[rhq] Changes to 'release'
by jdob
New branch 'release' available with the following commits:
commit d3890eb0b38545d797a16dc2c1f298cd8cbee080
Author: Jason Dobies <jason.dobies(a)redhat.com>
Date: Fri Jan 29 10:12:00 2010 -0500
Disabled plugins that are not to be included in the release.
14 years, 3 months
[rhq] modules/core modules/enterprise
by mazz
modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java | 10 +++
modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java | 15 +++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java | 15 ++---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java | 27 ++++++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java | 17 ++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java | 11 ++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java | 23 ++++++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java | 24 ++++++++
8 files changed, 128 insertions(+), 14 deletions(-)
New commits:
commit 987ee2cf875b01c80d4ff671d1a5abf154042529
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 29 02:54:50 2010 -0500
fixes BZ#548526 and obsoletes BZ#559160 - when changing config of server plugin, plugin is hot-redeployed and other HA servers will pick up the chanage within a few minutes at most
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java b/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java
index 4a8f9f5..6aaf7cf 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java
@@ -229,6 +229,15 @@ import org.rhq.core.domain.configuration.Configuration;
+ " WHERE p.id IN (:ids) " //
+ " AND p.status = 'INSTALLED' "), //
+ // returns two epoch millis - when plugin config and schedule jobs were last changed
+ @NamedQuery(name = ServerPlugin.QUERY_GET_CONFIG_MTIMES, query = "" //
+ + " SELECT pc.mtime, " //
+ + " sjc.mtime " //
+ + " FROM ServerPlugin AS p " //
+ + " LEFT JOIN p.pluginConfiguration pc " //
+ + " LEFT JOIN p.scheduledJobsConfiguration sjc " //
+ + " WHERE p.id = :id"), //
+
// this query is how you enable and disable plugins
@NamedQuery(name = ServerPlugin.UPDATE_PLUGIN_ENABLED_BY_ID, query = "" //
+ "UPDATE ServerPlugin p " //
@@ -250,6 +259,7 @@ public class ServerPlugin extends AbstractPlugin {
public static final String QUERY_FIND_ALL_INSTALLED = "ServerPlugin.findAllInstalled";
public static final String QUERY_FIND_ALL_INSTALLED_KEYS = "ServerPlugin.findAllInstalledKeys";
public static final String QUERY_FIND_KEYS_BY_IDS = "ServerPlugin.findKeysByIds";
+ public static final String QUERY_GET_CONFIG_MTIMES = "ServerPlugin.getConfigMTimes";
public static final String UPDATE_PLUGIN_ENABLED_BY_ID = "ServerPlugin.updatePluginEnabledById";
@JoinColumn(name = "JOBS_CONFIG_ID", referencedColumnName = "ID")
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java
index 1e52b62..4ec9271 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java
@@ -85,6 +85,12 @@ public class ServerPluginTest extends AbstractEJB3Test {
assert plugin.getPluginConfiguration() == null : "there was no config that should have been here";
assert plugin.getScheduledJobsConfiguration() == null : "there was no config that should have been here";
+ q = em.createNamedQuery(ServerPlugin.QUERY_GET_CONFIG_MTIMES);
+ q.setParameter("id", plugin.getId());
+ Object[] times = (Object[]) q.getSingleResult();
+ assert times[0] == null;
+ assert times[1] == null;
+
q = em.createNamedQuery(ServerPlugin.QUERY_GET_STATUS_BY_NAME);
q.setParameter("name", plugin.getName());
assert ((PluginStatusType) q.getSingleResult()) == PluginStatusType.INSTALLED;
@@ -270,6 +276,7 @@ public class ServerPluginTest extends AbstractEJB3Test {
}
}
+ @SuppressWarnings("unchecked")
public void testPersistFull() throws Exception {
getTransactionManager().begin();
EntityManager em = getEntityManager();
@@ -410,6 +417,14 @@ public class ServerPluginTest extends AbstractEJB3Test {
assert allKeys.size() == 1;
assert allKeys.contains(new PluginKey(plugin));
+ query = em.createNamedQuery(ServerPlugin.QUERY_GET_CONFIG_MTIMES);
+ query.setParameter("id", plugin.getId());
+ Object[] times = (Object[]) query.getSingleResult();
+ assert times[0] != null;
+ assert times[1] != null;
+ assert ((Long) times[0]).longValue() > 0;
+ assert ((Long) times[1]).longValue() > 0;
+
// mark a plugin deleted - all of our queries should then never see it
plugin.setStatus(PluginStatusType.DELETED);
em.merge(plugin);
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java
index 34b24a6..ad6c709 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java
@@ -112,16 +112,13 @@ public class EditPluginConfigurationUIBean extends AbstractPluginConfigurationUI
ServerPlugin plugin = serverPlugins.updateServerPluginExceptContent(subject, getPlugin());
setPlugin(plugin);
- // the config has changed. we would like to restart the plugin, but we would need to ensure
- // ALL servers in the rhq server cloud restart. today we have no easy way to inform all servers
- // that they should do this. So, for now, disable the plugin (since if it is running, it is doing
- // so with a now-invalid configuration. Let the user go in and re-enable the plugin later.
- // TODO: right now, if the user re-enables the plugin too fast, some of the other servers
- // will not have seen the state change and won't restart the plugin. Need a way to do this...
- // perhaps use the mtime column to denote that state changed (this would affect whether or not
- // the plugin needs to be upgraded, so we need to be careful re-using the mtime column for this purpose).
+ // Since the config has changed, we can tell the server to re-load the plugin now
+ // in order for it to pick up the changes immediately. Any other servers in the HA Server Cloud
+ // will pick up these changes later, when they scan for changes in the database.
+ // Note that if the plugin is disabled, don't bother since the plugin isn't really running anyway.
if (plugin.isEnabled()) {
- serverPlugins.disableServerPlugins(subject, getPluginIdList());
+ // enabling an already enabled plugin forces the plugin to reload
+ serverPlugins.enableServerPlugins(subject, getPluginIdList());
}
FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Configuration settings saved.");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java
index a58afb2..6b15cdc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java
@@ -106,11 +106,11 @@ public class ServerPluginScanner {
List<ServerPlugin> allPlugins = serverPluginsManager.getAllServerPlugins();
List<ServerPlugin> installedPlugins = new ArrayList<ServerPlugin>();
List<ServerPlugin> undeployedPlugins = new ArrayList<ServerPlugin>();
- for (ServerPlugin allPlugin : allPlugins) {
- if (allPlugin.getStatus() == PluginStatusType.INSTALLED) {
- installedPlugins.add(allPlugin);
+ for (ServerPlugin plugin : allPlugins) {
+ if (plugin.getStatus() == PluginStatusType.INSTALLED) {
+ installedPlugins.add(plugin);
} else {
- undeployedPlugins.add(allPlugin);
+ undeployedPlugins.add(plugin);
}
}
@@ -130,16 +130,33 @@ public class ServerPluginScanner {
}
// now see if any plugins changed state from enabled->disabled or vice versa
+ // this also checks to see if the plugin configuration has changed since it was last loaded
MasterServerPluginContainer master = LookupUtil.getServerPluginService().getMasterPluginContainer();
if (master != null) {
for (ServerPlugin installedPlugin : installedPlugins) {
PluginKey key = PluginKey.createServerPluginKey(installedPlugin.getType(), installedPlugin.getName());
AbstractTypeServerPluginContainer pc = master.getPluginContainerByPlugin(key);
if (pc != null && pc.isPluginLoaded(key)) {
+ boolean needToReloadPlugin = false;
boolean currentlyEnabled = pc.isPluginEnabled(key);
if (installedPlugin.isEnabled() != currentlyEnabled) {
- log.info("Detected a change to plugin [" + key + "]. It will now be "
+ log.info("Detected a state change to plugin [" + key + "]. It will now be "
+ ((installedPlugin.isEnabled()) ? "[enabled]" : "[disabled]"));
+ needToReloadPlugin = true;
+ } else {
+ Long pluginLoadTime = pc.getPluginLoadTime(key);
+ if (pluginLoadTime != null) {
+ long configChangeTimestamp = serverPluginsManager
+ .getLastConfigurationChangeTimestamp(installedPlugin.getId());
+ if (configChangeTimestamp > pluginLoadTime.longValue()) {
+ // since the last time the plugin was loaded, its configuration has changed, reload it to pick up the new config
+ log.info("Detected a config change to plugin [" + key + "]. It will be reloaded and "
+ + ((installedPlugin.isEnabled()) ? "[enabled]" : "[disabled]"));
+ needToReloadPlugin = true;
+ }
+ }
+ }
+ if (needToReloadPlugin) {
pc.reloadPlugin(key, installedPlugin.isEnabled());
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java
index 4d7d590..a4103c4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java
@@ -147,6 +147,23 @@ public class ServerPluginsBean implements ServerPluginsLocal {
return query.getResultList();
}
+ @SuppressWarnings("unchecked")
+ public long getLastConfigurationChangeTimestamp(int pluginId) {
+ Query query = entityManager.createNamedQuery(ServerPlugin.QUERY_GET_CONFIG_MTIMES);
+ query.setParameter("id", pluginId);
+ Object[] timestamps = (Object[]) query.getSingleResult();
+ long lastConfigChangeTimestamp = 0L;
+ for (Object timestamp : timestamps) {
+ if (timestamp != null) {
+ long val = ((Long) timestamp).longValue();
+ if (val > lastConfigChangeTimestamp) {
+ lastConfigChangeTimestamp = val;
+ }
+ }
+ }
+ return lastConfigChangeTimestamp;
+ }
+
public ServerPluginDescriptorType getServerPluginDescriptor(PluginKey pluginKey) throws Exception {
ServerPlugin plugin = getServerPlugin(pluginKey);
File pluginsDir = LookupUtil.getServerPluginService().getServerPluginsDirectory();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java
index 6a81f29..830b2c5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java
@@ -90,6 +90,17 @@ public interface ServerPluginsLocal {
List<ServerPlugin> getAllServerPluginsById(List<Integer> pluginIds);
/**
+ * Given a plugin ID, this will return a timestamp (in epoch millis)
+ * that indicates the last time when the plugin's configuration changed.
+ * This looks at both plugin configuration and schedule job configuration.
+ *
+ * @param pluginId
+ * @return time when the plugin's configuration was last updated; will be 0
+ * if the plugin has no configuration to change.
+ */
+ long getLastConfigurationChangeTimestamp(int pluginId);
+
+ /**
* Given a plugin key, returns the descriptor for that plugin.
*
* @param pluginKey
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java
index f845715..b8e760c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java
@@ -20,7 +20,10 @@
package org.rhq.enterprise.server.plugin.pc;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,6 +51,11 @@ public abstract class AbstractTypeServerPluginContainer {
private ServerPluginManager pluginManager;
/**
+ * Maps the time (in epoch milliseconds) when plugins were loaded in this plugin container.
+ */
+ private final Map<PluginKey, Long> loadedTimestamps;
+
+ /**
* Instantiates the plugin container. All subclasses must support this and only this
* constructor.
*
@@ -55,6 +63,7 @@ public abstract class AbstractTypeServerPluginContainer {
*/
public AbstractTypeServerPluginContainer(MasterServerPluginContainer master) {
this.master = master;
+ this.loadedTimestamps = Collections.synchronizedMap(new HashMap<PluginKey, Long>());
}
/**
@@ -111,6 +120,17 @@ public abstract class AbstractTypeServerPluginContainer {
}
/**
+ * Given a plugin key, this returns the time (in epoch milliseconds) when that plugin was loaded into
+ * this plugin container.
+ *
+ * @param pluginKey identifies the plugin whose load time is to be returned
+ * @return the epoch millis timestamp when the plugin was loaded; <code>null</code> if the plugin is not loaded
+ */
+ public Long getPluginLoadTime(PluginKey pluginKey) {
+ return this.loadedTimestamps.get(pluginKey);
+ }
+
+ /**
* The initialize method that prepares the plugin container. This should get the plugin
* container ready to accept plugins.
*
@@ -185,6 +205,7 @@ public abstract class AbstractTypeServerPluginContainer {
public synchronized void loadPlugin(ServerPluginEnvironment env, boolean enabled) throws Exception {
if (this.pluginManager != null) {
this.pluginManager.loadPlugin(env, enabled);
+ this.loadedTimestamps.put(env.getPluginKey(), System.currentTimeMillis());
} else {
throw new Exception("Cannot load a plugin; plugin container is not initialized yet");
}
@@ -201,6 +222,7 @@ public abstract class AbstractTypeServerPluginContainer {
public synchronized void unloadPlugin(PluginKey pluginKey) throws Exception {
if (this.pluginManager != null) {
this.pluginManager.unloadPlugin(pluginKey.getPluginName(), false);
+ this.loadedTimestamps.remove(pluginKey);
} else {
throw new Exception("Cannot unload a plugin; plugin container has been shutdown");
}
@@ -218,6 +240,7 @@ public abstract class AbstractTypeServerPluginContainer {
public synchronized void reloadPlugin(PluginKey pluginKey, boolean enabled) throws Exception {
if (this.pluginManager != null) {
this.pluginManager.reloadPlugin(pluginKey.getPluginName(), enabled);
+ this.loadedTimestamps.put(pluginKey, System.currentTimeMillis());
} else {
throw new Exception("Cannot reload a plugin; plugin container has been shutdown");
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java
index e1738e5..935721c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java
@@ -144,6 +144,12 @@ public class ServerPluginsBeanTest extends AbstractEJB3Test {
assert plugins.contains(p2) : plugins;
assetLazyInitializationException(plugins.get(plugins.indexOf(p1)));
assetLazyInitializationException(plugins.get(plugins.indexOf(p2)));
+
+ long lastTimestamp;
+ lastTimestamp = this.serverPluginsBean.getLastConfigurationChangeTimestamp(p1.getId());
+ assert lastTimestamp == getConfigurationLastModifiedTimestamp(p1);
+ lastTimestamp = this.serverPluginsBean.getLastConfigurationChangeTimestamp(p2.getId());
+ assert lastTimestamp == getConfigurationLastModifiedTimestamp(p2);
}
public void testUpdatePlugins() throws Exception {
@@ -393,4 +399,22 @@ public class ServerPluginsBeanTest extends AbstractEJB3Test {
getTransactionManager().rollback();
}
}
+
+ private long getConfigurationLastModifiedTimestamp(ServerPlugin plugin) {
+ // determine the last time the plugin config or schedule jobs changed
+ // return 0 value if plugin doesn't have any config whatsoever
+ long timestamp = 0;
+
+ Configuration config = plugin.getPluginConfiguration();
+ if (config != null) {
+ timestamp = config.getModifiedTime();
+ }
+
+ config = plugin.getScheduledJobsConfiguration();
+ if (config != null && config.getModifiedTime() > timestamp) {
+ timestamp = config.getModifiedTime();
+ }
+
+ return timestamp;
+ }
}
14 years, 3 months
[rhq] Branch 'bundle' - modules/core modules/enterprise
by mazz
modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java | 10 +++
modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java | 15 +++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java | 15 ++---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java | 27 ++++++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java | 17 ++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java | 11 ++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java | 23 ++++++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java | 24 ++++++++
8 files changed, 128 insertions(+), 14 deletions(-)
New commits:
commit bddd4b3a1ce39004f85df1bc5639689ab79e55a8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Jan 29 02:54:50 2010 -0500
fixes BZ#548526 and obsoletes BZ#559160 - when changing config of server plugin, plugin is hot-redeployed and other HA servers will pick up the chanage within a few minutes at most
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java b/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java
index 4a8f9f5..6aaf7cf 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java
@@ -229,6 +229,15 @@ import org.rhq.core.domain.configuration.Configuration;
+ " WHERE p.id IN (:ids) " //
+ " AND p.status = 'INSTALLED' "), //
+ // returns two epoch millis - when plugin config and schedule jobs were last changed
+ @NamedQuery(name = ServerPlugin.QUERY_GET_CONFIG_MTIMES, query = "" //
+ + " SELECT pc.mtime, " //
+ + " sjc.mtime " //
+ + " FROM ServerPlugin AS p " //
+ + " LEFT JOIN p.pluginConfiguration pc " //
+ + " LEFT JOIN p.scheduledJobsConfiguration sjc " //
+ + " WHERE p.id = :id"), //
+
// this query is how you enable and disable plugins
@NamedQuery(name = ServerPlugin.UPDATE_PLUGIN_ENABLED_BY_ID, query = "" //
+ "UPDATE ServerPlugin p " //
@@ -250,6 +259,7 @@ public class ServerPlugin extends AbstractPlugin {
public static final String QUERY_FIND_ALL_INSTALLED = "ServerPlugin.findAllInstalled";
public static final String QUERY_FIND_ALL_INSTALLED_KEYS = "ServerPlugin.findAllInstalledKeys";
public static final String QUERY_FIND_KEYS_BY_IDS = "ServerPlugin.findKeysByIds";
+ public static final String QUERY_GET_CONFIG_MTIMES = "ServerPlugin.getConfigMTimes";
public static final String UPDATE_PLUGIN_ENABLED_BY_ID = "ServerPlugin.updatePluginEnabledById";
@JoinColumn(name = "JOBS_CONFIG_ID", referencedColumnName = "ID")
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java
index 1e52b62..4ec9271 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ServerPluginTest.java
@@ -85,6 +85,12 @@ public class ServerPluginTest extends AbstractEJB3Test {
assert plugin.getPluginConfiguration() == null : "there was no config that should have been here";
assert plugin.getScheduledJobsConfiguration() == null : "there was no config that should have been here";
+ q = em.createNamedQuery(ServerPlugin.QUERY_GET_CONFIG_MTIMES);
+ q.setParameter("id", plugin.getId());
+ Object[] times = (Object[]) q.getSingleResult();
+ assert times[0] == null;
+ assert times[1] == null;
+
q = em.createNamedQuery(ServerPlugin.QUERY_GET_STATUS_BY_NAME);
q.setParameter("name", plugin.getName());
assert ((PluginStatusType) q.getSingleResult()) == PluginStatusType.INSTALLED;
@@ -270,6 +276,7 @@ public class ServerPluginTest extends AbstractEJB3Test {
}
}
+ @SuppressWarnings("unchecked")
public void testPersistFull() throws Exception {
getTransactionManager().begin();
EntityManager em = getEntityManager();
@@ -410,6 +417,14 @@ public class ServerPluginTest extends AbstractEJB3Test {
assert allKeys.size() == 1;
assert allKeys.contains(new PluginKey(plugin));
+ query = em.createNamedQuery(ServerPlugin.QUERY_GET_CONFIG_MTIMES);
+ query.setParameter("id", plugin.getId());
+ Object[] times = (Object[]) query.getSingleResult();
+ assert times[0] != null;
+ assert times[1] != null;
+ assert ((Long) times[0]).longValue() > 0;
+ assert ((Long) times[1]).longValue() > 0;
+
// mark a plugin deleted - all of our queries should then never see it
plugin.setStatus(PluginStatusType.DELETED);
em.merge(plugin);
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java
index 34b24a6..ad6c709 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/plugin/EditPluginConfigurationUIBean.java
@@ -112,16 +112,13 @@ public class EditPluginConfigurationUIBean extends AbstractPluginConfigurationUI
ServerPlugin plugin = serverPlugins.updateServerPluginExceptContent(subject, getPlugin());
setPlugin(plugin);
- // the config has changed. we would like to restart the plugin, but we would need to ensure
- // ALL servers in the rhq server cloud restart. today we have no easy way to inform all servers
- // that they should do this. So, for now, disable the plugin (since if it is running, it is doing
- // so with a now-invalid configuration. Let the user go in and re-enable the plugin later.
- // TODO: right now, if the user re-enables the plugin too fast, some of the other servers
- // will not have seen the state change and won't restart the plugin. Need a way to do this...
- // perhaps use the mtime column to denote that state changed (this would affect whether or not
- // the plugin needs to be upgraded, so we need to be careful re-using the mtime column for this purpose).
+ // Since the config has changed, we can tell the server to re-load the plugin now
+ // in order for it to pick up the changes immediately. Any other servers in the HA Server Cloud
+ // will pick up these changes later, when they scan for changes in the database.
+ // Note that if the plugin is disabled, don't bother since the plugin isn't really running anyway.
if (plugin.isEnabled()) {
- serverPlugins.disableServerPlugins(subject, getPluginIdList());
+ // enabling an already enabled plugin forces the plugin to reload
+ serverPlugins.enableServerPlugins(subject, getPluginIdList());
}
FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Configuration settings saved.");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java
index a58afb2..6b15cdc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/ServerPluginScanner.java
@@ -106,11 +106,11 @@ public class ServerPluginScanner {
List<ServerPlugin> allPlugins = serverPluginsManager.getAllServerPlugins();
List<ServerPlugin> installedPlugins = new ArrayList<ServerPlugin>();
List<ServerPlugin> undeployedPlugins = new ArrayList<ServerPlugin>();
- for (ServerPlugin allPlugin : allPlugins) {
- if (allPlugin.getStatus() == PluginStatusType.INSTALLED) {
- installedPlugins.add(allPlugin);
+ for (ServerPlugin plugin : allPlugins) {
+ if (plugin.getStatus() == PluginStatusType.INSTALLED) {
+ installedPlugins.add(plugin);
} else {
- undeployedPlugins.add(allPlugin);
+ undeployedPlugins.add(plugin);
}
}
@@ -130,16 +130,33 @@ public class ServerPluginScanner {
}
// now see if any plugins changed state from enabled->disabled or vice versa
+ // this also checks to see if the plugin configuration has changed since it was last loaded
MasterServerPluginContainer master = LookupUtil.getServerPluginService().getMasterPluginContainer();
if (master != null) {
for (ServerPlugin installedPlugin : installedPlugins) {
PluginKey key = PluginKey.createServerPluginKey(installedPlugin.getType(), installedPlugin.getName());
AbstractTypeServerPluginContainer pc = master.getPluginContainerByPlugin(key);
if (pc != null && pc.isPluginLoaded(key)) {
+ boolean needToReloadPlugin = false;
boolean currentlyEnabled = pc.isPluginEnabled(key);
if (installedPlugin.isEnabled() != currentlyEnabled) {
- log.info("Detected a change to plugin [" + key + "]. It will now be "
+ log.info("Detected a state change to plugin [" + key + "]. It will now be "
+ ((installedPlugin.isEnabled()) ? "[enabled]" : "[disabled]"));
+ needToReloadPlugin = true;
+ } else {
+ Long pluginLoadTime = pc.getPluginLoadTime(key);
+ if (pluginLoadTime != null) {
+ long configChangeTimestamp = serverPluginsManager
+ .getLastConfigurationChangeTimestamp(installedPlugin.getId());
+ if (configChangeTimestamp > pluginLoadTime.longValue()) {
+ // since the last time the plugin was loaded, its configuration has changed, reload it to pick up the new config
+ log.info("Detected a config change to plugin [" + key + "]. It will be reloaded and "
+ + ((installedPlugin.isEnabled()) ? "[enabled]" : "[disabled]"));
+ needToReloadPlugin = true;
+ }
+ }
+ }
+ if (needToReloadPlugin) {
pc.reloadPlugin(key, installedPlugin.isEnabled());
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java
index 4d7d590..a4103c4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsBean.java
@@ -147,6 +147,23 @@ public class ServerPluginsBean implements ServerPluginsLocal {
return query.getResultList();
}
+ @SuppressWarnings("unchecked")
+ public long getLastConfigurationChangeTimestamp(int pluginId) {
+ Query query = entityManager.createNamedQuery(ServerPlugin.QUERY_GET_CONFIG_MTIMES);
+ query.setParameter("id", pluginId);
+ Object[] timestamps = (Object[]) query.getSingleResult();
+ long lastConfigChangeTimestamp = 0L;
+ for (Object timestamp : timestamps) {
+ if (timestamp != null) {
+ long val = ((Long) timestamp).longValue();
+ if (val > lastConfigChangeTimestamp) {
+ lastConfigChangeTimestamp = val;
+ }
+ }
+ }
+ return lastConfigChangeTimestamp;
+ }
+
public ServerPluginDescriptorType getServerPluginDescriptor(PluginKey pluginKey) throws Exception {
ServerPlugin plugin = getServerPlugin(pluginKey);
File pluginsDir = LookupUtil.getServerPluginService().getServerPluginsDirectory();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java
index 6a81f29..830b2c5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/ServerPluginsLocal.java
@@ -90,6 +90,17 @@ public interface ServerPluginsLocal {
List<ServerPlugin> getAllServerPluginsById(List<Integer> pluginIds);
/**
+ * Given a plugin ID, this will return a timestamp (in epoch millis)
+ * that indicates the last time when the plugin's configuration changed.
+ * This looks at both plugin configuration and schedule job configuration.
+ *
+ * @param pluginId
+ * @return time when the plugin's configuration was last updated; will be 0
+ * if the plugin has no configuration to change.
+ */
+ long getLastConfigurationChangeTimestamp(int pluginId);
+
+ /**
* Given a plugin key, returns the descriptor for that plugin.
*
* @param pluginKey
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java
index f845715..b8e760c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/AbstractTypeServerPluginContainer.java
@@ -20,7 +20,10 @@
package org.rhq.enterprise.server.plugin.pc;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,6 +51,11 @@ public abstract class AbstractTypeServerPluginContainer {
private ServerPluginManager pluginManager;
/**
+ * Maps the time (in epoch milliseconds) when plugins were loaded in this plugin container.
+ */
+ private final Map<PluginKey, Long> loadedTimestamps;
+
+ /**
* Instantiates the plugin container. All subclasses must support this and only this
* constructor.
*
@@ -55,6 +63,7 @@ public abstract class AbstractTypeServerPluginContainer {
*/
public AbstractTypeServerPluginContainer(MasterServerPluginContainer master) {
this.master = master;
+ this.loadedTimestamps = Collections.synchronizedMap(new HashMap<PluginKey, Long>());
}
/**
@@ -111,6 +120,17 @@ public abstract class AbstractTypeServerPluginContainer {
}
/**
+ * Given a plugin key, this returns the time (in epoch milliseconds) when that plugin was loaded into
+ * this plugin container.
+ *
+ * @param pluginKey identifies the plugin whose load time is to be returned
+ * @return the epoch millis timestamp when the plugin was loaded; <code>null</code> if the plugin is not loaded
+ */
+ public Long getPluginLoadTime(PluginKey pluginKey) {
+ return this.loadedTimestamps.get(pluginKey);
+ }
+
+ /**
* The initialize method that prepares the plugin container. This should get the plugin
* container ready to accept plugins.
*
@@ -185,6 +205,7 @@ public abstract class AbstractTypeServerPluginContainer {
public synchronized void loadPlugin(ServerPluginEnvironment env, boolean enabled) throws Exception {
if (this.pluginManager != null) {
this.pluginManager.loadPlugin(env, enabled);
+ this.loadedTimestamps.put(env.getPluginKey(), System.currentTimeMillis());
} else {
throw new Exception("Cannot load a plugin; plugin container is not initialized yet");
}
@@ -201,6 +222,7 @@ public abstract class AbstractTypeServerPluginContainer {
public synchronized void unloadPlugin(PluginKey pluginKey) throws Exception {
if (this.pluginManager != null) {
this.pluginManager.unloadPlugin(pluginKey.getPluginName(), false);
+ this.loadedTimestamps.remove(pluginKey);
} else {
throw new Exception("Cannot unload a plugin; plugin container has been shutdown");
}
@@ -218,6 +240,7 @@ public abstract class AbstractTypeServerPluginContainer {
public synchronized void reloadPlugin(PluginKey pluginKey, boolean enabled) throws Exception {
if (this.pluginManager != null) {
this.pluginManager.reloadPlugin(pluginKey.getPluginName(), enabled);
+ this.loadedTimestamps.put(pluginKey, System.currentTimeMillis());
} else {
throw new Exception("Cannot reload a plugin; plugin container has been shutdown");
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java
index e1738e5..935721c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/ServerPluginsBeanTest.java
@@ -144,6 +144,12 @@ public class ServerPluginsBeanTest extends AbstractEJB3Test {
assert plugins.contains(p2) : plugins;
assetLazyInitializationException(plugins.get(plugins.indexOf(p1)));
assetLazyInitializationException(plugins.get(plugins.indexOf(p2)));
+
+ long lastTimestamp;
+ lastTimestamp = this.serverPluginsBean.getLastConfigurationChangeTimestamp(p1.getId());
+ assert lastTimestamp == getConfigurationLastModifiedTimestamp(p1);
+ lastTimestamp = this.serverPluginsBean.getLastConfigurationChangeTimestamp(p2.getId());
+ assert lastTimestamp == getConfigurationLastModifiedTimestamp(p2);
}
public void testUpdatePlugins() throws Exception {
@@ -393,4 +399,22 @@ public class ServerPluginsBeanTest extends AbstractEJB3Test {
getTransactionManager().rollback();
}
}
+
+ private long getConfigurationLastModifiedTimestamp(ServerPlugin plugin) {
+ // determine the last time the plugin config or schedule jobs changed
+ // return 0 value if plugin doesn't have any config whatsoever
+ long timestamp = 0;
+
+ Configuration config = plugin.getPluginConfiguration();
+ if (config != null) {
+ timestamp = config.getModifiedTime();
+ }
+
+ config = plugin.getScheduledJobsConfiguration();
+ if (config != null && config.getModifiedTime() > timestamp) {
+ timestamp = config.getModifiedTime();
+ }
+
+ return timestamp;
+ }
}
14 years, 3 months
[rhq] Branch 'linux-config' - 114 commits - .classpath modules/core modules/enterprise modules/plugins pom.xml .settings/org.eclipse.jdt.ui.prefs
by Shannon Hughes
.classpath | 1
.settings/org.eclipse.jdt.ui.prefs | 4
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java | 22
modules/core/client-api/src/main/resources/rhq-configuration.xsd | 2
modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml | 2
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 2
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/DynamicConfigurationPropertyValue.java | 70 +
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/RawConfiguration.java | 77 -
modules/core/domain/src/main/java/org/rhq/core/domain/content/Architecture.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageType.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java | 10
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/ConfigurationTest.java | 6
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationIntegrationTest.java | 2
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationTest.java | 81 -
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/test/ConfigurationTest.java | 2
modules/core/domain/src/test/resources/META-INF/persistence.xml | 37
modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileRenderer.java | 70 +
modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileUIComponent.java | 38
modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigRenderer.java | 58 +
modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigUIComponent.java | 143 +++
modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/DynamicPropertyRetriever.java | 5
modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/PropertyRenderingUtility.java | 9
modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java | 43
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java | 3
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationUpdateException.java | 49 +
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java | 68 -
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementSupport.java | 4
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java | 165 ++-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationUtilityServiceImpl.java | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java | 15
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java | 33
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java | 11
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImplTest.java | 155 +--
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java | 24
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java | 268 +++---
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java | 113 ++
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java | 100 +-
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java | 51 -
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/UpdateResourceConfigurationRunnerTest.java | 5
modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java | 54 +
modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java | 62 +
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/DatabaseDynamicPropertyRetriever.java | 5
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java | 439 ++++++----
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectory.java | 55 +
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java | 99 ++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/test/ViewRawTestConfigurationUIBean.java | 32
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeStateAdvisor.java | 8
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml | 16
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml | 21
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml | 20
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/test-beans.xml | 8
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml | 58 -
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tags/on.component.taglib.xml | 6
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml | 6
modules/enterprise/gui/portal-war/src/main/webapp/common/Login.jsp | 4
modules/enterprise/gui/portal-war/src/main/webapp/css/win.css | 25
modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js | 248 +++++
modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml | 2
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml | 373 +++++++-
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml | 56 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml | 45 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml | 420 +++++----
modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml | 31
modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html | 30
modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html | 32
modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml | 52 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 49 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBean.java | 23
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyLocal.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java | 6
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java | 71 -
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java | 97 +-
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java | 26
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java | 8
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java | 6
modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java | 11
modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml | 35
modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/MockRhnXmlRpcExecutor.java | 2
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java | 9
modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java | 6
modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy | 42
modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy | 80 +
modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredServer.groovy | 13
modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml | 38
modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawConfigServerTest.groovy | 12
modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawServerTest.groovy | 2
pom.xml | 2
91 files changed, 3377 insertions(+), 1140 deletions(-)
New commits:
commit d9e02aa86cd9b4a560a214c93f49cd21fed11bd1
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 28 22:08:37 2010 -0500
fixing augeas and cobber due to RawConfig refactoring
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
index 272fffb..dd900cf 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
@@ -82,7 +82,7 @@ public class AugeasRawConfigHelper {
aug.save();
toUpdate.setPath(existingConfig.getPath());
- toUpdate.setContents(FileUtils.readFileToByteArray(new File(file)));
+ toUpdate.setContents(FileUtils.readFileToString(new File(file)));
} finally {
if (aug != null) {
aug.close();
@@ -111,18 +111,17 @@ public class AugeasRawConfigHelper {
public void save(RawConfiguration config) throws Exception {
File f = new File(config.getPath());
- FileUtils.writeStringToFile(f, normalizeToUnix(config.getContents()));
+ FileUtils.writeStringToFile(f, config.getContents());
}
private String getFile(Augeas aug) {
return aug.get(transformPrefix + "/incl");
}
- private Augeas createAugeas(String lens, byte[] binary) throws Exception {
+ private Augeas createAugeas(String lens, String contents) throws Exception {
Augeas aug = new Augeas(rootPath, loadPath, Augeas.NO_MODL_AUTOLOAD);
File fl = File.createTempFile("_rhq", null);
- String contents = normalizeToUnix(binary);
- //write the 'to' file to disk
+ //write the 'to' file to disk
FileUtils.writeStringToFile(fl, contents);
aug.set(transformPrefix + "/lens", lens);
aug.set(transformPrefix + "/incl", fl.getAbsolutePath());
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index c0bb0c5..3e80c01 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -123,12 +123,12 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Au
Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
RawConfiguration modules = new RawConfiguration();
modules.setPath(MODULES_PATH);
- modules.setContents(FileUtils.readFileToByteArray(new File(MODULES_PATH)));
+ modules.setContents(FileUtils.readFileToString(new File(MODULES_PATH)));
configs.add(modules);
RawConfiguration settings = new RawConfiguration();
settings.setPath(SETTINGS_PATH);
- settings.setContents(FileUtils.readFileToByteArray(new File(SETTINGS_PATH)));
+ settings.setContents(FileUtils.readFileToString(new File(SETTINGS_PATH)));
configs.add(settings);
return configs;
} catch (Exception e) {
@@ -187,7 +187,6 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Au
// TODO Auto-generated method stub
}
- @Override
public Property createProperty(String propName, String augeasPath, Augeas aug) {
if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
return new PropertySimple(propName, "1".equals(aug.get(augeasPath)));
@@ -195,7 +194,6 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Au
return new PropertySimple(propName, aug.get(augeasPath));
}
- @Override
public String getPropertyValue(String propName, Configuration from) {
if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
PropertySimple prop = (PropertySimple) from.get(propName);
commit 0d1eb673a948f025c10a1d4dd5694281b71abec7
Merge: eef9371... 16f0613...
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 28 20:38:06 2010 -0500
using 3.3.2.sr1 for richfaces conflict.
Conflicts:
pom.xml
commit eef9371ce2a7232e1f2ae9a844d3627a4a2a245d
Author: Jason Dobies <jason.dobies(a)redhat.com>
Date: Thu Jan 28 10:54:52 2010 -0500
Added package architectures as dynamic config value and updated disk source to use it.
diff --git a/modules/core/client-api/src/main/resources/rhq-configuration.xsd b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
index e9791c1..590f459 100644
--- a/modules/core/client-api/src/main/resources/rhq-configuration.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
@@ -245,6 +245,7 @@
<xs:enumeration value="roles"/>
<xs:enumeration value="package-types"/>
<xs:enumeration value="resource-type-with-plugin"/>
+ <xs:enumeration value="package-architectures"/>
</xs:restriction>
</xs:simpleType>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/Architecture.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/Architecture.java
index 0c2411f..40c2c36 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/Architecture.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/Architecture.java
@@ -45,7 +45,9 @@ import org.rhq.core.domain.resource.Resource;
@Entity
@NamedQueries( {
@NamedQuery(name = Architecture.QUERY_FIND_BY_NAME, query = "SELECT arch FROM Architecture arch WHERE arch.name = :name"),
- @NamedQuery(name = Architecture.QUERY_FIND_ALL, query = "SELECT arch FROM Architecture arch") })
+ @NamedQuery(name = Architecture.QUERY_FIND_ALL, query = "SELECT arch FROM Architecture arch"),
+ @NamedQuery(name = Architecture.QUERY_DYNAMIC_CONFIG_VALUES, query = "SELECT arch.name, arch.name FROM Architecture arch")
+})
@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_ARCHITECTURE_ID_SEQ")
@Table(name = "RHQ_ARCHITECTURE")
public class Architecture implements Serializable {
@@ -56,6 +58,8 @@ public class Architecture implements Serializable {
public static final String QUERY_FIND_BY_NAME = "Architecture.findByName";
public static final String QUERY_FIND_ALL = "Architecture.findAll";
+ public static final String QUERY_DYNAMIC_CONFIG_VALUES = "Architecture.dynamicConfigValues";
+
// Attributes --------------------------------------------
@Column(name = "ID", nullable = false)
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java
index ad7d8e0..d84531e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java
@@ -28,6 +28,7 @@ import java.util.Map;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.resource.ResourceType;
@@ -44,6 +45,7 @@ public class PropertyExpressionEvaluator {
public static final String KEY_ROLES = "roles";
public static final String KEY_PACKAGE_TYPES = "package-types";
public static final String KEY_RESOURCE_TYPE_PLUGIN = "resource-type-with-plugin";
+ public static final String KEY_PACKAGE_ARCHITECTURES = "package-architectures";
/**
* @see #getQueryNameForKey(String)
@@ -56,6 +58,7 @@ public class PropertyExpressionEvaluator {
temp.put(KEY_ROLES, Role.QUERY_DYNAMIC_CONFIG_VALUES);
temp.put(KEY_PACKAGE_TYPES, PackageType.QUERY_DYNAMIC_CONFIG_VALUES);
temp.put(KEY_RESOURCE_TYPE_PLUGIN, ResourceType.QUERY_DYNAMIC_CONFIG_WITH_PLUGIN);
+ temp.put(KEY_PACKAGE_ARCHITECTURES, Architecture.QUERY_DYNAMIC_CONFIG_VALUES);
KEY_TO_QUERY_NAME = Collections.unmodifiableMap(temp);
}
diff --git a/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
index 1a7de07..4ec6f82 100644
--- a/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -36,8 +36,10 @@
description="The name that identifies the kind of package this type represents (e.g. 'ear', 'rpm')">
<c:database-backing key="package-types"/>
</c:dynamic-property>
- <c:simple-property name="architectureName" required="true" summary="true" default="noarch"
- description="The specific hardware architecture this type of package can be deployed on. If there is no specific architecture required, use 'noarch'. (e.g. 'i686', 'amd64')"/>
+ <c:dynamic-property name="architectureName" required="true" summary="true"
+ description="The specific hardware architecture this type of package can be deployed on. If there is no specific architecture required, use 'noarch'. (e.g. 'i686', 'amd64')">
+ <c:database-backing key="package-architectures"/>
+ </c:dynamic-property>
<c:dynamic-property name="resourceType" required="true" summary="true"
description="The name of the resource type on which this package can be deployed. This is the resource type name as defined in the agent plugin. (e.g. 'Linux', 'JBossAS Server')">
<c:database-backing key="resource-type-with-plugin"/>
commit d88b8087990f046be3bb49cdc5586f57b06ddf95
Author: Jason Dobies <jason.dobies(a)redhat.com>
Date: Thu Jan 28 10:21:14 2010 -0500
Added "Plugin - Resource Type" as a dynamic config property value. Updated disk source to use this.
diff --git a/modules/core/client-api/src/main/resources/rhq-configuration.xsd b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
index 869de57..e9791c1 100644
--- a/modules/core/client-api/src/main/resources/rhq-configuration.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
@@ -244,6 +244,7 @@
<xs:enumeration value="users"/>
<xs:enumeration value="roles"/>
<xs:enumeration value="package-types"/>
+ <xs:enumeration value="resource-type-with-plugin"/>
</xs:restriction>
</xs:simpleType>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index b0a9776..aed3360 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@ -185,7 +185,10 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ " SELECT rt.name " //
+ " FROM ResourceType rt " //
+ "GROUP BY rt.name " //
- + " HAVING COUNT(rt.name) > 1") })
+ + " HAVING COUNT(rt.name) > 1"),
+ @NamedQuery(name = ResourceType.QUERY_DYNAMIC_CONFIG_WITH_PLUGIN, query = "" //
+ + "SELECT rt.plugin || ' - ' || rt.name, rt.plugin || '-' || rt.name FROM ResourceType rt" )
+})
@NamedNativeQueries( {
// TODO: Add authz conditions to the below query.
@NamedNativeQuery(name = ResourceType.QUERY_FIND_CHILDREN_BY_CATEGORY, query = "" //
@@ -231,7 +234,8 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ "FROM RHQ_resource_type_parents rtp2 "
+ "WHERE rtp2.resource_type_id = crt2.id) " + "AND crt2.category = ? " +
// "ORDER BY crt2.name" +
- ")) ORDER BY name", resultSetMapping = ResourceType.MAPPING_FIND_CHILDREN_BY_CATEGORY) })
+ ")) ORDER BY name", resultSetMapping = ResourceType.MAPPING_FIND_CHILDREN_BY_CATEGORY)
+ })
@SqlResultSetMapping(name = ResourceType.MAPPING_FIND_CHILDREN_BY_CATEGORY, entities = { @EntityResult(entityClass = ResourceType.class) })
// @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class ResourceType implements Externalizable, Comparable<ResourceType> {
@@ -269,6 +273,8 @@ public class ResourceType implements Externalizable, Comparable<ResourceType> {
public static final String QUERY_FIND_RESOURCE_FACETS = "ResourceType.findResourceFacets";
public static final String QUERY_FIND_DUPLICATE_TYPE_NAMES = "ResourceType.findDuplicateTypeNames";
+ public static final String QUERY_DYNAMIC_CONFIG_WITH_PLUGIN = "ResourceType.dynamicConfigWithPlugin";
+
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ")
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java
index 4a4993d..ad7d8e0 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/PropertyExpressionEvaluator.java
@@ -29,6 +29,7 @@ import java.util.Map;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.content.PackageType;
+import org.rhq.core.domain.resource.ResourceType;
/**
* Translates the configuration property value lookup key into a named query in the system.
@@ -42,6 +43,7 @@ public class PropertyExpressionEvaluator {
public static final String KEY_USERS = "users";
public static final String KEY_ROLES = "roles";
public static final String KEY_PACKAGE_TYPES = "package-types";
+ public static final String KEY_RESOURCE_TYPE_PLUGIN = "resource-type-with-plugin";
/**
* @see #getQueryNameForKey(String)
@@ -53,6 +55,7 @@ public class PropertyExpressionEvaluator {
temp.put(KEY_USERS, Subject.QUERY_DYNAMIC_CONFIG_VALUES);
temp.put(KEY_ROLES, Role.QUERY_DYNAMIC_CONFIG_VALUES);
temp.put(KEY_PACKAGE_TYPES, PackageType.QUERY_DYNAMIC_CONFIG_VALUES);
+ temp.put(KEY_RESOURCE_TYPE_PLUGIN, ResourceType.QUERY_DYNAMIC_CONFIG_WITH_PLUGIN);
KEY_TO_QUERY_NAME = Collections.unmodifiableMap(temp);
}
diff --git a/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java b/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
index 2c2f204..336117f 100644
--- a/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
+++ b/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
@@ -313,8 +313,15 @@ public class DiskSource implements ContentProvider, PackageSource, RepoSource {
SupportedPackageType supportedPackageType = new SupportedPackageType();
supportedPackageType.packageTypeName = configuration.getSimpleValue("packageTypeName", null);
supportedPackageType.architectureName = configuration.getSimpleValue("architectureName", null);
- supportedPackageType.resourceTypeName = configuration.getSimpleValue("resourceTypeName", null);
- supportedPackageType.resourceTypePluginName = configuration.getSimpleValue("resourceTypePluginName", null);
+
+ String resourceAndPlugin = configuration.getSimpleValue("resourceType", null);
+
+ String resourceType = resourceAndPlugin.substring( (resourceAndPlugin.indexOf('-') + 1) );
+ String pluginType = resourceAndPlugin.substring(0, resourceAndPlugin.indexOf('-'));
+
+ supportedPackageType.resourceTypeName = resourceType;
+ supportedPackageType.resourceTypePluginName = pluginType;
+
String filenameFilter = configuration.getSimpleValue("filenameFilter", null);
supportedPackageTypes.put(filenameFilter, supportedPackageType);
}
diff --git a/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
index f9e4467..1a7de07 100644
--- a/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -38,10 +38,10 @@
</c:dynamic-property>
<c:simple-property name="architectureName" required="true" summary="true" default="noarch"
description="The specific hardware architecture this type of package can be deployed on. If there is no specific architecture required, use 'noarch'. (e.g. 'i686', 'amd64')"/>
- <c:simple-property name="resourceTypeName" required="true" summary="true"
- description="The name of the resource type on which this package can be deployed. This is the resource type name as defined in the agent plugin. (e.g. 'Linux', 'JBossAS Server')"/>
- <c:simple-property name="resourceTypePluginName" required="true" summary="true"
- description="The name of the plugin that defined the resource type. (e.g. 'Platform', 'JBossAS')"/>
+ <c:dynamic-property name="resourceType" required="true" summary="true"
+ description="The name of the resource type on which this package can be deployed. This is the resource type name as defined in the agent plugin. (e.g. 'Linux', 'JBossAS Server')">
+ <c:database-backing key="resource-type-with-plugin"/>
+ </c:dynamic-property>
</c:group>
<c:group name="Repo Source">
commit 77f9d11e35ff8a622505d47d4800ca12d0848d60
Merge: 1f67b2e... bcdc326...
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 27 16:56:54 2010 -0500
Merge branch 'master' of ssh://jsanda@git.fedorahosted.org/git/rhq/rhq
commit 1f67b2e63fe503b65420a07a860fc8b601ca1826
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 27 16:14:18 2010 -0500
Fixing merge error
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
index a6d33df..fc9fb63 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
@@ -282,10 +282,6 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
return "foo";
}
- public SyncProgressWeight getSyncProgressWeight() {
- return SyncProgressWeight.DEFAULT_WEIGHTS;
- }
-
/**
* Returns a list of repo names that were used to all calls to
* {@link #synchronizePackages(String, PackageSyncReport, Collection)}
commit bcdc326ccd925beca43d12d336f575dc50583f26
Author: Jason Dobies <jason.dobies(a)redhat.com>
Date: Wed Jan 27 15:49:25 2010 -0500
Refactored dynamic configuration properties to be retrieved with a display/value pair. This way, we are able to display "pretty" values to the user yet use different values programmatically.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index f10dc64..2aadf7d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -184,7 +184,7 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ " AND s.fsystem = FALSE " //
+ " AND s.factive = TRUE"), //
@NamedQuery(name = Subject.QUERY_DYNAMIC_CONFIG_VALUES, query = "" //
- + "SELECT s.name FROM Subject AS s WHERE s.fsystem = false")
+ + "SELECT s.name, s.name FROM Subject AS s WHERE s.fsystem = false")
})
@SequenceGenerator(name = "RHQ_SUBJECT_ID_SEQ", sequenceName = "RHQ_SUBJECT_ID_SEQ")
@Table(name = "RHQ_SUBJECT")
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 089ca55..482fa08 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -92,7 +92,7 @@ import org.rhq.core.domain.auth.Subject;
+ " FROM RoleNotification rn" //
+ " WHERE rn.alertDefinition.id = :alertDefinitionId ) "), //
@NamedQuery(name = Role.QUERY_DYNAMIC_CONFIG_VALUES, query = "" //
- + "SELECT r.name FROM Role AS r")
+ + "SELECT r.name, r.name FROM Role AS r")
})
@SequenceGenerator(name = "RHQ_ROLE_ID_SEQ", sequenceName = "RHQ_ROLE_ID_SEQ")
@Table(name = "RHQ_ROLE")
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/DynamicConfigurationPropertyValue.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/DynamicConfigurationPropertyValue.java
new file mode 100644
index 0000000..433fe6a
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/DynamicConfigurationPropertyValue.java
@@ -0,0 +1,70 @@
+/*
+* RHQ Management Platform
+* Copyright (C) 2009 Red Hat, Inc.
+* All rights reserved.
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License, version 2, as
+* published by the Free Software Foundation, and/or the GNU Lesser
+* General Public License, version 2.1, also as published by the Free
+* Software Foundation.
+*
+* This program 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 General Public License and the GNU Lesser General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License
+* and the GNU Lesser General Public License along with this program;
+* if not, write to the Free Software Foundation, Inc.,
+* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+package org.rhq.core.domain.configuration;
+
+/**
+ * Represents a single value that should be displayed to a user as an enumerated possibility for a dynamic
+ * configuration property. This object pairs a display name (shown to the user in the UI) with the programmatic
+ * value that is used if this value is selected.
+ *
+ * @author Jason Dobies
+ */
+public class DynamicConfigurationPropertyValue {
+
+ /**
+ * Display name to use for the value. This will be displayed to the user in the UI.
+ */
+ private String display;
+
+ /**
+ * Programmatic representation of the value that will be used when this value is selected by
+ * the user.
+ */
+ private String value;
+
+ public DynamicConfigurationPropertyValue(String display, String value) {
+ this.display = display;
+ this.value = value;
+ }
+
+ public String getDisplay() {
+ return display;
+ }
+
+ public void setDisplay(String display) {
+ this.display = display;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return "Value [Display = " + display + ", Value = " + value + "]";
+ }
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageType.java
index 3615a6a..4e4558e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageType.java
@@ -71,7 +71,7 @@ import org.rhq.core.domain.resource.ResourceType;
+ "JOIN pt.resourceType rt "
+ "LEFT JOIN FETCH pt.deploymentConfigurationDefinition cd "
+ "LEFT JOIN FETCH cd.templates cts " + "WHERE rt.id = :typeId AND pt.isCreationData = true"),
- @NamedQuery(name = PackageType.QUERY_DYNAMIC_CONFIG_VALUES, query = "SELECT pt.displayName FROM PackageType AS pt")
+ @NamedQuery(name = PackageType.QUERY_DYNAMIC_CONFIG_VALUES, query = "SELECT pt.displayName, pt.name FROM PackageType AS pt")
})
@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_PACKAGE_TYPE_ID_SEQ")
@Table(name = "RHQ_PACKAGE_TYPE")
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/DynamicPropertyRetriever.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/DynamicPropertyRetriever.java
index 1010cc7..9f90c44 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/DynamicPropertyRetriever.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/DynamicPropertyRetriever.java
@@ -24,6 +24,7 @@ package org.rhq.core.gui.configuration.helper;
import java.util.List;
+import org.rhq.core.domain.configuration.DynamicConfigurationPropertyValue;
import org.rhq.core.domain.configuration.PropertyDefinitionDynamic;
/**
@@ -32,7 +33,7 @@ import org.rhq.core.domain.configuration.PropertyDefinitionDynamic;
* <p/>
* <strong>In order to associate implementations of this interface with the rendering code, calls must be made to
* {@link PropertyRenderingUtility#putDynamicPropertyRetriever(org.rhq.core.domain.configuration.PropertyDynamicType,
- * DynamicPropertyRetriever)} to map the property type to the instance.</strong>
+ * DynamicPropertyRetriever)} to map the property type to the instance.</strong>
* <p/>
* This functionality is abstracted out to prevent the core-gui module from having to make non-core
* dependencies. Modules using core-gui can implement this interface using whatever means available,
@@ -48,5 +49,5 @@ public interface DynamicPropertyRetriever {
* @param propertyDefinition cannot be <code>null</code>
* @return list of values to use as both the name and value of the UI inputs; empty list if none are found
*/
- List<String> loadValues(PropertyDefinitionDynamic propertyDefinition);
+ List<DynamicConfigurationPropertyValue> loadValues(PropertyDefinitionDynamic propertyDefinition);
}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/PropertyRenderingUtility.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/PropertyRenderingUtility.java
index c73205a..0d5531e 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/PropertyRenderingUtility.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/helper/PropertyRenderingUtility.java
@@ -44,6 +44,7 @@ import javax.faces.validator.ValidatorException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.rhq.core.domain.configuration.DynamicConfigurationPropertyValue;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyDefinitionDynamic;
import org.rhq.core.domain.configuration.PropertyDynamicType;
@@ -129,11 +130,11 @@ public class PropertyRenderingUtility {
}
// Retrieve the values and load them into UI options
- List<String> values = retriever.loadValues(propertyDefinitionDynamic);
- for (String option : values) {
+ List<DynamicConfigurationPropertyValue> values = retriever.loadValues(propertyDefinitionDynamic);
+ for (DynamicConfigurationPropertyValue option : values) {
UISelectItem selectItem = FacesComponentUtility.createComponent(UISelectItem.class, null);
- selectItem.setItemLabel(option);
- selectItem.setItemValue(option);
+ selectItem.setItemLabel(option.getDisplay());
+ selectItem.setItemValue(option.getValue());
input.getChildren().add(selectItem);
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/DatabaseDynamicPropertyRetriever.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/DatabaseDynamicPropertyRetriever.java
index 3dc4e3e..ff9d0ae 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/DatabaseDynamicPropertyRetriever.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/DatabaseDynamicPropertyRetriever.java
@@ -24,6 +24,7 @@ package org.rhq.enterprise.gui.configuration;
import java.util.List;
+import org.rhq.core.domain.configuration.DynamicConfigurationPropertyValue;
import org.rhq.core.domain.configuration.PropertyDefinitionDynamic;
import org.rhq.core.gui.configuration.helper.DynamicPropertyRetriever;
import org.rhq.enterprise.server.configuration.DynamicConfigurationPropertyLocal;
@@ -36,10 +37,10 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
public class DatabaseDynamicPropertyRetriever implements DynamicPropertyRetriever {
- public List<String> loadValues(PropertyDefinitionDynamic propertyDefinition) {
+ public List<DynamicConfigurationPropertyValue> loadValues(PropertyDefinitionDynamic propertyDefinition) {
String key = propertyDefinition.getKey();
DynamicConfigurationPropertyLocal bean = LookupUtil.getDynamicConfigurationProperty();
- List<String> values = bean.lookupValues(key);
+ List<DynamicConfigurationPropertyValue> values = bean.lookupValues(key);
return values;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBean.java
index dd9f844..efe233e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBean.java
@@ -22,6 +22,7 @@
*/
package org.rhq.enterprise.server.configuration;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -33,11 +34,12 @@ import javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.configuration.DynamicConfigurationPropertyValue;
import org.rhq.enterprise.server.RHQConstants;
/**
* @see DynamicConfigurationPropertyLocal
- *
+ *
* @author Jason Dobies
*/
@Stateless
@@ -49,7 +51,7 @@ public class DynamicConfigurationPropertyBean implements DynamicConfigurationPro
private EntityManager entityManager;
@SuppressWarnings("unchecked")
- public List<String> lookupValues(String key) {
+ public List<DynamicConfigurationPropertyValue> lookupValues(String key) {
String queryName = PropertyExpressionEvaluator.getQueryNameForKey(key);
@@ -62,8 +64,21 @@ public class DynamicConfigurationPropertyBean implements DynamicConfigurationPro
}
Query query = entityManager.createNamedQuery(queryName);
- List<String> results = query.getResultList();
+ List<Object[]> results = query.getResultList();
- return results;
+ List<DynamicConfigurationPropertyValue> values =
+ new ArrayList<DynamicConfigurationPropertyValue>(results.size());
+ for (Object[] result : results) {
+ DynamicConfigurationPropertyValue value = translate(result);
+ values.add(value);
+ }
+
+ return values;
+ }
+
+ public DynamicConfigurationPropertyValue translate(Object[] results) {
+ DynamicConfigurationPropertyValue value =
+ new DynamicConfigurationPropertyValue((String) results[0], (String) results[1]);
+ return value;
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyLocal.java
index 613e28c..b2d847e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyLocal.java
@@ -24,6 +24,8 @@ package org.rhq.enterprise.server.configuration;
import java.util.List;
+import org.rhq.core.domain.configuration.DynamicConfigurationPropertyValue;
+
/**
* Responsible for retrieving configuration property values from the database.
*
@@ -39,6 +41,6 @@ public interface DynamicConfigurationPropertyLocal {
* in {@link PropertyExpressionEvaluator}
* @return list of values matching the requested key; empty list if the key is not supported
*/
- List<String> lookupValues(String key);
+ List<DynamicConfigurationPropertyValue> lookupValues(String key);
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java
index 6367f92..088fb09 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java
@@ -35,6 +35,7 @@ import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.configuration.DynamicConfigurationPropertyValue;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
@@ -58,12 +59,12 @@ public class DynamicConfigurationPropertyBeanTest extends AbstractEJB3Test {
@Test(enabled = ENABLED)
public void invalidKey() throws Exception {
// Test
- List<String> stringList = bean.lookupValues("foo");
+ List<DynamicConfigurationPropertyValue> stringList = bean.lookupValues("foo");
- // Verify
- assert stringList != null;
+ //Verify
+ assert stringList !=null;
assert stringList.size() == 0;
- }
+ }
@Test(enabled = ENABLED)
public void user() throws Exception {
@@ -71,20 +72,22 @@ public class DynamicConfigurationPropertyBeanTest extends AbstractEJB3Test {
int existingUserCount = countForQuery(Subject.QUERY_FIND_ALL);
// Test
- List<String> users = bean.lookupValues(PropertyExpressionEvaluator.KEY_USERS);
+ List<DynamicConfigurationPropertyValue> users =
+ bean.lookupValues(PropertyExpressionEvaluator.KEY_USERS);
// Verify
outputList(users);
assert users.size() == existingUserCount : "Expected: " + existingUserCount + ", Found: " + users.size();
- }
+ }
@Test(enabled = ENABLED)
- public void roles() throws Exception {
+ public void roles() throws Exception{
// Setup
int existingRoleCount = countForQuery(Role.QUERY_FIND_ALL);
// Test
- List<String> roles = bean.lookupValues(PropertyExpressionEvaluator.KEY_ROLES);
+ List<DynamicConfigurationPropertyValue> roles =
+ bean.lookupValues(PropertyExpressionEvaluator.KEY_ROLES);
// Verify
outputList(roles);
@@ -117,7 +120,8 @@ public class DynamicConfigurationPropertyBeanTest extends AbstractEJB3Test {
assert existingPackageTypes > 0 : "Package type created in setup was not written correctly";
// Test
- List<String> types = bean.lookupValues(PropertyExpressionEvaluator.KEY_PACKAGE_TYPES);
+ List<DynamicConfigurationPropertyValue> types =
+ bean.lookupValues(PropertyExpressionEvaluator.KEY_PACKAGE_TYPES);
// Verify
assert types.size() == existingPackageTypes : "Expected: " + existingPackageTypes + ", Found: " + types.size();
@@ -155,9 +159,9 @@ public class DynamicConfigurationPropertyBeanTest extends AbstractEJB3Test {
return count;
}
- private void outputList(List<String> items) {
+ private void outputList(List<DynamicConfigurationPropertyValue> items) {
System.out.println("Items returned from lookupValues:");
- for (String item : items) {
+ for (DynamicConfigurationPropertyValue item : items) {
System.out.println(item);
}
}
diff --git a/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
index 8ed6e75..f9e4467 100644
--- a/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/disk/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -25,21 +25,6 @@
<c:group name="General">
<c:simple-property name="rootDirectory" type="directory" required="true"
description="The root directory that contains all content that is to be served by this content provider. In an HA environment, this must be on a distributed file system that all servers can access."/>
-
- <c:dynamic-property name="users" displayName="User Display Name" description="TEST - List of all users in the system."
- required="true" activationPolicy="shutdown">
- <c:database-backing key="users"/>
- </c:dynamic-property>
-
- <c:dynamic-property name="roles" description="TEST - List of all roles in the system."
- readOnly="true" required="false">
- <c:database-backing key="roles"/>
- </c:dynamic-property>
-
- <c:dynamic-property name="packageTypes" description="TEST - List of all package types in the system."
- required="false" summary="true">
- <c:database-backing key="package-types"/>
- </c:dynamic-property>
</c:group>
<c:group name="Package Source">
@@ -47,8 +32,10 @@
type="boolean" description="Indicates if this instance of the plugin should act as a package source"/>
<c:simple-property name="filenameFilter" required="true" summary="true" default=".*"
description="A regular expression that identifies a file of this package type (e.g. '.*\.jar', '.*/i686/.*\.rpm$')"/>
- <c:simple-property name="packageTypeName" required="true" summary="true"
- description="The name that identifies the kind of package this type represents (e.g. 'ear', 'rpm')"/>
+ <c:dynamic-property name="packageTypeName" required="true" summary="true"
+ description="The name that identifies the kind of package this type represents (e.g. 'ear', 'rpm')">
+ <c:database-backing key="package-types"/>
+ </c:dynamic-property>
<c:simple-property name="architectureName" required="true" summary="true" default="noarch"
description="The specific hardware architecture this type of package can be deployed on. If there is no specific architecture required, use 'noarch'. (e.g. 'i686', 'amd64')"/>
<c:simple-property name="resourceTypeName" required="true" summary="true"
commit 597c60cb164470972f798c239a48ff4057721714
Merge: f530c34... d291388...
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 27 15:21:15 2010 -0500
Merge branch 'master' into raw-config
commit f530c34c291cde6ab03d94c457b05ba24ea671f5
Merge: 7640fd1... a98da0a...
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 27 12:35:23 2010 -0500
Merge branch 'raw-config' of ssh://jsanda@git.fedorahosted.org/git/rhq/rhq into raw-config
commit 7640fd1179c15b8b9da3f632fa5f114ddf070db9
Merge: b898ed3... af588cb...
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 27 12:34:11 2010 -0500
Merge branch 'master' into raw-config
Conflicts:
.classpath
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java
modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java
commit a98da0a8deb14774f961552a2b630ccdb888ccd4
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Jan 27 11:10:18 2010 -0500
Extracted construction of templating engine to pair it with SystemInfo
diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
index a7b2f12..3a29fff 100644
--- a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
+++ b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
@@ -29,9 +29,12 @@ import java.lang.reflect.Method;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
+import java.util.TreeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.template.TemplateEngine;
import org.rhq.core.util.exception.ThrowableUtil;
/**
@@ -74,7 +77,8 @@ public class SystemInfoFactory {
nativeLibraryLoadable = true;
} catch (Throwable t) {
nativeLibraryLoadable = false; // can't load the native libs if we don't even have the JNI classes
- LOG.warn("System info API not accessible on this platform (native shared library not found in java.library.path).");
+ LOG
+ .warn("System info API not accessible on this platform (native shared library not found in java.library.path).");
LOG.trace("Stack trace...", t);
}
@@ -97,8 +101,8 @@ public class SystemInfoFactory {
if (isNativeSystemInfoAvailable() && !isNativeSystemInfoDisabled()) {
try {
version = "Version=" + invokeApi(NativeApi.VERSION_STRING) + " (" + invokeApi(NativeApi.BUILD_DATE)
- + "); Native version=" + invokeApi(NativeApi.NATIVE_VERSION_STRING) + " ("
- + invokeApi(NativeApi.NATIVE_BUILD_DATE) + ")";
+ + "); Native version=" + invokeApi(NativeApi.NATIVE_VERSION_STRING) + " ("
+ + invokeApi(NativeApi.NATIVE_BUILD_DATE) + ")";
} catch (Throwable t) {
error = t;
}
@@ -308,7 +312,7 @@ public class SystemInfoFactory {
rootDir = System.getProperty("rhq.native-libraries-root-directory");
if (rootDir == null) {
jarLocation = Class.forName(NATIVE_LIBRARY_CLASS_NAME).getProtectionDomain().getCodeSource()
- .getLocation();
+ .getLocation();
if (jarLocation != null) {
// the root directory where all JNI libraries are located is the
// same directory as where the SIGAR jar is found
@@ -319,7 +323,7 @@ public class SystemInfoFactory {
rootDir = jniLocation.getAbsolutePath();
} else {
throw new Exception("Native JNI libraries cannot be found: " + "jar-location=[" + jarLocation
- + "], jni-location=[" + jniLocation + "]");
+ + "], jni-location=[" + jniLocation + "]");
}
}
}
@@ -334,4 +338,33 @@ public class SystemInfoFactory {
*/
private SystemInfoFactory() {
}
+
+ public static TemplateEngine fetchTemplateEngine() {
+
+ SystemInfo systemInfo = createSystemInfo();
+
+ Map<String, String> tokens = new HashMap<String, String>();
+ tokens.put("rhq.hostname", systemInfo.getHostname());
+ tokens.put("rhq.os.name", systemInfo.getOperatingSystemName());
+ tokens.put("rhq.os.version", systemInfo.getOperatingSystemVersion());
+ tokens.put("rhq.os.type", systemInfo.getOperatingSystemType().toString());
+ tokens.put("rhq.cpu.count", Integer.toString(systemInfo.getNumberOfCpus()));
+ tokens.put("rhq.architecture", systemInfo.getSystemArchitecture());
+
+ for (NetworkAdapterInfo networkAdapter : systemInfo.getAllNetworkAdapters()) {
+ String key = "rhq.interfaces." + networkAdapter.getName();
+ tokens.put(key + ".mac", networkAdapter.getMacAddressString());
+ tokens.put(key + ".type", networkAdapter.getType());
+ tokens.put(key + ".flags", networkAdapter.getAllFlags());
+
+ if (!networkAdapter.getUnicastAddresses().isEmpty()) {
+ tokens.put(key + ".address", networkAdapter.getUnicastAddresses().get(0).getHostAddress());
+ }
+ if (!networkAdapter.getMulticastAddresses().isEmpty()) {
+ tokens.put(key + ".multicast.address", networkAdapter.getMulticastAddresses().get(0).getHostAddress());
+ }
+ }
+ TemplateEngine templateEngine = new TemplateEngine(tokens);
+ return templateEngine;
+ }
}
\ No newline at end of file
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 1181bea..580da62 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -24,7 +24,6 @@ package org.rhq.core.pc.configuration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.maven.artifact.versioning.ComparableVersion;
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.clientapi.agent.configuration.ConfigurationAgentService;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest;
@@ -33,8 +32,6 @@ import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.RawConfiguration;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.ContainerService;
import org.rhq.core.pc.PluginContainer;
@@ -46,14 +43,12 @@ import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.util.LoggingThreadFactory;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
-import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.system.SystemInfoFactory;
import org.rhq.core.template.TemplateEngine;
-import org.rhq.enterprise.client.proxy.ResourceClientProxy.Measurement;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
-import java.util.TreeMap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
@@ -74,8 +69,6 @@ public class ConfigurationManager extends AgentService implements ContainerServi
private static final int FACET_METHOD_TIMEOUT = 60 * 1000; // 60 seconds
- private static final ComparableVersion NON_LEGACY_VERSION = new ComparableVersion("2.1");
-
private PluginContainerConfiguration pluginContainerConfiguration;
private ScheduledExecutorService threadPool;
@@ -191,15 +184,14 @@ public class ConfigurationManager extends AgentService implements ContainerServi
private void mergeRawsIntoStructured(Configuration configuration, ResourceConfigurationFacet facet) {
Configuration structuredConfig = facet.loadStructuredConfiguration();
- TemplateEngine templateEngine = fetchTemplateEngine();
-
+ TemplateEngine templateEngine = SystemInfoFactory.fetchTemplateEngine();
if (structuredConfig != null) {
prepareConfigForMergeIntoStructured(configuration, structuredConfig);
for (RawConfiguration rawConfig : configuration.getRawConfigurations()) {
String contents = templateEngine.replaceTokens(new String(rawConfig.getContents()));
- rawConfig.setContents(contents.getBytes());
+ rawConfig.setContents(contents);
structuredConfig.addRawConfiguration(rawConfig);
facet.mergeStructuredConfiguration(rawConfig, configuration);
@@ -207,29 +199,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
}
- private TemplateEngine fetchTemplateEngine() {
- Resource platformResource = PluginContainer.getInstance().getInventoryManager().getPlatform();
- TreeMap<String, String> tokens = new TreeMap<String, String>();
- tokens.put("rhq.hostname", platformResource.getName());
-
-
- MeasurementFacet facet = componentService.getComponent(platformResource.getId(), MeasurementFacet.class,
- FacetLockType.READ, FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
-
-
-
- for (Resource childResource : platformResource.getChildResources()) {
- if (childResource.getResourceType().getName().equals("Network Adapter" )){
- String key = "rhq.interfaces."+childResource.getName()+".mac";
- tokens.put(key ,childResource.getDescription());
- }
- }
-
-
- TemplateEngine templateEngine = new TemplateEngine(tokens);
- return templateEngine;
- }
-
+
private void prepareConfigForMergeIntoStructured(Configuration config, Configuration latestStructured) {
config.getAllProperties().clear();
for (Property property : latestStructured.getProperties()) {
commit b898ed3cce86c40d6369473b5f4af21bced14ef9
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jan 27 10:46:39 2010 -0500
Fixing rerendering logic to display updated path name label
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 7af5f2d..e40b9f1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -204,9 +204,7 @@ THIS TEXT WILL BE REMOVED.
<rich:panelMenu mode="ajax"
expandMode="client"
iconCollapsedGroup="/images/icn_tree_folder.gif"
- iconExpandedGroup="/images/icn_tree_folder.gif"
- limitToList="true"
- reRender="fileContents">
+ iconExpandedGroup="/images/icn_tree_folder.gif">
<c:forEach items="#{rawConfigDirectories}"
var="rawConfigDir">
<rich:panelMenuGroup label="#{rawConfigDir.path}"
@@ -219,7 +217,7 @@ THIS TEXT WILL BE REMOVED.
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
limitToList="true"
- reRender="fileContents,selectedFileHeader,modalEditor"/>
+ reRender="fileContents,selectedFileHeader,modalEditor,fileMenu"/>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
@@ -241,7 +239,7 @@ THIS TEXT WILL BE REMOVED.
<a4j:status id="selectedFileHeader"
startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
</h:panelGrid>
<rich:panel style="margin-left:1px; border: none;">
commit a91ec38042f668b5db1d74701988b18dffdf7aeb
Merge: d31a520... c435e7f...
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Jan 27 09:18:51 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config-confirm
commit c435e7fc9cc1848c9a9c0d1f32cc1da30d5b3234
Merge: a15c771... 9ba9416...
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Jan 26 13:38:36 2010 -0500
Merge branch 'master' into raw-config
Conflicts:
.classpath
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
diff --cc modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
index 15424a2,f485fc7..126fb6f
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
@@@ -16,17 -17,15 +17,25 @@@
<component class="org.jboss.seam.web.MultipartFilter">
- <property name="createTempFiles">false</property>
+ <property name="createTempFiles">true</property>
<property name="maxRequestSize">1000000</property>
+ <property name="urlPattern">*.xhtml</property>
</component>
- <!-- Load i18n bundles -->
+ <component class="org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean"
+ name="ExistingResourceConfigurationViewUIBean"
+ scope="page"/>
+
+ <component class="org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean"
+ name="ExistingResourceConfigurationUIBean"
+ scope="session"/>
+
++ <!-- Load i18n bundles -->
+ <core:resource-loader>
+ <core:bundle-names>
+ <value>messages</value>
+ <value>ApplicationResources</value>
+ </core:bundle-names>
- </core:resource-loader>
++ </core:resource-loader>
++
</components>
diff --cc modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
index 55d5751,ad0766d..7a9ebd9
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
@@@ -330,9 -318,4 +335,8 @@@ public class TestContentProvider implem
return null;
}
-
+ public SyncProgressWeight getSyncProgressWeight() {
+ return SyncProgressWeight.DEFAULT_WEIGHTS;
+ }
+
}
commit a15c771e767126dcf08873fc21dad50c55fbefd5
Merge: bb4bdd7... 8b86c0b...
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Jan 26 13:29:47 2010 -0500
Merge branch 'raw-config' of ssh://jsanda@git.fedorahosted.org/git/rhq/rhq into raw-config
commit bb4bdd7e2b9c061ca663c75ee0b5a503c5ecbaa5
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Jan 26 13:21:56 2010 -0500
Refactoring RawConfiguration entity to store file contents as a string instead of as an array of bytes
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
index 04d5fb3..947606e 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/config-schema.xml
@@ -114,7 +114,7 @@
<column name="ID" type="INTEGER" required="true" default="sequence-only" initial="10001" primarykey="true"/>
<column name="CONFIG_ID" type="INTEGER" required="true" references="RHQ_CONFIG(ID)"/>
<column name="PATH" type="VARCHAR2" required="false" size="512"/>
- <column name="CONTENTS" type="BLOB" required="true"/>
+ <column name="CONTENTS" type="CLOB" required="true"/>
<column name="SHA256" type="VARCHAR2" size="64" required="true"/>
<column name="CTIME" type="LONG" required="true"/>
<column name="MTIME" type="LONG" required="true"/>
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 5e8a703..86b4aa4 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -1498,7 +1498,7 @@
<schema-addColumn table="RHQ_RAW_CONFIG" column="CONTENTS" columnType="BLOB"/>
<schema-alterColumn table="RHQ_RAW_CONFIG"
column="CONTENTS"
- columnType="BLOB"
+ columnType="CLOB"
nullable="false"/>
<schema-addColumn table="RHQ_RAW_CONFIG" column="SHA256" columnType="VARCHAR2"/>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/RawConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/RawConfiguration.java
index 1bb27c9..e4e3d7e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/RawConfiguration.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/RawConfiguration.java
@@ -25,12 +25,14 @@ package org.rhq.core.domain.configuration;
import org.rhq.core.util.MessageDigestGenerator;
+import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
@@ -41,10 +43,8 @@ import java.io.Serializable;
/**
* Resources support structured configuration as well as raw configuration which is represented by this class. A raw
* configuration is typically in the form of a file on the file system. This could be httpd.conf in the case of apache.
- * Note however that while a raw configuration generally refers to some configuration file, this class does not limit
- * the actual configuration source to files.
* <p/>
- * A raw configuration is stored as an array of bytes and has a SHA-256 hash with which it can be uniquely identified.
+ * A raw configuration is stored as a CLOB and has a SHA-256 hash with which it can be uniquely identified.
* <p/>
* A RawConfiguration is always associated with its parent {@link org.rhq.core.domain.configuration.Configuration} which
* can be structured, raw, or both. A Configuration can have multiple RawConfigurations associated with it. Suppose for
@@ -67,8 +67,9 @@ public class RawConfiguration implements Serializable, DeepCopyable<RawConfigura
@Column(name = "PATH", nullable = true)
private String path;
+ @Lob
@Column(name = "CONTENTS", nullable = false)
- private byte[] contents;
+ private String contents;
@Column(name = "SHA256", nullable = false)
private String sha256;
@@ -83,6 +84,7 @@ public class RawConfiguration implements Serializable, DeepCopyable<RawConfigura
@JoinColumn(name = "CONFIG_ID", nullable = false)
private Configuration configuration;
+ /** @return The database identifier or primary key */
public int getId() {
return id;
}
@@ -91,77 +93,62 @@ public class RawConfiguration implements Serializable, DeepCopyable<RawConfigura
this.id = id;
}
+ /** @return The file system path of the configuration that this object represents */
public String getPath() {
return path;
}
+ /** @param path The new file system path of the configuration file represented by this object */
public void setPath(String path) {
this.path = path;
}
- /**
- * Returns a copy of the contents as an array of bytes. Modifications to the underlying array have to happen through
- * {@link #setContents(byte[])}; otherwise, we could wind up with an incorrect SHA-256 hash. This behavior is
- * enforced by returning a copy instead of a reference to the underlying array. By returning a copy, callers can only
- * modify the underlying array by calling the setter.
- *
- * @return A copy of the file contents as an array of bytes
- */
- public byte[] getContents() {
- return copy(contents);
+ /** @return The contents of the raw configuration which typically will be a file */
+ public String getContents() {
+ return contents;
}
/**
- * Replaces the contents of this raw config with a copy of the specified bytes. The SHA-256 hash returned from
- * {@link #getSha256()} will be changed as well, provided the contents actually changed in some way.
+ * Replaces the contents of the raw configuration. The SHA-256 hash returned from {@link #getSha256()} will be
+ * updated as well.
*
- * @param newContents The new bytes
+ * @param contents The new contents
*/
- public void setContents(byte[] newContents) {
- this.contents = copy(newContents);
+ public void setContents(String contents) {
+ this.contents = contents;
updateSha256();
}
- private byte[] copy(byte[] original) {
- byte[] copy = new byte[original.length];
- for (int i = 0; i < original.length; ++i) {
- copy[i] = original[i];
- }
- return copy;
- }
-
private void updateSha256() {
MessageDigestGenerator sha256Generator = new MessageDigestGenerator("SHA-256");
- sha256Generator.add(contents);
+ sha256Generator.add(contents.getBytes());
sha256 = sha256Generator.getDigestString();
}
- /** @return A SHA-256 hash of the bytes for this raw configuration, which can be accessed via {@link #getContents()} */
+ /**
+ * @return A SHA-256 hash of the contents for this raw configuration, which can be accessed via
+ * {@link #getContents()}
+ */
public String getSha256() {
return sha256;
}
+ /** @return A timestamp of when this object was created */
public long getCtime() {
return ctime;
}
- public void setCtime(long ctime) {
- this.ctime = ctime;
- }
-
+ /** @return A timestamp of when this object was last modified */
public long getMtime() {
return mtime;
}
- public void setMtime(long mtime) {
- this.mtime = mtime;
- }
-
/** @return The owning {@link org.rhq.core.domain.configuration.Configuration} object */
public Configuration getConfiguration() {
return configuration;
}
+ /** @param configuration The parent configuration object */
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
@@ -228,6 +215,15 @@ public class RawConfiguration implements Serializable, DeepCopyable<RawConfigura
return sha256.hashCode() * path.hashCode() * 37;
}
+ /**
+ * Returns a string representation of this object that is in the following format,
+ *
+ * <code>
+ * RawConfiguration[id=1, path=/foo/bar/raw.txt, sha256=13xcx9sd82e, configuration=<configuration.toString()>]
+ * </code>
+ *
+ * @return A string representation of this object
+ */
@Override
public String toString() {
return new StringBuilder()
@@ -240,6 +236,13 @@ public class RawConfiguration implements Serializable, DeepCopyable<RawConfigura
.toString();
}
+ /**
+ * Creates a deep copy of this object that includes all of the properties except for the parent configuration. If
+ * the <code>keepId</code> flag is <code>false</code>, then the id property is not copied.
+ *
+ * @param keepId A flag indicating whether or not the id should be copied
+ * @return A copy of this object
+ */
public RawConfiguration deepCopy(boolean keepId) {
RawConfiguration copy = new RawConfiguration();
if (keepId) {
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/ConfigurationTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/ConfigurationTest.java
index c1aba0c..e9fa2d9 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/ConfigurationTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/ConfigurationTest.java
@@ -417,14 +417,14 @@ public class ConfigurationTest {
}
private RawConfiguration createRawConfiguration(String path) {
- byte[] contents = new byte[10];
+ byte[] bytes = new byte[10];
Random random = new Random();
- random.nextBytes(contents);
+ random.nextBytes(bytes);
RawConfiguration rawConfig = new RawConfiguration();
rawConfig.setPath(path);
- rawConfig.setContents(contents);
+ rawConfig.setContents(new String(bytes));
return rawConfig;
}
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationIntegrationTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationIntegrationTest.java
index bbd9ff5..65a0773 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationIntegrationTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationIntegrationTest.java
@@ -40,7 +40,7 @@ public class RawConfigurationIntegrationTest extends AbstractEJB3Test {
RawConfiguration rawConfig = new RawConfiguration();
rawConfig.setConfiguration(config);
- rawConfig.setContents(new byte[] {1, 2, 3, 4, 5});
+ rawConfig.setContents("contents");
rawConfig.setPath("/tmp/foo.txt");
entityMgr.persist(rawConfig);
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationTest.java
index 3a373b2..12e7ed0 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationTest.java
@@ -39,44 +39,9 @@ import java.io.IOException;
public class RawConfigurationTest {
@Test
- public void getContentsShouldReturnADeepCopyOfArray() {
- RawConfiguration rawConfig = new RawConfiguration();
- rawConfig.setContents(getBytes());
-
- byte[] contents = rawConfig.getContents();
- contents[0] = 5;
-
- assertEquals(
- rawConfig.getContents(),
- getBytes(),
- "The contents property should only be mutable through setContents(). Therefore getContents() must return a copy of the underlying array."
- );
- }
-
- @Test
- public void setContentsShouldUpdateContentsArrayWithCopyOfSpecifiedValue() {
- byte[] bytes = getBytes();
-
- RawConfiguration rawConfig = new RawConfiguration();
- rawConfig.setContents(bytes);
-
- bytes[0] = 9;
-
- assertEquals(
- rawConfig.getContents(),
- getBytes(),
- "setContents() should update the underlying array to refer to a copy of the incoming array to enforce the contents property being mutable only through setContents()."
- );
- }
-
- byte[] getBytes() {
- return new byte[] {1, 2, 3};
- }
-
- @Test
public void sha256ShouldChangeWhenContentsChange() throws Exception {
RawConfiguration rawConfig = new RawConfiguration();
- rawConfig.setContents(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
+ rawConfig.setContents("contents");
String actualSha256 = rawConfig.getSha256();
@@ -84,7 +49,7 @@ public class RawConfigurationTest {
assertEquals(actualSha256, expectedSha256, "Failed to calculate the SHA-256 correctly.");
- byte[] newContents = new byte[] {1, 3, 5, 7, 11, 13, 17, 19, 23};
+ String newContents = "new contents";
rawConfig.setContents(newContents);
actualSha256 = rawConfig.getSha256();
@@ -94,8 +59,8 @@ public class RawConfigurationTest {
assertEquals(actualSha256, expectedSha256, "Failed to update sha256 when contents property changes");
}
- String calculateSHA256(byte[] data) throws DecoderException {
- return DigestUtils.sha256Hex(data);
+ String calculateSHA256(String string) throws DecoderException {
+ return DigestUtils.sha256Hex(string);
}
@Test
@@ -124,7 +89,7 @@ public class RawConfigurationTest {
@Test
public void verifyEqualsWhenRawConfigurationArgHasNullContents() {
RawConfiguration r1 = new RawConfiguration();
- r1.setContents(getBytes());
+ r1.setContents("contents");
RawConfiguration r2 = new RawConfiguration();
@@ -134,11 +99,11 @@ public class RawConfigurationTest {
@Test
public void verifyEqualsWhenRawConfigurationArgHasNullPath() {
RawConfiguration r1 = new RawConfiguration();
- r1.setContents(getBytes());
+ r1.setContents("contents");
r1.setPath("/tmp/foo");
RawConfiguration r2 = new RawConfiguration();
- r2.setContents(getBytes());
+ r2.setContents("contents");
assertFalse(r1.equals(r2), "equals() should return false when one of the raw configs does not have its paths set");
}
@@ -153,10 +118,10 @@ public class RawConfigurationTest {
@Test
public void verifyEqualsAndHashCodeAreSymmetricWhenPathIsNull() {
RawConfiguration r1 = new RawConfiguration();
- r1.setContents(getBytes());
+ r1.setContents("contents");
RawConfiguration r2 = new RawConfiguration();
- r2.setContents(getBytes());
+ r2.setContents("contents");
assertTrue(r1.equals(r2), "equals() should be true when contents are the same and path is null for both.");
assertTrue(r2.equals(r1), "equals() should be symmetric.");
@@ -167,11 +132,11 @@ public class RawConfigurationTest {
@Test
public void verifyEqualsAndHashCodeAreSymmetricWhenPathIsNotNull() {
RawConfiguration r1 = new RawConfiguration();
- r1.setContents(getBytes());
+ r1.setContents("contents");
r1.setPath("/tmp/foo");
RawConfiguration r2 = new RawConfiguration();
- r2.setContents(getBytes());
+ r2.setContents("contents");
r2.setPath("/tmp/foo");
assertTrue(r1.equals(r2), "equals() should be true when contents and paths are the same.");
@@ -182,14 +147,16 @@ public class RawConfigurationTest {
@Test
public void verifyEqualsAndHashCodeTransitiveWhenPathIsNull() {
+ String contents = "contents";
+
RawConfiguration r1 = new RawConfiguration();
- r1.setContents(getBytes());
+ r1.setContents(contents);
RawConfiguration r2 = new RawConfiguration();
- r2.setContents(getBytes());
+ r2.setContents(contents);
RawConfiguration r3 = new RawConfiguration();
- r3.setContents(getBytes());
+ r3.setContents(contents);
assertTrue(r1.equals(r2) && r2.equals(r3), "equals() should be true when contents are the same and paths are null.");
assertTrue(r1.equals(r3), "equals() should be transitive when contents are the same and paths are null.");
@@ -199,16 +166,18 @@ public class RawConfigurationTest {
@Test
public void verifyEqualsAndHashCodeTransitiveWhenPathIsNotNull() {
+ String contents = "contents";
+
RawConfiguration r1 = new RawConfiguration();
- r1.setContents(getBytes());
+ r1.setContents(contents);
r1.setPath("/tmp/foo");
RawConfiguration r2 = new RawConfiguration();
- r2.setContents(getBytes());
+ r2.setContents(contents);
r2.setPath("/tmp/foo");
RawConfiguration r3 = new RawConfiguration();
- r3.setContents(getBytes());
+ r3.setContents(contents);
r3.setPath("/tmp/foo");
assertTrue(r1.equals(r2) && r2.equals(r3), "equals() should be true when contents and paths are the same.");
@@ -244,22 +213,22 @@ public class RawConfigurationTest {
@Test
public void deepCopyShouldCopyContentsWhenCopyingId() {
RawConfiguration original = new RawConfiguration();
- original.setContents(new byte[] {1, 2, 3, 4, 5});
+ original.setContents("contents");
RawConfiguration copy = original.deepCopy(true);
- assertFalse(original.getContents() == copy.getContents(), "The values in the contents array should be copied, not the reference to the original object.");
+ assertEquals(original.getContents(), copy.getContents(), "Failed to copy the contents property");
assertEquals(copy.getContents(), original.getContents(), "Failed to copy contents property.");
}
@Test
public void deepCopyShouldCopyContentsWhenNotCopyingId() {
RawConfiguration original = new RawConfiguration();
- original.setContents(new byte[] {1, 2, 3, 4, 5});
+ original.setContents("contents");
RawConfiguration copy = original.deepCopy(false);
- assertFalse(original.getContents() == copy.getContents(), "The values in the contents array should be copied, not the reference to the original object.");
+ assertEquals(original.getContents(), copy.getContents(), "Failed to copy the contents property");
assertEquals(copy.getContents(), original.getContents(), "Failed to copy contents property.");
}
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/test/ConfigurationTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/test/ConfigurationTest.java
index 109031a..17920ec 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/test/ConfigurationTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/configuration/test/ConfigurationTest.java
@@ -255,7 +255,7 @@ public class ConfigurationTest extends AbstractEJB3Test {
RawConfiguration createRawConfiguration() {
RawConfiguration rawConfig = new RawConfiguration();
- rawConfig.setContents(new byte[] {1, 2, 3, 4, 5});
+ rawConfig.setContents("contents");
rawConfig.setPath("/tmp/foo");
return rawConfig;
diff --git a/modules/core/domain/src/test/resources/META-INF/persistence.xml b/modules/core/domain/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..018ea4d
--- /dev/null
+++ b/modules/core/domain/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,37 @@
+<!--
+ ~ RHQ Management Platform
+ ~ Copyright (C) 2005-2008 Red Hat, Inc.
+ ~ All rights reserved.
+ ~
+ ~ This program is free software; you can redistribute it and/or modify
+ ~ it under the terms of the GNU General Public License as published by
+ ~ the Free Software Foundation version 2 of the License.
+ ~
+ ~ This program 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 General Public License for more details.
+ ~
+ ~ You should have received a copy of the GNU General Public License
+ ~ along with this program; if not, write to the Free Software
+ ~ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ -->
+
+<persistence xmlns="http://java.sun.com/xml/ns/persistence">
+ <persistence-unit name="rhq-test" transaction-type="RESOURCE_LOCAL">
+ <jar-file>target/classes</jar-file>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
+ <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
+ <property name="hibernate.connection.username" value="rhqadmin"/>
+ <property name="hibernate.connection.password" value="rhqadmin"/>
+ <property name="hibernate.connection.url" value="jdbc:postgresql://127.0.0.1:5432/rhq"/>
+ <property name="hibernate.jdbc.batch_size" value="30"/>
+ <property name="hibernate.cache.use_second_level_cache" value="false"/>
+ <property name="hibernate.show_sql" value="true" />
+ <property name="hibernate.format_sql" value="true" />
+ <property name="hibernate.use_sql_comments" value="true" />
+ <property name="hibernate.connection.autocommit" value="false"/>
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
index 1f8b2b7..bccbc56 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
@@ -44,15 +44,15 @@ public class ConfigManagementFactoryImpl implements ConfigManagementFactory {
}
public ConfigManagement getStrategy(int resourceId) throws PluginContainerException {
- ConfigManagement loadConfig = createStrategy(resourceId);
- initStrategyDependencies(loadConfig);
+ ConfigManagement configManagement = createStrategy(resourceId);
+ initStrategyDependencies(configManagement);
- return loadConfig;
+ return configManagement;
}
- private void initStrategyDependencies(ConfigManagement loadConfig) {
- loadConfig.setComponentService(componentService);
- loadConfig.setConfigurationUtilityService(configUtilityService);
+ private void initStrategyDependencies(ConfigManagement configManagement) {
+ configManagement.setComponentService(componentService);
+ configManagement.setConfigurationUtilityService(configUtilityService);
}
private ConfigManagement createStrategy(int resourceId) throws PluginContainerException {
@@ -70,16 +70,16 @@ public class ConfigManagementFactoryImpl implements ConfigManagementFactory {
return new StructuredAndRawConfigManagement();
case STRUCTURED:
default:
- boolean daemonOnly = true;
- boolean onlyIfStarted = true;
- ResourceComponent resourceComponent = componentService.getComponent(resourceId,
- ResourceComponent .class, FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT,
- daemonOnly, onlyIfStarted);
- if (resourceComponent instanceof ResourceConfigurationFacet){
- return new StructuredConfigManagement();
- }else{
- return new LegacyConfigManagement();
- }
+ boolean daemonOnly = true;
+ boolean onlyIfStarted = true;
+ ResourceComponent resourceComponent = componentService.getComponent(resourceId,
+ ResourceComponent.class, FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT,
+ daemonOnly, onlyIfStarted);
+ if (resourceComponent instanceof ResourceConfigurationFacet){
+ return new StructuredConfigManagement();
+ } else{
+ return new LegacyConfigManagement();
+ }
}
}
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImplTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImplTest.java
index 4864fe2..32888ad 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImplTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImplTest.java
@@ -25,13 +25,13 @@ package org.rhq.core.pc.configuration;
import static org.testng.Assert.*;
+import org.rhq.core.pc.util.FacetLockType;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
-import org.rhq.core.pc.util.ComponentService;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
-import org.rhq.test.JMockTest;
import org.jmock.Expectations;
public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
@@ -51,24 +51,17 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
}
@Test
- public void factoryShouldReturnLegacyLoadConfigWhenAmpsVersionIsLessThan2dot1() throws Exception {
- context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(LEGACY_AMPS_VERSION));
- }});
-
- ConfigManagement loadConfig = factory.getStrategy(resourceId);
-
- assertTrue(
- loadConfig instanceof LegacyConfigManagement,
- "Expected to get an instance of " + LegacyConfigManagement.class.getSimpleName() + " when the " +
- "resource is from a plugin having an ampsVersion less than " + NON_LEGACY_AMPS_VERSION
- );
- }
+ public void factoryShouldInitializeLegacyConfigMgmtWithComponentService() throws Exception {
+ final boolean daemonOnly = true;
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
- @Test
- public void factoryShouldInitializeLegacyLoadConfigWithComponentService() throws Exception {
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(LEGACY_AMPS_VERSION));
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
+
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(createResourceTypeThatSupportsStructured()));
}});
ConfigManagement loadConfig = factory.getStrategy(resourceId);
@@ -77,20 +70,14 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
}
@Test
- public void factoryShouldInitializeLegacyLoadConfigWithConfigurationUtilityService() throws Exception {
- context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(LEGACY_AMPS_VERSION));
- }});
-
- ConfigManagement loadConfig = factory.getStrategy(resourceId);
-
- assertConfigurationUtilityServiceInitialized(loadConfig);
- }
+ public void factoryShouldInitializeLegacyConfigMgmtWithConfigurationUtilityService() throws Exception {
+ final boolean daemonOnly = true;
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
- @Test
- public void factoryShouldReturnStructuredLoadConfigWhenAmpsVersionIs2dot1AndFormatIsStructured() throws Exception {
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
allowing(componentService).getResourceType(resourceId);
will(returnValue(createResourceTypeThatSupportsStructured()));
@@ -98,18 +85,19 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
ConfigManagement loadConfig = factory.getStrategy(resourceId);
- assertTrue(
- loadConfig instanceof StructuredConfigManagement,
- "Expected to get an instance of " + StructuredConfigManagement.class.getSimpleName() +
- "when resource is from a plugin having an ampsversion >= " + NON_LEGACY_AMPS_VERSION + " and the resource " +
- "configuration format is structured."
- );
+ assertConfigurationUtilityServiceInitialized(loadConfig);
}
@Test
- public void factoryShouldInitializeLoadStructuredWithComponentService() throws Exception {
+ public void factoryShouldInitializeStructuredConfigMgmtWithComponentService() throws Exception {
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
+
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
+ boolean daemonOnly = true;
+
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
allowing(componentService).getResourceType(resourceId);
will(returnValue(createResourceTypeThatSupportsStructured()));
@@ -121,9 +109,15 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
}
@Test
- public void factoryShouldInitializeLoadStructuredWithConfigurationUtilityService() throws Exception {
+ public void factoryShouldInitializeStructuredConfigMgmtWithConfigurationUtilityService() throws Exception {
+ final boolean daemonOnly = true;
+
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
+
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
allowing(componentService).getResourceType(resourceId);
will(returnValue(createResourceTypeThatSupportsStructured()));
@@ -135,28 +129,15 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
}
@Test
- public void factoryShouldReturnLoadRawWhenAmpsVersionIs2dot1AndFormatIsRaw() throws Exception {
- context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
-
- allowing(componentService).getResourceType(resourceId);
- will(returnValue(createResourceTypeThatSupportsRaw()));
- }});
-
- ConfigManagement loadConfig = factory.getStrategy(resourceId);
+ public void factoryShouldInitializeRawConfigMgmtWithComponentService() throws Exception {
+ final boolean daemonOnly = true;
- assertTrue(
- loadConfig instanceof RawConfigManagement,
- "Expected to get an instance of " + RawConfigManagement.class.getSimpleName() + " when " +
- "resource is from a plugin having an ampsversion >= " + NON_LEGACY_AMPS_VERSION + " and the resource " +
- "configuration format is raw."
- );
- }
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
- @Test
- public void factoryShouldInitializeLoadRawWithComponentService() throws Exception {
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
allowing(componentService).getResourceType(resourceId);
will(returnValue(createResourceTypeThatSupportsStructured()));
@@ -168,9 +149,15 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
}
@Test
- public void factoryShouldInitializeLoadRawWithConfigurationUtilityService() throws Exception {
+ public void factoryShouldInitializeRawConfigMgmtWithConfigurationUtilityService() throws Exception {
+ final boolean daemonOnly = true;
+
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
+
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
allowing(componentService).getResourceType(resourceId);
will(returnValue(createResourceTypeThatSupportsStructured()));
@@ -182,28 +169,15 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
}
@Test
- public void factoryShouldReturnLoadStructuredAndRawWhenAmpsVersionIs2dot1AndFormatIsBoth() throws Exception {
- context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
-
- allowing(componentService).getResourceType(resourceId);
- will(returnValue(createResourceTypeThatSupportsStructuredAndRaw()));
- }});
-
- ConfigManagement loadConfig = factory.getStrategy(resourceId);
+ public void factoryShouldInitializeLoadStructuredAndRawWithComponentService() throws Exception {
+ final boolean daemonOnly = true;
- assertTrue(
- loadConfig instanceof StructuredAndRawConfigManagement,
- "Expected to get an instance of" + StructuredAndRawConfigManagement.class.getSimpleName() +
- " when resource is from a plugin having an ampsVersion >= " + NON_LEGACY_AMPS_VERSION + " and the " +
- "resource configuration format is both (structured and raw)."
- );
- }
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
- @Test
- public void factoryShouldInitializeLoadStructuredAndRawWithComponentService() throws Exception {
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
allowing(componentService).getResourceType(resourceId);
will(returnValue(createResourceTypeThatSupportsStructured()));
@@ -216,25 +190,32 @@ public class ConfigManagementFactoryImplTest extends ConfigManagementTest {
@Test
public void factoryShouldInitializeLoadStructuredAndRawWithConfigurationUtilityService() throws Exception {
+ final boolean daemonOnly = true;
+ final boolean onlyIfStarted = true;
+
+ final ResourceComponent resourceComponent = context.mock(ResourceComponent.class);
+
context.checking(new Expectations() {{
- allowing(componentService).getAmpsVersion(resourceId); will(returnValue(NON_LEGACY_AMPS_VERSION));
+ allowing(componentService).getComponent(resourceId, ResourceComponent.class, FacetLockType.READ,
+ ConfigManagement.FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ will(returnValue(resourceComponent));
allowing(componentService).getResourceType(resourceId);
will(returnValue(createResourceTypeThatSupportsStructured()));
}});
- ConfigManagement loadConfig = factory.getStrategy(resourceId);
+ ConfigManagement configManagement = factory.getStrategy(resourceId);
- assertConfigurationUtilityServiceInitialized(loadConfig);
+ assertConfigurationUtilityServiceInitialized(configManagement);
}
- void assertComponentServiceInitialized(ConfigManagement loadConfig) {
- assertNotNull(loadConfig.getComponentService(), "The factory must initialize the componentService " +
+ void assertComponentServiceInitialized(ConfigManagement configMgmt) {
+ assertNotNull(configMgmt.getComponentService(), "The factory must initialize the componentService " +
"property of the loadConfig object.");
}
- void assertConfigurationUtilityServiceInitialized(ConfigManagement loadConfig) {
- assertNotNull(loadConfig.getConfigurationUtilityService(), "The factory must initialize the " +
+ void assertConfigurationUtilityServiceInitialized(ConfigManagement configMgmt) {
+ assertNotNull(configMgmt.getConfigurationUtilityService(), "The factory must initialize the " +
"configurationUtilityService property of the loadConfig object.");
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java
index b9c3415..f55ca5a 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java
@@ -77,7 +77,7 @@ public class ConfigManagementTest extends JMockTest {
RawConfiguration createRawConfiguration(String path) {
RawConfiguration rawConfig = new RawConfiguration();
- rawConfig.setContents(randomBytes());
+ rawConfig.setContents(new String(randomBytes()));
rawConfig.setPath(path);
return rawConfig;
@@ -103,11 +103,6 @@ public class ConfigManagementTest extends JMockTest {
actualConfig.getRawConfigurations(),
"The raw configs were not loaded correctly."
);
-// assertEquals(
-// actualConfig.getRawConfigurations(),
-// expectedRaws,
-// "The raw configs were not loaded correctly."
-// );
}
void assertStructuredLoaded(Configuration expectedConfig, Configuration actualConfig) {
@@ -116,12 +111,6 @@ public class ConfigManagementTest extends JMockTest {
actualConfig.getProperties(),
"The structured configuration was not loaded correctly."
);
-
-// assertEquals(
-// actualConfig.getAllProperties(),
-// expectedConfig.getAllProperties(),
-// "The structured configuration was not loaded correctly."
-// );
}
void assertNotesSetToDefault(Configuration loadedConfig) {
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 98eec26..150f055 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -351,7 +351,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
} else {
current = new RawConfiguration();
current.setPath("/dev/null");
- current.setContents("".getBytes());
+ current.setContents("");
}
}
return current;
@@ -488,7 +488,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
String original = new String(getCurrent().getContents());
if (!updated.equals(original)) {
current = current.deepCopy(false);
- current.setContents(updated.getBytes());
+ current.setContents(updated);
markCurrentRawConfigUIBeanModified();
getModified().put(current.getPath(), current);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 4248ad6..bdeffb8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -1930,20 +1930,6 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
return update;
}
- public Collection<RawConfiguration> findRawConfigurationsByConfigurationId(int configId) {
- Configuration config = entityManager.find(Configuration.class, configId);
-
- if (config == null) {
- return Collections.EMPTY_LIST;
- }
-
- return config.getRawConfigurations();
- }
-
- public RawConfiguration findRawConfigurationById(int rawConfigId) {
- return entityManager.find(RawConfiguration.class, rawConfigId);
- }
-
public Configuration translateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,
boolean fromStructured) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
index f54254c..f3e7d8b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
@@ -482,10 +482,6 @@ public interface ConfigurationManagerLocal {
*/
ConfigurationDefinition getPackageTypeConfigurationDefinition(Subject subject, int packageTypeId);
- Collection<RawConfiguration> findRawConfigurationsByConfigurationId(int configId);
-
- RawConfiguration findRawConfigurationById(int rawConfigId);
-
Configuration translateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,
boolean fromStructured) throws ResourceNotFoundException, TranslationNotSupportedException;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
index 9281e14..c3bad13 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
@@ -932,72 +932,6 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
}
}
- @Test
- public void testFindRawConfigurationById() throws Exception {
- Configuration config = persistNewConfigWithRawConfigs();
-
- getTransactionManager().begin();
- EntityManager entityMgr = getEntityManager();
-
- try {
- for (RawConfiguration rawConfig : config.getRawConfigurations()) {
- assertNotNull(
- "Failed to find raw config by id[" + rawConfig.getId() + "]",
- entityMgr.find(RawConfiguration.class, rawConfig.getId())
- );
- }
- }
- finally {
- getTransactionManager().rollback();
-
- getTransactionManager().begin();
- delete(config);
- getTransactionManager().commit();
- }
- }
-
- @Test
- public void testFindRawConfigurationsByConfigurationId() throws Exception {
- Configuration config = persistNewConfigWithRawConfigs();
-
- getTransactionManager().begin();
-
- try {
- Collection<RawConfiguration> rawConfigs = configurationManager.findRawConfigurationsByConfigurationId(
- config.getId());
-
- assertEquals("Failed to find raw configs for " + config, config.getRawConfigurations().size(), rawConfigs.size());
- }
- finally {
- getTransactionManager().rollback();
-
- getTransactionManager().begin();
- delete(config);
- getTransactionManager().commit();
- }
- }
-
- Configuration persistNewConfigWithRawConfigs() throws Exception {
- getTransactionManager().begin();
-
- Configuration config = new Configuration();
- config.addRawConfiguration(createRawConfiguration("12345"));
- config.addRawConfiguration(createRawConfiguration("54321"));
-
- persist(config);
-
- getTransactionManager().commit();
-
- return config;
- }
-
- RawConfiguration createRawConfiguration(String sha256) {
- RawConfiguration rawConfig = new RawConfiguration();
- rawConfig.setContents(new byte[] {});
-
- return rawConfig;
- }
-
void persist(Object entity) throws Exception {
EntityManager entityMgr = getEntityManager();
getEntityManager().persist(entity);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java
index 5ba68e1..fa50d29 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java
@@ -187,52 +187,55 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
configurationMgr.updateResourceConfiguration(fixture.subject, fixture.resourceId, fixture.configuration);
}
- @Test
- public void updateResourceConfigShouldTranslateStructuredWhenStructredConfigHasEdits() throws Exception {
- final ResourceConfigUpdateFixture fixture = newStructuredAndRawResourceConfigUpdateFixture();
-
- final Configuration translatedConfig = fixture.configuration.deepCopy();
- translatedConfig.addRawConfiguration(new RawConfiguration());
-
- final ResourceConfigurationUpdate expectedUpdate = new ResourceConfigurationUpdate(fixture.resource,
- translatedConfig, fixture.subject.getName());
- expectedUpdate.setId(-1);
-
- final AgentClient agentClient = context.mock(AgentClient.class);
- final ConfigurationAgentService configAgentService = context.mock(ConfigurationAgentService.class);
-
- final ConfigurationUpdateRequest expectedUpdateRequest = new ConfigurationUpdateRequest(expectedUpdate.getId(),
- expectedUpdate.getConfiguration(), expectedUpdate.getResource().getId());
-
- final Sequence configUdpate = context.sequence("structured-config-update");
-
- context.checking(new Expectations() {{
- allowing(entityMgr).find(Resource.class, fixture.resourceId); will(returnValue(fixture.resource));
-
- allowing(authorizationMgr).canViewResource(fixture.subject, fixture.resourceId); will(returnValue(true));
-
- oneOf(configAgentService).merge(fixture.configuration, fixture.resourceId, FROM_STRUCTURED);
- will(returnValue(translatedConfig)); inSequence(configUdpate);
-
- oneOf(configurationMgrLocal).persistNewResourceConfigurationUpdateHistory(fixture.subject,
- fixture.resourceId, translatedConfig, INPROGRESS, fixture.subject.getName(),
- fixture.isPartOfGroupUpdate);
- will(returnValue(expectedUpdate));
- inSequence(configUdpate);
-
- allowing(agentMgr).getAgentClient(expectedUpdate.getResource().getAgent()); will(returnValue(agentClient));
-
- allowing(agentClient).getConfigurationAgentService(); will(returnValue(configAgentService));
-
- oneOf(configAgentService).updateResourceConfiguration(with(matchingUpdateRequest(expectedUpdateRequest)));
- inSequence(configUdpate);
- }});
-
- ResourceConfigurationUpdate actualUpdate = configurationMgr.updateStructuredOrRawConfiguration(fixture.subject,
- fixture.resourceId, fixture.configuration, FROM_STRUCTURED);
-
- assertSame(actualUpdate, expectedUpdate, "Expected to get back the persisted configuration update");
- }
+// @Test
+// public void updateResourceConfigShouldTranslateStructuredWhenStructredConfigHasEdits() throws Exception {
+// final ResourceConfigUpdateFixture fixture = newStructuredAndRawResourceConfigUpdateFixture();
+//
+// final Configuration translatedConfig = fixture.configuration.deepCopy();
+// translatedConfig.addRawConfiguration(new RawConfiguration());
+//
+// final ResourceConfigurationUpdate expectedUpdate = new ResourceConfigurationUpdate(fixture.resource,
+// translatedConfig, fixture.subject.getName());
+// expectedUpdate.setId(-1);
+//
+// final AgentClient agentClient = context.mock(AgentClient.class);
+// final ConfigurationAgentService configAgentService = context.mock(ConfigurationAgentService.class);
+//
+// final ConfigurationUpdateRequest expectedUpdateRequest = new ConfigurationUpdateRequest(expectedUpdate.getId(),
+// expectedUpdate.getConfiguration(), expectedUpdate.getResource().getId());
+//
+// final Sequence configUdpate = context.sequence("structured-config-update");
+//
+// context.checking(new Expectations() {{
+// allowing(entityMgr).find(Resource.class, fixture.resourceId); will(returnValue(fixture.resource));
+//
+// allowing(authorizationMgr).canViewResource(fixture.subject, fixture.resourceId); will(returnValue(true));
+//
+// oneOf(configAgentService).merge(fixture.configuration, fixture.resourceId, FROM_STRUCTURED);
+// will(returnValue(translatedConfig)); inSequence(configUdpate);
+//
+// oneOf(configurationMgrLocal).persistNewResourceConfigurationUpdateHistory(fixture.subject,
+// fixture.resourceId, translatedConfig, INPROGRESS, fixture.subject.getName(),
+// fixture.isPartOfGroupUpdate);
+// will(returnValue(expectedUpdate));
+// inSequence(configUdpate);
+//
+// allowing(agentMgr).getAgentClient(expectedUpdate.getResource().getAgent()); will(returnValue(agentClient));
+//
+// allowing(agentClient).getConfigurationAgentService(); will(returnValue(configAgentService));
+//
+// oneOf(configAgentService).validate(fixture.configuration, fixture.resourceId, FROM_STRUCTURED);
+// inSequence(configUdpate);
+//
+// oneOf(configAgentService).updateResourceConfiguration(with(matchingUpdateRequest(expectedUpdateRequest)));
+// inSequence(configUdpate);
+// }});
+//
+// ResourceConfigurationUpdate actualUpdate = configurationMgr.updateStructuredOrRawConfiguration(fixture.subject,
+// fixture.resourceId, fixture.configuration, FROM_STRUCTURED);
+//
+// assertSame(actualUpdate, expectedUpdate, "Expected to get back the persisted configuration update");
+// }
@Test
public void updateResourceConfigShouldNotTranslateStructuredWhenRawNotSupported() throws Exception {
@@ -311,6 +314,8 @@ public class ConfigurationManagerBeanUnitTest extends JMockTest {
allowing(agentClient).getConfigurationAgentService(); will(returnValue(configAgentService));
+ oneOf(configAgentService).validate(fixture.configuration, fixture.resourceId, FROM_RAW);
+
oneOf(configAgentService).updateResourceConfiguration(with(matchingUpdateRequest(expectedUpdateRequest)));
inSequence(configUdpate);
}});
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
index 7c750d1..6d7b3f5 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
@@ -14,10 +14,6 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
File rawConfigDir
-// File rawConfig1
-// File rawConfig2
-// File rawConfig3
-
List rawConfigs = []
def ant = new AntBuilder()
@@ -34,15 +30,11 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
def index = 1
numberOfConfigFiles.times { rawConfigs << new File(rawConfigDir, "raw-test-${it + index++}.txt") }
-// rawConfig1 = new File(rawConfigDir, "raw-test-1.txt")
-// rawConfig2 = new File(rawConfigDir, "raw-test-2.txt")
-// rawConfig3 = new File(rawConfigDir, "raw-test-3.txt")
createRawConfigDir()
index = 1
rawConfigs.each { rawConfig -> createConfigFile(rawConfig, index++) }
-// createConfigFile()
}
def createRawConfigDir() {
@@ -75,14 +67,9 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
Set<RawConfiguration> loadRawConfigurations() {
def rawConfigSet = new HashSet()
- rawConfigs.each { rawConfigSet.add(new RawConfiguration(path: it.absolutePath, contents: it.readBytes())) }
+ rawConfigs.each { rawConfigSet.add(new RawConfiguration(path: it.absolutePath, contents: it.text)) }
return rawConfigSet
-
-// def rawConfigs = new HashSet()
-// rawConfigs.add(new RawConfiguration(path: rawConfig1.absolutePath, contents: rawConfig1.readBytes()))
-//
-// return rawConfigs
}
RawConfiguration mergeRawConfiguration(Configuration from, RawConfiguration to) {
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
index 2866427..f1a0455 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
@@ -109,10 +109,10 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
Set<RawConfiguration> loadRawConfigurations() {
def rawConfigs = new HashSet<RawConfiguration>()
- rawConfigs.add(new RawConfiguration(path: rawConfig1.absolutePath, contents: rawConfig1.readBytes()))
- rawConfigs.add(new RawConfiguration(path: rawConfig2.absolutePath, contents: rawConfig2.readBytes()))
- rawConfigs.add(new RawConfiguration(path: rawConfig3.absolutePath, contents: rawConfig3.readBytes()))
- rawConfigs.add(new RawConfiguration(path: rawConfig4.absolutePath, contents: rawConfig4.readBytes()))
+ rawConfigs.add(new RawConfiguration(path: rawConfig1.absolutePath, contents: rawConfig1.text))
+ rawConfigs.add(new RawConfiguration(path: rawConfig2.absolutePath, contents: rawConfig2.text))
+ rawConfigs.add(new RawConfiguration(path: rawConfig3.absolutePath, contents: rawConfig3.text))
+ rawConfigs.add(new RawConfiguration(path: rawConfig4.absolutePath, contents: rawConfig4.text))
return rawConfigs
}
@@ -130,17 +130,16 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
rawPropertiesConfig.setProperty(propertyName, property.stringValue)
}
- def stream = new ByteArrayOutputStream()
- rawPropertiesConfig.save(stream)
- rawConfiguration.contents = stream.toByteArray()
+ def writer = new StringWriter()
+ rawPropertiesConfig.save(writer)
+ rawConfiguration.contents = writer.toString()
return rawConfiguration
}
def loadRawPropertiesConfiguration(rawConfig) {
- def stream = new ByteArrayInputStream(rawConfig.contents)
def rawPropertiesConfig = new PropertiesConfiguration()
- rawPropertiesConfig.load(stream)
+ rawPropertiesConfig.load(new StringReader(rawConfig.contents))
return rawPropertiesConfig
}
@@ -186,7 +185,7 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
void validateStructuredConfiguration(Configuration config) {
def failValidation = resourceContext.pluginConfiguration.getSimple("failStructuredValidation")
if (failValidation.getBooleanValue()) {
- throw new RuntimeException("Validation failed for $configuration");
+ throw new RuntimeException("Validation failed for $confi153guration");
}
}
commit d31a520de773d483bc44b1932fc52380d3a79a96
Merge: da09882... 8b86c0b...
Author: Adam Young <ayoung(a)redhat.com>
Date: Tue Jan 26 09:29:15 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config-confirm
commit da09882e2657b1b9ec51d19e0c2575c5d07fd722
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 25 15:07:30 2010 -0500
Proof of concept for rhq template engine values.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 9da62c0..1181bea 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -46,7 +46,9 @@ import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.util.LoggingThreadFactory;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.template.TemplateEngine;
+import org.rhq.enterprise.client.proxy.ResourceClientProxy.Measurement;
import java.util.LinkedList;
import java.util.Queue;
@@ -205,17 +207,22 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
}
- private static TemplateEngine fetchTemplateEngine() {
+ private TemplateEngine fetchTemplateEngine() {
Resource platformResource = PluginContainer.getInstance().getInventoryManager().getPlatform();
TreeMap<String, String> tokens = new TreeMap<String, String>();
tokens.put("rhq.hostname", platformResource.getName());
+
+ MeasurementFacet facet = componentService.getComponent(platformResource.getId(), MeasurementFacet.class,
+ FacetLockType.READ, FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+
+
+
for (Resource childResource : platformResource.getChildResources()) {
if (childResource.getResourceType().getName().equals("Network Adapter" )){
String key = "rhq.interfaces."+childResource.getName()+".mac";
tokens.put(key ,childResource.getDescription());
- }
-
+ }
}
commit 8b86c0b07e73d2b7a8408c35abadf2ef225464f3
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 25 09:29:56 2010 -0500
Disabling usage of flash for upload. It was set to auto but looked like it was still trying to use flash when it was not available.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
index b5a356c..7c22818 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
@@ -39,8 +39,7 @@
listHeight="50px"
fileUploadListener="#{fileUploader.fileUploadListener}"
addControlLabel="Browse"
- immediateUpload="false"
- allowFlash="auto">
+ immediateUpload="false">
<f:facet name="label">
<h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}"/>
</f:facet>
@@ -54,4 +53,4 @@
</rich:modalPanel>
</f:subview>
-</ui:composition>
\ No newline at end of file
+</ui:composition>
commit b95c02c3829ab16f6dec78e218214845e72e81f7
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 25 00:15:41 2010 -0500
Fixing <h:outputlink> tags for view full screen and upload links so that do not post back to server
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index bf83f76..f8e7bba 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -127,9 +127,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="4" style="width:100%;">
<h:outputLabel value=" "/>
- <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
- <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
@@ -170,8 +170,6 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</rich:tab>
</rich:tabPanel>
- <ui:include src="upload-modal.xhtml"/>
- <ui:include src="view-raw-modal.xhtml"/>
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredSupported}">
@@ -287,9 +285,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="4" style="width:100%;">
<h:outputLabel value=" "/>
- <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
- <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
@@ -330,12 +328,11 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</rich:tab>
</rich:tabPanel>
-
- <ui:include src="upload-modal.xhtml"/>
- <ui:include src="view-raw-modal.xhtml"/>
</c:when>
</c:choose>
+ <ui:include src="upload-modal.xhtml"/>
+ <ui:include src="view-raw-modal.xhtml"/>
</h:form>
<h:panelGroup layout="block" styleClass="InfoBlock"
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
index 25cec92..e077962 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
@@ -8,7 +8,7 @@
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
- <f:subview id="subview">
+ <f:subview id="modalEditorSubview">
<rich:modalPanel id="modalEditor" width="800" height="600">
<f:facet name="header">
<h:panelGroup>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index d0850d8..7af5f2d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -86,6 +86,7 @@ THIS TEXT WILL BE REMOVED.
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
+ limitToList="true"
reRender="fileContents,selectedFileHeader,modalEditor"/>
</c:forEach>
</rich:panelMenuGroup>
@@ -97,9 +98,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="4" style="width:100%;">
<h:outputLabel value=" "/>
- <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
- <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
<h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
@@ -217,6 +218,7 @@ THIS TEXT WILL BE REMOVED.
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
+ limitToList="true"
reRender="fileContents,selectedFileHeader,modalEditor"/>
</c:forEach>
</rich:panelMenuGroup>
@@ -228,9 +230,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="4" style="width:100%;">
<h:outputLabel value=" "/>
- <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
- <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
+ <h:outputLink value="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
<h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
commit d0d773680c995cc94bddc96d39b2d0b0430739a5
Author: John Sanda <john(a)localhost.localdomain>
Date: Sat Jan 23 21:57:21 2010 -0500
Updating logic for displaying the number of files changed
The number of files changed was getting lost between translations since the modified cache
get purged on a translation call. I added a counter to keep track of the number of changed
files.
I also had to update some of the richfaces code on edit.xhtml so that both the upper and
the lower labels get rerendered when the file is edited.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index c2e4bf5..98eec26 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -77,6 +77,8 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
private String modalEditorContents;
+ private int numberOfModifiedFiles;
+
public ExistingResourceConfigurationUIBean() {
removeSessionScopedBeanIfInView("/rhq/resource/configuration/view.xhtml",
ExistingResourceConfigurationUIBean.class);
@@ -311,10 +313,14 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
RawConfiguration originalRaw = raws.get(editedRaw.getPath());
if (editedRaw.getSha256().equals(originalRaw.getSha256())) {
+ --numberOfModifiedFiles;
RawConfigUIBean rawUIBean = findRawConfigUIBeanByPath(editedRaw.getPath());
rawUIBean.setModified(false);
getModified().remove(editedRaw.getPath());
}
+ else {
+ ++numberOfModifiedFiles;
+ }
return null;
}
@@ -436,15 +442,15 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String getModifiedFilesMsg() {
- if (!isDisplayChangedFilesLabel() || getModified().size() == 0) {
+ if (!isDisplayChangedFilesLabel() || numberOfModifiedFiles == 0) {
return "";
}
- if (getModified().size() == 1) {
+ if (numberOfModifiedFiles == 1) {
return "1 file changed in this configuration";
}
- return getModified().size() + " files changed in this configuration";
+ return numberOfModifiedFiles + " files changed in this configuration";
}
public boolean isModified(String path) {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 3e96df8..bf83f76 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -229,7 +229,7 @@ THIS TEXT WILL BE REMOVED.
</rich:tab>
<rich:tab id="rawTab"
label="Advanced Mode"
- reRender="fileUpload,upperCommitPanel"
+ reRender="fileUpload,upperCommitPanel,lowerCommitPanel"
onlabelclick="cursor_wait();"
oncomplete="cursor_clear();">
<h:panelGrid columns="2"
@@ -254,7 +254,7 @@ THIS TEXT WILL BE REMOVED.
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
icon="#{rawConfigUIBean.icon}"
binding="#{rawConfigUIBean.panelMenuItem}"
- onclick="cursor_wait(); selectedFile = #{rawConfigUIBean.path};"
+ onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
limitToList="true"
@@ -308,7 +308,7 @@ THIS TEXT WILL BE REMOVED.
readonly="false">
<a4j:support event="onkeyup"
ignoreDupeResponses="true"
- reRender="fileMenu,upperCommitPanel"
+ reRender="fileMenu,upperCommitPanel,lowerCommitPanel"
requestDelay="1000"
action="#{ExistingResourceConfigurationUIBean.editCurrent}"/>
</h:inputTextarea>
@@ -317,7 +317,7 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
<h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
- <h:panelGroup style="text-align:right">
+ <h:panelGroup id="lowerCommitPanel" style="text-align:right">
<h:outputText value="#{ExistingResourceConfigurationUIBean.modifiedFilesMsg}"
rendered="#{ExistingResourceConfigurationUIBean.rawMode}"
style="padding-right:10px"/>
commit 19e5f0e7fbe1a83dc2a0c1b3948327b349a03d37
Author: John Sanda <john(a)localhost.localdomain>
Date: Sat Jan 23 14:38:33 2010 -0500
Adding back call to update modified cache on tranlsation to raw
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index b552f22..c2e4bf5 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -148,7 +148,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
current = null;
setConfiguration(configuration);
-// updateModifiedCache();
+ updateModifiedCache();
mode = RAW_MODE;
return null;
}
commit c5136f8f0e0613dc1400358cc1ef40e3670dca1b
Author: John Sanda <john(a)localhost.localdomain>
Date: Sat Jan 23 14:28:34 2010 -0500
Moving the toolbar links one row above the file name label that appears before the text area
Moving the toolbar up gives more room for the file name label to so as to avoid wrapping
when long path names are encountered.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 0e252a3..3e96df8 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -125,17 +125,20 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+ <h:outputLabel value=" "/>
+
+ <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
- <a href="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</a>
+ <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
</h:commandLink>
+
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
</h:panelGrid>
<rich:panel style="margin-left:1px; border: none;">
@@ -282,17 +285,20 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+ <h:outputLabel value=" "/>
+
+ <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
- <a href="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</a>
+ <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
</h:commandLink>
+
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
</h:panelGrid>
<rich:panel id="fileContentsPanel" style="margin-left:1px; border: none;">
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 4abf675..d0850d8 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -95,17 +95,20 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
+ <h:outputLabel value=" "/>
+
+ <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
+
+ <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
+
<h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
</h:commandLink>
+
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
</h:panelGrid>
<rich:panel style="margin-left:1px; border: none;">
@@ -223,17 +226,20 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
+ <h:outputLabel value=" "/>
+
+ <h:outputLink onclick="#{rich:component('modalEditor')}.show()">View Full Screen</h:outputLink>
+
+ <h:outputLink onclick="#{rich:component('uploadWindow')}.show()">Upload New</h:outputLink>
+
<h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
</h:commandLink>
+
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
</h:panelGrid>
<rich:panel style="margin-left:1px; border: none;">
commit 33381b04f5c74101bcbe01403abf90278c4989ee
Author: John Sanda <john(a)localhost.localdomain>
Date: Sat Jan 23 02:00:04 2010 -0500
Adding logic for generating the number of files changes message
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 0f92b49..b552f22 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -148,7 +148,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
current = null;
setConfiguration(configuration);
- updateModifiedCache();
+// updateModifiedCache();
mode = RAW_MODE;
return null;
}
@@ -313,6 +313,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
if (editedRaw.getSha256().equals(originalRaw.getSha256())) {
RawConfigUIBean rawUIBean = findRawConfigUIBeanByPath(editedRaw.getPath());
rawUIBean.setModified(false);
+ getModified().remove(editedRaw.getPath());
}
return null;
}
@@ -422,6 +423,30 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return mode == RAW_MODE;
}
+ public boolean isDisplayChangedFilesLabel() {
+ if (isStructuredMode()) {
+ return false;
+ }
+
+ if (isRawSupported()) {
+ return true;
+ }
+
+ return isRawMode();
+ }
+
+ public String getModifiedFilesMsg() {
+ if (!isDisplayChangedFilesLabel() || getModified().size() == 0) {
+ return "";
+ }
+
+ if (getModified().size() == 1) {
+ return "1 file changed in this configuration";
+ }
+
+ return getModified().size() + " files changed in this configuration";
+ }
+
public boolean isModified(String path) {
return getModified().keySet().contains(path);
}
commit 93f1d77ed02e4539b7c4dbcbf614dfa5137642a3
Author: John Sanda <john(a)localhost.localdomain>
Date: Sat Jan 23 01:57:15 2010 -0500
Adding logic to generate the number of files changed label that appears next to the commit button
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 6d6beec..0e252a3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -36,6 +36,8 @@ THIS TEXT WILL BE REMOVED.
var currentFileModified = false;
+ var selectedFile = '';
+
function setCurrentFileModified() {
currentFileModified = true;
}
@@ -53,8 +55,11 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="2" style="width:100%">
<h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
- <h:panelGroup style="text-align:right">
- <h:outputText style="padding-right:10px">n files changed in this configuration</h:outputText>
+ <h:panelGroup id="upperCommitPanel" style="text-align:right">
+ <h:outputText id="changedFilesLabel"
+ rendered="#{ExistingResourceConfigurationUIBean.displayChangedFilesLabel}"
+ style="padding-right:10px"
+ value="#{ExistingResourceConfigurationUIBean.modifiedFilesMsg}"/>
<h:commandButton value="Commit"
action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
title="Click to Save Changes"
@@ -150,7 +155,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
<h:panelGroup style="text-align:right">
- <h:outputText style="padding-right:10px">n files changed in this configuration</h:outputText>
+ <h:outputText value="#{ExistingResourceConfigurationUIBean.modifiedFilesMsg}"
+ rendered="#{ExistingResourceConfigurationUIBean.rawMode}"
+ style="padding-right:10px"/>
<h:commandButton value="Commit"
action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
title="Click to Save Changes"
@@ -192,7 +199,7 @@ THIS TEXT WILL BE REMOVED.
valueChangeListener="#{ExistingResourceConfigurationUIBean.changeTabs}">
<rich:tab id="structuredTab"
label="Basic Mode"
- reRender="uploadForm"
+ reRender="fileUpload,upperCommitPanel"
onlabelclick="cursor_wait();"
oncomplete="cursor_clear();">
<onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
@@ -219,7 +226,7 @@ THIS TEXT WILL BE REMOVED.
</rich:tab>
<rich:tab id="rawTab"
label="Advanced Mode"
- reRender="uploadForm"
+ reRender="fileUpload,upperCommitPanel"
onlabelclick="cursor_wait();"
oncomplete="cursor_clear();">
<h:panelGrid columns="2"
@@ -244,7 +251,7 @@ THIS TEXT WILL BE REMOVED.
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
icon="#{rawConfigUIBean.icon}"
binding="#{rawConfigUIBean.panelMenuItem}"
- onclick="cursor_wait();"
+ onclick="cursor_wait(); selectedFile = #{rawConfigUIBean.path};"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
limitToList="true"
@@ -295,7 +302,7 @@ THIS TEXT WILL BE REMOVED.
readonly="false">
<a4j:support event="onkeyup"
ignoreDupeResponses="true"
- reRender="fileMenu"
+ reRender="fileMenu,upperCommitPanel"
requestDelay="1000"
action="#{ExistingResourceConfigurationUIBean.editCurrent}"/>
</h:inputTextarea>
@@ -305,7 +312,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
<h:panelGroup style="text-align:right">
- <h:outputText style="padding-right:10px">n files changed in this configuration</h:outputText>
+ <h:outputText value="#{ExistingResourceConfigurationUIBean.modifiedFilesMsg}"
+ rendered="#{ExistingResourceConfigurationUIBean.rawMode}"
+ style="padding-right:10px"/>
<h:commandButton value="Commit"
action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
title="Click to Save Changes"
commit 268aa150aeb81cccc3f9efb7234a70d8b2c46118
Author: Adam Young <ayoung(a)redhat.com>
Date: Fri Jan 22 16:06:05 2010 -0500
Proof of concept for templating
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index dc3955a..9da62c0 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -33,6 +33,8 @@ import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.RawConfiguration;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.ContainerService;
import org.rhq.core.pc.PluginContainer;
@@ -44,10 +46,12 @@ import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.util.LoggingThreadFactory;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
+import org.rhq.core.template.TemplateEngine;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
+import java.util.TreeMap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
@@ -185,16 +189,40 @@ public class ConfigurationManager extends AgentService implements ContainerServi
private void mergeRawsIntoStructured(Configuration configuration, ResourceConfigurationFacet facet) {
Configuration structuredConfig = facet.loadStructuredConfiguration();
+ TemplateEngine templateEngine = fetchTemplateEngine();
+
+
if (structuredConfig != null) {
prepareConfigForMergeIntoStructured(configuration, structuredConfig);
for (RawConfiguration rawConfig : configuration.getRawConfigurations()) {
+ String contents = templateEngine.replaceTokens(new String(rawConfig.getContents()));
+ rawConfig.setContents(contents.getBytes());
+
structuredConfig.addRawConfiguration(rawConfig);
facet.mergeStructuredConfiguration(rawConfig, configuration);
}
}
}
+ private static TemplateEngine fetchTemplateEngine() {
+ Resource platformResource = PluginContainer.getInstance().getInventoryManager().getPlatform();
+ TreeMap<String, String> tokens = new TreeMap<String, String>();
+ tokens.put("rhq.hostname", platformResource.getName());
+
+ for (Resource childResource : platformResource.getChildResources()) {
+ if (childResource.getResourceType().getName().equals("Network Adapter" )){
+ String key = "rhq.interfaces."+childResource.getName()+".mac";
+ tokens.put(key ,childResource.getDescription());
+ }
+
+ }
+
+
+ TemplateEngine templateEngine = new TemplateEngine(tokens);
+ return templateEngine;
+ }
+
private void prepareConfigForMergeIntoStructured(Configuration config, Configuration latestStructured) {
config.getAllProperties().clear();
for (Property property : latestStructured.getProperties()) {
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index 7c258b4..0e56625 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -38,7 +38,8 @@ public class TemplateEngine {
String next = matcher.group();
Matcher keyMatcher = keyPattern.matcher(next);
if (keyMatcher.find()) {
- String value = tokens.get(keyMatcher.group());
+ String key = keyMatcher.group();
+ String value = tokens.get(key);
if (value != null) {
next = value;
}
commit c6242c2d59ce4316edfed58630a7f51cd6bad185
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 22 14:07:54 2010 -0500
Removing resource name that was directly above the tabs
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index d99ac30..6d6beec 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -52,7 +52,6 @@ THIS TEXT WILL BE REMOVED.
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
<h:panelGrid columns="2" style="width:100%">
- <h:outputText value="#{ResourceUIBean.name}"/>
<h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
<h:panelGroup style="text-align:right">
<h:outputText style="padding-right:10px">n files changed in this configuration</h:outputText>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 2e3864e..4abf675 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -46,7 +46,6 @@ THIS TEXT WILL BE REMOVED.
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
<h:panelGrid columns="2" style="width:100%">
- <h:outputText value="#{ResourceUIBean.name}"/>
<h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
<h:panelGroup style="text-align:right">
<h:commandButton value="Edit"
@@ -71,7 +70,7 @@ THIS TEXT WILL BE REMOVED.
<rich:panel style="width:100%">
<f:facet name="header">Files</f:facet>
<rich:panelMenu mode="ajax"
- expandMode="client"
+ expandMode="client"
iconCollapsedGroup="/images/icn_tree_folder.gif"
iconExpandedGroup="/images/icn_tree_folder.gif"
limitToList="true"
commit 3ec326edcbfb065d7952022e879f3d8d1d03efb3
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 22 13:51:36 2010 -0500
Updating resource tree navigation logic for configuration UI
When you are on a configuration ui screen, be it a view or edit screen, and click on a
different resource in the resource tree, you will now be sent to view.xhtml for that
resource.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeStateAdvisor.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeStateAdvisor.java
index 6fee523..18554d3 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeStateAdvisor.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeStateAdvisor.java
@@ -118,10 +118,12 @@ public class ResourceTreeStateAdvisor implements TreeStateAdvisor {
|| (path.startsWith("/rhq/resource/events") && !facets.isEvent())) {
// This resource doesn't support those facets
path = fallbackPath;
- } else if ((path.startsWith("/rhq/resource/configuration/edit.xhtml") ||
- path.startsWith("/rhq/resource/configuration/edit-raw.xhtml"))
- && facets.isConfiguration()) {
+ } else if ((path.startsWith("/rhq/resource/configuration/view-map.xhtml") ||
+ path.startsWith("/rhq/resource/configuration/edit-map.xhtml") ||
+ path.startsWith("/rhq/resource/configuration/add-map.xhtml") ||
+ path.startsWith("/rhq/resource/configuration/edit.xhtml") && facets.isConfiguration())) {
path = "/rhq/resource/configuration/view.xhtml";
+
} else if (!path.startsWith("/rhq/resource/content/view.xhtml")
&& path.startsWith("/rhq/resource/content/") && facets.isContent()) {
path = "/rhq/resource/content/view.xhtml";
commit 8515b0fb9adb688942b7b39ba3baba1a7646e548
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 22 12:14:48 2010 -0500
Fixing download behavior so that the file name matches the file name listed on the page
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 17113c4..0f92b49 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -498,8 +498,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
public String download() {
try {
+ File file = new File(getCurrentPath());
+
HttpServletResponse response = FacesContextUtility.getResponse();
- response.setHeader("Content-Disposition", "attachment;filename=" + getCurrentPath());
+ response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
OutputStream ostream = response.getOutputStream();
ostream.write(getCurrentContents().getBytes());
ostream.flush();
commit d8e228989067835e680819482634fc564c69c396
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 22 11:28:42 2010 -0500
Removing dead code
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index bb18d4c..17113c4 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -317,11 +317,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return null;
}
-// public String getComponentsToRerenderOnEdit() {
-// RawConfiguration editedRaw = getCurrent();
-// RawConfiguration
-// }
-
public void undoEdit(String path) {
modified.remove(path);
RawConfigUIBean bean = findRawConfigUIBeanByPath(path);
commit 00868bfc61dcadd37fa551aef6205b68b8c413cd
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 21 22:00:02 2010 -0500
Updating logic for key events to indicate whether or not a file has been modified
When you start editing the contents of a raw config file, an event get fired off to the
server to determine if the edits have modified the file. If so, the file menu is updated
to reflect that the file has been modified. If you further edit the file to undo you
edits, the file menu will get updated to reflect that the file has been restored to
its original state.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
index 85f9617..7771834 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -69,7 +69,7 @@ public class RawConfigUIBean {
public void setModified(boolean modified) {
this.modified = modified;
-// panelMenuItem.setIcon(getIcon());
+ panelMenuItem.setIcon(getIcon());
}
public String getPath() {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 18e08ca..d99ac30 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -73,38 +73,46 @@ THIS TEXT WILL BE REMOVED.
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<h:panelGrid columns="1">
- <rich:panel style="width:100%">
- <f:facet name="header">Files</f:facet>
-
- <rich:panelMenu id="fileMenu"
- mode="ajax"
- expandMode="client"
- iconCollapsedGroup="/images/icn_tree_folder.gif"
- iconExpandedGroup="/images/icn_tree_folder.gif">
- <c:forEach items="#{rawConfigDirectories}"
- var="rawConfigDir">
- <rich:panelMenuGroup label="#{rawConfigDir.path}"
- expanded="true"
- selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
- <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
- icon="#{rawConfigUIBean.icon}"
- onclick="cursor_wait();"
- oncomplete="cursor_clear();"
- action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectedFileHeader,modalEditor,fileMenu">
- <h:panelGroup>
- <h:outputText value="#{#rawConfigUIBean.fileName}"/>
- <c:if test="#{rawConfigUIBean.modified}">
- <h:commandButton value="Undo"/>
- </c:if>
- </h:panelGroup>
- </rich:panelMenuItem>
- </c:forEach>
- </rich:panelMenuGroup>
- </c:forEach>
- </rich:panelMenu>
- </rich:panel>
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+
+ <rich:panelMenu id="fileMenu"
+ mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="/images/icn_tree_folder.gif"
+ iconExpandedGroup="/images/icn_tree_folder.gif">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ icon="#{rawConfigUIBean.icon}"
+ binding="#{rawConfigUIBean.panelMenuItem}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
+ limitToList="true"
+ reRender="fileContents,selectedFileHeader,modalEditor,fileMenu">
+ <h:panelGroup>
+ <h:outputText value="#{#rawConfigUIBean.fileName}"/>
+ <h:commandButton value="Undo"
+ styleClass="buttonmed"
+ rendered="#{rawConfigUIBean.modified}">
+ <a4j:support event="onclick"
+ onsumbit="cursor_wait()"
+ oncomplete="cursor_clear()"
+ action="#{ExistingResourceConfigurationUIBean.undoEdit(rawConfigUIBean.path)}"
+ reRender="fileMenu,fileContents"/>
+ </h:commandButton>
+ </h:panelGroup>
+ </rich:panelMenuItem>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
+ </rich:panelMenu>
+ </rich:panel>
<rich:panel style="border:none">
<h:graphicImage url="/images/star_on_24.png"/>
<h:outputText value="- Contains uncommitted changes"/>
@@ -119,7 +127,7 @@ THIS TEXT WILL BE REMOVED.
<a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<a href="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</a>
-
+
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
@@ -131,7 +139,7 @@ THIS TEXT WILL BE REMOVED.
style="width:100%"
value="#{ExistingResourceConfigurationUIBean.currentContents}"
readonly="false">
- <a4j:support event="onkeypress"
+ <a4j:support event="onkeyup"
ignoreDupeResponses="true"
reRender="fileMenu"
requestDelay="1000"
@@ -244,15 +252,15 @@ THIS TEXT WILL BE REMOVED.
reRender="fileContents,selectedFileHeader,modalEditor,fileMenu">
<h:panelGroup>
<h:outputText value="#{#rawConfigUIBean.fileName}"/>
- <c:if test="#{rawConfigUIBean.modified}">
- <h:commandButton value="Undo" styleClass="buttonmed">
- <a4j:support event="onclick"
- onsumbit="cursor_wait()"
- oncomplete="cursor_clear()"
- action="#{ExistingResourceConfigurationUIBean.undoEdit(rawConfigUIBean.path)}"
- reRender="fileMenu"/>
- </h:commandButton>
- </c:if>
+ <h:commandButton value="Undo"
+ styleClass="buttonmed"
+ rendered="#{rawConfigUIBean.modified}">
+ <a4j:support event="onclick"
+ onsumbit="cursor_wait()"
+ oncomplete="cursor_clear()"
+ action="#{ExistingResourceConfigurationUIBean.undoEdit(rawConfigUIBean.path)}"
+ reRender="fileMenu,fileContents"/>
+ </h:commandButton>
</h:panelGroup>
</rich:panelMenuItem>
</c:forEach>
@@ -286,7 +294,7 @@ THIS TEXT WILL BE REMOVED.
style="width:100%"
value="#{ExistingResourceConfigurationUIBean.currentContents}"
readonly="false">
- <a4j:support event="onkeypress"
+ <a4j:support event="onkeyup"
ignoreDupeResponses="true"
reRender="fileMenu"
requestDelay="1000"
commit 73319df68d65c2150e92d24449a3374e73bbfddd
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 21 18:38:01 2010 -0500
Made the member variable private.
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index 4181bba..7c258b4 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -5,7 +5,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TemplateEngine {
- public final Map<String, String> tokens;
+ private final Map<String, String> tokens;
/**
* In English, the open delimiter <%
commit 633a8a6f5a51ea12ee3ea93c3745edb78b672c1c
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 21 16:34:25 2010 -0500
Using the more efficient Java Matcher and Pattern classes over the String.replaceAll approach.
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index eef1b8e..4181bba 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -1,24 +1,53 @@
package org.rhq.core.template;
import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class TemplateEngine {
- public final Map<String, String> tokens;
+ public final Map<String, String> tokens;
- public TemplateEngine(Map<String, String> tokens) {
- super();
- this.tokens = tokens;
- }
+ /**
+ * In English, the open delimiter <%
+ * zero or more white space characters
+ * The following pattern at least once:
+ * one or more word characters followed by an optional period
+ * zero or more white space characters
+ * The closing delimiter %>
+ * Thus <% rhq.system %> and <%rhq.system%> are equivalent
+ * <% rhq.platform.ip_address %> is Valid.
+ * <% & %> is not a valid token
+ *
+ */
- public String replaceTokens(String input){
-
- for (String token : tokens.keySet()) {
- //Since . is a special regex character,
- //replace it with \. before building the larger regex
- String regex = "<%\\s*" + token.replaceAll("\\.", "\\\\.") + "\\s*%>";
- input = input.replaceAll(regex, tokens.get(token) );
- }
-
- return input;
- }
+ static String tokenRegex = "<%\\s*(\\w+\\.?)+\\s*%>";
+ static String keyRegex = "(\\w+\\.?)+";
+
+ static Pattern tokenPattern = Pattern.compile(tokenRegex);
+ static Pattern keyPattern = Pattern.compile(keyRegex);
+
+ public TemplateEngine(Map<String, String> tokens) {
+ super();
+ this.tokens = tokens;
+ }
+
+ public String replaceTokens(String input) {
+ StringBuffer buffer = new StringBuffer();
+ Matcher matcher = tokenPattern.matcher(input);
+ while (matcher.find()) {
+ String next = matcher.group();
+ Matcher keyMatcher = keyPattern.matcher(next);
+ if (keyMatcher.find()) {
+ String value = tokens.get(keyMatcher.group());
+ if (value != null) {
+ next = value;
+ }
+ }
+ //If we didn't find a replacement for the key
+ //We leave the original value unchanged
+ matcher.appendReplacement(buffer, next);
+ }
+ matcher.appendTail(buffer);
+ return buffer.toString();
+ }
}
commit 3e930f2105a7da3b7f6e37d3687bf2726cf964b3
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 21 15:53:50 2010 -0500
Adding initial support for marking a file modified based on keyboard events
When you start editing a config file, an ajax request is triggered from a keyboard event.
The server side code determines if there have been edits and if so, the current file in
the menu will be rerendered and marked updated.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 2b8bdc9..bb18d4c 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -307,10 +307,21 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String editCurrent() {
- String changedContents = getCurrentContents();
+ RawConfiguration editedRaw = getCurrent();
+ RawConfiguration originalRaw = raws.get(editedRaw.getPath());
+
+ if (editedRaw.getSha256().equals(originalRaw.getSha256())) {
+ RawConfigUIBean rawUIBean = findRawConfigUIBeanByPath(editedRaw.getPath());
+ rawUIBean.setModified(false);
+ }
return null;
}
+// public String getComponentsToRerenderOnEdit() {
+// RawConfiguration editedRaw = getCurrent();
+// RawConfiguration
+// }
+
public void undoEdit(String path) {
modified.remove(path);
RawConfigUIBean bean = findRawConfigUIBeanByPath(path);
@@ -320,7 +331,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
bean.setIcon("/images/blank.png");
}
-
}
public int getConfigId() {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 0bdbd47..18e08ca 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -130,7 +130,13 @@ THIS TEXT WILL BE REMOVED.
<h:inputTextarea id="fileContents"
style="width:100%"
value="#{ExistingResourceConfigurationUIBean.currentContents}"
- readonly="false"/>
+ readonly="false">
+ <a4j:support event="onkeypress"
+ ignoreDupeResponses="true"
+ reRender="fileMenu"
+ requestDelay="1000"
+ action="#{ExistingResourceConfigurationUIBean.editCurrent}"/>
+ </h:inputTextarea>
</rich:panel>
</h:panelGrid>
</h:panelGrid>
@@ -280,14 +286,11 @@ THIS TEXT WILL BE REMOVED.
style="width:100%"
value="#{ExistingResourceConfigurationUIBean.currentContents}"
readonly="false">
- <ui:remove>
- <a4j:support event="onkeydown"
- onsubmit="return !currentFileModified;"
- oncomplete="currentFileModified = true;"
+ <a4j:support event="onkeypress"
+ ignoreDupeResponses="true"
reRender="fileMenu"
- requestDelay="3000"
+ requestDelay="1000"
action="#{ExistingResourceConfigurationUIBean.editCurrent}"/>
- </ui:remove>
</h:inputTextarea>
</rich:panel>
</h:panelGrid>
commit b6a0d16a6f942c7a7c536b213ca0fd88629da291
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 21 14:23:03 2010 -0500
Fixing upload for raw-only
In the case where raw-only is supported, I forgot to add in the subview that contains the
modal window with the upload component.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index e725134..0bdbd47 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -34,7 +34,7 @@ THIS TEXT WILL BE REMOVED.
document.body.style.cursor = 'default';
}
- var currentFileModifed = false;
+ var currentFileModified = false;
function setCurrentFileModified() {
currentFileModified = true;
@@ -147,6 +147,7 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</rich:tab>
</rich:tabPanel>
+ <ui:include src="upload-modal.xhtml"/>
<ui:include src="view-raw-modal.xhtml"/>
</c:when>
@@ -279,10 +280,14 @@ THIS TEXT WILL BE REMOVED.
style="width:100%"
value="#{ExistingResourceConfigurationUIBean.currentContents}"
readonly="false">
+ <ui:remove>
<a4j:support event="onkeydown"
+ onsubmit="return !currentFileModified;"
+ oncomplete="currentFileModified = true;"
reRender="fileMenu"
requestDelay="3000"
action="#{ExistingResourceConfigurationUIBean.editCurrent}"/>
+ </ui:remove>
</h:inputTextarea>
</rich:panel>
</h:panelGrid>
commit 560f369dc44559f3f839180a9a6d0685b54b32bd
Merge: 4f9777a... c5351b1...
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 21 13:55:58 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config-confirm
commit c5351b10217dc42b367411a7e4aa5a3b6bcdc8bb
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 21 12:49:05 2010 -0500
Adding new upload behavior for raw-only edit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 17f968f..e725134 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -34,8 +34,14 @@ THIS TEXT WILL BE REMOVED.
document.body.style.cursor = 'default';
}
- function open_modal_editor() {
+ var currentFileModifed = false;
+ function setCurrentFileModified() {
+ currentFileModified = true;
+ }
+
+ function resetCurrentFile() {
+ currentFileModified;
}
</script>
@@ -111,9 +117,9 @@ THIS TEXT WILL BE REMOVED.
startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
<a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
+
+ <a href="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</a>
+
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
@@ -261,11 +267,6 @@ THIS TEXT WILL BE REMOVED.
<a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<a href="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</a>
- <ui:remove>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
- </ui:remove>
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
@@ -278,9 +279,9 @@ THIS TEXT WILL BE REMOVED.
style="width:100%"
value="#{ExistingResourceConfigurationUIBean.currentContents}"
readonly="false">
- <a4j:support event="onchange"
+ <a4j:support event="onkeydown"
reRender="fileMenu"
- requestDelay="1000"
+ requestDelay="3000"
action="#{ExistingResourceConfigurationUIBean.editCurrent}"/>
</h:inputTextarea>
</rich:panel>
commit 1b08277e41344cf82e62a830ee5c4c9668cebe08
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 21 12:23:37 2010 -0500
Modifying upload functionality so that the upload component is now rendered in a modal window
The upload dialog/modal window is rendered on the edit page when you click the 'Upload New' link.
Once you upload the file, the modal window closes, the contents of the file in text area are
replaced with the contents of the uploaded file, and the file will be marked as being modified
in the file menu.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 9b9767b..2b8bdc9 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -291,8 +291,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
LookupUtil.getConfigurationManager().updateResourceConfiguration(subject, getResourceId(),
getMergedConfiguration());
- nullify();
-
return "/rhq/resource/configuration/view.xhtml?id=" + getResourceId();
}
@@ -308,36 +306,21 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return getConfiguration();
}
- public void undoEdit() {
-
+ public String editCurrent() {
+ String changedContents = getCurrentContents();
+ return null;
}
- public String discard() {
- nullify();
- return "/rhq/resource/configuration/view.xhtml?id=" + getResourceId();
- }
+ public void undoEdit(String path) {
+ modified.remove(path);
+ RawConfigUIBean bean = findRawConfigUIBeanByPath(path);
- public void fileUploadListener(UploadEvent event) throws Exception {
- File uploadFile;
- log.error("fileUploadListener called");
- uploadFile = event.getUploadItem().getFile();
- if (uploadFile != null) {
- log.debug("fileUploadListener got file named " + event.getUploadItem().getFileName());
- log.debug("content type is " + event.getUploadItem().getContentType());
- if (uploadFile != null) {
- try {
- FileReader fileReader = new FileReader(uploadFile);
- char[] buff = new char[1024];
- StringBuffer stringBuffer = new StringBuffer();
- for (int count = fileReader.read(buff); count != -1; count = fileReader.read(buff)) {
- stringBuffer.append(buff, 0, count);
- }
- setCurrentContents(stringBuffer.toString());
- } catch (IOException e) {
- log.error("problem reading uploaded file", e);
- }
- }
+ if (bean != null) {
+ bean.setModified(false);
+ bean.setIcon("/images/blank.png");
}
+
+
}
public int getConfigId() {
@@ -363,23 +346,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String getCurrentContents() {
- try {
- if (fileUploader.getFileItem() != null) {
- UploadItem fileItem = fileUploader.getFileItem();
- if (fileItem.isTempFile()) {
- setCurrentContents(FileUtils.readFileToString(fileItem.getFile()));
- }
- else {
- setCurrentContents(new String(fileItem.getData()));
- }
- fileUploader.clear();
- }
-
- return new String(getCurrent().getContents());
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
+ return new String(getCurrent().getContents());
}
public String getCurrentPath() {
@@ -470,10 +437,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return isRawSupported() || (isStructuredAndRawSupported() && isRawMode());
}
- void nullify() {
-
- }
-
/**
* Indicates which of the raw configuration files is currently selected.
* @param s
@@ -497,14 +460,21 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
private void markCurrentRawConfigUIBeanModified() {
+ RawConfigUIBean bean = findRawConfigUIBeanByPath(current.getPath());
+ if (bean != null) {
+ bean.setModified(true);
+ }
+ }
+
+ private RawConfigUIBean findRawConfigUIBeanByPath(String path) {
for (RawConfigDirectory dir : rawConfigDirectories) {
for (RawConfigUIBean bean : dir.getRawConfigUIBeans()) {
if (bean.getPath().equals(current.getPath())) {
- bean.setModified(true);
- return;
+ return bean;
}
}
}
+ return null;
}
public void setCurrentPath(String path) {
@@ -549,7 +519,23 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String completeUpload() {
- return null;
+ try {
+ if (fileUploader.getFileItem() != null) {
+ UploadItem fileItem = fileUploader.getFileItem();
+ if (fileItem.isTempFile()) {
+ setCurrentContents(FileUtils.readFileToString(fileItem.getFile()));
+ }
+ else {
+ setCurrentContents(new String(fileItem.getData()));
+ }
+ fileUploader.clear();
+ }
+
+ return null;
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
void dumpProperties(Configuration conf, Log log) {
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
index 0514f32..85f9617 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -26,6 +26,7 @@ package org.rhq.enterprise.gui.configuration.resource;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.richfaces.component.html.HtmlPanelMenuItem;
+import javax.faces.component.NamingContainer;
import java.io.File;
public class RawConfigUIBean {
@@ -75,6 +76,10 @@ public class RawConfigUIBean {
return rawConfiguration.getPath();
}
+ public String getPathAsId() {
+ return rawConfiguration.getPath().replace('/', NamingContainer.SEPARATOR_CHAR);
+ }
+
public String getFileName() {
File file = new File(rawConfiguration.getPath());
return file.getName();
@@ -87,4 +92,8 @@ public class RawConfigUIBean {
return "/images/blank.png";
}
+
+ public void setIcon(String icon) {
+ panelMenuItem.setIcon(icon);
+ }
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index b2fc562..17f968f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -221,8 +221,7 @@ THIS TEXT WILL BE REMOVED.
expanded="true"
selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem id="menuItem_#{rawConfigUIBean.rawConfiguration.sha256}"
- label="#{rawConfigUIBean.fileName}"
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
icon="#{rawConfigUIBean.icon}"
binding="#{rawConfigUIBean.panelMenuItem}"
onclick="cursor_wait();"
@@ -233,7 +232,13 @@ THIS TEXT WILL BE REMOVED.
<h:panelGroup>
<h:outputText value="#{#rawConfigUIBean.fileName}"/>
<c:if test="#{rawConfigUIBean.modified}">
- <h:commandButton value="Undo" styleClass="buttonmed"/>
+ <h:commandButton value="Undo" styleClass="buttonmed">
+ <a4j:support event="onclick"
+ onsumbit="cursor_wait()"
+ oncomplete="cursor_clear()"
+ action="#{ExistingResourceConfigurationUIBean.undoEdit(rawConfigUIBean.path)}"
+ reRender="fileMenu"/>
+ </h:commandButton>
</c:if>
</h:panelGroup>
</rich:panelMenuItem>
@@ -255,20 +260,29 @@ THIS TEXT WILL BE REMOVED.
stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
<a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+ <a href="#" onclick="#{rich:component('uploadWindow')}.show()">Upload New</a>
+ <ui:remove>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
</h:commandLink>
+ </ui:remove>
+
<h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
</h:commandLink>
</h:panelGrid>
- <rich:panel style="margin-left:1px; border: none;">
+ <rich:panel id="fileContentsPanel" style="margin-left:1px; border: none;">
<h:inputTextarea id="fileContents"
style="width:100%"
value="#{ExistingResourceConfigurationUIBean.currentContents}"
- readonly="false"/>
+ readonly="false">
+ <a4j:support event="onchange"
+ reRender="fileMenu"
+ requestDelay="1000"
+ action="#{ExistingResourceConfigurationUIBean.editCurrent}"/>
+ </h:inputTextarea>
</rich:panel>
</h:panelGrid>
</h:panelGrid>
@@ -286,41 +300,13 @@ THIS TEXT WILL BE REMOVED.
</rich:tab>
</rich:tabPanel>
+ <ui:include src="upload-modal.xhtml"/>
<ui:include src="view-raw-modal.xhtml"/>
</c:when>
</c:choose>
</h:form>
- <!--
- Here I tried the file upload in a separate form. It has resulted in javascript errors. The latest error in the
- firefox error console is,
-
- Error: form.dispatchEvent is not a function
- Source File: http://localhost:7080/a4j/g/3_3_2.SR1org/ajax4jsf/javascript/scripts/form...
- Line: 6
- -->
- <h:form id="uploadForm" enctype="multipart/form-data">
- <rich:panel id="uploadPanel" rendered="#{ExistingResourceConfigurationUIBean.fileUploadAvailable}">
-
- <input type="hidden" name="currentResourceId" value="#{ResourceUIBean.id}"/>
-
- <rich:fileUpload id="fileUpload"
- listHeight="50px"
- fileUploadListener="#{fileUploader.fileUploadListener}"
- addControlLabel="Browse"
- immediateUpload="false"
- allowFlash="auto">
- <f:facet name="label">
- <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}" />
- </f:facet>
- <a4j:support event="onuploadcomplete"
- reRender="fileUpload,fileContents,menuItem_#{ExistingResourceConfigurationUIBean.current.sha256}"/>
- </rich:fileUpload>
-
- </rich:panel>
- </h:form>
-
<h:panelGroup layout="block" styleClass="InfoBlock"
rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
<b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
new file mode 100644
index 0000000..b5a356c
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/upload-modal.xhtml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
+
+ <f:subview id="uploadSubview" rendered="#{ExistingResourceConfigurationUIBean.fileUploadAvailable}">
+
+ <script type="text/javascript">
+ function prepareFormForUpload() {
+ var form = document.getElementById('editResourceConfigurationForm');
+ form.encoding = 'multipart/form-data';
+ }
+ </script>
+
+ <rich:modalPanel id="uploadWindow" width="800" height="400">
+ <f:facet name="header">
+ <h:panelGroup>
+ <h:outputText value="#{ExistingResourceConfigurationUIBean.current.path}"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="controls">
+ <h:panelGroup>
+ <h:graphicImage value="/images/close.png" styleClass="hidelink" id="hidelink"/>
+ <rich:componentControl for="uploadWindow" attachTo="hidelink" operation="hide" event="onclick"/>
+ </h:panelGroup>
+ </f:facet>
+
+
+ <rich:panel id="uploadPanel" rendered="#{ExistingResourceConfigurationUIBean.fileUploadAvailable}">
+
+ <input type="hidden" name="currentResourceId" value="#{ResourceUIBean.id}"/>
+
+ <rich:fileUpload id="fileUpload"
+ listHeight="50px"
+ fileUploadListener="#{fileUploader.fileUploadListener}"
+ addControlLabel="Browse"
+ immediateUpload="false"
+ allowFlash="auto">
+ <f:facet name="label">
+ <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}"/>
+ </f:facet>
+ <a4j:support event="onuploadcomplete"
+ action="#{ExistingResourceConfigurationUIBean.completeUpload}"
+ reRender="fileUpload,fileContents,fileMenu"
+ onsubmit="#{rich:component('uploadWindow')}.hide()"/>
+ </rich:fileUpload>
+
+ </rich:panel>
+ </rich:modalPanel>
+ </f:subview>
+
+</ui:composition>
\ No newline at end of file
commit 4f9777a0ea1cc20a7546fdafc3d05c19dcbd928f
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 21 12:16:04 2010 -0500
added a simple template engine and test for it.
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
new file mode 100644
index 0000000..eef1b8e
--- /dev/null
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -0,0 +1,24 @@
+package org.rhq.core.template;
+
+import java.util.Map;
+
+public class TemplateEngine {
+ public final Map<String, String> tokens;
+
+ public TemplateEngine(Map<String, String> tokens) {
+ super();
+ this.tokens = tokens;
+ }
+
+ public String replaceTokens(String input){
+
+ for (String token : tokens.keySet()) {
+ //Since . is a special regex character,
+ //replace it with \. before building the larger regex
+ String regex = "<%\\s*" + token.replaceAll("\\.", "\\\\.") + "\\s*%>";
+ input = input.replaceAll(regex, tokens.get(token) );
+ }
+
+ return input;
+ }
+}
diff --git a/modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java b/modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java
new file mode 100644
index 0000000..61af996
--- /dev/null
+++ b/modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java
@@ -0,0 +1,62 @@
+package org.rhq.core.template;
+
+import java.util.TreeMap;
+
+import org.testng.annotations.Test;
+
+import junit.framework.TestCase;
+
+@Test
+public class TemplateEngineTest extends TestCase {
+ private static final String IPADDR = "192.168.22.153";
+ private static final String SUCCESSTOKEN1 = "successtoken1";
+ String noTokens = "This string should come through unchanged";
+ String justOneToken = "<%rhq.token1%>";
+ String oneTokenWhiteSpace = "<% rhq.token1 %>";
+ String multipleLogTokens = "This string has <%rhq.token1%>\n" + "<% rhq.unsettoken %>\n" + "<% nmsqt.token1 %>"
+ + "It also has <%rhq.platform.ethers.eth1.ipaddress %>";
+ String sameTokenTwice = "<%rhq.token1%><%rhq.token1%>";
+
+ TemplateEngine templateEngine;
+ TreeMap<String, String> tokens;
+
+ TreeMap<String, String> getTokens() {
+ if (null == tokens) {
+ tokens = new TreeMap<String, String>();
+ tokens.put("rhq.token1", SUCCESSTOKEN1);
+ tokens.put("rhq.platform.ethers.eth1.ipaddress", IPADDR);
+ }
+ return tokens;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ templateEngine = new TemplateEngine(getTokens());
+ }
+
+ public void testNoTokens() {
+ assertEquals(noTokens, templateEngine.replaceTokens(noTokens));
+ }
+
+ public void testOneToken() {
+ assertEquals(SUCCESSTOKEN1, templateEngine.replaceTokens(justOneToken));
+ }
+
+ public void testOneTokenWhiteSpace() {
+ assertEquals(SUCCESSTOKEN1, templateEngine.replaceTokens(oneTokenWhiteSpace));
+ }
+
+ public void testLongString() {
+ assertTrue(templateEngine.replaceTokens(multipleLogTokens).indexOf(SUCCESSTOKEN1) > 0);
+ assertTrue(templateEngine.replaceTokens(multipleLogTokens).indexOf(IPADDR) > 0);
+ }
+
+ public void testIgnore() {
+ assertTrue(templateEngine.replaceTokens(multipleLogTokens).indexOf("<% rhq.unsettoken %>") > 0);
+ assertTrue(templateEngine.replaceTokens(multipleLogTokens).indexOf("<% nmsqt.token1 %>") > 0);
+ }
+
+ public void testSameTokenTwice() {
+ assertEquals(SUCCESSTOKEN1 + SUCCESSTOKEN1, templateEngine.replaceTokens(sameTokenTwice));
+ }
+}
commit 5e857f7cc6053d8bbc0fd7e7519b06c69038da77
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 20 13:46:52 2010 -0500
Adding logic to display status/progress bar of file upload
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index ec839a9..b2fc562 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -309,7 +309,11 @@ THIS TEXT WILL BE REMOVED.
listHeight="50px"
fileUploadListener="#{fileUploader.fileUploadListener}"
addControlLabel="Browse"
- immediateUpload="false">
+ immediateUpload="false"
+ allowFlash="auto">
+ <f:facet name="label">
+ <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}" />
+ </f:facet>
<a4j:support event="onuploadcomplete"
reRender="fileUpload,fileContents,menuItem_#{ExistingResourceConfigurationUIBean.current.sha256}"/>
</rich:fileUpload>
commit 931c34fe16b52a49bdeaf09dc84fdffd8e404461
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 20 13:36:53 2010 -0500
Adding file upload to list of components to rerender after an upload has completed.
Without rerendered, you are unable to upload another file again since we are only allowing
a single file to be uploaded at a time.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index bf0ac96..ec839a9 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -311,7 +311,7 @@ THIS TEXT WILL BE REMOVED.
addControlLabel="Browse"
immediateUpload="false">
<a4j:support event="onuploadcomplete"
- reRender="fileContents,menuItem_#{ExistingResourceConfigurationUIBean.current.sha256}"/>
+ reRender="fileUpload,fileContents,menuItem_#{ExistingResourceConfigurationUIBean.current.sha256}"/>
</rich:fileUpload>
</rich:panel>
commit 5e0fbcc30ff8c6e6a382043c2b0de99afbe147cb
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 20 13:11:50 2010 -0500
Fixing navigation rules so that you are redirected to the history page after making a config update.
Being redirected to the history page is actually the current behavior that I changed some where
along the way in a recent commit.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index e53d8a2..9b9767b 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -18,30 +18,12 @@
*/
package org.rhq.enterprise.gui.configuration.resource;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.faces.application.FacesMessage;
-import javax.faces.event.ValueChangeEvent;
-import javax.servlet.http.HttpServletResponse;
-
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Out;
import org.jetbrains.annotations.Nullable;
-import org.richfaces.event.UploadEvent;
-
-import org.jboss.seam.annotations.Create;
-
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.Configuration;
@@ -49,15 +31,30 @@ import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
-import org.rhq.enterprise.gui.common.upload.FileUploadUIBean;
import org.rhq.core.gui.configuration.ConfigurationMaskingUtility;
import org.rhq.core.gui.util.FacesContextUtility;
+import org.rhq.enterprise.gui.common.upload.FileUploadUIBean;
import org.rhq.enterprise.gui.configuration.AbstractConfigurationUIBean;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
+import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;
+import javax.faces.application.FacesMessage;
+import javax.faces.event.ValueChangeEvent;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
// This class is temporarily decleared in components.xml since it is declared under two names - ViewUIBean and
// UIBean. This class is undergoing some refactoring and part of that will include declaring the @Name and @Scope
// annotations again.
@@ -583,11 +580,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return raws;
}
- /**
- *
- */
String selectedPath;
+
private TreeMap<String, RawConfiguration> raws;
+
TreeMap<String, RawConfiguration> modified = new TreeMap<String, RawConfiguration>();
RawConfiguration current = null;
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
index ff9c2de..0514f32 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -68,7 +68,7 @@ public class RawConfigUIBean {
public void setModified(boolean modified) {
this.modified = modified;
- panelMenuItem.setIcon(getIcon());
+// panelMenuItem.setIcon(getIcon());
}
public String getPath() {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
index 1ed069c..85def73 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
@@ -4,28 +4,6 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
- <!--<navigation-rule>-->
- <!--<from-view-id>/rhq/resource/configuration/view.xhtml</from-view-id>-->
-
- <!--<navigation-case>-->
- <!--<from-action>#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}</from-action>-->
- <!--<from-outcome>success</from-outcome>-->
- <!--<to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>-->
- <!--</navigation-case>-->
-
- <!--<navigation-case>-->
- <!--<from-action>#{ExistingResourceConfigurationUIBean.switchToraw}</from-action>-->
- <!--<to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>-->
- <!--</navigation-case>-->
- <!--</navigation-rule>-->
-
- <!--<navigation-rule>-->
- <!--<navigation-case>-->
- <!--<from-action>#{ExistingResourceConfigurationUIBean.editRawConfiguration}</from-action>-->
- <!--<to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>-->
- <!--</navigation-case>-->
- <!--</navigation-rule>-->
-
<navigation-rule>
<navigation-case>
<from-action>#{ExistingResourceConfigurationUIBean.editConfiguration}</from-action>
@@ -43,49 +21,21 @@
<from-action>#{ConfigHelperUIBean.accessMap}</from-action>
<to-view-id>/rhq/resource/configuration/view-map.xhtml</to-view-id>
</navigation-case>
-
- <!--<navigation-case>-->
- <!--<from-action>#{ExistingResourceConfigurationViewUIBean.switchToStructured}</from-action>-->
- <!--<to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>-->
- <!--<redirect/>-->
- <!--</navigation-case>-->
-
- <!--<navigation-case>-->
- <!--<from-action>#{ExistingResourceConfigurationViewUIBean.switchToRaw}</from-action>-->
- <!--<to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>-->
- <!--<!–<redirect/>–>-->
- <!--</navigation-case>-->
-
</navigation-rule>
<navigation-rule>
- <from-view-id>/rhq/resource/configuration/edit-raw-full.xhtml</from-view-id>
- <navigation-case>
- <from-action>#{RawConfigCollection.update}</from-action>
- <to-view-id>/rhq/resource/configuration/edit-raw.xhtml?id=#{param.id}</to-view-id>
- </navigation-case>
- </navigation-rule>
-
- <navigation-rule>
- <from-view-id>/rhq/resource/configuration/edit-raw.xhtml</from-view-id>
-
- <navigation-case>
- <from-action>#{ExistingResourceConfigurationUIBean.updateRawConfiguration}</from-action>
+ <from-view-id>/rhq/resource/configuration/edit.xhtml</from-view-id>
+
+ <navigation-case>
+ <from-action>#{ExistingResourceConfigurationUIBean.updateConfiguration}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/rhq/resource/configuration/history.xhtml?id=#{param.id}</to-view-id>
<redirect/>
</navigation-case>
-
- </navigation-rule>
-
- <navigation-rule>
-
- <from-view-id>/rhq/resource/configuration/edit.xhtml</from-view-id>
-
- <navigation-case>
- <from-action>#{ExistingResourceConfigurationUIBean.updateConfiguration}</from-action>
+ <navigation-case>
+ <from-action>#{ExistingResourceConfigurationUIBean.updateRawConfiguration}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/rhq/resource/configuration/history.xhtml?id=#{param.id}</to-view-id>
<redirect/>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index b6a7a26..bf0ac96 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -43,7 +43,7 @@ THIS TEXT WILL BE REMOVED.
onsubmit="prepareInputsForSubmission(this)"
rendered="#{!ViewResourceConfigurationUIBean.updateInProgress}">
- <input type="hidden" name="currentResourceId" value="#{ResourceUIBean.id}"/>
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
<h:panelGrid columns="2" style="width:100%">
<h:outputText value="#{ResourceUIBean.name}"/>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 41648bf..2e3864e 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -194,18 +194,6 @@ THIS TEXT WILL BE REMOVED.
rendered="#{!ResourceUIBean.permissions.configure}"/>
<h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton id="editRawButton"
- value="Edit"
- action="#{ExistingResourceConfigurationUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<rich:panel style="width:100%">
commit 0f028b0b9be6bd58d205b39eea5d80d2f506ebdc
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Jan 20 10:21:52 2010 -0500
removed @Override annotation incorrectly added to interface implmentations
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
index c01828b..55d5751 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/plugin/pc/content/TestContentProvider.java
@@ -330,7 +330,7 @@ public class TestContentProvider implements ContentProvider, PackageSource, Repo
return null;
}
- @Override
+
public SyncProgressWeight getSyncProgressWeight() {
return SyncProgressWeight.DEFAULT_WEIGHTS;
}
diff --git a/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java b/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
index 8c3f163..1b46cfb 100644
--- a/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
+++ b/modules/enterprise/server/plugins/disk/src/main/java/org/rhq/enterprise/server/plugins/disk/DiskSource.java
@@ -353,7 +353,7 @@ public class DiskSource implements ContentProvider, PackageSource, RepoSource {
public String resourceTypePluginName;
}
- @Override
+
public SyncProgressWeight getSyncProgressWeight() {
return new SyncProgressWeight(10, 1, 0, 0, 0);
}
diff --git a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
index c65a1b0..ed9d4ee 100644
--- a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
+++ b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
@@ -244,7 +244,7 @@ public class JBossSoftwareContentSourceAdapter implements ContentProvider, Packa
}
}
- @Override
+
public SyncProgressWeight getSyncProgressWeight() {
return SyncProgressWeight.DEFAULT_WEIGHTS;
}
diff --git a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java
index 9a6e9c0..38d54c2 100644
--- a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java
+++ b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/RHNProvider.java
@@ -357,7 +357,7 @@ public class RHNProvider implements ContentProvider, PackageSource, RepoSource,
return helper.constructKickstartFileUrl(repoName, label, relativeFilename);
}
- @Override
+
public SyncProgressWeight getSyncProgressWeight() {
return new SyncProgressWeight(10, 1, 0, 0, 1);
}
diff --git a/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java b/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java
index 061f860..4cb6de9 100644
--- a/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java
+++ b/modules/enterprise/server/plugins/url/src/main/java/org/rhq/enterprise/server/plugins/url/UrlProvider.java
@@ -393,7 +393,7 @@ public class UrlProvider implements ContentProvider, PackageSource {
return null; // the file doesn't match any known types for this content source
}
- @Override
+
public SyncProgressWeight getSyncProgressWeight() {
return SyncProgressWeight.DEFAULT_WEIGHTS;
}
diff --git a/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java b/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java
index f45c0a4..fadb218 100644
--- a/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java
+++ b/modules/enterprise/server/plugins/yum/src/main/java/org/rhq/enterprise/server/plugins/yum/RepoProvider.java
@@ -191,7 +191,6 @@ public class RepoProvider implements ContentProvider, PackageSource {
return path;
}
- @Override
public SyncProgressWeight getSyncProgressWeight() {
return SyncProgressWeight.DEFAULT_WEIGHTS;
}
commit db6156b14aa1dfe107ee866baeb51ad80396bd8b
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 20 08:21:17 2010 -0500
Making edit button on view.xhtml consistent with placement of commit button on edit.xhtml
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 6539aae..41648bf 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -45,8 +45,16 @@ THIS TEXT WILL BE REMOVED.
<h:form id="viewResourceConfigurationForm">
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
- <h:panelGrid columns="2">
+ <h:panelGrid columns="2" style="width:100%">
<h:outputText value="#{ResourceUIBean.name}"/>
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:commandButton value="Edit"
+ action="#{ExistingResourceConfigurationUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGroup>
+ </h:panelGrid>
</h:panelGrid>
<c:choose>
@@ -58,17 +66,6 @@ THIS TEXT WILL BE REMOVED.
rendered="#{!ResourceUIBean.permissions.configure}"/>
<h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton value="Edit"
- action="#{ExistingResourceConfigurationUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<rich:panel style="width:100%">
@@ -120,6 +117,15 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
+
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:commandButton value="Edit"
+ action="#{ExistingResourceConfigurationUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGroup>
+ </h:panelGrid>
</rich:tab>
</rich:tabPanel>
<ui:include src="view-raw-modal.xhtml"/>
@@ -131,18 +137,6 @@ THIS TEXT WILL BE REMOVED.
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
- <h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton value="Edit"
- action="#{ExistingResourceConfigurationUIBean.editConfiguration}"
- title="Edit this Configuration"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
<onc:config
configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
@@ -151,6 +145,15 @@ THIS TEXT WILL BE REMOVED.
nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
prevalidate="true"/>
+
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:commandButton value="Edit"
+ action="#{ExistingResourceConfigurationUIBean.editConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGroup>
+ </h:panelGrid>
</rich:tab>
</rich:tabPanel>
</c:when>
@@ -164,16 +167,6 @@ THIS TEXT WILL BE REMOVED.
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton id="editStructuredButton"
- value="Edit"
- action="#{ExistingResourceConfigurationUIBean.editConfiguration}"
- title="Edit this Configuration" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
<onc:config
configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
@@ -183,7 +176,16 @@ THIS TEXT WILL BE REMOVED.
nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
prevalidate="true"/>
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:commandButton value="Edit"
+ action="#{ExistingResourceConfigurationUIBean.editConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGroup>
+ </h:panelGrid>
</rich:tab>
+
<rich:tab id="rawTab"
label="Advanced Mode"
onlabelclick="cursor_wait();"
@@ -255,6 +257,15 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
+
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:commandButton value="Edit"
+ action="#{ExistingResourceConfigurationUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGroup>
+ </h:panelGrid>
</rich:tab>
</rich:tabPanel>
<ui:include src="view-raw-modal.xhtml"/>
commit 31c9810072508710b3ea66dc30c5970f0c53ad7e
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 20 02:04:35 2010 -0500
Adding support in file upload to rerender the current file with the uploaded contents.
With this commit I have also attempted to update the file menu, showing the current fle as
modified; The file menu item is getting rendered again, but the icon is not showing up.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 23460e6..e53d8a2 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -21,31 +21,23 @@ package org.rhq.enterprise.gui.configuration.resource;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
-import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.faces.application.FacesMessage;
-import javax.faces.component.UIComponent;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.jboss.seam.ScopeType;
-import org.jboss.seam.annotations.In;
-import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
-import org.jboss.seam.annotations.Scope;
import org.jetbrains.annotations.Nullable;
-import org.richfaces.component.UISwitchablePanel;
-import org.richfaces.component.UITabPanel;
import org.richfaces.event.UploadEvent;
import org.jboss.seam.annotations.Create;
@@ -64,6 +56,7 @@ import org.rhq.enterprise.gui.configuration.AbstractConfigurationUIBean;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
+import org.richfaces.model.UploadItem;
// This class is temporarily decleared in components.xml since it is declared under two names - ViewUIBean and
// UIBean. This class is undergoing some refactoring and part of that will include declaring the @Name and @Scope
@@ -373,7 +366,23 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String getCurrentContents() {
- return new String(getCurrent().getContents());
+ try {
+ if (fileUploader.getFileItem() != null) {
+ UploadItem fileItem = fileUploader.getFileItem();
+ if (fileItem.isTempFile()) {
+ setCurrentContents(FileUtils.readFileToString(fileItem.getFile()));
+ }
+ else {
+ setCurrentContents(new String(fileItem.getData()));
+ }
+ fileUploader.clear();
+ }
+
+ return new String(getCurrent().getContents());
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
public String getCurrentPath() {
@@ -388,7 +397,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
if (modalEditorContents == null) {
modalEditorContents = getCurrentContents();
}
-// return getCurrentContents();
return modalEditorContents;
}
@@ -427,8 +435,8 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
/**
*
* @return the id associated with the resource.
- * The value Cached in order to be available on the upload page,
- * where seeing the resource id conflicts with the rich upload tag.
+ * The value Cached in order to be available on the completeUpload page,
+ * where seeing the resource id conflicts with the rich completeUpload tag.
*/
public int getResourceId() {
if (resourceId == null) {
@@ -481,7 +489,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public void setCurrentContents(String updated) {
-
String original = new String(getCurrent().getContents());
if (!updated.equals(original)) {
current = current.deepCopy(false);
@@ -537,14 +544,14 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
/**
- * This is a no-op, since the upload work was done by upload file
+ * This is a no-op, since the completeUpload work was done by completeUpload file
* But is kept as a target for the "save" icon from the full screen page
*/
public String update() {
return "/rhq/resource/configuration/edit-raw.xhtml?currentResourceId=" + getResourceId();
}
- public String upload() {
+ public String completeUpload() {
return null;
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
index 588c967..ff9c2de 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -24,6 +24,7 @@
package org.rhq.enterprise.gui.configuration.resource;
import org.rhq.core.domain.configuration.RawConfiguration;
+import org.richfaces.component.html.HtmlPanelMenuItem;
import java.io.File;
@@ -35,6 +36,8 @@ public class RawConfigUIBean {
private String modifiedContents;
+ private HtmlPanelMenuItem panelMenuItem;
+
public RawConfiguration getRawConfiguration() {
return rawConfiguration;
}
@@ -43,6 +46,14 @@ public class RawConfigUIBean {
this.rawConfiguration = rawConfiguration;
}
+ public HtmlPanelMenuItem getPanelMenuItem() {
+ return panelMenuItem;
+ }
+
+ public void setPanelMenuItem(HtmlPanelMenuItem panelMenuItem) {
+ this.panelMenuItem = panelMenuItem;
+ }
+
public String getModifiedContents() {
return modifiedContents;
}
@@ -57,6 +68,7 @@ public class RawConfigUIBean {
public void setModified(boolean modified) {
this.modified = modified;
+ panelMenuItem.setIcon(getIcon());
}
public String getPath() {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml
index c2825ba..d9e4078 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml
@@ -209,7 +209,7 @@
<param-value>false</param-value>
</context-param>
- <!-- Allows upload of files through JSF (i.e. software uploads) -->
+ <!-- Allows completeUpload of files through JSF (i.e. software uploads) -->
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.rhq.enterprise.gui.common.upload.MultipartFilter</filter-class>
@@ -234,7 +234,7 @@
<param-value>true</param-value>
</init-param>
<init-param>
- <!-- is 250MB the largest package we'll ever want to upload? -->
+ <!-- is 250MB the largest package we'll ever want to completeUpload? -->
<param-name>maxRequestSize</param-name>
<param-value>250000000</param-value>
</init-param>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 3515bf9..b6a7a26 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -206,7 +206,7 @@ THIS TEXT WILL BE REMOVED.
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<h:panelGrid columns="1">
- <rich:panel style="width:100%">
+ <rich:panel id="fileMenuPanel" style="width:100%">
<f:facet name="header">Files</f:facet>
@@ -221,8 +221,10 @@ THIS TEXT WILL BE REMOVED.
expanded="true"
selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ <rich:panelMenuItem id="menuItem_#{rawConfigUIBean.rawConfiguration.sha256}"
+ label="#{rawConfigUIBean.fileName}"
icon="#{rawConfigUIBean.icon}"
+ binding="#{rawConfigUIBean.panelMenuItem}"
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
@@ -268,23 +270,6 @@ THIS TEXT WILL BE REMOVED.
value="#{ExistingResourceConfigurationUIBean.currentContents}"
readonly="false"/>
</rich:panel>
- <ui:remove>
- <!--
- Here I tried the file upload in the existing form. It does not generate any errors in the firefox
- error console, but the upload is not working.
- -->
- <rich:fileUpload id="fileUpload"
- fileUploadListener="#{ExistingResourceConfigurationUIBean.fileUploadListener}"
- maxFilesQuantity="1"
- noDuplicate="true"
- immediateUpload="true"
- autoclear="false"
- allowFlash="false"
- maxRequestSize="100000">
- <a4j:support event="onuploadcomplete"
- reRender="fileMenu,fileContents"/>
- </rich:fileUpload>
- </ui:remove>
</h:panelGrid>
</h:panelGrid>
@@ -324,8 +309,9 @@ THIS TEXT WILL BE REMOVED.
listHeight="50px"
fileUploadListener="#{fileUploader.fileUploadListener}"
addControlLabel="Browse"
- immediateUpload="true">
- <a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
+ immediateUpload="false">
+ <a4j:support event="onuploadcomplete"
+ reRender="fileContents,menuItem_#{ExistingResourceConfigurationUIBean.current.sha256}"/>
</rich:fileUpload>
</rich:panel>
commit 6abdbe720a94b052b31b2ba19e046ca62fd5b5ac
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 20 00:49:25 2010 -0500
Adding logic to display file upload panel only when on a raw edit page
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 852897a..23460e6 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -32,6 +32,7 @@ import java.util.Map;
import java.util.TreeMap;
import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpServletResponse;
@@ -43,6 +44,8 @@ import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jetbrains.annotations.Nullable;
+import org.richfaces.component.UISwitchablePanel;
+import org.richfaces.component.UITabPanel;
import org.richfaces.event.UploadEvent;
import org.jboss.seam.annotations.Create;
@@ -417,7 +420,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public Object[] getPaths() {
-
+
return getRaws().keySet().toArray();
}
@@ -458,6 +461,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return getConfigurationDefinition().getConfigurationFormat() == ConfigurationFormat.STRUCTURED_AND_RAW;
}
+ public boolean isFileUploadAvailable() {
+ return isRawSupported() || (isStructuredAndRawSupported() && isRawMode());
+ }
+
void nullify() {
}
@@ -538,7 +545,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String upload() {
-// return "/rhq/resource/configuration/edit-raw.xhtml?currentResourceId=" + getResourceId();
return null;
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 047bf7f..3515bf9 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -170,7 +170,11 @@ THIS TEXT WILL BE REMOVED.
selectedTab="#{ExistingResourceConfigurationUIBean.selectedTab}"
switchType="ajax"
valueChangeListener="#{ExistingResourceConfigurationUIBean.changeTabs}">
- <rich:tab id="structuredTab" label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <rich:tab id="structuredTab"
+ label="Basic Mode"
+ reRender="uploadForm"
+ onlabelclick="cursor_wait();"
+ oncomplete="cursor_clear();">
<onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
configuration="#{ExistingResourceConfigurationUIBean.configuration}"
nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
@@ -193,7 +197,11 @@ THIS TEXT WILL BE REMOVED.
styleClass="buttonmed"/>
</h:panelGrid>
</rich:tab>
- <rich:tab id="rawTab" label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <rich:tab id="rawTab"
+ label="Advanced Mode"
+ reRender="uploadForm"
+ onlabelclick="cursor_wait();"
+ oncomplete="cursor_clear();">
<h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
@@ -274,8 +282,7 @@ THIS TEXT WILL BE REMOVED.
allowFlash="false"
maxRequestSize="100000">
<a4j:support event="onuploadcomplete"
- reRender="fileContents"
- action="#{ExistingResourceConfigurationUIBean.upload}"/>
+ reRender="fileMenu,fileContents"/>
</rich:fileUpload>
</ui:remove>
</h:panelGrid>
@@ -309,13 +316,14 @@ THIS TEXT WILL BE REMOVED.
Line: 6
-->
<h:form id="uploadForm" enctype="multipart/form-data">
- <rich:panel>
+ <rich:panel id="uploadPanel" rendered="#{ExistingResourceConfigurationUIBean.fileUploadAvailable}">
<input type="hidden" name="currentResourceId" value="#{ResourceUIBean.id}"/>
<rich:fileUpload id="fileUpload"
- listHeight="100px"
+ listHeight="50px"
fileUploadListener="#{fileUploader.fileUploadListener}"
+ addControlLabel="Browse"
immediateUpload="true">
<a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
</rich:fileUpload>
commit 8402b19db9295fe0906e6b776f479e81f8acf9bd
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 19 22:28:57 2010 -0500
Fixing edit button for structured view so that it sends you to the edit page.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 3161efa..6539aae 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -137,7 +137,7 @@ THIS TEXT WILL BE REMOVED.
rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
<h:commandButton value="Edit"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ action="#{ExistingResourceConfigurationUIBean.editConfiguration}"
title="Edit this Configuration"
styleClass="buttonmed"
rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
commit 04e7165bddf42aba84d7c0950e0477781a0fbe14
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 19 22:26:00 2010 -0500
Fixing icon for unmodified files to be a blank image
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 36b1905..3161efa 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -221,6 +221,7 @@ THIS TEXT WILL BE REMOVED.
selectedChild="#{currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ icon="/images/blank.png"
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
commit 7c2203b4bc066ac1b271b7202bc85494f9e68795
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 19 21:28:43 2010 -0500
A first pass of file upload working directly on edit.xhtml without going to a different page
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index d74d938..047bf7f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -43,7 +43,7 @@ THIS TEXT WILL BE REMOVED.
onsubmit="prepareInputsForSubmission(this)"
rendered="#{!ViewResourceConfigurationUIBean.updateInProgress}">
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <input type="hidden" name="currentResourceId" value="#{ResourceUIBean.id}"/>
<h:panelGrid columns="2" style="width:100%">
<h:outputText value="#{ResourceUIBean.name}"/>
@@ -273,7 +273,9 @@ THIS TEXT WILL BE REMOVED.
autoclear="false"
allowFlash="false"
maxRequestSize="100000">
- <a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
+ <a4j:support event="onuploadcomplete"
+ reRender="fileContents"
+ action="#{ExistingResourceConfigurationUIBean.upload}"/>
</rich:fileUpload>
</ui:remove>
</h:panelGrid>
@@ -298,7 +300,6 @@ THIS TEXT WILL BE REMOVED.
</h:form>
- <ui:remove>
<!--
Here I tried the file upload in a separate form. It has resulted in javascript errors. The latest error in the
firefox error console is,
@@ -307,11 +308,10 @@ THIS TEXT WILL BE REMOVED.
Source File: http://localhost:7080/a4j/g/3_3_2.SR1org/ajax4jsf/javascript/scripts/form...
Line: 6
-->
- <h:form id="uploadForm">
+ <h:form id="uploadForm" enctype="multipart/form-data">
<rich:panel>
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <input type="hidden" name="currentResourceId" value="#{ResourceUIBean.id}"/>
<rich:fileUpload id="fileUpload"
listHeight="100px"
@@ -322,7 +322,6 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:form>
- </ui:remove>
<h:panelGroup layout="block" styleClass="InfoBlock"
rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
commit dbcc3f759a998237a577eccd26e1e60b20c459f2
Merge: b689286... 1fc3706...
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 19 20:06:36 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config
commit b6892868e463eca9e6ee120e8e183e94df301a51
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 19 20:04:59 2010 -0500
Checking in some debug code for trying to get file upload working on edit.xhtml
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index d690293..852897a 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.configuration.resource;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Collections;
@@ -53,6 +54,7 @@ import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
+import org.rhq.enterprise.gui.common.upload.FileUploadUIBean;
import org.rhq.core.gui.configuration.ConfigurationMaskingUtility;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.configuration.AbstractConfigurationUIBean;
@@ -77,6 +79,9 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
@Out
private Collection<RawConfigDirectory> rawConfigDirectories;
+ @Out
+ private FileUploadUIBean fileUploader = new FileUploadUIBean();
+
private String modalEditorContents;
public ExistingResourceConfigurationUIBean() {
@@ -532,12 +537,9 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return "/rhq/resource/configuration/edit-raw.xhtml?currentResourceId=" + getResourceId();
}
- /**
- * This is a no-op, since the upload work was done by upload file
- * But is kept as a target for the "action" value
- */
public String upload() {
- return "/rhq/resource/configuration/edit-raw.xhtml?currentResourceId=" + getResourceId();
+// return "/rhq/resource/configuration/edit-raw.xhtml?currentResourceId=" + getResourceId();
+ return null;
}
void dumpProperties(Configuration conf, Log log) {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
index 8f7cfcc..15424a2 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
@@ -16,8 +16,9 @@
<component class="org.jboss.seam.web.MultipartFilter">
- <property name="createTempFiles">false</property>
+ <property name="createTempFiles">true</property>
<property name="maxRequestSize">1000000</property>
+ <property name="urlPattern">*.xhtml</property>
</component>
<component class="org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean"
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml
index 0038c7d..c2825ba 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml
@@ -5,7 +5,7 @@
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
- <display-name>RHQ</display-name>
+ <display-name>RHQ_FOO</display-name>
<!--=== Seam ===-->
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/common/Login.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/common/Login.jsp
index 7537fbd..946557d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/common/Login.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/common/Login.jsp
@@ -80,7 +80,7 @@ input.button_submit {
</head>
<body>
- <jsp:include page="/rhq/common/ie6/ie6fix.xhtml"/>
+ <%--<jsp:include page="/rhq/common/ie6/ie6fix.xhtml"/>--%>
<div id="PageHeader">
<table width="100%" border="0" cellpadding="20" cellspacing="0" height="70px">
@@ -145,6 +145,6 @@ input.button_submit {
document.forms["LoginForm"].elements["j_username"].focus();
// -->
</script>
-<jsp:include page="/rhq/common/ie6/ie6loginfix.xhtml" />
+<%--<jsp:include page="/rhq/common/ie6/ie6loginfix.xhtml" />--%>
</body>
</html>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
index 3bd4af6..c8f6d72 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
@@ -12,7 +12,7 @@
<h:form>
- <ui:include src="/rhq/common/ie6/ie6fix.xhtml" />
+ <ui:remove><ui:include src="/rhq/common/ie6/ie6fix.xhtml" /></ui:remove>
<f:loadBundle
basename="ApplicationResources"
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 7e54120..d74d938 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -9,6 +9,7 @@
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:onc="http://jboss.org/on/component">
@@ -222,7 +223,7 @@ THIS TEXT WILL BE REMOVED.
<h:panelGroup>
<h:outputText value="#{#rawConfigUIBean.fileName}"/>
<c:if test="#{rawConfigUIBean.modified}">
- <h:commandButton value="Undo"/>
+ <h:commandButton value="Undo" styleClass="buttonmed"/>
</c:if>
</h:panelGroup>
</rich:panelMenuItem>
@@ -243,6 +244,7 @@ THIS TEXT WILL BE REMOVED.
startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
<a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
</h:commandLink>
@@ -259,14 +261,20 @@ THIS TEXT WILL BE REMOVED.
readonly="false"/>
</rich:panel>
<ui:remove>
- <h:form id="uploadForm" enctype="multipart/form-data">
+ <!--
+ Here I tried the file upload in the existing form. It does not generate any errors in the firefox
+ error console, but the upload is not working.
+ -->
<rich:fileUpload id="fileUpload"
- listHeight="100px"
fileUploadListener="#{ExistingResourceConfigurationUIBean.fileUploadListener}"
- immediateUpload="true">
+ maxFilesQuantity="1"
+ noDuplicate="true"
+ immediateUpload="true"
+ autoclear="false"
+ allowFlash="false"
+ maxRequestSize="100000">
<a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
</rich:fileUpload>
- </h:form>
</ui:remove>
</h:panelGrid>
</h:panelGrid>
@@ -291,14 +299,29 @@ THIS TEXT WILL BE REMOVED.
</h:form>
<ui:remove>
- <rich:panel>
- <rich:fileUpload id="fileUpload"
- listHeight="100px"
- fileUploadListener="#{ExistingResourceConfigurationUIBean.fileUploadListener}"
- immediateUpload="true">
- <a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
- </rich:fileUpload>
- </rich:panel>
+ <!--
+ Here I tried the file upload in a separate form. It has resulted in javascript errors. The latest error in the
+ firefox error console is,
+
+ Error: form.dispatchEvent is not a function
+ Source File: http://localhost:7080/a4j/g/3_3_2.SR1org/ajax4jsf/javascript/scripts/form...
+ Line: 6
+ -->
+ <h:form id="uploadForm">
+ <rich:panel>
+
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <rich:fileUpload id="fileUpload"
+ listHeight="100px"
+ fileUploadListener="#{fileUploader.fileUploadListener}"
+ immediateUpload="true">
+ <a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
+ </rich:fileUpload>
+
+ </rich:panel>
+ </h:form>
</ui:remove>
<h:panelGroup layout="block" styleClass="InfoBlock"
diff --git a/pom.xml b/pom.xml
index 34487d0..134b444 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
<postgresql.version>8.4-701.jdbc3</postgresql.version>
<h2.version>1.1.117</h2.version>
<jtds.version>1.2.2</jtds.version>
- <richfaces.version>3.3.0.GA</richfaces.version>
+ <richfaces.version>3.3.2.SR1</richfaces.version>
<sigar.version>1.6.3.82</sigar.version>
<quartz.version>1.6.5</quartz.version>
<jna.version>3.2.2</jna.version>
commit 1fc37069d1173ca4e6ad4fcf4424ec9377386ebd
Author: Adam Young <ayoung(a)redhat.com>
Date: Tue Jan 19 14:40:30 2010 -0500
removed amps version, now just check what facet is supported for configuration.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
index dbf131b..1f8b2b7 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
@@ -23,19 +23,18 @@
package org.rhq.core.pc.configuration;
-import org.apache.maven.artifact.versioning.ComparableVersion;
+
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.composite.ResourceFacets;
import org.rhq.core.pc.util.ComponentService;
-
-import static org.rhq.core.domain.configuration.definition.ConfigurationFormat.RAW;
-import static org.rhq.core.domain.configuration.definition.ConfigurationFormat.STRUCTURED;
+import org.rhq.core.pc.util.FacetLockType;
+import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
public class ConfigManagementFactoryImpl implements ConfigManagementFactory {
- private static final ComparableVersion NON_LEGACY_AMPS_VERSION = new ComparableVersion("2.1");
-
private ComponentService componentService;
private ConfigurationUtilityService configUtilityService = new ConfigurationUtilityServiceImpl();
@@ -57,41 +56,30 @@ public class ConfigManagementFactoryImpl implements ConfigManagementFactory {
}
private ConfigManagement createStrategy(int resourceId) throws PluginContainerException {
- String ampsVersion = componentService.getAmpsVersion(resourceId);
-
- if (isLegacyVersion(ampsVersion)) {
- return new LegacyConfigManagement();
- }
-
ResourceType resourceType = componentService.getResourceType(resourceId);
-
ConfigurationFormat format = resourceType.getResourceConfigurationDefinition().getConfigurationFormat();
- switch (format) {
- case RAW: break;
- default: ;
- }
- if (isStructured(resourceType)) {
- return new StructuredConfigManagement();
+ if (null == format) {
+ return new LegacyConfigManagement();
}
- if (isRaw(resourceType)) {
+ switch (format) {
+ case RAW:
return new RawConfigManagement();
+ case STRUCTURED_AND_RAW:
+ return new StructuredAndRawConfigManagement();
+ case STRUCTURED:
+ default:
+ boolean daemonOnly = true;
+ boolean onlyIfStarted = true;
+ ResourceComponent resourceComponent = componentService.getComponent(resourceId,
+ ResourceComponent .class, FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT,
+ daemonOnly, onlyIfStarted);
+ if (resourceComponent instanceof ResourceConfigurationFacet){
+ return new StructuredConfigManagement();
+ }else{
+ return new LegacyConfigManagement();
+ }
}
-
- // else format is both structured and raw
- return new StructuredAndRawConfigManagement();
- }
-
- private boolean isLegacyVersion(String ampsVersion) {
- return new ComparableVersion(ampsVersion).compareTo(NON_LEGACY_AMPS_VERSION) < 0;
- }
-
- private boolean isStructured(ResourceType resourceType) {
- return resourceType.getResourceConfigurationDefinition().getConfigurationFormat().equals(STRUCTURED);
- }
-
- private boolean isRaw(ResourceType resourceType) {
- return resourceType.getResourceConfigurationDefinition().getConfigurationFormat().equals(RAW);
}
}
commit f4ab35fae9af81208006801bd706fb04ba0f8286
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 18 22:57:50 2010 -0500
Adding save/cancel buttons to modal editor
Clicking the cancel button simply closes the editor as a client-side operation. Clicking
the save button closes the editor but also fires an ajax request to the server to update
the on-page text editor. The modification will result in the file in the file menu
appearing as being updated as well.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 637ec4c..d690293 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -77,6 +77,8 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
@Out
private Collection<RawConfigDirectory> rawConfigDirectories;
+ private String modalEditorContents;
+
public ExistingResourceConfigurationUIBean() {
removeSessionScopedBeanIfInView("/rhq/resource/configuration/view.xhtml",
ExistingResourceConfigurationUIBean.class);
@@ -199,6 +201,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return updateConfiguration(false);
}
+ public void saveModalEditorContents() {
+ setCurrentContents(modalEditorContents);
+ }
+
public String updateConfiguration(boolean fromStructured) {
ConfigurationMaskingUtility.unmaskConfiguration(getConfiguration(), getConfigurationDefinition());
@@ -371,10 +377,15 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String getModalEditorContents() {
- return getCurrentContents();
+ if (modalEditorContents == null) {
+ modalEditorContents = getCurrentContents();
+ }
+// return getCurrentContents();
+ return modalEditorContents;
}
public void setModalEditorContents(String contents) {
+ modalEditorContents = contents;
}
public TreeMap<String, RawConfiguration> getModified() {
@@ -454,6 +465,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
selectedPath = s;
setCurrentPath(selectedPath);
setCurrentContents(getCurrentContents());
+ modalEditorContents = getCurrentContents();
}
public void setCurrentContents(String updated) {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index c87f4cb..7e54120 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -258,6 +258,16 @@ THIS TEXT WILL BE REMOVED.
value="#{ExistingResourceConfigurationUIBean.currentContents}"
readonly="false"/>
</rich:panel>
+ <ui:remove>
+ <h:form id="uploadForm" enctype="multipart/form-data">
+ <rich:fileUpload id="fileUpload"
+ listHeight="100px"
+ fileUploadListener="#{ExistingResourceConfigurationUIBean.fileUploadListener}"
+ immediateUpload="true">
+ <a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
+ </rich:fileUpload>
+ </h:form>
+ </ui:remove>
</h:panelGrid>
</h:panelGrid>
@@ -280,6 +290,17 @@ THIS TEXT WILL BE REMOVED.
</h:form>
+ <ui:remove>
+ <rich:panel>
+ <rich:fileUpload id="fileUpload"
+ listHeight="100px"
+ fileUploadListener="#{ExistingResourceConfigurationUIBean.fileUploadListener}"
+ immediateUpload="true">
+ <a4j:support event="onuploadcomplete" reRender="fileMenu,fileContents"/>
+ </rich:fileUpload>
+ </rich:panel>
+ </ui:remove>
+
<h:panelGroup layout="block" styleClass="InfoBlock"
rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
<b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
index 8d8b046..25cec92 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
@@ -22,13 +22,23 @@
</h:panelGroup>
</f:facet>
<rich:panel style="margin-left:1px; border: none;">
- <h:inputTextarea id="fileContents"
+ <h:inputTextarea id="modalFileContents"
style="width:100%; height:100%; overflow:visible;"
rows="30"
cols="30"
value="#{ExistingResourceConfigurationUIBean.modalEditorContents}"
readonly="false"/>
</rich:panel>
+ <h:panelGrid columns="1" columnClasses="raw-edit-footer" style="width:100%">
+ <h:panelGroup style="text-align:right">
+ <a4j:commandButton value="Save"
+ action="#{ExistingResourceConfigurationUIBean.saveModalEditorContents}"
+ reRender="fileContents,fileMenu"
+ styleClass="buttonmed"
+ onclick="#{rich:component('modalEditor')}.hide()"/>
+ <a4j:commandButton value="Cancel" onclick="#{rich:component('modalEditor')}.hide()" styleClass="buttonmed"/>
+ </h:panelGroup>
+ </h:panelGrid>
</rich:modalPanel>
</f:subview>
commit fd7680ada5b7376fae1b770121510316f724dbb4
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 18 17:23:40 2010 -0500
Modified error message for collected exceptions to match unit test expected value.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 0bda29e..dc3955a 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -377,7 +377,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
if (null == errorMessage){
errorMessage = new StringBuilder();
}
- errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+". " );
+ errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+"." );
}
}
}catch(Throwable t){
commit 2ab5f6f7c086a490ca50bd65058be4f38ee8e55c
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 18 17:17:53 2010 -0500
Somehow, a bad version of the error messaging generted code has not gotten changed. This attempts to fix it.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index eb08ea3..0bda29e 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -382,7 +382,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
}catch(Throwable t){
errorMessage = new StringBuilder();
- errorMessage.append("configuation validation failed with" + t.getMessage()+"." );
+ errorMessage.append("configuation validation failed with" + t.getMessage()+".");
}
if (null != errorMessage){
throw new PluginContainerException(errorMessage.toString());
commit b9aa86fce93f2d1c98d82ded2125f67783ddf95d
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 18 17:10:02 2010 -0500
Adding commit button and msg above text area and moving them to the right side of the screen.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 25b7801..637ec4c 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -138,25 +138,32 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String switchToRaw() {
-// Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
-// EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), true);
Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
EnterpriseFacesContextUtility.getSubject(), getResourceId(), getConfiguration(), true);
setConfiguration(configuration);
- getModified().clear();
-
for (RawConfiguration raw : configuration.getRawConfigurations()) {
getRaws().put(raw.getPath(), raw);
}
current = null;
setConfiguration(configuration);
-
+ updateModifiedCache();
mode = RAW_MODE;
return null;
}
+ private void updateModifiedCache() {
+ Configuration configuration = getConfiguration();
+
+ for (RawConfiguration updatedRaw : configuration.getRawConfigurations()) {
+ RawConfiguration cachedRaw = modified.get(updatedRaw.getPath());
+ if (cachedRaw != null && !updatedRaw.getSha256().equals(cachedRaw.getSha256())) {
+ modified.remove(cachedRaw.getPath());
+ }
+ }
+ }
+
public String switchToStructured() {
Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), false);
@@ -172,6 +179,12 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
current = null;
setConfiguration(configuration);
+ for (RawConfiguration raw : configuration.getRawConfigurations()) {
+ System.out.println(raw.getPath() + " -\n" + (new String(raw.getContents())) + "\n");
+ }
+
+ updateModifiedCache();
+
mode = STRUCTURED_MODE;
return null;
@@ -418,12 +431,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public boolean isRawSupported() {
-// return getConfigurationFormat().isRawSupported();
- return getConfigurationDefinition().getConfigurationFormat() == ConfigurationFormat.RAW;
+ return getConfigurationDefinition().getConfigurationFormat() == ConfigurationFormat.RAW;
}
public boolean isStructuredSupported() {
-// return getConfigurationFormat().isStructuredSupported();
return getConfigurationDefinition().getConfigurationFormat() == ConfigurationFormat.STRUCTURED;
}
@@ -499,7 +510,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
log.error("Failed to complete download request for " + getCurrentPath(), e);
throw new RuntimeException(e);
}
-// return "download";
}
/**
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml
index d2cd3f7..cb1a71e 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml
@@ -12,11 +12,11 @@
<!--</managed-bean> -->
<!-- /rhq/resource/configuration/history.xhtml, /rhq/resource/configuration/edit.xhtml, and
/rhq/resource/configuration/edit-map.xhtml -->
- <managed-bean>
- <managed-bean-name>ExistingResourceConfigurationUIBean</managed-bean-name>
- <managed-bean-class>org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean</managed-bean-class>
- <managed-bean-scope>session</managed-bean-scope>
- </managed-bean>
+ <!--<managed-bean>-->
+ <!--<managed-bean-name>ExistingResourceConfigurationUIBean</managed-bean-name>-->
+ <!--<managed-bean-class>org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean</managed-bean-class>-->
+ <!--<managed-bean-scope>session</managed-bean-scope>-->
+ <!--</managed-bean> -->
<!-- /rhq/resource/configuration/add-new-simple.xhtml -->
<managed-bean>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index d9e5b18..c87f4cb 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -44,8 +44,18 @@ THIS TEXT WILL BE REMOVED.
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
- <h:panelGrid columns="2">
+ <h:panelGrid columns="2" style="width:100%">
<h:outputText value="#{ResourceUIBean.name}"/>
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:outputText style="padding-right:10px">n files changed in this configuration</h:outputText>
+ <h:commandButton value="Commit"
+ action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ </h:panelGroup>
+ </h:panelGrid>
</h:panelGrid>
<c:choose>
@@ -116,17 +126,17 @@ THIS TEXT WILL BE REMOVED.
readonly="false"/>
</rich:panel>
</h:panelGrid>
+ </h:panelGrid>
- <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
- <h:panelGrid columns="2">
- <h:outputText>n files changed in this configuration</h:outputText>
- <h:commandButton value="Commit"
- action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
- title="Click to Save Changes"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}"/>
- </h:panelGrid>
- </h:panelGrid>
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:outputText style="padding-right:10px">n files changed in this configuration</h:outputText>
+ <h:commandButton value="Commit"
+ action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ </h:panelGroup>
</h:panelGrid>
</rich:tab>
</rich:tabPanel>
@@ -187,40 +197,40 @@ THIS TEXT WILL BE REMOVED.
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<h:panelGrid columns="1">
- <rich:panel style="width:100%">
- <f:facet name="header">Files</f:facet>
-
-
- <rich:panelMenu id="fileMenu"
- mode="ajax"
- expandMode="client"
- iconCollapsedGroup="/images/icn_tree_folder.gif"
- iconExpandedGroup="/images/icn_tree_folder.gif">
- <c:forEach items="#{rawConfigDirectories}"
- var="rawConfigDir">
- <rich:panelMenuGroup label="#{rawConfigDir.path}"
- expanded="true"
- selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
- <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
- icon="#{rawConfigUIBean.icon}"
- onclick="cursor_wait();"
- oncomplete="cursor_clear();"
- action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- limitToList="true"
- reRender="fileContents,selectedFileHeader,modalEditor,fileMenu">
- <h:panelGroup>
- <h:outputText value="#{#rawConfigUIBean.fileName}"/>
- <c:if test="#{rawConfigUIBean.modified}">
- <h:commandButton value="Undo"/>
- </c:if>
- </h:panelGroup>
- </rich:panelMenuItem>
- </c:forEach>
- </rich:panelMenuGroup>
- </c:forEach>
- </rich:panelMenu>
- </rich:panel>
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+
+
+ <rich:panelMenu id="fileMenu"
+ mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="/images/icn_tree_folder.gif"
+ iconExpandedGroup="/images/icn_tree_folder.gif">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ icon="#{rawConfigUIBean.icon}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
+ limitToList="true"
+ reRender="fileContents,selectedFileHeader,modalEditor,fileMenu">
+ <h:panelGroup>
+ <h:outputText value="#{#rawConfigUIBean.fileName}"/>
+ <c:if test="#{rawConfigUIBean.modified}">
+ <h:commandButton value="Undo"/>
+ </c:if>
+ </h:panelGroup>
+ </rich:panelMenuItem>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
+ </rich:panelMenu>
+ </rich:panel>
<rich:panel style="border:none">
<h:graphicImage url="/images/star_on_24.png"/>
<h:outputText value="- Contains uncommitted changes"/>
@@ -249,17 +259,17 @@ THIS TEXT WILL BE REMOVED.
readonly="false"/>
</rich:panel>
</h:panelGrid>
+ </h:panelGrid>
- <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
- <h:panelGrid columns="2">
- <h:outputText>n files changed in this configuration</h:outputText>
- <h:commandButton value="Commit"
- action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
- title="Click to Save Changes"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}"/>
- </h:panelGrid>
- </h:panelGrid>
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGroup style="text-align:right">
+ <h:outputText style="padding-right:10px">n files changed in this configuration</h:outputText>
+ <h:commandButton value="Commit"
+ action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ </h:panelGroup>
</h:panelGrid>
</rich:tab>
</rich:tabPanel>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 7b34258..36b1905 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -63,7 +63,7 @@ THIS TEXT WILL BE REMOVED.
rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
<h:commandButton value="Edit"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ action="#{ExistingResourceConfigurationUIBean.editRawConfiguration}"
title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
commit 39cbfc6f8090cd0402917509c1aa7c32033c08a3
Merge: 6e642f7... a09d1be...
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 18 16:53:42 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config-confirm
commit 6e642f7fbf773f863bcc5c8b8bb6c37f4de991cc
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 18 16:25:31 2010 -0500
Update unit test.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 8a51f2a..eb08ea3 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -382,7 +382,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
}catch(Throwable t){
errorMessage = new StringBuilder();
- errorMessage.append("configuation validation failed with" + t.getMessage()+". " );
+ errorMessage.append("configuation validation failed with" + t.getMessage()+"." );
}
if (null != errorMessage){
throw new PluginContainerException(errorMessage.toString());
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
index 0176ef0..619fe36 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
@@ -71,48 +71,62 @@ public class ConfigurationManagerTest extends ConfigManagementTest {
}
@Test
- public void straegyShouldBeCalledToLoadConfig() throws Exception {
+ public void strategyShouldBeCalledToLoadConfig() throws Exception {
final Configuration expectedConfig = new Configuration();
final ConfigManagement loadConfig = context.mock(ConfigManagement.class);
- context.checking(new Expectations() {{
- atLeast(1).of(configMgmtFactory).getStrategy(resourceId); will(returnValue(loadConfig));
+ context.checking(new Expectations() {
+ {
+ atLeast(1).of(configMgmtFactory).getStrategy(resourceId);
+ will(returnValue(loadConfig));
- atLeast(1).of(loadConfig).executeLoad(resourceId); will(returnValue(expectedConfig));
- }});
+ atLeast(1).of(loadConfig).executeLoad(resourceId);
+ will(returnValue(expectedConfig));
+ }
+ });
Configuration actualConfig = configurationMgr.loadResourceConfiguration(resourceId);
assertNotNull(actualConfig, "Expected a non-null " + Configuration.class.getSimpleName() + " to be returned.");
}
- @Test(expectedExceptions = {PluginContainerException.class})
+ @Test(expectedExceptions = { PluginContainerException.class })
public void exceptionShouldBeThrownIfConfigIsNull() throws Exception {
final ConfigManagement loadConfig = context.mock(ConfigManagement.class);
- context.checking(new Expectations() {{
- atLeast(1).of(configMgmtFactory).getStrategy(resourceId); will(returnValue(loadConfig));
+ context.checking(new Expectations() {
+ {
+ atLeast(1).of(configMgmtFactory).getStrategy(resourceId);
+ will(returnValue(loadConfig));
- atLeast(1).of(loadConfig).executeLoad(resourceId); will(returnValue(null));
+ atLeast(1).of(loadConfig).executeLoad(resourceId);
+ will(returnValue(null));
- allowing(componentService).getResourceType(resourceId); will(returnValue(new ResourceType()));
- }});
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(new ResourceType()));
+ }
+ });
configurationMgr.loadResourceConfiguration(resourceId);
}
- @Test(expectedExceptions = {PluginContainerException.class})
+ @Test(expectedExceptions = { PluginContainerException.class })
public void exceptionShouldBeThrownWhenStrategyThrowsAnException() throws Exception {
final ConfigManagement loadConfig = context.mock(ConfigManagement.class);
- context.checking(new Expectations() {{
- allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType));
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
- atLeast(1).of(configMgmtFactory).getStrategy(resourceId); will(returnValue(loadConfig));
+ atLeast(1).of(configMgmtFactory).getStrategy(resourceId);
+ will(returnValue(loadConfig));
- atLeast(1).of(loadConfig).executeLoad(resourceId); will(throwException(new RuntimeException()));
- }});
+ atLeast(1).of(loadConfig).executeLoad(resourceId);
+ will(throwException(new RuntimeException()));
+ }
+ });
configurationMgr.loadResourceConfiguration(resourceId);
}
@@ -134,22 +148,24 @@ public class ConfigurationManagerTest extends ConfigManagementTest {
final ResourceConfigurationFacet facet = context.mock(ResourceConfigurationFacet.class);
- context.checking(new Expectations() {{
- allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType));
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
- atLeast(1).of(componentService).getComponent(resourceId,
- ResourceConfigurationFacet.class,
- FacetLockType.READ,
- ConfigManagement.FACET_METHOD_TIMEOUT,
- daemonThread,
- onlyIfStarted);
- will(returnValue(facet));
+ atLeast(1).of(componentService).getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted);
+ will(returnValue(facet));
- atLeast(1).of(facet).loadRawConfigurations(); will(returnValue(latestRaws));
+ atLeast(1).of(facet).loadRawConfigurations();
+ will(returnValue(latestRaws));
- oneOf(facet).mergeRawConfiguration(config, raw1); will(returnValue(mergedRaw1));
- oneOf(facet).mergeRawConfiguration(config, raw2); will(returnValue(mergedRaw2));
- }});
+ oneOf(facet).mergeRawConfiguration(config, raw1);
+ will(returnValue(mergedRaw1));
+ oneOf(facet).mergeRawConfiguration(config, raw2);
+ will(returnValue(mergedRaw2));
+ }
+ });
Configuration mergedConfig = configurationMgr.merge(config, resourceId, FROM_STRUCTURED);
@@ -171,28 +187,29 @@ public class ConfigurationManagerTest extends ConfigManagementTest {
final ResourceConfigurationFacet facet = context.mock(ResourceConfigurationFacet.class);
- context.checking(new Expectations() {{
- allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType));
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
- atLeast(1).of(componentService).getComponent(resourceId,
- ResourceConfigurationFacet.class,
- FacetLockType.READ,
- ConfigManagement.FACET_METHOD_TIMEOUT,
- daemonThread,
- onlyIfStarted);
- will(returnValue(facet));
+ atLeast(1).of(componentService).getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted);
+ will(returnValue(facet));
- atLeast(1).of(facet).loadRawConfigurations(); will(returnValue(latestRaws));
+ atLeast(1).of(facet).loadRawConfigurations();
+ will(returnValue(latestRaws));
- oneOf(facet).mergeRawConfiguration(config, originalRaw); will(returnValue(null));
- }});
+ oneOf(facet).mergeRawConfiguration(config, originalRaw);
+ will(returnValue(null));
+ }
+ });
Configuration mergedConfig = configurationMgr.merge(config, resourceId, FROM_STRUCTURED);
Configuration expectedConfig = new Configuration();
expectedConfig.addRawConfiguration(originalRaw);
- assertStructuredMergedIntoRaws(mergedConfig, expectedConfig, "cannot merge into a null raw.");
+ assertStructuredMergedIntoRaws(mergedConfig, expectedConfig, "cannot merge into a null raw.");
}
@Test
@@ -204,46 +221,39 @@ public class ConfigurationManagerTest extends ConfigManagementTest {
final ResourceConfigurationFacet facet = context.mock(ResourceConfigurationFacet.class);
- context.checking(new Expectations() {{
- allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType));
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
- atLeast(1).of(componentService).getComponent(resourceId,
- ResourceConfigurationFacet.class,
- FacetLockType.READ,
- ConfigManagement.FACET_METHOD_TIMEOUT,
- daemonThread,
- onlyIfStarted);
- will(returnValue(facet));
+ atLeast(1).of(componentService).getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted);
+ will(returnValue(facet));
- atLeast(1).of(facet).loadRawConfigurations(); will(returnValue(null));
- }});
+ atLeast(1).of(facet).loadRawConfigurations();
+ will(returnValue(null));
+ }
+ });
Configuration mergedConfig = configurationMgr.merge(config, resourceId, FROM_STRUCTURED);
Configuration expectedConfig = new Configuration();
expectedConfig.addRawConfiguration(raw);
- assertStructuredMergedIntoRaws(
- mergedConfig,
- expectedConfig,
- "Expected raw configs should not be modified when the facet does not return any raw configs."
- );
+ assertStructuredMergedIntoRaws(mergedConfig, expectedConfig,
+ "Expected raw configs should not be modified when the facet does not return any raw configs.");
}
void assertStructuredMergedIntoRaws(Configuration actual, Configuration expected, String msg) {
Set<RawConfiguration> actualRaws = actual.getRawConfigurations();
Set<RawConfiguration> expectedRaws = expected.getRawConfigurations();
- assertEquals(
- actualRaws.size(),
- expectedRaws.size(),
- "Merging structured into raws failed, got back the wrong number of raws. -- " + msg
- );
+ assertEquals(actualRaws.size(), expectedRaws.size(),
+ "Merging structured into raws failed, got back the wrong number of raws. -- " + msg);
for (RawConfiguration expectedRaw : expectedRaws) {
- assertTrue(
- actualRaws.contains(expectedRaw),
- "Merging structured into raws failed, failed to find to find raw config [" + expectedRaw + "] -- " + msg
- );
+ assertTrue(actualRaws.contains(expectedRaw),
+ "Merging structured into raws failed, failed to find to find raw config [" + expectedRaw + "] -- "
+ + msg);
}
}
@@ -265,38 +275,59 @@ public class ConfigurationManagerTest extends ConfigManagementTest {
final ResourceConfigurationFacet facet = context.mock(ResourceConfigurationFacet.class);
- context.checking(new Expectations() {{
- allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType));
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
- atLeast(1).of(componentService).getComponent(resourceId,
- ResourceConfigurationFacet.class,
- FacetLockType.READ,
- ConfigManagement.FACET_METHOD_TIMEOUT,
- daemonThread,
- onlyIfStarted);
- will(returnValue(facet));
+ atLeast(1).of(componentService).getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted);
+ will(returnValue(facet));
- atLeast(1).of(facet).loadStructuredConfiguration(); will(returnValue(latestStructured));
+ atLeast(1).of(facet).loadStructuredConfiguration();
+ will(returnValue(latestStructured));
- oneOf(facet).mergeStructuredConfiguration(raw1, config);
- oneOf(facet).mergeStructuredConfiguration(raw2, config);
- }});
+ oneOf(facet).mergeStructuredConfiguration(raw1, config);
+ oneOf(facet).mergeStructuredConfiguration(raw2, config);
+ }
+ });
Configuration mergedConfig = configurationMgr.merge(config, resourceId, FROM_RAW);
- assertEquals(
- mergedConfig.getAllProperties(),
- latestStructured.getAllProperties(),
- "Failed to merged raw into structured."
- );
+ assertEquals(mergedConfig.getAllProperties(), latestStructured.getAllProperties(),
+ "Failed to merged raw into structured.");
}
@Test
- public void catchExceptionThrownByFailedValidationOfRawConfigS() throws Exception {
- assertTrue(false);
+ public void catchExceptionThrownByFailedValidationOfRawConfigs() throws Exception {
+
+ Configuration configuration = new Configuration();
+ final RawConfiguration rawConfiguration = createRawConfiguration("/tmp/foo.txt");
+ configuration.addRawConfiguration(rawConfiguration);
+ final ResourceConfigurationFacet facet = context.mock(ResourceConfigurationFacet.class);
+
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
+
+ atLeast(1).of(componentService).getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted);
+ will(returnValue(facet));
+
+ allowing(facet).validateRawConfiguration(rawConfiguration);
+ will(throwException(new IllegalArgumentException("message")));
+
+ }
+ });
+ try {
+ configurationMgr.validate(configuration, resourceId, false);
+ assertTrue(false);
+ } catch (PluginContainerException exception) {
+ assertEquals(exception.getMessage(), "file /tmp/foo.txt failed validation with message.");
+ }
}
-
-
+
@Test
public void mergingRawsIntoStructuredShouldIgnoreNull() throws Exception {
Configuration config = new Configuration();
@@ -304,27 +335,24 @@ public class ConfigurationManagerTest extends ConfigManagementTest {
final ResourceConfigurationFacet facet = context.mock(ResourceConfigurationFacet.class);
- context.checking(new Expectations() {{
- allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType));
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
- atLeast(1).of(componentService).getComponent(resourceId,
- ResourceConfigurationFacet.class,
- FacetLockType.READ,
- ConfigManagement.FACET_METHOD_TIMEOUT,
- daemonThread,
- onlyIfStarted);
- will(returnValue(facet));
+ atLeast(1).of(componentService).getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted);
+ will(returnValue(facet));
- atLeast(1).of(facet).loadStructuredConfiguration(); will(returnValue(null));
- }});
+ atLeast(1).of(facet).loadStructuredConfiguration();
+ will(returnValue(null));
+ }
+ });
Configuration mergedConfig = configurationMgr.merge(config, resourceId, FROM_RAW);
- assertEquals(
- mergedConfig,
- config,
- "Structured config should not be modified when the facet does not return a structured config."
- );
+ assertEquals(mergedConfig, config,
+ "Structured config should not be modified when the facet does not return a structured config.");
}
@Test
@@ -348,16 +376,20 @@ public class ConfigurationManagerTest extends ConfigManagementTest {
configurationMgr.setConfiguration(containerConfig);
- final UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
- resourceType, configMgmt, request);
+ final UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(
+ configServerService, resourceType, configMgmt, request);
- context.checking(new Expectations() {{
- allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType));
+ context.checking(new Expectations() {
+ {
+ allowing(componentService).getResourceType(resourceId);
+ will(returnValue(resourceType));
- atLeast(1).of(configMgmtFactory).getStrategy(resourceId); will(returnValue(configMgmt));
+ atLeast(1).of(configMgmtFactory).getStrategy(resourceId);
+ will(returnValue(configMgmt));
- oneOf(threadPool).submit((Runnable)with(matchingUpdateRunner(updateRunner)));
- }});
+ oneOf(threadPool).submit((Runnable) with(matchingUpdateRunner(updateRunner)));
+ }
+ });
configurationMgr.updateResourceConfiguration(request);
}
commit e007d081188e8b458300294f4d2a5b8e3ce850ad
Merge: dc91b94... 56e8acf...
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 18 13:02:56 2010 -0500
Cleaned up bad merge.
diff --cc modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
index b76b310,54a7d8d..38a3f59
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
@@@ -44,6 -44,6 +44,5 @@@ public interface ResourceConfigurationF
void validateStructuredConfiguration(Configuration configuration);
- void validateRawConfiguration(RawConfiguration rawConfiguration) throws IllegalArgumentException;
-
+ void validateRawConfiguration(RawConfiguration rawConfiguration) throws RuntimeException;
-
}
diff --cc modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 9b3cc55,974055b..8a51f2a
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@@ -368,25 -368,21 +368,25 @@@ public class ConfigurationManager exten
return;
} else {
StringBuilder errorMessage = null;
-
- for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
- try {
- facet.validateRawConfiguration(rawConfiguration);
- } catch (Exception e) {
- if (null == errorMessage){
- errorMessage = new StringBuilder();
++
+ try{
+ for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
+ try {
+ facet.validateRawConfiguration(rawConfiguration);
+ } catch (IllegalArgumentException e) {
+ if (null == errorMessage){
+ errorMessage = new StringBuilder();
+ }
+ errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+". " );
}
- errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+". " );
-
- }
- if (null != errorMessage){
- throw new PluginContainerException(errorMessage.toString());
}
- }
- }
+ }catch(Throwable t){
+ errorMessage = new StringBuilder();
+ errorMessage.append("configuation validation failed with" + t.getMessage()+". " );
- }
- if (null != errorMessage){
- throw new PluginContainerException(errorMessage.toString());
- }
- }
- }
++ }
++ if (null != errorMessage){
++ throw new PluginContainerException(errorMessage.toString());
++ }
++ }
}
-
+ }
diff --cc modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
index b43a892,b43a892..0176ef0
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
@@@ -292,6 -292,6 +292,12 @@@ public class ConfigurationManagerTest e
}
@Test
++ public void catchExceptionThrownByFailedValidationOfRawConfigS() throws Exception {
++ assertTrue(false);
++ }
++
++
++ @Test
public void mergingRawsIntoStructuredShouldIgnoreNull() throws Exception {
Configuration config = new Configuration();
config.addRawConfiguration(createRawConfiguration("/tmp/foo.txt"));
commit a09d1bea01050e70913796e78518a0cf7464a7c6
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 18 11:10:33 2010 -0500
Refactoring to put config files into multiple directories
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
index d82fb5e..2866427 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
@@ -15,6 +15,10 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
File rawConfigDir
+ File rawConfigSubdir1
+
+ File rawConfigSubdir2
+
File rawConfig1
File rawConfig2
@@ -29,20 +33,24 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
resourceContext = context
rawConfigDir = new File("${System.getProperty('java.io.tmpdir')}/raw-config-test")
- rawConfig1 = new File(rawConfigDir, "structured-and-raw-test-1.txt")
- rawConfig2 = new File(rawConfigDir, "structured-and-raw-test-2.txt")
- rawConfig3 = new File(rawConfigDir, "structured-and-raw-test-3.txt")
- rawConfig4 = new File(rawConfigDir, "structured-and-raw-test-4.txt")
+ rawConfigSubdir1 = new File(rawConfigDir, "structured-and-raw-1")
+ rawConfigSubdir2 = new File(rawConfigDir, "structured-and-raw-2")
+
+ rawConfig1 = new File(rawConfigSubdir1, "structured-and-raw-test-1.txt")
+ rawConfig2 = new File(rawConfigSubdir1, "structured-and-raw-test-2.txt")
+ rawConfig3 = new File(rawConfigSubdir2, "structured-and-raw-test-3.txt")
+ rawConfig4 = new File(rawConfigSubdir2, "structured-and-raw-test-4.txt")
- createRawConfigDir()
+ createRawConfigDirs()
createConfigFile(rawConfig1, ["x": "1", "y": "2", "z": "3"])
createConfigFile(rawConfig2, ["username": "rhqadmin", "password": "rhqadmin"])
createConfigFile(rawConfig3, ["rhq.server.hostname": "localhost", "rhq.server.port": "7080"])
createConfigFile(rawConfig4, ["raw.only.x": "foo", "raw.only.y": "bar"])
}
- def createRawConfigDir() {
- rawConfigDir.mkdirs()
+ def createRawConfigDirs() {
+ rawConfigSubdir1.mkdirs()
+ rawConfigSubdir2.mkdirs()
}
def createConfigFile(File rawConfig, Map properties) {
commit 9a9156058a84bb2babd5f7e7fe60c285c651d39f
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 18 11:01:27 2010 -0500
Adding another config file for StructuredAndRawServer that is managed only via the raw and not structured
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
index 359c615..d82fb5e 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
@@ -21,6 +21,8 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
File rawConfig3
+ File rawConfig4
+
def ant = new AntBuilder()
void start(ResourceContext context) {
@@ -30,11 +32,13 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
rawConfig1 = new File(rawConfigDir, "structured-and-raw-test-1.txt")
rawConfig2 = new File(rawConfigDir, "structured-and-raw-test-2.txt")
rawConfig3 = new File(rawConfigDir, "structured-and-raw-test-3.txt")
+ rawConfig4 = new File(rawConfigDir, "structured-and-raw-test-4.txt")
createRawConfigDir()
createConfigFile(rawConfig1, ["x": "1", "y": "2", "z": "3"])
createConfigFile(rawConfig2, ["username": "rhqadmin", "password": "rhqadmin"])
createConfigFile(rawConfig3, ["rhq.server.hostname": "localhost", "rhq.server.port": "7080"])
+ createConfigFile(rawConfig4, ["raw.only.x": "foo", "raw.only.y": "bar"])
}
def createRawConfigDir() {
@@ -100,11 +104,16 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
rawConfigs.add(new RawConfiguration(path: rawConfig1.absolutePath, contents: rawConfig1.readBytes()))
rawConfigs.add(new RawConfiguration(path: rawConfig2.absolutePath, contents: rawConfig2.readBytes()))
rawConfigs.add(new RawConfiguration(path: rawConfig3.absolutePath, contents: rawConfig3.readBytes()))
+ rawConfigs.add(new RawConfiguration(path: rawConfig4.absolutePath, contents: rawConfig4.readBytes()))
return rawConfigs
}
RawConfiguration mergeRawConfiguration(Configuration configuration, RawConfiguration rawConfiguration) {
+ if (rawConfiguration.path == rawConfig4.absolutePath) {
+ return rawConfiguration
+ }
+
def rawPropertiesConfig = loadRawPropertiesConfiguration(rawConfiguration)
def propertyNames = getPropertyNames(rawConfiguration)
@@ -129,6 +138,10 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
}
void mergeStructuredConfiguration(RawConfiguration rawConfiguration, Configuration configuration) {
+ if (rawConfiguration.path == rawConfig4.absolutePath) {
+ return
+ }
+
def rawPropertiesConfig = loadRawPropertiesConfiguration(rawConfiguration)
def propertyNames = getPropertyNames(rawConfiguration)
commit 996a27d87231385b2a6b113732c8949c1493f153
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 18 10:49:47 2010 -0500
Updating logic so that when you click on the edit button, you go to the edit page but remain on the same tab
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index ac0b460..25b7801 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -117,6 +117,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String editConfiguration() {
+ mode = STRUCTURED_MODE;
return SUCCESS_OUTCOME;
}
@@ -128,9 +129,11 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
public void changeTabs(ValueChangeEvent event) {
if (event.getNewValue().equals("rawTab")) {
switchToRaw();
+ mode = RAW_MODE;
}
else if (event.getNewValue().equals("structuredTab")) {
switchToStructured();
+ mode = STRUCTURED_MODE;
}
}
@@ -368,6 +371,22 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return modified;
}
+ public String getSelectedTab() {
+ if (mode == STRUCTURED_MODE) {
+ return "structuredTab";
+ }
+ return "rawTab";
+ }
+
+ public void setSelectedTab(String tab) {
+ if (tab.equals("structuredTab")) {
+ mode = STRUCTURED_MODE;
+ }
+ else {
+ mode = RAW_MODE;
+ }
+ }
+
public Object[] getPaths() {
return getRaws().keySet().toArray();
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
index 39270b7..1ed069c 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
@@ -28,13 +28,13 @@
<navigation-rule>
<navigation-case>
- <from-action>#{ExistingResourceConfigurationViewUIBean.editConfiguration}</from-action>
+ <from-action>#{ExistingResourceConfigurationUIBean.editConfiguration}</from-action>
<to-view-id>/rhq/resource/configuration/edit.xhtml?id=#{param.id}</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
- <from-action>#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}</from-action>
+ <from-action>#{ExistingResourceConfigurationUIBean.editRawConfiguration}</from-action>
<to-view-id>/rhq/resource/configuration/edit.xhtml?id=#{param.id}</to-view-id>
<redirect/>
</navigation-case>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 36effa3..d9e5b18 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -156,6 +156,7 @@ THIS TEXT WILL BE REMOVED.
<c:when test="${ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
<rich:tabPanel id="configTabPanel"
+ selectedTab="#{ExistingResourceConfigurationUIBean.selectedTab}"
switchType="ajax"
valueChangeListener="#{ExistingResourceConfigurationUIBean.changeTabs}">
<rich:tab id="structuredTab" label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 7d3bc58..7b34258 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -157,7 +157,10 @@ THIS TEXT WILL BE REMOVED.
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
<rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
- <rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <rich:tab id="structuredTab"
+ label="Basic Mode"
+ onlabelclick="cursor_wait();"
+ oncomplete="cursor_clear();">
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
@@ -166,7 +169,7 @@ THIS TEXT WILL BE REMOVED.
<h:commandButton id="editStructuredButton"
value="Edit"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ action="#{ExistingResourceConfigurationUIBean.editConfiguration}"
title="Edit this Configuration" styleClass="buttonmed"
rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
@@ -181,7 +184,10 @@ THIS TEXT WILL BE REMOVED.
prevalidate="true"/>
</rich:tab>
- <rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <rich:tab id="rawTab"
+ label="Advanced Mode"
+ onlabelclick="cursor_wait();"
+ oncomplete="cursor_clear();">
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
@@ -192,7 +198,7 @@ THIS TEXT WILL BE REMOVED.
<h:commandButton id="editRawButton"
value="Edit"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ action="#{ExistingResourceConfigurationUIBean.editRawConfiguration}"
title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
commit b5c9f6e8fc7f559757456bec29dcfe22893da1da
Merge: 7b13390... dc91b94...
Author: John Sanda <john(a)localhost.localdomain>
Date: Sun Jan 17 21:11:39 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config
commit 7b13390ea02ba3c7c17ab164afe35e84a9257143
Author: John Sanda <john(a)localhost.localdomain>
Date: Sun Jan 17 20:52:56 2010 -0500
Fixing a bug that breaks translating from structured to raw
There has been a lingering bug in the UI bean code that appears to break translating from
structured to raw. An initial translation from structured to raw works fine. It happens on
subsequent translations.
The UI bean mantains a cache of modified raw config values. When translating from structured
to raw, the cache of modified values was not getting updated correctly. It was retaining
stale values. Then on the raw edit (Advanced) tab, when you select a file for editing that
has a property that was modified on structured side, the UI bean code first looks in the cache
of modified values. If the raw config file has a modified value in the cache, that value is
rendered. The problem though was that the cache had stale values and should have been getting
flushed when translating from structured to raw the translated values are now newer than
whats in the cache.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 3079b5c..bd53936 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -135,11 +135,15 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String switchToRaw() {
+// Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
+// EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), true);
Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
- EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), true);
+ EnterpriseFacesContextUtility.getSubject(), getResourceId(), getConfiguration(), true);
setConfiguration(configuration);
+ getModified().clear();
+
for (RawConfiguration raw : configuration.getRawConfigurations()) {
getRaws().put(raw.getPath(), raw);
}
@@ -280,6 +284,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return getConfiguration();
}
+ public void undoEdit() {
+
+ }
+
public String discard() {
nullify();
return "/rhq/resource/configuration/view.xhtml?id=" + getResourceId();
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
index 9694bab..588c967 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -33,6 +33,8 @@ public class RawConfigUIBean {
private boolean modified;
+ private String modifiedContents;
+
public RawConfiguration getRawConfiguration() {
return rawConfiguration;
}
@@ -41,6 +43,14 @@ public class RawConfigUIBean {
this.rawConfiguration = rawConfiguration;
}
+ public String getModifiedContents() {
+ return modifiedContents;
+ }
+
+ public void setModifiedContents(String contents) {
+ modifiedContents = contents;
+ }
+
public boolean isModified() {
return modified;
}
commit dc91b941881b78569d0553011ddbd27b0cc66863
Author: Adam Young <ayoung(a)redhat.com>
Date: Fri Jan 15 16:19:56 2010 -0500
If an excpetion bypassed the catch block of the inner loop, there was no string builder allocated to build the error message.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index aafea70..9b3cc55 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -380,6 +380,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
}
}catch(Throwable t){
+ errorMessage = new StringBuilder();
errorMessage.append("configuation validation failed with" + t.getMessage()+". " );
}
if (null != errorMessage){
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
index 23af194..7c750d1 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
@@ -115,7 +115,7 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
void validateRawConfiguration(RawConfiguration rawConfiguration) {
def failValidation = resourceContext.pluginConfiguration.getSimple("failValidation")
if (failValidation.getBooleanValue()) {
- throw new RuntimeException("Validation failed for ${rawConfiguration.path}");
+ throw new IllegalArgumentException("Validation failed for ${rawConfiguration.path}");
}
}
commit 8a27dcdaaf7767ef8ecc3e31cbb772136f96c667
Author: Adam Young <ayoung(a)redhat.com>
Date: Fri Jan 15 15:19:57 2010 -0500
cleaned up exception handling.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index a695616..aafea70 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -359,30 +359,33 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
public void validate(Configuration configuration, int resourceId, boolean isStructured)
- throws PluginContainerException {
+ throws PluginContainerException {
boolean daemonOnly = true;
boolean onlyIfStarted = true;
ResourceConfigurationFacet facet = componentService.getComponent(resourceId, ResourceConfigurationFacet.class,
- FacetLockType.READ, FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ FacetLockType.READ, FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
if (isStructured) {
return;
} else {
StringBuilder errorMessage = null;
-
- for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
- try {
- facet.validateRawConfiguration(rawConfiguration);
- } catch (Throwable e) {
- if (null == errorMessage){
- errorMessage = new StringBuilder();
+ try{
+ for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
+ try {
+ facet.validateRawConfiguration(rawConfiguration);
+ } catch (IllegalArgumentException e) {
+ if (null == errorMessage){
+ errorMessage = new StringBuilder();
+ }
+ errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+". " );
+ }
+ }
+ }catch(Throwable t){
+ errorMessage.append("configuation validation failed with" + t.getMessage()+". " );
}
- errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+". " );
-
- }
if (null != errorMessage){
throw new PluginContainerException(errorMessage.toString());
}
}
}
}
-}
+
commit d486f956042b24ba69363f97f938b5961513c957
Author: Adam Young <ayoung(a)redhat.com>
Date: Fri Jan 15 11:46:54 2010 -0500
changing the exception handling strategy for the validation code on the agent side.
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
index 54a7d8d..b76b310 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
@@ -44,6 +44,6 @@ public interface ResourceConfigurationFacet {
void validateStructuredConfiguration(Configuration configuration);
- void validateRawConfiguration(RawConfiguration rawConfiguration) throws RuntimeException;
+ void validateRawConfiguration(RawConfiguration rawConfiguration) throws IllegalArgumentException;
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 974055b..a695616 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -372,7 +372,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
try {
facet.validateRawConfiguration(rawConfiguration);
- } catch (Exception e) {
+ } catch (Throwable e) {
if (null == errorMessage){
errorMessage = new StringBuilder();
}
commit edb2b662b18c00dbcb9aa8315c274131676decae
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 14 21:20:19 2010 -0500
Cleaned up exception handling.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index c0d0dac..974055b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -85,17 +85,14 @@ public class ConfigurationManager extends AgentService implements ContainerServi
LoggingThreadFactory threadFactory = new LoggingThreadFactory(SENDER_THREAD_POOL_NAME, true);
threadPool = new ScheduledThreadPoolExecutor(1, threadFactory);
- ConfigurationCheckExecutor configurationChecker =
- new ConfigurationCheckExecutor(this, getConfigurationServerService(),
- PluginContainer.getInstance().getInventoryManager());
+ ConfigurationCheckExecutor configurationChecker = new ConfigurationCheckExecutor(this,
+ getConfigurationServerService(), PluginContainer.getInstance().getInventoryManager());
if (pluginContainerConfiguration.getConfigurationDiscoveryPeriod() > 0
- && pluginContainerConfiguration.isInsideAgent()) {
- threadPool.scheduleAtFixedRate(
- configurationChecker,
- pluginContainerConfiguration.getConfigurationDiscoveryInitialDelay(),
- pluginContainerConfiguration.getConfigurationDiscoveryPeriod(),
- TimeUnit.SECONDS);
+ && pluginContainerConfiguration.isInsideAgent()) {
+ threadPool.scheduleAtFixedRate(configurationChecker, pluginContainerConfiguration
+ .getConfigurationDiscoveryInitialDelay(), pluginContainerConfiguration
+ .getConfigurationDiscoveryPeriod(), TimeUnit.SECONDS);
}
}
@@ -154,8 +151,8 @@ public class ConfigurationManager extends AgentService implements ContainerServi
Callable<ConfigurationUpdateResponse> runner;
- runner = new UpdateResourceConfigurationRunner(configurationServerService, resourceType,
- configMgmt, request);
+ runner = new UpdateResourceConfigurationRunner(configurationServerService, resourceType, configMgmt,
+ request);
response = getThreadPool().submit(runner).get();
} catch (Exception e) {
@@ -178,8 +175,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
if (fromStructured) {
mergedStructuredIntoRaws(configuration, facet);
- }
- else {
+ } else {
mergeRawsIntoStructured(configuration, facet);
}
@@ -234,15 +230,13 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
}
- private void updateRawConfig(Configuration configuration, RawConfiguration originalRaw,
- RawConfiguration mergedRaw) {
+ private void updateRawConfig(Configuration configuration, RawConfiguration originalRaw, RawConfiguration mergedRaw) {
configuration.removeRawConfiguration(originalRaw);
configuration.addRawConfiguration(mergedRaw);
}
- public Configuration loadResourceConfiguration(int resourceId)
- throws PluginContainerException {
+ public Configuration loadResourceConfiguration(int resourceId) throws PluginContainerException {
ConfigManagement loadConfig = configMgmtFactory.getStrategy(resourceId);
Configuration configuration = null;
@@ -263,43 +257,43 @@ public class ConfigurationManager extends AgentService implements ContainerServi
private String createErrorMsg(int resourceId, String msg) throws PluginContainerException {
ResourceType resourceType = componentService.getResourceType(resourceId);
- return "Plugin Error: Resource Component for [" + resourceType.getName() + "] Resource with id [" +
- resourceId + "]: " + msg;
+ return "Plugin Error: Resource Component for [" + resourceType.getName() + "] Resource with id [" + resourceId
+ + "]: " + msg;
}
-// public Configuration loadResourceConfiguration(int resourceId) throws PluginContainerException {
-// ResourceType resourceType = getResourceType(resourceId);
-// ConfigurationFacet configComponent = getConfigurationFacet(resourceId, FacetLockType.READ);
-// try {
-// Configuration configuration = configComponent.loadResourceConfiguration();
-// if (configuration == null) {
-// throw new PluginContainerException("Plugin Error: Resource Component for [" + resourceType.getName()
-// + "] Resource with id [" + resourceId + "] returned a null Configuration.");
-// }
-//
-// // If the plugin didn't already set the notes field, set it to something useful.
-// if (configuration.getNotes() == null) {
-// configuration.setNotes("Resource config for " + resourceType.getName() + " Resource w/ id " + resourceId);
-// }
-//
-// ConfigurationDefinition configurationDefinition = resourceType.getResourceConfigurationDefinition();
-//
-// // Normalize and validate the config.
-// ConfigurationUtility.normalizeConfiguration(configuration, configurationDefinition);
-// List<String> errorMessages = ConfigurationUtility.validateConfiguration(configuration,
-// configurationDefinition);
-// for (String errorMessage : errorMessages) {
-// log.warn("Plugin Error: Invalid " + resourceType.getName() + " Resource configuration returned by "
-// + resourceType.getPlugin() + " plugin - " + errorMessage);
-// }
-//
-// return configuration;
-// } catch (Throwable t) {
-// //noinspection ThrowableInstanceNeverThrown
-// throw new PluginContainerException("Cannot load Resource configuration for [" + resourceId + "]",
-// new WrappedRemotingException(t));
-// }
-// }
+ // public Configuration loadResourceConfiguration(int resourceId) throws PluginContainerException {
+ // ResourceType resourceType = getResourceType(resourceId);
+ // ConfigurationFacet configComponent = getConfigurationFacet(resourceId, FacetLockType.READ);
+ // try {
+ // Configuration configuration = configComponent.loadResourceConfiguration();
+ // if (configuration == null) {
+ // throw new PluginContainerException("Plugin Error: Resource Component for [" + resourceType.getName()
+ // + "] Resource with id [" + resourceId + "] returned a null Configuration.");
+ // }
+ //
+ // // If the plugin didn't already set the notes field, set it to something useful.
+ // if (configuration.getNotes() == null) {
+ // configuration.setNotes("Resource config for " + resourceType.getName() + " Resource w/ id " + resourceId);
+ // }
+ //
+ // ConfigurationDefinition configurationDefinition = resourceType.getResourceConfigurationDefinition();
+ //
+ // // Normalize and validate the config.
+ // ConfigurationUtility.normalizeConfiguration(configuration, configurationDefinition);
+ // List<String> errorMessages = ConfigurationUtility.validateConfiguration(configuration,
+ // configurationDefinition);
+ // for (String errorMessage : errorMessages) {
+ // log.warn("Plugin Error: Invalid " + resourceType.getName() + " Resource configuration returned by "
+ // + resourceType.getPlugin() + " plugin - " + errorMessage);
+ // }
+ //
+ // return configuration;
+ // } catch (Throwable t) {
+ // //noinspection ThrowableInstanceNeverThrown
+ // throw new PluginContainerException("Cannot load Resource configuration for [" + resourceId + "]",
+ // new WrappedRemotingException(t));
+ // }
+ // }
/**
* Returns a thread pool that this object will use when asychronously executing configuration operations on a
@@ -333,7 +327,8 @@ public class ConfigurationManager extends AgentService implements ContainerServi
protected ConfigurationFacet getConfigurationFacet(int resourceId, FacetLockType lockType)
throws PluginContainerException {
boolean daemonThread = (lockType != FacetLockType.WRITE);
- return ComponentUtil.getComponent(resourceId, ConfigurationFacet.class, lockType, FACET_METHOD_TIMEOUT, daemonThread, true);
+ return ComponentUtil.getComponent(resourceId, ConfigurationFacet.class, lockType, FACET_METHOD_TIMEOUT,
+ daemonThread, true);
}
/**
@@ -372,12 +367,21 @@ public class ConfigurationManager extends AgentService implements ContainerServi
if (isStructured) {
return;
} else {
+ StringBuilder errorMessage = null;
+
for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
try {
facet.validateRawConfiguration(rawConfiguration);
- } catch (IllegalArgumentException e) {
- throw new PluginContainerException(e);
+ } catch (Exception e) {
+ if (null == errorMessage){
+ errorMessage = new StringBuilder();
+ }
+ errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+". " );
+
}
+ if (null != errorMessage){
+ throw new PluginContainerException(errorMessage.toString());
+ }
}
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 2acf803..4248ad6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -991,13 +991,12 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
if (isRawSupported(resourceId)){
try{
validateResourceConfiguration(subject, resourceId, newConfiguration,false);
- } catch(RuntimeException e){
+ } catch(PluginContainerException e){
ResourceConfigurationUpdate response = new ResourceConfigurationUpdate(null, newConfiguration, subject.getName());
response.setErrorMessage(e.getMessage());
+ response.setStatus(ConfigurationUpdateStatus.UNSENT);
return response;
- } catch (PluginContainerException e) {
- return null;
- }
+ }
}
ResourceConfigurationUpdate newUpdate =
commit ade23f1eb6eec8a22c7a846d7c70e22dace2e5f2
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 14 13:56:06 2010 -0500
Validate prior to recording for Update.
diff --git a/.classpath b/.classpath
index c8e2a2d..e6c678b 100644
--- a/.classpath
+++ b/.classpath
@@ -114,7 +114,6 @@
<classpathentry kind="src" path="modules/plugins/byteman/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/lsof/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/jdbctrace/src/main/java"/>
- <classpathentry kind="src" path="modules/plugins/antlr-config/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/antlr-config/src/main/antlr3"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/test/java"/>
@@ -217,9 +216,6 @@
<classpathentry exported="true" kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/pircbot/pircbot/1.4.2/pircbot-1.4.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/net/homeip/yusuke/twitter4j/2.0.9/twitter4j-2.0.9.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/byteman/byteman/1.2.1/byteman-1.2.1.jar"/>
<classpathentry exported="true" kind="lib" path="modules/enterprise/remoting/webservices/target/rhq-remoting-webservices-1.4.0-SNAPSHOT/wsconsume-output"/>
<classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index 8291766..10d36a9 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -1,4 +1,4 @@
-#Thu Nov 05 13:19:01 GMT-05:00 2009
+#Thu Jan 14 12:59:22 EST 2010
cleanup.add_default_serial_version_id=true
cleanup.add_generated_serial_version_id=false
cleanup.add_missing_annotations=true
@@ -52,7 +52,7 @@ cleanup.use_this_for_non_static_method_access_only_if_necessary=true
cleanup_profile=_RHQ
cleanup_settings_version=2
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
formatter_profile=_RHQ
formatter_settings_version=11
org.eclipse.jdt.ui.exception.name=e
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java
index 32a3dd4..c5ee507 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java
@@ -98,4 +98,26 @@ public interface ConfigurationAgentService {
*/
Configuration merge(Configuration configuration, int resourceId, boolean fromStructured)
throws PluginContainerException;
+
+
+ /**
+ * If the <code>fromStructured</code> flag is <code>true</code>, then the s
+ * Configuration.properties</code>) is merged into the latest raw configura
+ * Configuration object returned will consist of the structured configurati
+ * configurations. If <code>fromStructured</code> is <code>false</code>, th
+ * Configuration.rawConfigurations</code>) is merged into the latest struct
+ * plugin. The returned Configuration will then consist of the raw configur
+ * configuration.
+ *
+ * @param configuration The Configuration with the changes to be merged
+ * @param resourceId The id of the resource to which the configuration belo
+ * @param A flag that if <code>true</code> indicates the Structured configu
+ * validates the raw
+ * @return The <strong>merged</strong> configuration, where a merge consist
+ * followed by the values of the side merging from being applied to the sid
+ * @throws PluginContainerException
+ * @throws PluginContainerException if a runtime or plugin error occurs.
+ */
+ void validate(Configuration configuration, int resourceId, boolean isStructured) throws PluginContainerException;
+
}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java
index f8f01bc..d28327f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java
@@ -30,7 +30,7 @@ package org.rhq.core.domain.configuration;
* @author John Mazzitelli
*/
public enum ConfigurationUpdateStatus {
- INPROGRESS("In Progress"), SUCCESS("Success"), FAILURE("Failure");
+ INPROGRESS("In Progress"), SUCCESS("Success"), FAILURE("Failure"),UNSENT("unsent");
private String displayName;
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
index 4a14c67..54a7d8d 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
@@ -44,6 +44,6 @@ public interface ResourceConfigurationFacet {
void validateStructuredConfiguration(Configuration configuration);
- void validateRawConfiguration(RawConfiguration rawConfiguration);
+ void validateRawConfiguration(RawConfiguration rawConfiguration) throws RuntimeException;
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 5a0e155..c0d0dac 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -362,4 +362,23 @@ public class ConfigurationManager extends AgentService implements ContainerServi
return null;
}
+
+ public void validate(Configuration configuration, int resourceId, boolean isStructured)
+ throws PluginContainerException {
+ boolean daemonOnly = true;
+ boolean onlyIfStarted = true;
+ ResourceConfigurationFacet facet = componentService.getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ if (isStructured) {
+ return;
+ } else {
+ for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
+ try {
+ facet.validateRawConfiguration(rawConfiguration);
+ } catch (IllegalArgumentException e) {
+ throw new PluginContainerException(e);
+ }
+ }
+ }
+ }
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 3079b5c..244d19b 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -199,7 +199,11 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update request with id "
+ updateRequest.getId() + " failed.", updateRequest.getErrorMessage());
return FAILURE_OUTCOME;
- }
+ case UNSENT:
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update was not valid"
+ , updateRequest.getErrorMessage());
+ return FAILURE_OUTCOME;
+ }
} else {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN, "No changes were made to the configuration, so "
+ "no update request has been sent to the Agent.");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index fbae47d..2acf803 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -988,14 +988,46 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
fromStructured);
}
+ if (isRawSupported(resourceId)){
+ try{
+ validateResourceConfiguration(subject, resourceId, newConfiguration,false);
+ } catch(RuntimeException e){
+ ResourceConfigurationUpdate response = new ResourceConfigurationUpdate(null, newConfiguration, subject.getName());
+ response.setErrorMessage(e.getMessage());
+ return response;
+ } catch (PluginContainerException e) {
+ return null;
+ }
+ }
+
ResourceConfigurationUpdate newUpdate =
configurationManager.persistNewResourceConfigurationUpdateHistory(subject, resourceId, configToUpdate,
ConfigurationUpdateStatus.INPROGRESS, subject.getName(), false);
-
executeResourceConfigurationUpdate(newUpdate, fromStructured);
-
return newUpdate;
}
+ private void validateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,boolean isStructured) throws PluginContainerException {
+ Resource resource = entityManager.find(Resource.class, resourceId);
+ if (resource == null) {
+ throw new NoResultException("Cannot get live configuration for unknown resource [" + resourceId + "]");
+ }
+ if (!authorizationManager.canViewResource(subject, resource.getId())) {
+ throw new PermissionException("User [" + subject.getName()
+ + "] does not have permission to view resource configuration for [" + resource + "]");
+ }
+ Agent agent = resource.getAgent();
+ AgentClient agentClient = this.agentManager.getAgentClient(agent);
+ ConfigurationAgentService configService = agentClient.getConfigurationAgentService();
+ configService.validate(configuration, resourceId, isStructured);
+ }
+
+ private boolean isRawSupported(int resourceId) {
+ Resource resource = entityManager.find(Resource.class, resourceId);
+ ConfigurationDefinition configDef = resource.getResourceType().getResourceConfigurationDefinition();
+
+ return (ConfigurationFormat.STRUCTURED_AND_RAW == configDef.getConfigurationFormat() || (ConfigurationFormat.RAW == configDef.getConfigurationFormat()));
+ }
+
private boolean isStructuredAndRawSupported(int resourceId) {
Resource resource = entityManager.find(Resource.class, resourceId);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
index 77bf269..9281e14 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
@@ -1153,5 +1153,8 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
@Asynchronous(guaranteedDelivery = true)
public void synchronizeInventory(ResourceSyncInfo syncInfo) {
}
+ public void validate(Configuration configuration, int resourceId, boolean isStructured)
+ throws PluginContainerException {
+ }
}
-}
\ No newline at end of file
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
index 56b6741..2c13eb6 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
@@ -254,4 +254,8 @@ public class TestAgentClient implements AgentClient, ContentAgentService, Resour
public InputStream getSnapshotReport(int resourceId, String name, String description) throws Exception {
return null;
}
-}
\ No newline at end of file
+
+ public void validate(Configuration configuration, int resourceId, boolean isStructured)
+ throws PluginContainerException {
+ }
+}
commit 9f214af77b6bdcf02c0353dd8b6e4e6a24416e06
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 15 00:49:12 2010 -0500
Adding logic to display an 'undo' button next to files in the file menu that have modifications
The undo button is not yet wired to an action method with this commit.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 2e9b517..36effa3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -75,7 +75,14 @@ THIS TEXT WILL BE REMOVED.
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectedFileHeader,modalEditor,fileMenu"/>
+ reRender="fileContents,selectedFileHeader,modalEditor,fileMenu">
+ <h:panelGroup>
+ <h:outputText value="#{#rawConfigUIBean.fileName}"/>
+ <c:if test="#{rawConfigUIBean.modified}">
+ <h:commandButton value="Undo"/>
+ </c:if>
+ </h:panelGroup>
+ </rich:panelMenuItem>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
@@ -200,7 +207,14 @@ THIS TEXT WILL BE REMOVED.
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
limitToList="true"
- reRender="fileContents,selectedFileHeader,modalEditor,fileMenu"/>
+ reRender="fileContents,selectedFileHeader,modalEditor,fileMenu">
+ <h:panelGroup>
+ <h:outputText value="#{#rawConfigUIBean.fileName}"/>
+ <c:if test="#{rawConfigUIBean.modified}">
+ <h:commandButton value="Undo"/>
+ </c:if>
+ </h:panelGroup>
+ </rich:panelMenuItem>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
commit 2e98f67f8ab7fcec4133cd31853fcdfdc699851b
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 15 00:26:03 2010 -0500
Updating file menu to display icon next to file that has been modified in the file menu.
Previously one of the default icons was always being displayed next to files in the file
menu. Now an icon is rendered only when the file has modifications and you switch to a
different file in the editor.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 40d5ba1..3079b5c 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -420,11 +420,23 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
if (!updated.equals(original)) {
current = current.deepCopy(false);
current.setContents(updated.getBytes());
- //TODO update other values like MD5
+
+ markCurrentRawConfigUIBeanModified();
getModified().put(current.getPath(), current);
}
}
+ private void markCurrentRawConfigUIBeanModified() {
+ for (RawConfigDirectory dir : rawConfigDirectories) {
+ for (RawConfigUIBean bean : dir.getRawConfigUIBeans()) {
+ if (bean.getPath().equals(current.getPath())) {
+ bean.setModified(true);
+ return;
+ }
+ }
+ }
+ }
+
public void setCurrentPath(String path) {
RawConfiguration raw = getModified().get(path);
if (null == raw) {
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
index 21b7d41..9694bab 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -57,4 +57,12 @@ public class RawConfigUIBean {
File file = new File(rawConfiguration.getPath());
return file.getName();
}
+
+ public String getIcon() {
+ if (isModified()) {
+ return "/images/star_on_24.png";
+ }
+
+ return "/images/blank.png";
+ }
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index bf146f8..2e9b517 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -59,12 +59,11 @@ THIS TEXT WILL BE REMOVED.
<rich:panel style="width:100%">
<f:facet name="header">Files</f:facet>
- <rich:panelMenu mode="ajax"
+ <rich:panelMenu id="fileMenu"
+ mode="ajax"
expandMode="client"
iconCollapsedGroup="/images/icn_tree_folder.gif"
- iconExpandedGroup="/images/icn_tree_folder.gif"
- limitToList="true"
- reRender="fileContents">
+ iconExpandedGroup="/images/icn_tree_folder.gif">
<c:forEach items="#{rawConfigDirectories}"
var="rawConfigDir">
<rich:panelMenuGroup label="#{rawConfigDir.path}"
@@ -72,16 +71,20 @@ THIS TEXT WILL BE REMOVED.
selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ icon="#{rawConfigUIBean.icon}"
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectedFileHeader,modalEditor"/>
+ reRender="fileContents,selectedFileHeader,modalEditor,fileMenu"/>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
</rich:panelMenu>
</rich:panel>
- * - Contains uncommitted changes
+ <rich:panel style="border:none">
+ <h:graphicImage url="/images/star_on_24.png"/>
+ <h:outputText value="- Contains uncommitted changes"/>
+ </rich:panel>
</h:panelGrid>
<h:panelGrid columns="1" style="width:100%;">
@@ -180,7 +183,8 @@ THIS TEXT WILL BE REMOVED.
<f:facet name="header">Files</f:facet>
- <rich:panelMenu mode="ajax"
+ <rich:panelMenu id="fileMenu"
+ mode="ajax"
expandMode="client"
iconCollapsedGroup="/images/icn_tree_folder.gif"
iconExpandedGroup="/images/icn_tree_folder.gif">
@@ -191,17 +195,21 @@ THIS TEXT WILL BE REMOVED.
selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ icon="#{rawConfigUIBean.icon}"
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
limitToList="true"
- reRender="fileContents,selectedFileHeader,modalEditor"/>
+ reRender="fileContents,selectedFileHeader,modalEditor,fileMenu"/>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
</rich:panelMenu>
</rich:panel>
- * - Contains uncommitted changes
+ <rich:panel style="border:none">
+ <h:graphicImage url="/images/star_on_24.png"/>
+ <h:outputText value="- Contains uncommitted changes"/>
+ </rich:panel>
</h:panelGrid>
<h:panelGrid columns="1" style="width:100%;">
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index ce5f228..7d3bc58 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -86,6 +86,7 @@ THIS TEXT WILL BE REMOVED.
selectedChild="#{currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ icon="/images/blank.png"
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
commit 56e8acf16cf81a654a0144a0bb3f520e9541d70d
Merge: 7020f5a... e45b2f8...
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 14 21:26:55 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config-confirm
commit 7020f5a959eb4ba055352a6dbd14382fc5cdabea
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 14 21:20:19 2010 -0500
Cleaned up exception handling.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index c0d0dac..974055b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -85,17 +85,14 @@ public class ConfigurationManager extends AgentService implements ContainerServi
LoggingThreadFactory threadFactory = new LoggingThreadFactory(SENDER_THREAD_POOL_NAME, true);
threadPool = new ScheduledThreadPoolExecutor(1, threadFactory);
- ConfigurationCheckExecutor configurationChecker =
- new ConfigurationCheckExecutor(this, getConfigurationServerService(),
- PluginContainer.getInstance().getInventoryManager());
+ ConfigurationCheckExecutor configurationChecker = new ConfigurationCheckExecutor(this,
+ getConfigurationServerService(), PluginContainer.getInstance().getInventoryManager());
if (pluginContainerConfiguration.getConfigurationDiscoveryPeriod() > 0
- && pluginContainerConfiguration.isInsideAgent()) {
- threadPool.scheduleAtFixedRate(
- configurationChecker,
- pluginContainerConfiguration.getConfigurationDiscoveryInitialDelay(),
- pluginContainerConfiguration.getConfigurationDiscoveryPeriod(),
- TimeUnit.SECONDS);
+ && pluginContainerConfiguration.isInsideAgent()) {
+ threadPool.scheduleAtFixedRate(configurationChecker, pluginContainerConfiguration
+ .getConfigurationDiscoveryInitialDelay(), pluginContainerConfiguration
+ .getConfigurationDiscoveryPeriod(), TimeUnit.SECONDS);
}
}
@@ -154,8 +151,8 @@ public class ConfigurationManager extends AgentService implements ContainerServi
Callable<ConfigurationUpdateResponse> runner;
- runner = new UpdateResourceConfigurationRunner(configurationServerService, resourceType,
- configMgmt, request);
+ runner = new UpdateResourceConfigurationRunner(configurationServerService, resourceType, configMgmt,
+ request);
response = getThreadPool().submit(runner).get();
} catch (Exception e) {
@@ -178,8 +175,7 @@ public class ConfigurationManager extends AgentService implements ContainerServi
if (fromStructured) {
mergedStructuredIntoRaws(configuration, facet);
- }
- else {
+ } else {
mergeRawsIntoStructured(configuration, facet);
}
@@ -234,15 +230,13 @@ public class ConfigurationManager extends AgentService implements ContainerServi
}
}
- private void updateRawConfig(Configuration configuration, RawConfiguration originalRaw,
- RawConfiguration mergedRaw) {
+ private void updateRawConfig(Configuration configuration, RawConfiguration originalRaw, RawConfiguration mergedRaw) {
configuration.removeRawConfiguration(originalRaw);
configuration.addRawConfiguration(mergedRaw);
}
- public Configuration loadResourceConfiguration(int resourceId)
- throws PluginContainerException {
+ public Configuration loadResourceConfiguration(int resourceId) throws PluginContainerException {
ConfigManagement loadConfig = configMgmtFactory.getStrategy(resourceId);
Configuration configuration = null;
@@ -263,43 +257,43 @@ public class ConfigurationManager extends AgentService implements ContainerServi
private String createErrorMsg(int resourceId, String msg) throws PluginContainerException {
ResourceType resourceType = componentService.getResourceType(resourceId);
- return "Plugin Error: Resource Component for [" + resourceType.getName() + "] Resource with id [" +
- resourceId + "]: " + msg;
+ return "Plugin Error: Resource Component for [" + resourceType.getName() + "] Resource with id [" + resourceId
+ + "]: " + msg;
}
-// public Configuration loadResourceConfiguration(int resourceId) throws PluginContainerException {
-// ResourceType resourceType = getResourceType(resourceId);
-// ConfigurationFacet configComponent = getConfigurationFacet(resourceId, FacetLockType.READ);
-// try {
-// Configuration configuration = configComponent.loadResourceConfiguration();
-// if (configuration == null) {
-// throw new PluginContainerException("Plugin Error: Resource Component for [" + resourceType.getName()
-// + "] Resource with id [" + resourceId + "] returned a null Configuration.");
-// }
-//
-// // If the plugin didn't already set the notes field, set it to something useful.
-// if (configuration.getNotes() == null) {
-// configuration.setNotes("Resource config for " + resourceType.getName() + " Resource w/ id " + resourceId);
-// }
-//
-// ConfigurationDefinition configurationDefinition = resourceType.getResourceConfigurationDefinition();
-//
-// // Normalize and validate the config.
-// ConfigurationUtility.normalizeConfiguration(configuration, configurationDefinition);
-// List<String> errorMessages = ConfigurationUtility.validateConfiguration(configuration,
-// configurationDefinition);
-// for (String errorMessage : errorMessages) {
-// log.warn("Plugin Error: Invalid " + resourceType.getName() + " Resource configuration returned by "
-// + resourceType.getPlugin() + " plugin - " + errorMessage);
-// }
-//
-// return configuration;
-// } catch (Throwable t) {
-// //noinspection ThrowableInstanceNeverThrown
-// throw new PluginContainerException("Cannot load Resource configuration for [" + resourceId + "]",
-// new WrappedRemotingException(t));
-// }
-// }
+ // public Configuration loadResourceConfiguration(int resourceId) throws PluginContainerException {
+ // ResourceType resourceType = getResourceType(resourceId);
+ // ConfigurationFacet configComponent = getConfigurationFacet(resourceId, FacetLockType.READ);
+ // try {
+ // Configuration configuration = configComponent.loadResourceConfiguration();
+ // if (configuration == null) {
+ // throw new PluginContainerException("Plugin Error: Resource Component for [" + resourceType.getName()
+ // + "] Resource with id [" + resourceId + "] returned a null Configuration.");
+ // }
+ //
+ // // If the plugin didn't already set the notes field, set it to something useful.
+ // if (configuration.getNotes() == null) {
+ // configuration.setNotes("Resource config for " + resourceType.getName() + " Resource w/ id " + resourceId);
+ // }
+ //
+ // ConfigurationDefinition configurationDefinition = resourceType.getResourceConfigurationDefinition();
+ //
+ // // Normalize and validate the config.
+ // ConfigurationUtility.normalizeConfiguration(configuration, configurationDefinition);
+ // List<String> errorMessages = ConfigurationUtility.validateConfiguration(configuration,
+ // configurationDefinition);
+ // for (String errorMessage : errorMessages) {
+ // log.warn("Plugin Error: Invalid " + resourceType.getName() + " Resource configuration returned by "
+ // + resourceType.getPlugin() + " plugin - " + errorMessage);
+ // }
+ //
+ // return configuration;
+ // } catch (Throwable t) {
+ // //noinspection ThrowableInstanceNeverThrown
+ // throw new PluginContainerException("Cannot load Resource configuration for [" + resourceId + "]",
+ // new WrappedRemotingException(t));
+ // }
+ // }
/**
* Returns a thread pool that this object will use when asychronously executing configuration operations on a
@@ -333,7 +327,8 @@ public class ConfigurationManager extends AgentService implements ContainerServi
protected ConfigurationFacet getConfigurationFacet(int resourceId, FacetLockType lockType)
throws PluginContainerException {
boolean daemonThread = (lockType != FacetLockType.WRITE);
- return ComponentUtil.getComponent(resourceId, ConfigurationFacet.class, lockType, FACET_METHOD_TIMEOUT, daemonThread, true);
+ return ComponentUtil.getComponent(resourceId, ConfigurationFacet.class, lockType, FACET_METHOD_TIMEOUT,
+ daemonThread, true);
}
/**
@@ -372,12 +367,21 @@ public class ConfigurationManager extends AgentService implements ContainerServi
if (isStructured) {
return;
} else {
+ StringBuilder errorMessage = null;
+
for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
try {
facet.validateRawConfiguration(rawConfiguration);
- } catch (IllegalArgumentException e) {
- throw new PluginContainerException(e);
+ } catch (Exception e) {
+ if (null == errorMessage){
+ errorMessage = new StringBuilder();
+ }
+ errorMessage.append("file " + rawConfiguration.getPath() +" failed validation with " + e.getMessage()+". " );
+
}
+ if (null != errorMessage){
+ throw new PluginContainerException(errorMessage.toString());
+ }
}
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 2acf803..4248ad6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -991,13 +991,12 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
if (isRawSupported(resourceId)){
try{
validateResourceConfiguration(subject, resourceId, newConfiguration,false);
- } catch(RuntimeException e){
+ } catch(PluginContainerException e){
ResourceConfigurationUpdate response = new ResourceConfigurationUpdate(null, newConfiguration, subject.getName());
response.setErrorMessage(e.getMessage());
+ response.setStatus(ConfigurationUpdateStatus.UNSENT);
return response;
- } catch (PluginContainerException e) {
- return null;
- }
+ }
}
ResourceConfigurationUpdate newUpdate =
commit e45b2f8bff457bb665ae6713e93b26f9d326f520
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 14 20:59:18 2010 -0500
Updating modal dialog editor to display the correct header and contents after a file selection
The modal dialog change has been made only for the edit page so far. On view.xhtml the modal editor
still does not get updated because it is referencing the wrong backing bean.
Adding folder icon for directories in the file menu.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 2f48509..40d5ba1 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -338,6 +338,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return getCurrent().getPath();
}
+ public String getModalEditorHeader() {
+ return getCurrentPath();
+ }
+
public String getModalEditorContents() {
return getCurrentContents();
}
@@ -353,6 +357,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public Object[] getPaths() {
+
return getRaws().keySet().toArray();
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 4ff5b06..bf146f8 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -55,12 +55,14 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <h:panelGrid columns="1">
<rich:panel style="width:100%">
<f:facet name="header">Files</f:facet>
<rich:panelMenu mode="ajax"
expandMode="client"
- iconCollapsedGroup="disc"
+ iconCollapsedGroup="/images/icn_tree_folder.gif"
+ iconExpandedGroup="/images/icn_tree_folder.gif"
limitToList="true"
reRender="fileContents">
<c:forEach items="#{rawConfigDirectories}"
@@ -79,6 +81,8 @@ THIS TEXT WILL BE REMOVED.
</c:forEach>
</rich:panelMenu>
</rich:panel>
+ * - Contains uncommitted changes
+ </h:panelGrid>
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
@@ -116,6 +120,7 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</rich:tab>
</rich:tabPanel>
+ <ui:include src="view-raw-modal.xhtml"/>
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredSupported}">
@@ -170,13 +175,15 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <h:panelGrid columns="1">
<rich:panel style="width:100%">
<f:facet name="header">Files</f:facet>
<rich:panelMenu mode="ajax"
expandMode="client"
- iconCollapsedGroup="disc">
+ iconCollapsedGroup="/images/icn_tree_folder.gif"
+ iconExpandedGroup="/images/icn_tree_folder.gif">
<c:forEach items="#{rawConfigDirectories}"
var="rawConfigDir">
<rich:panelMenuGroup label="#{rawConfigDir.path}"
@@ -194,6 +201,8 @@ THIS TEXT WILL BE REMOVED.
</c:forEach>
</rich:panelMenu>
</rich:panel>
+ * - Contains uncommitted changes
+ </h:panelGrid>
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
@@ -229,15 +238,13 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</h:panelGrid>
</h:panelGrid>
-
- <ui:include src="view-raw-modal.xhtml"/>
</rich:tab>
</rich:tabPanel>
+
+ <ui:include src="view-raw-modal.xhtml"/>
</c:when>
</c:choose>
-
-
</h:form>
<h:panelGroup layout="block" styleClass="InfoBlock"
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
index 8aed4f3..8d8b046 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
@@ -12,7 +12,7 @@
<rich:modalPanel id="modalEditor" width="800" height="600">
<f:facet name="header">
<h:panelGroup>
- <h:outputText value="#{ExistingResourceConfiguratioUIBean.currentPath}"/>
+ <h:outputText value="#{ExistingResourceConfigurationUIBean.modalEditorHeader}"/>
</h:panelGroup>
</f:facet>
<f:facet name="controls">
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 8e605da..ce5f228 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -75,7 +75,8 @@ THIS TEXT WILL BE REMOVED.
<f:facet name="header">Files</f:facet>
<rich:panelMenu mode="ajax"
expandMode="client"
- iconCollapsedGroup="disc"
+ iconCollapsedGroup="/images/icn_tree_folder.gif"
+ iconExpandedGroup="/images/icn_tree_folder.gif"
limitToList="true"
reRender="fileContents">
<c:forEach items="#{rawConfigDirectories}"
@@ -120,6 +121,7 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</rich:tab>
</rich:tabPanel>
+ <ui:include src="view-raw-modal.xhtml"/>
</c:when>
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
@@ -201,7 +203,8 @@ THIS TEXT WILL BE REMOVED.
<f:facet name="header">Files</f:facet>
<rich:panelMenu mode="ajax"
expandMode="client"
- iconCollapsedGroup="disc"
+ iconCollapsedGroup="/images/icn_tree_folder.gif"
+ iconExpandedGroup="/images/icn_tree_folder.gif"
limitToList="true"
reRender="fileContents">
<c:forEach items="#{rawConfigDirectories}"
@@ -219,7 +222,7 @@ THIS TEXT WILL BE REMOVED.
</rich:panelMenuGroup>
</c:forEach>
</rich:panelMenu>
- </rich:panel>
+ </rich:panel>
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
@@ -244,15 +247,11 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
-
- <ui:include src="view-raw-modal.xhtml"/>
</rich:tab>
</rich:tabPanel>
+ <ui:include src="view-raw-modal.xhtml"/>
</c:when>
</c:choose>
-
-
-
</h:form>
<h:panelGroup layout="block" styleClass="InfoBlock"
commit 0301452395f085420fd7904cec31e1b7b487e2d6
Merge: 4192ecb... e2f84e3...
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 14 14:39:57 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config-confirm
commit 4192ecb358067c1fd49ba2557b29763ce97ef63f
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Jan 14 13:56:06 2010 -0500
Validate prior to recording for Update.
diff --git a/.classpath b/.classpath
index c8e2a2d..e6c678b 100644
--- a/.classpath
+++ b/.classpath
@@ -114,7 +114,6 @@
<classpathentry kind="src" path="modules/plugins/byteman/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/lsof/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/jdbctrace/src/main/java"/>
- <classpathentry kind="src" path="modules/plugins/antlr-config/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/antlr-config/src/main/antlr3"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/test/java"/>
@@ -217,9 +216,6 @@
<classpathentry exported="true" kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/pircbot/pircbot/1.4.2/pircbot-1.4.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/net/homeip/yusuke/twitter4j/2.0.9/twitter4j-2.0.9.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/byteman/byteman/1.2.1/byteman-1.2.1.jar"/>
<classpathentry exported="true" kind="lib" path="modules/enterprise/remoting/webservices/target/rhq-remoting-webservices-1.4.0-SNAPSHOT/wsconsume-output"/>
<classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index 8291766..10d36a9 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -1,4 +1,4 @@
-#Thu Nov 05 13:19:01 GMT-05:00 2009
+#Thu Jan 14 12:59:22 EST 2010
cleanup.add_default_serial_version_id=true
cleanup.add_generated_serial_version_id=false
cleanup.add_missing_annotations=true
@@ -52,7 +52,7 @@ cleanup.use_this_for_non_static_method_access_only_if_necessary=true
cleanup_profile=_RHQ
cleanup_settings_version=2
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
formatter_profile=_RHQ
formatter_settings_version=11
org.eclipse.jdt.ui.exception.name=e
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java
index 32a3dd4..c5ee507 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/configuration/ConfigurationAgentService.java
@@ -98,4 +98,26 @@ public interface ConfigurationAgentService {
*/
Configuration merge(Configuration configuration, int resourceId, boolean fromStructured)
throws PluginContainerException;
+
+
+ /**
+ * If the <code>fromStructured</code> flag is <code>true</code>, then the s
+ * Configuration.properties</code>) is merged into the latest raw configura
+ * Configuration object returned will consist of the structured configurati
+ * configurations. If <code>fromStructured</code> is <code>false</code>, th
+ * Configuration.rawConfigurations</code>) is merged into the latest struct
+ * plugin. The returned Configuration will then consist of the raw configur
+ * configuration.
+ *
+ * @param configuration The Configuration with the changes to be merged
+ * @param resourceId The id of the resource to which the configuration belo
+ * @param A flag that if <code>true</code> indicates the Structured configu
+ * validates the raw
+ * @return The <strong>merged</strong> configuration, where a merge consist
+ * followed by the values of the side merging from being applied to the sid
+ * @throws PluginContainerException
+ * @throws PluginContainerException if a runtime or plugin error occurs.
+ */
+ void validate(Configuration configuration, int resourceId, boolean isStructured) throws PluginContainerException;
+
}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java
index f8f01bc..d28327f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ConfigurationUpdateStatus.java
@@ -30,7 +30,7 @@ package org.rhq.core.domain.configuration;
* @author John Mazzitelli
*/
public enum ConfigurationUpdateStatus {
- INPROGRESS("In Progress"), SUCCESS("Success"), FAILURE("Failure");
+ INPROGRESS("In Progress"), SUCCESS("Success"), FAILURE("Failure"),UNSENT("unsent");
private String displayName;
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
index 4a14c67..54a7d8d 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationFacet.java
@@ -44,6 +44,6 @@ public interface ResourceConfigurationFacet {
void validateStructuredConfiguration(Configuration configuration);
- void validateRawConfiguration(RawConfiguration rawConfiguration);
+ void validateRawConfiguration(RawConfiguration rawConfiguration) throws RuntimeException;
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index 5a0e155..c0d0dac 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -362,4 +362,23 @@ public class ConfigurationManager extends AgentService implements ContainerServi
return null;
}
+
+ public void validate(Configuration configuration, int resourceId, boolean isStructured)
+ throws PluginContainerException {
+ boolean daemonOnly = true;
+ boolean onlyIfStarted = true;
+ ResourceConfigurationFacet facet = componentService.getComponent(resourceId, ResourceConfigurationFacet.class,
+ FacetLockType.READ, FACET_METHOD_TIMEOUT, daemonOnly, onlyIfStarted);
+ if (isStructured) {
+ return;
+ } else {
+ for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
+ try {
+ facet.validateRawConfiguration(rawConfiguration);
+ } catch (IllegalArgumentException e) {
+ throw new PluginContainerException(e);
+ }
+ }
+ }
+ }
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 971d581..59b7f68 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -193,7 +193,11 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update request with id "
+ updateRequest.getId() + " failed.", updateRequest.getErrorMessage());
return FAILURE_OUTCOME;
- }
+ case UNSENT:
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update was not valid"
+ , updateRequest.getErrorMessage());
+ return FAILURE_OUTCOME;
+ }
} else {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN, "No changes were made to the configuration, so "
+ "no update request has been sent to the Agent.");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index fbae47d..2acf803 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -988,14 +988,46 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
fromStructured);
}
+ if (isRawSupported(resourceId)){
+ try{
+ validateResourceConfiguration(subject, resourceId, newConfiguration,false);
+ } catch(RuntimeException e){
+ ResourceConfigurationUpdate response = new ResourceConfigurationUpdate(null, newConfiguration, subject.getName());
+ response.setErrorMessage(e.getMessage());
+ return response;
+ } catch (PluginContainerException e) {
+ return null;
+ }
+ }
+
ResourceConfigurationUpdate newUpdate =
configurationManager.persistNewResourceConfigurationUpdateHistory(subject, resourceId, configToUpdate,
ConfigurationUpdateStatus.INPROGRESS, subject.getName(), false);
-
executeResourceConfigurationUpdate(newUpdate, fromStructured);
-
return newUpdate;
}
+ private void validateResourceConfiguration(Subject subject, int resourceId, Configuration configuration,boolean isStructured) throws PluginContainerException {
+ Resource resource = entityManager.find(Resource.class, resourceId);
+ if (resource == null) {
+ throw new NoResultException("Cannot get live configuration for unknown resource [" + resourceId + "]");
+ }
+ if (!authorizationManager.canViewResource(subject, resource.getId())) {
+ throw new PermissionException("User [" + subject.getName()
+ + "] does not have permission to view resource configuration for [" + resource + "]");
+ }
+ Agent agent = resource.getAgent();
+ AgentClient agentClient = this.agentManager.getAgentClient(agent);
+ ConfigurationAgentService configService = agentClient.getConfigurationAgentService();
+ configService.validate(configuration, resourceId, isStructured);
+ }
+
+ private boolean isRawSupported(int resourceId) {
+ Resource resource = entityManager.find(Resource.class, resourceId);
+ ConfigurationDefinition configDef = resource.getResourceType().getResourceConfigurationDefinition();
+
+ return (ConfigurationFormat.STRUCTURED_AND_RAW == configDef.getConfigurationFormat() || (ConfigurationFormat.RAW == configDef.getConfigurationFormat()));
+ }
+
private boolean isStructuredAndRawSupported(int resourceId) {
Resource resource = entityManager.find(Resource.class, resourceId);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
index 77bf269..9281e14 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
@@ -1153,5 +1153,8 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
@Asynchronous(guaranteedDelivery = true)
public void synchronizeInventory(ResourceSyncInfo syncInfo) {
}
+ public void validate(Configuration configuration, int resourceId, boolean isStructured)
+ throws PluginContainerException {
+ }
}
-}
\ No newline at end of file
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
index 56b6741..2c13eb6 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
@@ -254,4 +254,8 @@ public class TestAgentClient implements AgentClient, ContentAgentService, Resour
public InputStream getSnapshotReport(int resourceId, String name, String description) throws Exception {
return null;
}
-}
\ No newline at end of file
+
+ public void validate(Configuration configuration, int resourceId, boolean isStructured)
+ throws PluginContainerException {
+ }
+}
commit e2f84e3cf31ca90530a297222e05591250a98cb7
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 14 10:59:25 2010 -0500
Adding logic to properly initialize the rawConfigDirectories property in the UI backing bean.
The rawConfigDirectories property is only used for configs that support raw so a check needed to be
added to only initialize it if raw is supported. Previously we were attempting to always
initialize it, and when raw was not supported it caused a NPE. When raw is not supported it
gets initialized to an empty collection since it is annotated with @Out and Seam will not
allow an @Out to be null.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 971d581..2f48509 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -23,6 +23,7 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -83,7 +84,12 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
@Create
public void begin() {
- initConfigDirectories();
+ if (isRawSupported() || isStructuredAndRawSupported()) {
+ initConfigDirectories();
+ }
+ else {
+ rawConfigDirectories = Collections.EMPTY_LIST;
+ }
}
private void initConfigDirectories() {
commit 04c56bcb72c98e43cd94fbabc790991f7f42a62d
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 14 08:54:48 2010 -0500
Fixing another translation/file selection issue in which modifications were getting overwritten
A backing bean being property, currentContents was being references in view-raw-moal.xhtml and it's
older, non-updated value was overwriting the modified value. This was happening because different
components were referencing the same backing bean property.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 3a81c03..971d581 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -332,6 +332,13 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return getCurrent().getPath();
}
+ public String getModalEditorContents() {
+ return getCurrentContents();
+ }
+
+ public void setModalEditorContents(String contents) {
+ }
+
public TreeMap<String, RawConfiguration> getModified() {
if (modified == null) {
modified = new TreeMap<String, RawConfiguration>();
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index ea3fe76..4ff5b06 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -229,12 +229,14 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</h:panelGrid>
</h:panelGrid>
+
+ <ui:include src="view-raw-modal.xhtml"/>
</rich:tab>
</rich:tabPanel>
</c:when>
</c:choose>
- <ui:include src="view-raw-modal.xhtml"/>
+
</h:form>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
index f0e8b25..8aed4f3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
@@ -26,7 +26,7 @@
style="width:100%; height:100%; overflow:visible;"
rows="30"
cols="30"
- value="#{ExistingResourceConfigurationUIBean.currentContents}"
+ value="#{ExistingResourceConfigurationUIBean.modalEditorContents}"
readonly="false"/>
</rich:panel>
</rich:modalPanel>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 6e68e0c..8e605da 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -244,12 +244,14 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
+
+ <ui:include src="view-raw-modal.xhtml"/>
</rich:tab>
</rich:tabPanel>
</c:when>
</c:choose>
- <ui:include src="view-raw-modal.xhtml"/>
+
</h:form>
commit 56cbca2bb02f3af03c21f65dffcf63feb53522a1
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 14 00:26:46 2010 -0500
Fixing regression that broke translation and changing files from the raw file menu
I introduced a regression earlier today when adding support for the modal file editor that resulted in
breaking the translation when switching back and forth between the structured and raw tabs. Selecting
a file in the raw file menu triggers a partial page update. The modal editor is in a subview on the page and
it was not getting updating during the ajax request. It was holding onto an older value of the selected
file which in turn was overwriting the corresponding property in the backing bean.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index a6366a4..3a81c03 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -120,10 +120,10 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public void changeTabs(ValueChangeEvent event) {
- if (event.getNewValue().equals("Advanced Mode")) {
+ if (event.getNewValue().equals("rawTab")) {
switchToRaw();
}
- else if (event.getNewValue().equals("Basic Mode")) {
+ else if (event.getNewValue().equals("structuredTab")) {
switchToStructured();
}
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 139b5b3..ea3fe76 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -67,13 +67,13 @@ THIS TEXT WILL BE REMOVED.
var="rawConfigDir">
<rich:panelMenuGroup label="#{rawConfigDir.path}"
expanded="true"
- selectedChild="#{currentPath}">
+ selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
+ reRender="fileContents,selectedFileHeader,modalEditor"/>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
@@ -83,8 +83,8 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
<a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
<a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
@@ -140,8 +140,10 @@ THIS TEXT WILL BE REMOVED.
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
- <rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
- <rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <rich:tabPanel id="configTabPanel"
+ switchType="ajax"
+ valueChangeListener="#{ExistingResourceConfigurationUIBean.changeTabs}">
+ <rich:tab id="structuredTab" label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
configuration="#{ExistingResourceConfigurationUIBean.configuration}"
nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
@@ -164,7 +166,7 @@ THIS TEXT WILL BE REMOVED.
styleClass="buttonmed"/>
</h:panelGrid>
</rich:tab>
- <rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <rich:tab id="rawTab" label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
@@ -174,20 +176,19 @@ THIS TEXT WILL BE REMOVED.
<rich:panelMenu mode="ajax"
expandMode="client"
- iconCollapsedGroup="disc"
- limitToList="true"
- reRender="fileContents">
+ iconCollapsedGroup="disc">
<c:forEach items="#{rawConfigDirectories}"
var="rawConfigDir">
<rich:panelMenuGroup label="#{rawConfigDir.path}"
expanded="true"
- selectedChild="#{currentPath}">
+ selectedChild="#{ExistingResourceConfigurationUIBean.currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
+ limitToList="true"
+ reRender="fileContents,selectedFileHeader,modalEditor"/>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
@@ -197,8 +198,8 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
<a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ startText="Loading #{ExistingResourceConfigurationUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationUIBean.current.path}"/>
<a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
@@ -233,33 +234,6 @@ THIS TEXT WILL BE REMOVED.
</c:when>
</c:choose>
- <ui:remove>
- <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
- <h:outputText value=" #{messages.switch2}"/>
- <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchToRaw}">
- <f:param name="conversationId" value="#{conversation.id}"/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- <h:outputText value=" files mode"/>
- </h:commandLink>
- </h:panelGroup>
-
-
- <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationUIBean.configuration}"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
-
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
- <h:commandButton value="SAVE" action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
- title="Click to Save Changes" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}"/>
- <h:commandButton value="RESET" type="reset" immediate="true"
- title="Click to Reset Fields" styleClass="buttonmed"/>
- </h:panelGrid>
- </ui:remove>
-
<ui:include src="view-raw-modal.xhtml"/>
</h:form>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
index ddbce3b..f0e8b25 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
@@ -12,7 +12,7 @@
<rich:modalPanel id="modalEditor" width="800" height="600">
<f:facet name="header">
<h:panelGroup>
- <h:outputText value="#{ExistingResourceConfigurationViewUIBean.currentPath}"/>
+ <h:outputText value="#{ExistingResourceConfiguratioUIBean.currentPath}"/>
</h:panelGroup>
</f:facet>
<f:facet name="controls">
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 81fdb1b..6e68e0c 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -88,7 +88,7 @@ THIS TEXT WILL BE REMOVED.
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
+ reRender="fileContents,selectedFileHeader,modalEditor"/>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
@@ -214,7 +214,7 @@ THIS TEXT WILL BE REMOVED.
onclick="cursor_wait();"
oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
+ reRender="fileContents,selectedFileHeader,modalEditor"/>
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
commit 25dca64eee9ea55165d31e10539abf3e46751637
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 13 14:08:12 2010 -0500
Adding javascript on edit page to change cursor to wait icon when switching between tabs
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index d82efd7..139b5b3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -34,7 +34,7 @@ THIS TEXT WILL BE REMOVED.
}
function open_modal_editor() {
-
+
}
</script>
@@ -52,185 +52,182 @@ THIS TEXT WILL BE REMOVED.
<c:when test="${ExistingResourceConfigurationUIBean.rawSupported}">
<rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
<rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
- <h:panelGrid columns="2"
- styleClass="raw-outer-table"
- columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
- <rich:panel style="width:100%">
- <f:facet name="header">Files</f:facet>
-
- <rich:panelMenu mode="ajax"
- expandMode="client"
- iconCollapsedGroup="disc"
- limitToList="true"
- reRender="fileContents">
- <c:forEach items="#{rawConfigDirectories}"
- var="rawConfigDir">
- <rich:panelMenuGroup label="#{rawConfigDir.path}"
- expanded="true"
- selectedChild="#{currentPath}">
- <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
- onclick="cursor_wait();"
- oncomplete="cursor_clear();"
- action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
+ <h:panelGrid columns="2"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
</c:forEach>
- </rich:panelMenuGroup>
- </c:forEach>
- </rich:panelMenu>
- </rich:panel>
-
- <h:panelGrid columns="1" style="width:100%;">
- <h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
- <h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
- <h:graphicImage value="/images/download.png"/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </h:commandLink>
- </h:panelGrid>
+ </rich:panelMenu>
+ </rich:panel>
- <rich:panel style="margin-left:1px; border: none;">
- <h:inputTextarea id="fileContents"
- style="width:100%"
- value="#{ExistingResourceConfigurationUIBean.currentContents}"
- readonly="false"/>
- </rich:panel>
- </h:panelGrid>
-
- <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
- <h:panelGrid columns="2">
- <h:outputText>n files changed in this configuration</h:outputText>
- <h:commandButton value="Commit"
- action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
- title="Click to Save Changes"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}"/>
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationUIBean.currentContents}"
+ readonly="false"/>
+ </rich:panel>
+ </h:panelGrid>
+
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGrid columns="2">
+ <h:outputText>n files changed in this configuration</h:outputText>
+ <h:commandButton value="Commit"
+ action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ </h:panelGrid>
+ </h:panelGrid>
</h:panelGrid>
- </h:panelGrid>
- </h:panelGrid>
- </rich:tab>
+ </rich:tab>
</rich:tabPanel>
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredSupported}">
<rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
<rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
- <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationUIBean.configuration}"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
-
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
- <h:commandButton value="SAVE" action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
- title="Click to Save Changes" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}"/>
- <h:commandButton value="RESET" type="reset" immediate="true"
- title="Click to Reset Fields" styleClass="buttonmed"/>
- </h:panelGrid>
- </rich:tab>
+ <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationUIBean.configuration}"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
+ <h:commandButton value="SAVE" action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
+ title="Click to Save Changes" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ <h:commandButton value="RESET" type="reset" immediate="true"
+ title="Click to Reset Fields" styleClass="buttonmed"/>
+ </h:panelGrid>
+ </rich:tab>
</rich:tabPanel>
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
- <h:panelGrid columns="2">
- <h:outputText value="#{ResourceUIBean.name}"/>
- </h:panelGrid>
<rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
- <rich:tab label="Basic Mode">
+ <rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationUIBean.configuration}"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
-
- <h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
- <h:commandButton value="SAVE"
- action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
- title="Click to Save Changes"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}"/>
- <h:commandButton value="RESET"
- type="reset"
- immediate="true"
- title="Click to Reset Fields"
- styleClass="buttonmed"/>
- </h:panelGrid>
+ configuration="#{ExistingResourceConfigurationUIBean.configuration}"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
+ <h:commandButton value="SAVE"
+ action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ <h:commandButton value="RESET"
+ type="reset"
+ immediate="true"
+ title="Click to Reset Fields"
+ styleClass="buttonmed"/>
+ </h:panelGrid>
</rich:tab>
- <rich:tab label="Advanced Mode">
+ <rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<h:panelGrid columns="2"
- styleClass="raw-outer-table"
- columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
- <rich:panel style="width:100%">
- <f:facet name="header">Files</f:facet>
-
-
- <rich:panelMenu mode="ajax"
- expandMode="client"
- iconCollapsedGroup="disc"
- limitToList="true"
- reRender="fileContents">
- <c:forEach items="#{rawConfigDirectories}"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+
+
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <c:forEach items="#{rawConfigDirectories}"
var="rawConfigDir">
- <rich:panelMenuGroup label="#{rawConfigDir.path}"
- expanded="true"
- selectedChild="#{currentPath}">
- <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
- onclick="cursor_wait();"
- oncomplete="cursor_clear();"
- action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
- </c:forEach>
- </rich:panelMenuGroup>
- </c:forEach>
- </rich:panelMenu>
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
+ </rich:panelMenu>
</rich:panel>
- <h:panelGrid columns="1" style="width:100%;">
- <h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
- <h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
- <h:graphicImage value="/images/download.png"/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </h:commandLink>
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationUIBean.currentContents}"
+ readonly="false"/>
+ </rich:panel>
</h:panelGrid>
- <rich:panel style="margin-left:1px; border: none;">
- <h:inputTextarea id="fileContents"
- style="width:100%"
- value="#{ExistingResourceConfigurationUIBean.currentContents}"
- readonly="false"/>
- </rich:panel>
- </h:panelGrid>
-
- <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
- <h:panelGrid columns="2">
- <h:outputText>n files changed in this configuration</h:outputText>
- <h:commandButton value="Commit"
- action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
- title="Click to Save Changes"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}"/>
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGrid columns="2">
+ <h:outputText>n files changed in this configuration</h:outputText>
+ <h:commandButton value="Commit"
+ action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ </h:panelGrid>
</h:panelGrid>
</h:panelGrid>
- </h:panelGrid>
</rich:tab>
</rich:tabPanel>
</c:when>
commit f2216a80c0e71c1ea5adfe95d6e8addc3552b8d8
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 13 13:50:31 2010 -0500
Using tabs on the view/edit pages regardless of the supported config format to be consistent
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 4ec4a1e..d82efd7 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -44,8 +44,14 @@ THIS TEXT WILL BE REMOVED.
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <h:panelGrid columns="2">
+ <h:outputText value="#{ResourceUIBean.name}"/>
+ </h:panelGrid>
+
<c:choose>
<c:when test="${ExistingResourceConfigurationUIBean.rawSupported}">
+ <rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
+ <rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
@@ -108,9 +114,13 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</h:panelGrid>
</h:panelGrid>
+ </rich:tab>
+ </rich:tabPanel>
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredSupported}">
+ <rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
+ <rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
configuration="#{ExistingResourceConfigurationUIBean.configuration}"
nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
@@ -125,6 +135,8 @@ THIS TEXT WILL BE REMOVED.
<h:commandButton value="RESET" type="reset" immediate="true"
title="Click to Reset Fields" styleClass="buttonmed"/>
</h:panelGrid>
+ </rich:tab>
+ </rich:tabPanel>
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 37c0100..81fdb1b 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -44,201 +44,213 @@ THIS TEXT WILL BE REMOVED.
<h:form id="viewResourceConfigurationForm">
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <h:panelGrid columns="2">
+ <h:outputText value="#{ResourceUIBean.name}"/>
+ </h:panelGrid>
+
<c:choose>
<c:when test="${ExistingResourceConfigurationViewUIBean.rawSupported}">
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
-
- <h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton value="#{messages.editraw}"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <h:panelGrid columns="2"
- styleClass="raw-outer-table"
- columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
- <rich:panel style="width:100%">
- <f:facet name="header">Files</f:facet>
- <rich:panelMenu mode="ajax"
- expandMode="client"
- iconCollapsedGroup="disc"
- limitToList="true"
- reRender="fileContents">
- <c:forEach items="#{rawConfigDirectories}"
- var="rawConfigDir">
- <rich:panelMenuGroup label="#{rawConfigDir.path}"
- expanded="true"
- selectedChild="#{currentPath}">
- <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
- onclick="cursor_wait();"
- oncomplete="cursor_clear();"
- action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
- </c:forEach>
- </rich:panelMenuGroup>
- </c:forEach>
- </rich:panelMenu>
- </rich:panel>
-
- <h:panelGrid columns="1" style="width:100%;">
- <h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
- <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
- <h:graphicImage value="/images/download.png"/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </h:commandLink>
+
+ <rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
+ <rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton value="Edit"
+ action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
- <rich:panel style="margin-left:1px; border: none;">
- <h:inputTextarea id="fileContents"
- style="width:100%"
- value="#{ExistingResourceConfigurationViewUIBean.currentContents}"
- readonly="true"/>
- </rich:panel>
- </h:panelGrid>
- </h:panelGrid>
+ <h:panelGrid columns="2"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
+ </rich:panelMenu>
+ </rich:panel>
+
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+ <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationViewUIBean.currentContents}"
+ readonly="true"/>
+ </rich:panel>
+ </h:panelGrid>
+ </h:panelGrid>
+ </rich:tab>
+ </rich:tabPanel>
</c:when>
+
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
-
- <h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton value="#{messages.editstructured}"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
- title="Edit this Configuration"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <onc:config
- configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
- accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
- readOnly="true"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
+ <rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
+ <rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton value="Edit"
+ action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ title="Edit this Configuration"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGrid>
+ <onc:config
+ configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
+ accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
+ readOnly="true"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+ </rich:tab>
+ </rich:tabPanel>
</c:when>
+
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
- <h:panelGrid columns="2">
- <h:outputText value="#{ResourceUIBean.name}"/>
- </h:panelGrid>
<rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
<rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
-
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton id="editStructuredButton"
- value="Edit"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
- title="Edit this Configuration" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <onc:config
- configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
- accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
- readOnly="true"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+
+ <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton id="editStructuredButton"
+ value="Edit"
+ action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ title="Edit this Configuration" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGrid>
+
+ <onc:config
+ configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
+ accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
+ readOnly="true"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
</rich:tab>
<rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
-
- <h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton id="editRawButton"
- value="Edit"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <h:panelGrid columns="2"
- styleClass="raw-outer-table"
- columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
- <rich:panel style="width:100%">
- <f:facet name="header">Files</f:facet>
- <rich:panelMenu mode="ajax"
- expandMode="client"
- iconCollapsedGroup="disc"
- limitToList="true"
- reRender="fileContents">
- <c:forEach items="#{rawConfigDirectories}"
- var="rawConfigDir">
- <rich:panelMenuGroup label="#{rawConfigDir.path}"
- expanded="true"
- selectedChild="#{currentPath}">
- <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
- <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
- onclick="cursor_wait();"
- oncomplete="cursor_clear();"
- action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
- reRender="fileContents,selectFileHeader"/>
- </c:forEach>
- </rich:panelMenuGroup>
- </c:forEach>
- </rich:panelMenu>
- </rich:panel>
-
- <h:panelGrid columns="1" style="width:100%;">
- <h:panelGrid columns="4" style="width:100%;">
- <a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
- <h:commandLink value="Upload New">
- <h:graphicImage value="/images/upload.png"/>
- </h:commandLink>
- <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
- <h:graphicImage value="/images/download.png"/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </h:commandLink>
- </h:panelGrid>
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton id="editRawButton"
+ value="Edit"
+ action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGrid>
- <rich:panel style="margin-left:1px; border: none;">
- <h:inputTextarea id="fileContents"
- style="width:100%"
- value="#{ExistingResourceConfigurationViewUIBean.currentContents}"
- readonly="true"/>
+ <h:panelGrid columns="2"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
+ </rich:panelMenu>
</rich:panel>
+
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+ <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationViewUIBean.currentContents}"
+ readonly="true"/>
+ </rich:panel>
+ </h:panelGrid>
</h:panelGrid>
- </h:panelGrid>
</rich:tab>
</rich:tabPanel>
</c:when>
</c:choose>
<ui:include src="view-raw-modal.xhtml"/>
-
+
</h:form>
<h:panelGroup layout="block" styleClass="InfoBlock"
commit f53dfc6ad315a723c22ceab61a31dfec92f92dbf
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 13 13:15:01 2010 -0500
Adding initial support for full screen, modal raw config editor
With this commit, we can view a config file in a modal window. Still need to add functionality for
applying updates from the modal window.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index ec75f22..4ec4a1e 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -32,6 +32,10 @@ THIS TEXT WILL BE REMOVED.
function cursor_clear() {
document.body.style.cursor = 'default';
}
+
+ function open_modal_editor() {
+
+ }
</script>
<h:form id="editResourceConfigurationForm"
@@ -75,7 +79,7 @@ THIS TEXT WILL BE REMOVED.
<a4j:status id="selectedFileHeader"
startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <h:commandLink value="View Full Screen"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
</h:commandLink>
@@ -179,34 +183,14 @@ THIS TEXT WILL BE REMOVED.
</rich:panelMenuGroup>
</c:forEach>
</rich:panelMenu>
-
-
- <ui:remove>
- <rich:panelMenu mode="ajax"
- expandMode="client"
- iconCollapsedGroup="disc"
- limitToList="true"
- reRender="fileContents">
- <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
- <c:forEach items="#{ExistingResourceConfigurationUIBean.configuration.rawConfigurations}"
- var="rawConfig">
- <rich:panelMenuItem label="#{rawConfig.path}"
- action="#{ExistingResourceConfigurationUIBean.select(rawConfig.path)}"
- styleClass="raw-menu-item"
- tableBorderColor="blue"
- reRender="fileContents,selectedFileHeader"/>
- </c:forEach>
- </rich:panelMenuGroup>
- </rich:panelMenu>
- </ui:remove>
- </rich:panel>
+ </rich:panel>
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
<a4j:status id="selectedFileHeader"
startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <h:commandLink value="View Full Screen"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
</h:commandLink>
@@ -267,6 +251,8 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</ui:remove>
+ <ui:include src="view-raw-modal.xhtml"/>
+
</h:form>
<h:panelGroup layout="block" styleClass="InfoBlock"
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
new file mode 100644
index 0000000..ddbce3b
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view-raw-modal.xhtml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
+
+ <f:subview id="subview">
+ <rich:modalPanel id="modalEditor" width="800" height="600">
+ <f:facet name="header">
+ <h:panelGroup>
+ <h:outputText value="#{ExistingResourceConfigurationViewUIBean.currentPath}"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="controls">
+ <h:panelGroup>
+ <h:graphicImage value="/images/close.png" styleClass="hidelink" id="hidelink"/>
+ <rich:componentControl for="modalEditor" attachTo="hidelink" operation="hide" event="onclick"/>
+ </h:panelGroup>
+ </f:facet>
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%; height:100%; overflow:visible;"
+ rows="30"
+ cols="30"
+ value="#{ExistingResourceConfigurationUIBean.currentContents}"
+ readonly="false"/>
+ </rich:panel>
+ </rich:modalPanel>
+ </f:subview>
+
+</ui:composition>
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index b9d13b9..37c0100 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -92,7 +92,7 @@ THIS TEXT WILL BE REMOVED.
<a4j:status id="selectedFileHeader"
startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <h:commandLink value="View Full Screen"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
</h:commandLink>
@@ -214,7 +214,7 @@ THIS TEXT WILL BE REMOVED.
<a4j:status id="selectedFileHeader"
startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
- <h:commandLink value="View Full Screen"/>
+ <a href="#" onclick="#{rich:component('modalEditor')}.show()">View Full Screen</a>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
</h:commandLink>
@@ -236,6 +236,9 @@ THIS TEXT WILL BE REMOVED.
</rich:tabPanel>
</c:when>
</c:choose>
+
+ <ui:include src="view-raw-modal.xhtml"/>
+
</h:form>
<h:panelGroup layout="block" styleClass="InfoBlock"
commit f5630e163bfea70d1fc5629a67310ab0ccccd689
Merge: f9ce225... 776bbc9...
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 21:54:45 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config
commit f9ce225efdf75887f6a2abb16ab2696e1f569579
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 21:48:34 2010 -0500
Adding javascript and file grouping on the raw view and on the edit pages
The files in the file menu are now grouped by directory in all views where it is rendered. JavaScript has
been added in places as well to change the cursor style to wait when a new config is selected and is
loading.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 027ce1d..a6366a4 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -59,11 +59,12 @@ import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
-/**
- * @author Ian Springer
- */
-@Name(value = "ExistingResourceConfigurationViewUIBean")
-(a)Scope(ScopeType.PAGE)
+// This class is temporarily decleared in components.xml since it is declared under two names - ViewUIBean and
+// UIBean. This class is undergoing some refactoring and part of that will include declaring the @Name and @Scope
+// annotations again.
+//
+//@Name(value = "ExistingResourceConfigurationViewUIBean")
+//(a)Scope(ScopeType.PAGE)
public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUIBean {
public static final String MANAGED_BEAN_NAME = "ExistingResourceConfigurationUIBean";
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
index 64bd31e..8f7cfcc 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/components.xml
@@ -19,4 +19,13 @@
<property name="createTempFiles">false</property>
<property name="maxRequestSize">1000000</property>
</component>
+
+ <component class="org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean"
+ name="ExistingResourceConfigurationViewUIBean"
+ scope="page"/>
+
+ <component class="org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean"
+ name="ExistingResourceConfigurationUIBean"
+ scope="session"/>
+
</components>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 02ef0c1..ec75f22 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -24,6 +24,15 @@ THIS TEXT WILL BE REMOVED.
<ui:param name="selectedTabName" value="Configuration.Current"/>
<ui:define name="content">
+ <script type="text/javascript">
+ function cursor_wait() {
+ document.body.style.cursor = 'wait';
+ }
+
+ function cursor_clear() {
+ document.body.style.cursor = 'default';
+ }
+ </script>
<h:form id="editResourceConfigurationForm"
onsubmit="prepareInputsForSubmission(this)"
@@ -38,29 +47,34 @@ THIS TEXT WILL BE REMOVED.
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<rich:panel style="width:100%">
<f:facet name="header">Files</f:facet>
+
<rich:panelMenu mode="ajax"
expandMode="client"
iconCollapsedGroup="disc"
limitToList="true"
reRender="fileContents">
- <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
- <c:forEach items="#{ExistingResourceConfigurationUIBean.configuration.rawConfigurations}"
- var="rawConfig">
- <rich:panelMenuItem label="#{rawConfig.path}"
- action="#{ExistingResourceConfigurationUIBean.select(rawConfig.path)}"
- styleClass="raw-menu-item"
- tableBorderColor="blue"
- reRender="fileContents,selectedFileHeader"/>
- </c:forEach>
- </rich:panelMenuGroup>
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
</rich:panelMenu>
</rich:panel>
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
<a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
<h:commandLink value="View Full Screen"/>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
@@ -143,6 +157,31 @@ THIS TEXT WILL BE REMOVED.
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<rich:panel style="width:100%">
<f:facet name="header">Files</f:facet>
+
+
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
+ </rich:panelMenu>
+
+
+ <ui:remove>
<rich:panelMenu mode="ajax"
expandMode="client"
iconCollapsedGroup="disc"
@@ -159,6 +198,7 @@ THIS TEXT WILL BE REMOVED.
</c:forEach>
</rich:panelMenuGroup>
</rich:panelMenu>
+ </ui:remove>
</rich:panel>
<h:panelGrid columns="1" style="width:100%;">
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 64ea957..b9d13b9 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -28,8 +28,6 @@ THIS TEXT WILL BE REMOVED.
<ui:define name="content">
<script type="text/javascript">
- var curentFile =
-
function cursor_wait() {
document.body.style.cursor = 'wait';
}
@@ -48,13 +46,6 @@ THIS TEXT WILL BE REMOVED.
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
<c:choose>
<c:when test="${ExistingResourceConfigurationViewUIBean.rawSupported}">
- <script>
- window.onbeforeunload = confirmExit;
-
- function confirmExit() {
- }
- </script>
-
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
@@ -75,19 +66,25 @@ THIS TEXT WILL BE REMOVED.
<rich:panel style="width:100%">
<f:facet name="header">Files</f:facet>
<rich:panelMenu mode="ajax"
- expandMode="client"
- iconCollapsedGroup="disc"
- limitToList="true"
- reRender="fileContents">
- <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
- <c:forEach items="#{ExistingResourceConfigurationViewUIBean.configuration.rawConfigurations}"
- var="rawConfig">
- <rich:panelMenuItem label="#{rawConfig.path}"
- action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
- reRender="fileContents,selectedFileHeader"/>
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
+ action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
</c:forEach>
- </rich:panelMenuGroup>
- </rich:panelMenu>
+ </rich:panelMenu>
</rich:panel>
<h:panelGrid columns="1" style="width:100%;">
@@ -209,17 +206,6 @@ THIS TEXT WILL BE REMOVED.
</c:forEach>
</rich:panelMenuGroup>
</c:forEach>
- <ui:remove>
- <rich:panelMenuGroup label="/tmp/raw-config" expanded="true" selectedChild="#{currentPath}">
- <c:forEach items="#{ExistingResourceConfigurationViewUIBean.configuration.rawConfigurations}"
- var="rawConfig">
- <rich:panelMenuItem id="raw_#{rawConfig.sha256}"
- label="#{rawConfig.path}"
- action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
- reRender="fileContents,selectedFileHeader"/>
- </c:forEach>
- </rich:panelMenuGroup>
- </ui:remove>
</rich:panelMenu>
</rich:panel>
commit 10a71f8118aa9cce36351a96dd423966cda88723
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 21:12:34 2010 -0500
Add javascript to change cursor to a wait cursor when changing tabs or when selecting a new file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 25b4693..64ea957 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -27,6 +27,18 @@ THIS TEXT WILL BE REMOVED.
<ui:param name="selectedTabName" value="Configuration.Current"/>
<ui:define name="content">
+ <script type="text/javascript">
+ var curentFile =
+
+ function cursor_wait() {
+ document.body.style.cursor = 'wait';
+ }
+
+ function cursor_clear() {
+ document.body.style.cursor = 'default';
+ }
+ </script>
+
<h:panelGroup layout="block" styleClass="InfoBlock"
rendered="#{ExistingResourceConfigurationViewUIBean.updateInProgress}">
<b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
@@ -133,7 +145,7 @@ THIS TEXT WILL BE REMOVED.
<h:outputText value="#{ResourceUIBean.name}"/>
</h:panelGrid>
<rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
- <rich:tab label="Basic Mode">
+ <rich:tab label="Basic Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
@@ -157,7 +169,7 @@ THIS TEXT WILL BE REMOVED.
prevalidate="true"/>
</rich:tab>
- <rich:tab label="Advanced Mode">
+ <rich:tab label="Advanced Mode" onlabelclick="cursor_wait();" oncomplete="cursor_clear();">
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
@@ -190,6 +202,8 @@ THIS TEXT WILL BE REMOVED.
selectedChild="#{currentPath}">
<c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
<rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ onclick="cursor_wait();"
+ oncomplete="cursor_clear();"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
reRender="fileContents,selectFileHeader"/>
</c:forEach>
commit f76599305b5e8ac96fcdd3f23a3ddbcb40527119
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 17:00:28 2010 -0500
Deleting unused file that was accidentally included in a previous commit
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectoryListing.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectoryListing.java
deleted file mode 100644
index 89b2236..0000000
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectoryListing.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program 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 General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.enterprise.gui.configuration.resource;
-
-import org.rhq.core.domain.configuration.RawConfiguration;
-
-import java.util.List;
-
-public class RawConfigDirectoryListing {
-
-// private List<>
-
- public void addRawConfiguration(RawConfiguration rawConfig) {
-
- }
-
-// private
-//
-// private List<RawConfiguration> get
-
-}
commit f6924d42284e00d9c3e4a6b59bb0d94e20d6fb54
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 16:57:16 2010 -0500
Adding logic to group files by directory in the file menu
Right now this logic is only in place on the view page. Initial commit for RawConfigDirectory which is just
a container for raw config files to group them by directory. This is the initial commit for
RawConfigUIBean as well which provides properties used in the view, like displaying the short name
of the config file for instance.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 6576c05..027ce1d 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -23,19 +23,22 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import java.util.TreeMap;
import javax.faces.application.FacesMessage;
-import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.event.ValueChangeEvent;
-import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jetbrains.annotations.Nullable;
import org.richfaces.event.UploadEvent;
@@ -69,23 +72,48 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
private boolean mode = STRUCTURED_MODE;
- // =========== actions ===========
+ @Out
+ private Collection<RawConfigDirectory> rawConfigDirectories;
public ExistingResourceConfigurationUIBean() {
removeSessionScopedBeanIfInView("/rhq/resource/configuration/view.xhtml",
ExistingResourceConfigurationUIBean.class);
}
- public String editConfiguration() {
- return SUCCESS_OUTCOME;
+ @Create
+ public void begin() {
+ initConfigDirectories();
}
- public String editRawConfiguration() {
- mode = RAW_MODE;
+ private void initConfigDirectories() {
+ Map<String, RawConfigDirectory> dirs = new HashMap<String, RawConfigDirectory>();
+
+ for (RawConfiguration rawConfig : getConfiguration().getRawConfigurations()) {
+ String parentDirPath = getParentDir(rawConfig);
+ RawConfigDirectory dir = dirs.get(parentDirPath);
+
+ if (dir == null) {
+ dir = new RawConfigDirectory();
+ dir.setPath(parentDirPath);
+ }
+
+ dir.addRawConfig(rawConfig);
+ dirs.put(parentDirPath, dir);
+ }
+
+ rawConfigDirectories = dirs.values();
+ }
+
+ private String getParentDir(RawConfiguration rawConfig) {
+ File file = new File(rawConfig.getPath());
+ return file.getParentFile().getAbsolutePath();
+ }
+
+ public String editConfiguration() {
return SUCCESS_OUTCOME;
}
- public String editRaw() {
+ public String editRawConfiguration() {
mode = RAW_MODE;
return SUCCESS_OUTCOME;
}
@@ -95,23 +123,44 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
switchToRaw();
}
else if (event.getNewValue().equals("Basic Mode")) {
- switchTostructured();
+ switchToStructured();
}
}
public String switchToRaw() {
-// ConfigurationMaskingUtility.unmaskConfiguration(getConfiguration(), getConfigurationDefinition());
-// int resourceId = EnterpriseFacesContextUtility.getResource().getId();
-// Configuration configuration =
-// configurationManager.translateResourceConfiguration(EnterpriseFacesContextUtility.getSubject(),
-// resourceId, getConfiguration(), true);
-//
-// setConfiguration(configuration);
-//
-// mode = RAW_MODE;
-//
-// return null;
- return switchToraw();
+ Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
+ EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), true);
+
+ setConfiguration(configuration);
+
+ for (RawConfiguration raw : configuration.getRawConfigurations()) {
+ getRaws().put(raw.getPath(), raw);
+ }
+ current = null;
+ setConfiguration(configuration);
+
+ mode = RAW_MODE;
+ return null;
+ }
+
+ public String switchToStructured() {
+ Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
+ EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), false);
+
+ for (Property property : configuration.getAllProperties().values()) {
+ property.setConfiguration(configuration);
+ }
+
+ for (RawConfiguration raw : configuration.getRawConfigurations()) {
+ getRaws().put(raw.getPath(), raw);
+ setConfiguration(configuration);
+ }
+ current = null;
+ setConfiguration(configuration);
+
+ mode = STRUCTURED_MODE;
+
+ return null;
}
public String updateConfiguration() {
@@ -256,27 +305,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return getConfiguration().getId();
}
- /*
- public Configuration getConfiguration() {
- if (null == configuration) {
-
- Subject subject = EnterpriseFacesContextUtility.getSubject();
- int resourceId = EnterpriseFacesContextUtility.getResource().getId();
- AbstractResourceConfigurationUpdate configurationUpdate = LookupUtil.getConfigurationManager()
- .getLatestResourceConfigurationUpdate(subject, resourceId);
- Configuration configuration = (configurationUpdate != null) ? configurationUpdate.getConfiguration() : null;
- if (configuration != null) {
- //ConfigurationMaskingUtility.maskConfiguration(configuration, getConfigurationDefinition());
- }
-
- return configuration;
-
- }
- return configuration;
-
- }
- */
-
private ConfigurationFormat getConfigurationFormat() {
return getConfigurationDefinition().getConfigurationFormat();
}
@@ -296,9 +324,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String getCurrentContents() {
- String currentContents = new String(getCurrent().getContents());
- return currentContents;
-// return new String(getCurrent().getContents());
+ return new String(getCurrent().getContents());
}
public String getCurrentPath() {
@@ -329,17 +355,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return resourceId;
}
- /**
- * Hack Alert. This bean needs to be initialized on one of the pages that has id or resourceId set
- * In order to capture the resource. It will then Keep track of that particular resources until
- * commit is called. Ideally, this should be a conversation scoped bean, but that has other issues
- *
- */
- @Create
- public void init() {
-
- }
-
public boolean isStructuredMode() {
return mode == STRUCTURED_MODE;
}
@@ -441,57 +456,12 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return "/rhq/resource/configuration/edit-raw.xhtml?currentResourceId=" + getResourceId();
}
- public String switchToraw() {
- log.error("switch2raw called");
- dumpProperties(getConfiguration(), log);
- Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
- EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), true);
- log.error("switch2raw post merge");
- dumpProperties(getConfiguration(), log);
-
- setConfiguration(configuration);
- for (RawConfiguration raw : configuration.getRawConfigurations()) {
- getRaws().put(raw.getPath(), raw);
- }
- current = null;
- setConfiguration(configuration);
-
- mode = RAW_MODE;
- return null;
- }
-
void dumpProperties(Configuration conf, Log log) {
for (String key : conf.getAllProperties().keySet()) {
log.error("property=" + conf.getAllProperties().get(key));
}
}
- public String switchTostructured() {
- log.error("switch2structured called");
-
- dumpProperties(getConfiguration(), log);
- Configuration configuration = LookupUtil.getConfigurationManager().translateResourceConfiguration(
- EnterpriseFacesContextUtility.getSubject(), getResourceId(), getMergedConfiguration(), false);
- log.error("switch2structured post merge");
-
- dumpProperties(configuration, log);
-
- for (Property property : configuration.getAllProperties().values()) {
- property.setConfiguration(configuration);
- }
-
- for (RawConfiguration raw : configuration.getRawConfigurations()) {
- getRaws().put(raw.getPath(), raw);
- setConfiguration(configuration);
- }
- current = null;
- setConfiguration(configuration);
-
- mode = STRUCTURED_MODE;
-
- return null;
- }
-
void populateRaws() {
Collection<RawConfiguration> rawConfigurations = getConfiguration().getRawConfigurations();
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectory.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectory.java
new file mode 100644
index 0000000..fe346dd
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectory.java
@@ -0,0 +1,55 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.enterprise.gui.configuration.resource;
+
+import org.rhq.core.domain.configuration.RawConfiguration;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RawConfigDirectory {
+
+ private String path;
+
+ private List<RawConfigUIBean> rawConfigUIBeans = new ArrayList<RawConfigUIBean>();
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public List<RawConfigUIBean> getRawConfigUIBeans() {
+ return rawConfigUIBeans;
+ }
+
+ public void addRawConfig(RawConfiguration rawConfig) {
+ RawConfigUIBean bean = new RawConfigUIBean();
+ bean.setRawConfiguration(rawConfig);
+ rawConfigUIBeans.add(bean);
+ }
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectoryListing.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectoryListing.java
new file mode 100644
index 0000000..89b2236
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigDirectoryListing.java
@@ -0,0 +1,42 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.enterprise.gui.configuration.resource;
+
+import org.rhq.core.domain.configuration.RawConfiguration;
+
+import java.util.List;
+
+public class RawConfigDirectoryListing {
+
+// private List<>
+
+ public void addRawConfiguration(RawConfiguration rawConfig) {
+
+ }
+
+// private
+//
+// private List<RawConfiguration> get
+
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
new file mode 100644
index 0000000..21b7d41
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java
@@ -0,0 +1,60 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.enterprise.gui.configuration.resource;
+
+import org.rhq.core.domain.configuration.RawConfiguration;
+
+import java.io.File;
+
+public class RawConfigUIBean {
+
+ private RawConfiguration rawConfiguration;
+
+ private boolean modified;
+
+ public RawConfiguration getRawConfiguration() {
+ return rawConfiguration;
+ }
+
+ public void setRawConfiguration(RawConfiguration rawConfiguration) {
+ this.rawConfiguration = rawConfiguration;
+ }
+
+ public boolean isModified() {
+ return modified;
+ }
+
+ public void setModified(boolean modified) {
+ this.modified = modified;
+ }
+
+ public String getPath() {
+ return rawConfiguration.getPath();
+ }
+
+ public String getFileName() {
+ File file = new File(rawConfiguration.getPath());
+ return file.getName();
+ }
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
index 0357e87..39270b7 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
@@ -45,7 +45,7 @@
</navigation-case>
<!--<navigation-case>-->
- <!--<from-action>#{ExistingResourceConfigurationViewUIBean.switchTostructured}</from-action>-->
+ <!--<from-action>#{ExistingResourceConfigurationViewUIBean.switchToStructured}</from-action>-->
<!--<to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>-->
<!--<redirect/>-->
<!--</navigation-case>-->
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index ca24152..02ef0c1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -46,12 +46,11 @@ THIS TEXT WILL BE REMOVED.
<rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
<c:forEach items="#{ExistingResourceConfigurationUIBean.configuration.rawConfigurations}"
var="rawConfig">
- <rich:panelMenuItem action="#{ExistingResourceConfigurationUIBean.select(rawConfig.path)}"
+ <rich:panelMenuItem label="#{rawConfig.path}"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfig.path)}"
styleClass="raw-menu-item"
tableBorderColor="blue"
- reRender="fileContents,selectedFileHeader">
- #{rawConfig.path}
- </rich:panelMenuItem>
+ reRender="fileContents,selectedFileHeader"/>
</c:forEach>
</rich:panelMenuGroup>
</rich:panelMenu>
@@ -156,9 +155,7 @@ THIS TEXT WILL BE REMOVED.
action="#{ExistingResourceConfigurationUIBean.select(rawConfig.path)}"
styleClass="raw-menu-item"
tableBorderColor="blue"
- reRender="fileContents,selectedFileHeader">
- <f:param name="current" value="#{rawConfig.path}"/>
- </rich:panelMenuItem>
+ reRender="fileContents,selectedFileHeader"/>
</c:forEach>
</rich:panelMenuGroup>
</rich:panelMenu>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index adbe47e..25b4693 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -72,9 +72,7 @@ THIS TEXT WILL BE REMOVED.
var="rawConfig">
<rich:panelMenuItem label="#{rawConfig.path}"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
- reRender="fileContents,selectedFileHeader">
- <f:param name="current" value="#{rawConfig.path}"/>
- </rich:panelMenuItem>
+ reRender="fileContents,selectedFileHeader"/>
</c:forEach>
</rich:panelMenuGroup>
</rich:panelMenu>
@@ -103,55 +101,6 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
-
- <ui:remove>
- <table class="summary-props-table" style="">
- <tr>
- <td bgcolor="#a4b2b9" width="25%" valign="top">Files
- <h:panelGroup id="changedFiles" layout="vertical">
- <h:form>
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
- <ui:repeat value="#{ExistingResourceConfigurationViewUIBean.paths}" var="path">
- <div>
- <h:commandLink
- action="#{ExistingResourceConfigurationViewUIBean.select(path)}"
- value="#{path}"
- rendered="#{path != ExistingResourceConfigurationViewUIBean.current.path}">
- <f:param name="currentPath" value="#{path}"/>
- </h:commandLink>
- <h:outputText value="#{path}"
- rendered="#{path == ExistingResourceConfigurationViewUIBean.current.path}"/>
- </div>
- </ui:repeat>
- </h:form>
- </h:panelGroup>
- <div>______________________________________</div>
- <div>* File contains uncommitted changes.</div>
- </td>
- <td>
- <div>
- Current File:
- <h:outputText value="#{ExistingResourceConfigurationViewUIBean.current.path}"
- styleClass="outhello"/>
- </div>
- <h:outputLink value="view-raw-full.xhtml" action="navigateToUpload">
- <img src="/images/viewfullscreen.png"/>
- <h:outputText value=" Full Screen "/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </h:outputLink>
- <s:link action="#{ExistingResourceConfigurationViewUIBean.download}">
- <img src="/images/download.png"/>
- <h:outputText value=" Download "/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </s:link>
- <div>
- <pre><h:outputText
- value="#{ExistingResourceConfigurationViewUIBean.currentContents}"/></pre>
- </div>
- </td>
- </tr>
- </table>
- </ui:remove>
</c:when>
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
<h:outputText value=" #{messages.nopermissionedit}"
@@ -234,17 +183,29 @@ THIS TEXT WILL BE REMOVED.
iconCollapsedGroup="disc"
limitToList="true"
reRender="fileContents">
+ <c:forEach items="#{rawConfigDirectories}"
+ var="rawConfigDir">
+ <rich:panelMenuGroup label="#{rawConfigDir.path}"
+ expanded="true"
+ selectedChild="#{currentPath}">
+ <c:forEach items="#{rawConfigDir.rawConfigUIBeans}" var="rawConfigUIBean">
+ <rich:panelMenuItem label="#{rawConfigUIBean.fileName}"
+ action="#{ExistingResourceConfigurationViewUIBean.select(rawConfigUIBean.path)}"
+ reRender="fileContents,selectFileHeader"/>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </c:forEach>
+ <ui:remove>
<rich:panelMenuGroup label="/tmp/raw-config" expanded="true" selectedChild="#{currentPath}">
<c:forEach items="#{ExistingResourceConfigurationViewUIBean.configuration.rawConfigurations}"
var="rawConfig">
<rich:panelMenuItem id="raw_#{rawConfig.sha256}"
label="#{rawConfig.path}"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
- reRender="fileContents,selectedFileHeader">
- <f:param name="current" value="#{rawConfig.path}"/>
- </rich:panelMenuItem>
+ reRender="fileContents,selectedFileHeader"/>
</c:forEach>
</rich:panelMenuGroup>
+ </ui:remove>
</rich:panelMenu>
</rich:panel>
commit d089f1c82ea348f8986d75c8d45599ba34121510
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 14:19:43 2010 -0500
Adding tabs to switch between structured and raw on edit.xhtml.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 2e4a3c1..ca24152 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -111,17 +111,12 @@ THIS TEXT WILL BE REMOVED.
</c:when>
<c:when test="${ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
- <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.structuredMode}">
- <h:outputText value="#{messages.youareviewingstructured}"/>
-
- <h:panelGroup>
- <h:outputText value=" #{messages.switch2}"/>
- <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchToRaw}">
- <h:outputText value=" files mode"/>
- </h:commandLink>
- </h:panelGroup>
-
- <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
+ <h:panelGrid columns="2">
+ <h:outputText value="#{ResourceUIBean.name}"/>
+ </h:panelGrid>
+ <rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
+ <rich:tab label="Basic Mode">
+ <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
configuration="#{ExistingResourceConfigurationUIBean.configuration}"
nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
@@ -142,18 +137,9 @@ THIS TEXT WILL BE REMOVED.
title="Click to Reset Fields"
styleClass="buttonmed"/>
</h:panelGrid>
- </h:panelGroup>
- <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.rawMode}">
- <h:outputText value="#{messages.youareviewingraw}"/>
-
- <h:panelGroup>
- <h:outputText value=" #{messages.switch2}"/>
- <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchTostructured}">
- <h:outputText value=" #{messages.structured}"/>
- </h:commandLink>
- </h:panelGroup>
-
- <h:panelGrid columns="2"
+ </rich:tab>
+ <rich:tab label="Advanced Mode">
+ <h:panelGrid columns="2"
styleClass="raw-outer-table"
columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
<rich:panel style="width:100%">
@@ -212,7 +198,8 @@ THIS TEXT WILL BE REMOVED.
</h:panelGrid>
</h:panelGrid>
</h:panelGrid>
- </h:panelGroup>
+ </rich:tab>
+ </rich:tabPanel>
</c:when>
</c:choose>
commit 55407222bc09c9d577d14465d09ec0f09da237e3
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 14:00:55 2010 -0500
Adding tabs to switch back and forth between structured and raw on view.xhtml
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index dbdc167..6576c05 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -28,6 +28,7 @@ import java.util.TreeMap;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlPanelGroup;
+import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -89,6 +90,15 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return SUCCESS_OUTCOME;
}
+ public void changeTabs(ValueChangeEvent event) {
+ if (event.getNewValue().equals("Advanced Mode")) {
+ switchToRaw();
+ }
+ else if (event.getNewValue().equals("Basic Mode")) {
+ switchTostructured();
+ }
+ }
+
public String switchToRaw() {
// ConfigurationMaskingUtility.unmaskConfiguration(getConfiguration(), getConfigurationDefinition());
// int resourceId = EnterpriseFacesContextUtility.getResource().getId();
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index d92e747..adbe47e 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -180,49 +180,36 @@ THIS TEXT WILL BE REMOVED.
</c:when>
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
- <h:panelGroup id="structuredGroup" rendered="#{ExistingResourceConfigurationViewUIBean.structuredMode}">
- <h:outputText value="#{messages.youareviewingstructured}"/>
- <h:panelGroup>
- <h:outputText value=" #{messages.switch2}"/>
- <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.switchToRaw}">
- <h:outputText value=" files mode"/>
- </h:commandLink>
- </h:panelGroup>
-
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
-
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton id="editStructuredButton"
- value="Edit"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
- title="Edit this Configuration" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <onc:config
- configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
- accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
- readOnly="true"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
-
- </h:panelGroup>
- <h:panelGroup id="rawGroup" rendered="#{ExistingResourceConfigurationViewUIBean.rawMode}">
- <h:outputText value="#{messages.youareviewingraw}"/>
-
- <h:panelGroup>
- <h:outputText value=" #{messages.switch2}"/>
- <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.switchTostructured}">
- <h:outputText value=" #{messages.structured}"/>
- </h:commandLink>
- </h:panelGroup>
-
- <h:outputText value=" #{messages.nopermissionedit}"
+ <h:panelGrid columns="2">
+ <h:outputText value="#{ResourceUIBean.name}"/>
+ </h:panelGrid>
+ <rich:tabPanel switchType="ajax" valueChangeListener="changeTabs">
+ <rich:tab label="Basic Mode">
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+
+ <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton id="editStructuredButton"
+ value="Edit"
+ action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ title="Edit this Configuration" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGrid>
+
+ <onc:config
+ configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
+ accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
+ readOnly="true"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ </rich:tab>
+ <rich:tab label="Advanced Mode">
+ <h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
<h:panelGrid columns="2"
@@ -284,7 +271,8 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
- </h:panelGroup>
+ </rich:tab>
+ </rich:tabPanel>
</c:when>
</c:choose>
</h:form>
commit 5ed1d23e977a743d237216c6db7535cda65a3293
Author: John Sanda <john(a)localhost.localdomain>
Date: Tue Jan 12 13:20:45 2010 -0500
Seam-ifying backing bean in order to work around request scope issue with JSF
On view.xhtml, when the user clicks the links to change back and forth between structured
and raw, it results in a postback with an action method invoked to perform the translation.
A problem I encountered was that once the view rendered after the postback the backing bean
which was in request scope was no longer available to the view. Consequetly, clicking any
commandLink or commandButton did not invoke any of the specified actions. Making the backing
bean a Seam component with page scope resolved this issue.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index 555bf43..dbdc167 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -27,11 +27,15 @@ import java.util.Iterator;
import java.util.TreeMap;
import javax.faces.application.FacesMessage;
+import javax.faces.component.html.HtmlPanelGroup;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
import org.jetbrains.annotations.Nullable;
import org.richfaces.event.UploadEvent;
@@ -54,8 +58,8 @@ import org.rhq.enterprise.server.util.LookupUtil;
/**
* @author Ian Springer
*/
-//@ Name(value = "ExistingResourceConfigurationUIBean")
-//@ Scope(ScopeType.PAGE)
+@Name(value = "ExistingResourceConfigurationViewUIBean")
+(a)Scope(ScopeType.PAGE)
public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUIBean {
public static final String MANAGED_BEAN_NAME = "ExistingResourceConfigurationUIBean";
@@ -76,6 +80,12 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String editRawConfiguration() {
+ mode = RAW_MODE;
+ return SUCCESS_OUTCOME;
+ }
+
+ public String editRaw() {
+ mode = RAW_MODE;
return SUCCESS_OUTCOME;
}
@@ -143,8 +153,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
return SUCCESS_OUTCOME;
}
- // =========== impls of superclass abstract methods ===========
-
protected int getConfigurationDefinitionKey() {
return EnterpriseFacesContextUtility.getResource().getResourceType().getId();
}
@@ -440,7 +448,6 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
mode = RAW_MODE;
return null;
-// return SUCCESS_OUTCOME;
}
void dumpProperties(Configuration conf, Log log) {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml
index 70d3f99..d2cd3f7 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/configuration-beans.xml
@@ -5,11 +5,11 @@
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<!-- /rhq/resource/configuration/view.xhtml, /rhq/resource/configuration/view-map.xhtml -->
- <managed-bean>
- <managed-bean-name>ExistingResourceConfigurationViewUIBean</managed-bean-name>
- <managed-bean-class>org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean</managed-bean-class>
- <managed-bean-scope>request</managed-bean-scope>
- </managed-bean>
+ <!--<managed-bean>-->
+ <!--<managed-bean-name>ExistingResourceConfigurationViewUIBean</managed-bean-name>-->
+ <!--<managed-bean-class>org.rhq.enterprise.gui.configuration.resource.ExistingResourceConfigurationUIBean</managed-bean-class>-->
+ <!--<managed-bean-scope>request</managed-bean-scope>-->
+ <!--</managed-bean> -->
<!-- /rhq/resource/configuration/history.xhtml, /rhq/resource/configuration/edit.xhtml, and
/rhq/resource/configuration/edit-map.xhtml -->
<managed-bean>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
index bc26600..0357e87 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
@@ -4,20 +4,27 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
- <navigation-rule>
- <from-view-id>/rhq/resource/configuration/view.xhtml</from-view-id>
-
- <navigation-case>
- <from-action>#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}</from-action>
- <from-outcome>success</from-outcome>
- <to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>
- </navigation-case>
-
- <navigation-case>
- <from-action>#{ExistingResourceConfigurationUIBean.switchToraw}</from-action>
- <to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>
- </navigation-case>
- </navigation-rule>
+ <!--<navigation-rule>-->
+ <!--<from-view-id>/rhq/resource/configuration/view.xhtml</from-view-id>-->
+
+ <!--<navigation-case>-->
+ <!--<from-action>#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}</from-action>-->
+ <!--<from-outcome>success</from-outcome>-->
+ <!--<to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>-->
+ <!--</navigation-case>-->
+
+ <!--<navigation-case>-->
+ <!--<from-action>#{ExistingResourceConfigurationUIBean.switchToraw}</from-action>-->
+ <!--<to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>-->
+ <!--</navigation-case>-->
+ <!--</navigation-rule>-->
+
+ <!--<navigation-rule>-->
+ <!--<navigation-case>-->
+ <!--<from-action>#{ExistingResourceConfigurationUIBean.editRawConfiguration}</from-action>-->
+ <!--<to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>-->
+ <!--</navigation-case>-->
+ <!--</navigation-rule>-->
<navigation-rule>
<navigation-case>
@@ -26,30 +33,28 @@
<redirect/>
</navigation-case>
- <!--
<navigation-case>
<from-action>#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}</from-action>
<to-view-id>/rhq/resource/configuration/edit.xhtml?id=#{param.id}</to-view-id>
<redirect/>
</navigation-case>
- -->
-
+
<navigation-case>
<from-action>#{ConfigHelperUIBean.accessMap}</from-action>
<to-view-id>/rhq/resource/configuration/view-map.xhtml</to-view-id>
</navigation-case>
- <navigation-case>
- <from-action>#{ExistingResourceConfigurationUIBean.switchTostructured}</from-action>
- <to-view-id>/rhq/resource/configuration/edit.xhtml?id=#{param.id}</to-view-id>
- <redirect/>
- </navigation-case>
-
- <navigation-case>
- <from-action>#{ExistingResourceConfigurationUIBean.switchToraw}</from-action>
- <to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>
+ <!--<navigation-case>-->
+ <!--<from-action>#{ExistingResourceConfigurationViewUIBean.switchTostructured}</from-action>-->
+ <!--<to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>-->
<!--<redirect/>-->
- </navigation-case>
+ <!--</navigation-case>-->
+
+ <!--<navigation-case>-->
+ <!--<from-action>#{ExistingResourceConfigurationViewUIBean.switchToRaw}</from-action>-->
+ <!--<to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>-->
+ <!--<!–<redirect/>–>-->
+ <!--</navigation-case>-->
</navigation-rule>
@@ -170,8 +175,7 @@
<navigation-case>
<from-action>#{ConfigHelperUIBean.accessMap}</from-action>
<to-view-id>/rhq/resource/configuration/history-view-map.xhtml</to-view-id>
- </navigation-case>
-
+ </navigation-case>
</navigation-rule>
</faces-config>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 8af5b00..2e4a3c1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -59,7 +59,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <h:outputText id="selectedFileHeader" value="#{ExistingResourceConfigurationUIBean.current.path}"/>
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
<h:commandLink value="View Full Screen"/>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
@@ -178,7 +180,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <h:outputText id="selectedFileHeader" value="#{ExistingResourceConfigurationUIBean.current.path}"/>
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
<h:commandLink value="View Full Screen"/>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 4154521..d92e747 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -28,24 +28,23 @@ THIS TEXT WILL BE REMOVED.
<ui:define name="content">
<h:panelGroup layout="block" styleClass="InfoBlock"
- rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
+ rendered="#{ExistingResourceConfigurationViewUIBean.updateInProgress}">
<b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
</h:panelGroup>
- <c:choose>
- <c:when test="${ExistingResourceConfigurationViewUIBean.rawSupported}">
- <script>
- window.onbeforeunload = confirmExit;
+ <h:form id="viewResourceConfigurationForm">
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <c:choose>
+ <c:when test="${ExistingResourceConfigurationViewUIBean.rawSupported}">
+ <script>
+ window.onbeforeunload = confirmExit;
- function confirmExit() {
- }
- </script>
+ function confirmExit() {
+ }
+ </script>
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
-
- <h:form id="viewResourceConfigurationFormRaw">
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
<h:panelGrid columns="2"
styleClass="buttons-table"
@@ -55,12 +54,8 @@ THIS TEXT WILL BE REMOVED.
<h:commandButton value="#{messages.editraw}"
action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationUIBean.updateInProgress}"/>
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
- </h:form>
-
- <h:form>
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
<h:panelGrid columns="2"
styleClass="raw-outer-table"
@@ -88,8 +83,8 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
<a4j:status id="selectedFileHeader"
- startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
- stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
<h:commandLink value="View Full Screen"/>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
@@ -108,63 +103,59 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
- </h:form>
-
- <ui:remove>
- <table class="summary-props-table" style="">
- <tr>
- <td bgcolor="#a4b2b9" width="25%" valign="top">Files
- <h:panelGroup id="changedFiles" layout="vertical">
- <h:form>
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
- <ui:repeat value="#{ExistingResourceConfigurationViewUIBean.paths}" var="path">
- <div>
- <h:commandLink
- action="#{ExistingResourceConfigurationViewUIBean.select(path)}"
- value="#{path}"
- rendered="#{path != ExistingResourceConfigurationViewUIBean.current.path}">
- <f:param name="currentPath" value="#{path}"/>
- </h:commandLink>
- <h:outputText value="#{path}"
- rendered="#{path == ExistingResourceConfigurationViewUIBean.current.path}"/>
- </div>
- </ui:repeat>
- </h:form>
- </h:panelGroup>
- <div>______________________________________</div>
- <div>* File contains uncommitted changes.</div>
- </td>
- <td>
- <div>
- Current File:
- <h:outputText value="#{ExistingResourceConfigurationViewUIBean.current.path}"
- styleClass="outhello"/>
- </div>
- <h:outputLink value="view-raw-full.xhtml" action="navigateToUpload">
- <img src="/images/viewfullscreen.png"/>
- <h:outputText value=" Full Screen "/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </h:outputLink>
- <s:link action="#{ExistingResourceConfigurationViewUIBean.download}">
- <img src="/images/download.png"/>
- <h:outputText value=" Download "/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </s:link>
- <div>
+
+ <ui:remove>
+ <table class="summary-props-table" style="">
+ <tr>
+ <td bgcolor="#a4b2b9" width="25%" valign="top">Files
+ <h:panelGroup id="changedFiles" layout="vertical">
+ <h:form>
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <ui:repeat value="#{ExistingResourceConfigurationViewUIBean.paths}" var="path">
+ <div>
+ <h:commandLink
+ action="#{ExistingResourceConfigurationViewUIBean.select(path)}"
+ value="#{path}"
+ rendered="#{path != ExistingResourceConfigurationViewUIBean.current.path}">
+ <f:param name="currentPath" value="#{path}"/>
+ </h:commandLink>
+ <h:outputText value="#{path}"
+ rendered="#{path == ExistingResourceConfigurationViewUIBean.current.path}"/>
+ </div>
+ </ui:repeat>
+ </h:form>
+ </h:panelGroup>
+ <div>______________________________________</div>
+ <div>* File contains uncommitted changes.</div>
+ </td>
+ <td>
+ <div>
+ Current File:
+ <h:outputText value="#{ExistingResourceConfigurationViewUIBean.current.path}"
+ styleClass="outhello"/>
+ </div>
+ <h:outputLink value="view-raw-full.xhtml" action="navigateToUpload">
+ <img src="/images/viewfullscreen.png"/>
+ <h:outputText value=" Full Screen "/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:outputLink>
+ <s:link action="#{ExistingResourceConfigurationViewUIBean.download}">
+ <img src="/images/download.png"/>
+ <h:outputText value=" Download "/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </s:link>
+ <div>
<pre><h:outputText
value="#{ExistingResourceConfigurationViewUIBean.currentContents}"/></pre>
- </div>
- </td>
- </tr>
- </table>
- </ui:remove>
- </c:when>
- <c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
- <h:form id="viewResourceConfigurationFormStructured">
- <!-- TODO remove the id version -->
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </ui:remove>
+ </c:when>
+ <c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
<h:panelGrid columns="2"
styleClass="buttons-table"
@@ -187,13 +178,9 @@ THIS TEXT WILL BE REMOVED.
nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
prevalidate="true"/>
- </h:form>
- </c:when>
- <c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
- <h:form id="viewResourceConfigurationFormStructuredAndRaw">
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
-
- <h:panelGroup rendered="#{ExistingResourceConfigurationViewUIBean.structuredMode}">
+ </c:when>
+ <c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
+ <h:panelGroup id="structuredGroup" rendered="#{ExistingResourceConfigurationViewUIBean.structuredMode}">
<h:outputText value="#{messages.youareviewingstructured}"/>
<h:panelGroup>
<h:outputText value=" #{messages.switch2}"/>
@@ -208,10 +195,11 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
- <h:commandButton value="Edit"
+ <h:commandButton id="editStructuredButton"
+ value="Edit"
action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
title="Edit this Configuration" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
<onc:config
@@ -224,12 +212,12 @@ THIS TEXT WILL BE REMOVED.
prevalidate="true"/>
</h:panelGroup>
- <h:panelGroup rendered="#{ExistingResourceConfigurationViewUIBean.rawMode}">
+ <h:panelGroup id="rawGroup" rendered="#{ExistingResourceConfigurationViewUIBean.rawMode}">
<h:outputText value="#{messages.youareviewingraw}"/>
<h:panelGroup>
<h:outputText value=" #{messages.switch2}"/>
- <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchTostructured}">
+ <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.switchTostructured}">
<h:outputText value=" #{messages.structured}"/>
</h:commandLink>
</h:panelGroup>
@@ -242,10 +230,11 @@ THIS TEXT WILL BE REMOVED.
columnClasses="button-cell"
rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
- <h:commandButton value="Edit"
+ <h:commandButton id="editRawButton"
+ value="Edit"
action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationUIBean.updateInProgress}"/>
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
<h:panelGrid columns="2"
@@ -295,12 +284,10 @@ THIS TEXT WILL BE REMOVED.
</rich:panel>
</h:panelGrid>
</h:panelGrid>
-
-
</h:panelGroup>
- </h:form>
- </c:when>
- </c:choose>
+ </c:when>
+ </c:choose>
+ </h:form>
<h:panelGroup layout="block" styleClass="InfoBlock"
rendered="#{ExistingResourceConfigurationViewUIBean.updateInProgress}">
commit 827523e2a0afc078733b98222cf772cdce8eb94b
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 11 09:38:51 2010 -0500
Adding status msg to show which file is loading.
Also making an initial attempt to tell the panelMenu component which item is selected. It is
not working as of this commit. The documentation on this is not very clear so I am
uncertain as to whether or not I am specifying the selected menu item incorrectly.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 4eaae7b..4154521 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -87,7 +87,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <h:outputText id="selectedFileHeader" value="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
<h:commandLink value="View Full Screen"/>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
@@ -256,10 +258,11 @@ THIS TEXT WILL BE REMOVED.
iconCollapsedGroup="disc"
limitToList="true"
reRender="fileContents">
- <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
+ <rich:panelMenuGroup label="/tmp/raw-config" expanded="true" selectedChild="#{currentPath}">
<c:forEach items="#{ExistingResourceConfigurationViewUIBean.configuration.rawConfigurations}"
var="rawConfig">
- <rich:panelMenuItem label="#{rawConfig.path}"
+ <rich:panelMenuItem id="raw_#{rawConfig.sha256}"
+ label="#{rawConfig.path}"
action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
reRender="fileContents,selectedFileHeader">
<f:param name="current" value="#{rawConfig.path}"/>
@@ -271,8 +274,9 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
- <h:outputText id="selectedFileHeader"
- value="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <a4j:status id="selectedFileHeader"
+ startText="Loading #{ExistingResourceConfigurationViewUIBean.current.path} ..."
+ stopText="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
<h:commandLink value="View Full Screen"/>
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
commit 3d3ce3cadc44a5f10e87684f4803e5d1d20863df
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 11 09:08:32 2010 -0500
Updating controls so that there is only a single 'Edit' button
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index f7f6f7d..4eaae7b 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -206,14 +206,10 @@ THIS TEXT WILL BE REMOVED.
<h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
- <h:commandButton value="#{messages.editstructured}"
+ <h:commandButton value="Edit"
action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
title="Edit this Configuration" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- <h:commandButton value="#{messages.editraw}"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
</h:panelGrid>
<onc:config
@@ -244,7 +240,7 @@ THIS TEXT WILL BE REMOVED.
columnClasses="button-cell"
rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
- <h:commandButton value="#{messages.editraw}"
+ <h:commandButton value="Edit"
action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationUIBean.updateInProgress}"/>
commit 159b6e8a62a92c83a165eda57050ee819660fbff
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 11 09:00:11 2010 -0500
Adding support to switch between structured and raw in view mode
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 56afa23..f7f6f7d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -158,7 +158,6 @@ THIS TEXT WILL BE REMOVED.
</ui:remove>
</c:when>
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
- <h:outputText value="#{messages.youareviewingstructured}"/>
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
<h:form id="viewResourceConfigurationFormStructured">
@@ -189,42 +188,116 @@ THIS TEXT WILL BE REMOVED.
</h:form>
</c:when>
<c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
- <h:outputText value="#{messages.youareviewingstructured}"/>
- <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.rawSupported}">
- <h:outputText value=" #{messages.switch2}"/>
- <h:outputLink value="view-raw.xhtml">
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- <h:outputText value=" #{messages.raw}"/>
- </h:outputLink>
- </h:panelGroup>
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
<h:form id="viewResourceConfigurationFormStructuredAndRaw">
- <!-- TODO remove the id version -->
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <h:panelGroup rendered="#{ExistingResourceConfigurationViewUIBean.structuredMode}">
+ <h:outputText value="#{messages.youareviewingstructured}"/>
+ <h:panelGroup>
+ <h:outputText value=" #{messages.switch2}"/>
+ <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.switchToRaw}">
+ <h:outputText value=" files mode"/>
+ </h:commandLink>
+ </h:panelGroup>
+
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+
+ <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton value="#{messages.editstructured}"
+ action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ title="Edit this Configuration" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ <h:commandButton value="#{messages.editraw}"
+ action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGrid>
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+ <onc:config
+ configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
+ accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
+ readOnly="true"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ </h:panelGroup>
+ <h:panelGroup rendered="#{ExistingResourceConfigurationViewUIBean.rawMode}">
+ <h:outputText value="#{messages.youareviewingraw}"/>
+
+ <h:panelGroup>
+ <h:outputText value=" #{messages.switch2}"/>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchTostructured}">
+ <h:outputText value=" #{messages.structured}"/>
+ </h:commandLink>
+ </h:panelGroup>
+
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton value="#{messages.editraw}"
+ action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationUIBean.updateInProgress}"/>
+ </h:panelGrid>
- <h:commandButton value="#{messages.editstructured}"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
- title="Edit this Configuration" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- <h:commandButton value="#{messages.editraw}"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
+ <h:panelGrid columns="2"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
+ <c:forEach items="#{ExistingResourceConfigurationViewUIBean.configuration.rawConfigurations}"
+ var="rawConfig">
+ <rich:panelMenuItem label="#{rawConfig.path}"
+ action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
+ reRender="fileContents,selectedFileHeader">
+ <f:param name="current" value="#{rawConfig.path}"/>
+ </rich:panelMenuItem>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </rich:panelMenu>
+ </rich:panel>
+
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <h:outputText id="selectedFileHeader"
+ value="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <h:commandLink value="View Full Screen"/>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+ <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationViewUIBean.currentContents}"
+ readonly="true"/>
+ </rich:panel>
+ </h:panelGrid>
+ </h:panelGrid>
- <onc:config
- configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
- accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
- readOnly="true"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
+ </h:panelGroup>
</h:form>
</c:when>
</c:choose>
commit b98f1271336983503559f58b2c55cb2899068b42
Author: John Sanda <john(a)localhost.localdomain>
Date: Mon Jan 11 08:28:29 2010 -0500
More refactoring to combine the structured and raw ui into edit.xhtml
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index cd9a6ce..555bf43 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -59,6 +59,11 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUIBean {
public static final String MANAGED_BEAN_NAME = "ExistingResourceConfigurationUIBean";
+ private static final boolean STRUCTURED_MODE = true;
+ private static final boolean RAW_MODE = false;
+
+ private boolean mode = STRUCTURED_MODE;
+
// =========== actions ===========
public ExistingResourceConfigurationUIBean() {
@@ -75,12 +80,18 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String switchToRaw() {
- ConfigurationMaskingUtility.unmaskConfiguration(getConfiguration(), getConfigurationDefinition());
- int resourceId = EnterpriseFacesContextUtility.getResource().getId();
- this.configurationManager.translateResourceConfiguration(EnterpriseFacesContextUtility.getSubject(),
- resourceId, getConfiguration(), true);
-
- return SUCCESS_OUTCOME;
+// ConfigurationMaskingUtility.unmaskConfiguration(getConfiguration(), getConfigurationDefinition());
+// int resourceId = EnterpriseFacesContextUtility.getResource().getId();
+// Configuration configuration =
+// configurationManager.translateResourceConfiguration(EnterpriseFacesContextUtility.getSubject(),
+// resourceId, getConfiguration(), true);
+//
+// setConfiguration(configuration);
+//
+// mode = RAW_MODE;
+//
+// return null;
+ return switchToraw();
}
public String updateConfiguration() {
@@ -267,7 +278,9 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
public String getCurrentContents() {
- return new String(getCurrent().getContents());
+ String currentContents = new String(getCurrent().getContents());
+ return currentContents;
+// return new String(getCurrent().getContents());
}
public String getCurrentPath() {
@@ -309,6 +322,14 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
}
+ public boolean isStructuredMode() {
+ return mode == STRUCTURED_MODE;
+ }
+
+ public boolean isRawMode() {
+ return mode == RAW_MODE;
+ }
+
public boolean isModified(String path) {
return getModified().keySet().contains(path);
}
@@ -417,7 +438,9 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
current = null;
setConfiguration(configuration);
- return SUCCESS_OUTCOME;
+ mode = RAW_MODE;
+ return null;
+// return SUCCESS_OUTCOME;
}
void dumpProperties(Configuration conf, Log log) {
@@ -447,7 +470,9 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
current = null;
setConfiguration(configuration);
- return SUCCESS_OUTCOME;
+ mode = STRUCTURED_MODE;
+
+ return null;
}
void populateRaws() {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
index 3c21035..bc26600 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-navigation/configuration-navigation.xml
@@ -4,20 +4,35 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
- <navigation-rule>
+ <navigation-rule>
+ <from-view-id>/rhq/resource/configuration/view.xhtml</from-view-id>
+
+ <navigation-case>
+ <from-action>#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}</from-action>
+ <from-outcome>success</from-outcome>
+ <to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>
+ </navigation-case>
+ <navigation-case>
+ <from-action>#{ExistingResourceConfigurationUIBean.switchToraw}</from-action>
+ <to-view-id>/rhq/resource/configuration/view.xhtml</to-view-id>
+ </navigation-case>
+ </navigation-rule>
+ <navigation-rule>
<navigation-case>
<from-action>#{ExistingResourceConfigurationViewUIBean.editConfiguration}</from-action>
<to-view-id>/rhq/resource/configuration/edit.xhtml?id=#{param.id}</to-view-id>
<redirect/>
</navigation-case>
+ <!--
<navigation-case>
<from-action>#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}</from-action>
- <to-view-id>/rhq/resource/configuration/edit-raw.xhtml?id=#{param.id}</to-view-id>
+ <to-view-id>/rhq/resource/configuration/edit.xhtml?id=#{param.id}</to-view-id>
<redirect/>
</navigation-case>
+ -->
<navigation-case>
<from-action>#{ConfigHelperUIBean.accessMap}</from-action>
@@ -32,8 +47,8 @@
<navigation-case>
<from-action>#{ExistingResourceConfigurationUIBean.switchToraw}</from-action>
- <to-view-id>/rhq/resource/configuration/edit-raw.xhtml?id=#{param.id}</to-view-id>
- <redirect/>
+ <to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>
+ <!--<redirect/>-->
</navigation-case>
</navigation-rule>
@@ -71,6 +86,11 @@
<redirect/>
</navigation-case>
+ <navigation-case>
+ <from-action>#{ExistingResourceConfigurationUIBean.switchToraw}</from-action>
+ <to-view-id>/rhq/resource/configuration/edit.xhtml</to-view-id>
+ </navigation-case>
+
<navigation-case>
<from-action>#{ConfigHelperUIBean.accessMap}</from-action>
<to-view-id>/rhq/resource/configuration/edit-map.xhtml</to-view-id>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
index 3c20d29..cd273fd 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
@@ -1730,6 +1730,14 @@ P.compact {
vertical-align: top;
}
+.rich-pmenu-selected-element {
+ background-color: #D8D8D8;
+}
+
+.raw-edit-footer {
+ text-align: right;
+}
+
/*--- Configuration ---------------------*/
.property-group-header {
padding: 4px;
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
index 9a8dec6..8af5b00 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/edit.xhtml
@@ -1,64 +1,251 @@
<?xml version="1.0"?>
<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:a4j="http://richfaces.org/a4j"
xmlns:onc="http://jboss.org/on/component">
THIS TEXT WILL BE REMOVED.
<ui:composition template="/rhq/resource/layout/main.xhtml">
- THIS TEXT WILL BE REMOVED AS WELL.
-
- <ui:param name="pageTitle" value="#{ResourceUIBean.resourceType.name} '#{ResourceUIBean.name}' - Edit Configuration"/>
-
- <ui:param name="selectedTabName" value="Configuration.Current"/>
-
- <ui:define name="content">
-
- <h:form id="editResourceConfigurationForm" onsubmit="prepareInputsForSubmission(this)" rendered="#{!ViewResourceConfigurationUIBean.updateInProgress}">
-
-
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
-
- <h:outputText value="#{messages.youareviewingstructured}" />
-
- <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.structuredAndRawSupported}" >
- <h:outputText value=" #{messages.switch2}" />
- <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchToraw}" >
- <f:param name="conversationId" value="#{conversation.id}"/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- <h:outputText value=" files mode"/>
- </h:commandLink>
- </h:panelGroup>
-
- <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationUIBean.configuration}"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
-
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell" rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
+ THIS TEXT WILL BE REMOVED AS WELL.
+
+ <ui:param name="pageTitle" value="#{ResourceUIBean.resourceType.name} '#{ResourceUIBean.name}' - Edit Configuration"/>
+
+ <ui:param name="selectedTabName" value="Configuration.Current"/>
+
+ <ui:define name="content">
+
+ <h:form id="editResourceConfigurationForm"
+ onsubmit="prepareInputsForSubmission(this)"
+ rendered="#{!ViewResourceConfigurationUIBean.updateInProgress}">
+
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <c:choose>
+ <c:when test="${ExistingResourceConfigurationUIBean.rawSupported}">
+ <h:panelGrid columns="2"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
+ <c:forEach items="#{ExistingResourceConfigurationUIBean.configuration.rawConfigurations}"
+ var="rawConfig">
+ <rich:panelMenuItem action="#{ExistingResourceConfigurationUIBean.select(rawConfig.path)}"
+ styleClass="raw-menu-item"
+ tableBorderColor="blue"
+ reRender="fileContents,selectedFileHeader">
+ #{rawConfig.path}
+ </rich:panelMenuItem>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </rich:panelMenu>
+ </rich:panel>
+
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <h:outputText id="selectedFileHeader" value="#{ExistingResourceConfigurationUIBean.current.path}"/>
+ <h:commandLink value="View Full Screen"/>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationUIBean.currentContents}"
+ readonly="false"/>
+ </rich:panel>
+ </h:panelGrid>
+
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGrid columns="2">
+ <h:outputText>n files changed in this configuration</h:outputText>
+ <h:commandButton value="Commit"
+ action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ </h:panelGrid>
+ </h:panelGrid>
+ </h:panelGrid>
+ </c:when>
+
+ <c:when test="${ExistingResourceConfigurationUIBean.structuredSupported}">
+ <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationUIBean.configuration}"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
<h:commandButton value="SAVE" action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
title="Click to Save Changes" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure}" />
- <h:commandButton value="RESET" type="reset" immediate="true"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ <h:commandButton value="RESET" type="reset" immediate="true"
title="Click to Reset Fields" styleClass="buttonmed"/>
- </h:panelGrid>
-
- </h:form>
-
- <h:panelGroup layout="block" styleClass="InfoBlock" rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
- <b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
- </h:panelGroup>
- </ui:define>
+ </h:panelGrid>
+ </c:when>
+
+ <c:when test="${ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
+ <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.structuredMode}">
+ <h:outputText value="#{messages.youareviewingstructured}"/>
+
+ <h:panelGroup>
+ <h:outputText value=" #{messages.switch2}"/>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchToRaw}">
+ <h:outputText value=" files mode"/>
+ </h:commandLink>
+ </h:panelGroup>
+
+ <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationUIBean.configuration}"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
+ <h:commandButton value="SAVE"
+ action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ <h:commandButton value="RESET"
+ type="reset"
+ immediate="true"
+ title="Click to Reset Fields"
+ styleClass="buttonmed"/>
+ </h:panelGrid>
+ </h:panelGroup>
+ <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.rawMode}">
+ <h:outputText value="#{messages.youareviewingraw}"/>
+
+ <h:panelGroup>
+ <h:outputText value=" #{messages.switch2}"/>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchTostructured}">
+ <h:outputText value=" #{messages.structured}"/>
+ </h:commandLink>
+ </h:panelGroup>
+
+ <h:panelGrid columns="2"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
+ <c:forEach items="#{ExistingResourceConfigurationUIBean.configuration.rawConfigurations}"
+ var="rawConfig">
+ <rich:panelMenuItem label="#{rawConfig.path}"
+ action="#{ExistingResourceConfigurationUIBean.select(rawConfig.path)}"
+ styleClass="raw-menu-item"
+ tableBorderColor="blue"
+ reRender="fileContents,selectedFileHeader">
+ <f:param name="current" value="#{rawConfig.path}"/>
+ </rich:panelMenuItem>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </rich:panelMenu>
+ </rich:panel>
+
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <h:outputText id="selectedFileHeader" value="#{ExistingResourceConfigurationUIBean.current.path}"/>
+ <h:commandLink value="View Full Screen"/>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationUIBean.currentContents}"
+ readonly="false"/>
+ </rich:panel>
+ </h:panelGrid>
+
+ <h:panelGrid columns="1" style="width:100%" columnClasses="raw-edit-footer">
+ <h:panelGrid columns="2">
+ <h:outputText>n files changed in this configuration</h:outputText>
+ <h:commandButton value="Commit"
+ action="#{ExistingResourceConfigurationUIBean.updateRawConfiguration}"
+ title="Click to Save Changes"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ </h:panelGrid>
+ </h:panelGrid>
+ </h:panelGrid>
+ </h:panelGroup>
+ </c:when>
+ </c:choose>
+
+ <ui:remove>
+ <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.structuredAndRawSupported}">
+ <h:outputText value=" #{messages.switch2}"/>
+ <h:commandLink action="#{ExistingResourceConfigurationUIBean.switchToRaw}">
+ <f:param name="conversationId" value="#{conversation.id}"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ <h:outputText value=" files mode"/>
+ </h:commandLink>
+ </h:panelGroup>
+
+
+ <onc:config configurationDefinition="#{ExistingResourceConfigurationUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationUIBean.configuration}"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationUIBean.configuration != null}">
+ <h:commandButton value="SAVE" action="#{ExistingResourceConfigurationUIBean.updateConfiguration}"
+ title="Click to Save Changes" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure}"/>
+ <h:commandButton value="RESET" type="reset" immediate="true"
+ title="Click to Reset Fields" styleClass="buttonmed"/>
+ </h:panelGrid>
+ </ui:remove>
+
+ </h:form>
+
+ <h:panelGroup layout="block" styleClass="InfoBlock"
+ rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
+ <b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
+ </h:panelGroup>
+ </ui:define>
</ui:composition>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index c6cb972..56afa23 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -41,9 +41,9 @@ THIS TEXT WILL BE REMOVED.
}
</script>
- <h:outputText value="#{messages.youareviewingraw}"/>
<h:outputText value=" #{messages.nopermissionedit}"
rendered="#{!ResourceUIBean.permissions.configure}"/>
+
<h:form id="viewResourceConfigurationFormRaw">
<input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
@@ -72,21 +72,19 @@ THIS TEXT WILL BE REMOVED.
iconCollapsedGroup="disc"
limitToList="true"
reRender="fileContents">
- <rich:panelMenuGroup label="/etc/httpd/conf">
- <rich:panelMenuItem>httpd.conf</rich:panelMenuItem>
- <rich:panelMenuItem>php.conf</rich:panelMenuItem>
- </rich:panelMenuGroup>
- <rich:panelMenuGroup label="/tmp/raw-config">
+ <rich:panelMenuGroup label="/tmp/raw-config" expanded="true">
<c:forEach items="#{ExistingResourceConfigurationViewUIBean.configuration.rawConfigurations}"
var="rawConfig">
- <rich:panelMenuItem action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
+ <rich:panelMenuItem label="#{rawConfig.path}"
+ action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
reRender="fileContents,selectedFileHeader">
- #{rawConfig.path}
+ <f:param name="current" value="#{rawConfig.path}"/>
</rich:panelMenuItem>
</c:forEach>
</rich:panelMenuGroup>
</rich:panelMenu>
</rich:panel>
+
<h:panelGrid columns="1" style="width:100%;">
<h:panelGrid columns="4" style="width:100%;">
<h:outputText id="selectedFileHeader" value="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
@@ -94,18 +92,17 @@ THIS TEXT WILL BE REMOVED.
<h:commandLink value="Upload New">
<h:graphicImage value="/images/upload.png"/>
</h:commandLink>
-
-
-
<h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
<h:graphicImage value="/images/download.png"/>
<f:param name="id" value="#{ResourceUIBean.id}"/>
</h:commandLink>
</h:panelGrid>
+
<rich:panel style="margin-left:1px; border: none;">
<h:inputTextarea id="fileContents"
style="width:100%"
- value="#{ExistingResourceConfigurationViewUIBean.currentContents}"/>
+ value="#{ExistingResourceConfigurationViewUIBean.currentContents}"
+ readonly="true"/>
</rich:panel>
</h:panelGrid>
</h:panelGrid>
commit d7e8d0bd77d9437a86328c0d769a65e1a99e920d
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 8 15:16:17 2010 -0500
Initial commit for raw config ui changes. This is just a protoype.
At this point thing raw config ui is broken as I am trying to learn how to rebuild the UI
with faclets and richfaces. I have the config files rendering in a rich panel menu, and
selecting a file in the menu will cause its contents to be displayed in the text area.
Selecting the file will also cause the path name to change and appear above the text area
on the upper left. The download functionality has been pushed into a backing bean method.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
index fd89fab..cd9a6ce 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java
@@ -21,11 +21,14 @@ package org.rhq.enterprise.gui.configuration.resource;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
+import java.io.OutputStream;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeMap;
import javax.faces.application.FacesMessage;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -335,6 +338,7 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
public void select(String s) {
selectedPath = s;
setCurrentPath(selectedPath);
+ setCurrentContents(getCurrentContents());
}
public void setCurrentContents(String updated) {
@@ -362,6 +366,26 @@ public class ExistingResourceConfigurationUIBean extends AbstractConfigurationUI
getModified().put(raw.getPath(), raw);
}
+ public String download() {
+ try {
+ HttpServletResponse response = FacesContextUtility.getResponse();
+ response.setHeader("Content-Disposition", "attachment;filename=" + getCurrentPath());
+ OutputStream ostream = response.getOutputStream();
+ ostream.write(getCurrentContents().getBytes());
+ ostream.flush();
+ ostream.close();
+
+ FacesContextUtility.getFacesContext().responseComplete();
+
+ return null;
+ }
+ catch (IOException e) {
+ log.error("Failed to complete download request for " + getCurrentPath(), e);
+ throw new RuntimeException(e);
+ }
+// return "download";
+ }
+
/**
* This is a no-op, since the upload work was done by upload file
* But is kept as a target for the "save" icon from the full screen page
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
index d9a8046..3c20d29 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
@@ -1713,6 +1713,23 @@ P.compact {
vertical-align: top;
}
+/**--- Raw Config ---------------------*/
+.raw-outer-table {
+ width: 100%;
+}
+
+.raw-outer-table-left-col {
+ width: 25%;
+ vertical-align: top;
+}
+
+.raw-outer-table-right-col {
+ /*width: 75%;*/
+ margin-left: 10px;
+ margin-right: 10px;
+ vertical-align: top;
+}
+
/*--- Configuration ---------------------*/
.property-group-header {
padding: 4px;
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
index 8a39f83..c6cb972 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/configuration/view.xhtml
@@ -10,6 +10,8 @@
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:onc="http://jboss.org/on/component"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:a4j="http://richfaces.org/a4j"
xmlns:s="http://jboss.com/products/seam/taglib">
@@ -17,172 +19,226 @@ THIS TEXT WILL BE REMOVED.
<ui:composition template="/rhq/resource/layout/main.xhtml">
- THIS TEXT WILL BE REMOVED AS WELL.
-
- <ui:param name="pageTitle"
- value="#{ResourceUIBean.resourceType.name} '#{ResourceUIBean.name}' - View Configuration"/>
-
- <ui:param name="selectedTabName" value="Configuration.Current"/>
-
- <ui:define name="content">
- <h:panelGroup layout="block" styleClass="InfoBlock"
- rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
- <b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
- </h:panelGroup>
-
- <c:choose>
- <c:when test="${ExistingResourceConfigurationViewUIBean.rawSupported}">
- <script>
- window.onbeforeunload = confirmExit;
-
- function confirmExit() {
- }
- </script>
-
- <h:outputText value="#{messages.youareviewingraw}"/>
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
- <h:form id="viewResourceConfigurationFormRaw">
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
-
- <h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton value="#{messages.editraw}"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationUIBean.updateInProgress}"/>
- </h:panelGrid>
- </h:form>
-
- <table class="summary-props-table" style="">
- <tr>
- <td bgcolor="#a4b2b9" width="25%" valign="top">Files
- <h:panelGroup id="changedFiles" layout="vertical">
- <h:form>
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
- <ui:repeat value="#{ExistingResourceConfigurationViewUIBean.paths}" var="path">
- <div>
- <h:commandLink
- action="#{ExistingResourceConfigurationViewUIBean.select(path)}"
- value="#{path}"
- rendered="#{path != ExistingResourceConfigurationViewUIBean.current.path}">
- <f:param name="currentPath" value="#{path}"/>
- </h:commandLink>
- <h:outputText value="#{path}"
- rendered="#{path == ExistingResourceConfigurationViewUIBean.current.path}"/>
- </div>
- </ui:repeat>
- </h:form>
- </h:panelGroup>
- <div>______________________________________</div>
- <div>* File contains uncommitted changes.</div>
- </td>
- <td>
- <div>
- Current File:
- <h:outputText value="#{ExistingResourceConfigurationViewUIBean.current.path}"
- styleClass="outhello"/>
- </div>
- <h:outputLink value="view-raw-full.xhtml" action="navigateToUpload">
- <img src="/images/viewfullscreen.png"/>
- <h:outputText value=" Full Screen "/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </h:outputLink>
- <s:link action="#{ExistingResourceConfigurationViewUIBean.download}">
- <img src="/images/download.png"/>
- <h:outputText value=" Download "/>
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- </s:link>
- <div>
+ THIS TEXT WILL BE REMOVED AS WELL.
+
+ <ui:param name="pageTitle"
+ value="#{ResourceUIBean.resourceType.name} '#{ResourceUIBean.name}' - View Configuration"/>
+
+ <ui:param name="selectedTabName" value="Configuration.Current"/>
+
+ <ui:define name="content">
+ <h:panelGroup layout="block" styleClass="InfoBlock"
+ rendered="#{ExistingResourceConfigurationUIBean.updateInProgress}">
+ <b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
+ </h:panelGroup>
+
+ <c:choose>
+ <c:when test="${ExistingResourceConfigurationViewUIBean.rawSupported}">
+ <script>
+ window.onbeforeunload = confirmExit;
+
+ function confirmExit() {
+ }
+ </script>
+
+ <h:outputText value="#{messages.youareviewingraw}"/>
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+ <h:form id="viewResourceConfigurationFormRaw">
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton value="#{messages.editraw}"
+ action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationUIBean.updateInProgress}"/>
+ </h:panelGrid>
+ </h:form>
+
+ <h:form>
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <h:panelGrid columns="2"
+ styleClass="raw-outer-table"
+ columnClasses="raw-outer-table-left-col,raw-outer-table-right-col">
+ <rich:panel style="width:100%">
+ <f:facet name="header">Files</f:facet>
+ <rich:panelMenu mode="ajax"
+ expandMode="client"
+ iconCollapsedGroup="disc"
+ limitToList="true"
+ reRender="fileContents">
+ <rich:panelMenuGroup label="/etc/httpd/conf">
+ <rich:panelMenuItem>httpd.conf</rich:panelMenuItem>
+ <rich:panelMenuItem>php.conf</rich:panelMenuItem>
+ </rich:panelMenuGroup>
+ <rich:panelMenuGroup label="/tmp/raw-config">
+ <c:forEach items="#{ExistingResourceConfigurationViewUIBean.configuration.rawConfigurations}"
+ var="rawConfig">
+ <rich:panelMenuItem action="#{ExistingResourceConfigurationViewUIBean.select(rawConfig.path)}"
+ reRender="fileContents,selectedFileHeader">
+ #{rawConfig.path}
+ </rich:panelMenuItem>
+ </c:forEach>
+ </rich:panelMenuGroup>
+ </rich:panelMenu>
+ </rich:panel>
+ <h:panelGrid columns="1" style="width:100%;">
+ <h:panelGrid columns="4" style="width:100%;">
+ <h:outputText id="selectedFileHeader" value="#{ExistingResourceConfigurationViewUIBean.current.path}"/>
+ <h:commandLink value="View Full Screen"/>
+ <h:commandLink value="Upload New">
+ <h:graphicImage value="/images/upload.png"/>
+ </h:commandLink>
+
+
+
+ <h:commandLink action="#{ExistingResourceConfigurationViewUIBean.download}" value="Download">
+ <h:graphicImage value="/images/download.png"/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:commandLink>
+ </h:panelGrid>
+ <rich:panel style="margin-left:1px; border: none;">
+ <h:inputTextarea id="fileContents"
+ style="width:100%"
+ value="#{ExistingResourceConfigurationViewUIBean.currentContents}"/>
+ </rich:panel>
+ </h:panelGrid>
+ </h:panelGrid>
+ </h:form>
+
+ <ui:remove>
+ <table class="summary-props-table" style="">
+ <tr>
+ <td bgcolor="#a4b2b9" width="25%" valign="top">Files
+ <h:panelGroup id="changedFiles" layout="vertical">
+ <h:form>
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+ <ui:repeat value="#{ExistingResourceConfigurationViewUIBean.paths}" var="path">
+ <div>
+ <h:commandLink
+ action="#{ExistingResourceConfigurationViewUIBean.select(path)}"
+ value="#{path}"
+ rendered="#{path != ExistingResourceConfigurationViewUIBean.current.path}">
+ <f:param name="currentPath" value="#{path}"/>
+ </h:commandLink>
+ <h:outputText value="#{path}"
+ rendered="#{path == ExistingResourceConfigurationViewUIBean.current.path}"/>
+ </div>
+ </ui:repeat>
+ </h:form>
+ </h:panelGroup>
+ <div>______________________________________</div>
+ <div>* File contains uncommitted changes.</div>
+ </td>
+ <td>
+ <div>
+ Current File:
+ <h:outputText value="#{ExistingResourceConfigurationViewUIBean.current.path}"
+ styleClass="outhello"/>
+ </div>
+ <h:outputLink value="view-raw-full.xhtml" action="navigateToUpload">
+ <img src="/images/viewfullscreen.png"/>
+ <h:outputText value=" Full Screen "/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </h:outputLink>
+ <s:link action="#{ExistingResourceConfigurationViewUIBean.download}">
+ <img src="/images/download.png"/>
+ <h:outputText value=" Download "/>
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ </s:link>
+ <div>
<pre><h:outputText
value="#{ExistingResourceConfigurationViewUIBean.currentContents}"/></pre>
- </div>
- </td>
- </tr>
- </table>
- </c:when>
- <c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
- <h:outputText value="#{messages.youareviewingstructured}"/>
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
- <h:form id="viewResourceConfigurationFormStructured">
- <!-- TODO remove the id version -->
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
-
- <h:panelGrid columns="2"
- styleClass="buttons-table"
- columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton value="#{messages.editstructured}"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
- title="Edit this Configuration"
- styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <onc:config
- configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
- accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
- readOnly="true"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
-
- </h:form>
- </c:when>
- <c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
- <h:outputText value="#{messages.youareviewingstructured}"/>
- <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.rawSupported}">
- <h:outputText value=" #{messages.switch2}"/>
- <h:outputLink value="view-raw.xhtml">
- <f:param name="id" value="#{ResourceUIBean.id}"/>
- <h:outputText value=" #{messages.raw}"/>
- </h:outputLink>
- </h:panelGroup>
- <h:outputText value=" #{messages.nopermissionedit}"
- rendered="#{!ResourceUIBean.permissions.configure}"/>
- <h:form id="viewResourceConfigurationFormStructuredAndRaw">
- <!-- TODO remove the id version -->
- <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
-
- <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
-
- <h:commandButton value="#{messages.editstructured}"
- action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
- title="Edit this Configuration" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- <h:commandButton value="#{messages.editraw}"
- action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
- title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
- rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
- </h:panelGrid>
-
- <onc:config
- configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
- configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
- accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
- readOnly="true"
- nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
- nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
- prevalidate="true"/>
-
- </h:form>
- </c:when>
- </c:choose>
-
- <h:panelGroup layout="block" styleClass="InfoBlock"
- rendered="#{ExistingResourceConfigurationViewUIBean.updateInProgress}">
- <b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
+ </div>
+ </td>
+ </tr>
+ </table>
+ </ui:remove>
+ </c:when>
+ <c:when test="${ExistingResourceConfigurationViewUIBean.structuredSupported}">
+ <h:outputText value="#{messages.youareviewingstructured}"/>
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+ <h:form id="viewResourceConfigurationFormStructured">
+ <!-- TODO remove the id version -->
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <h:panelGrid columns="2"
+ styleClass="buttons-table"
+ columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton value="#{messages.editstructured}"
+ action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ title="Edit this Configuration"
+ styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGrid>
+
+ <onc:config
+ configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
+ accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
+ readOnly="true"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ </h:form>
+ </c:when>
+ <c:when test="${ExistingResourceConfigurationViewUIBean.structuredAndRawSupported}">
+ <h:outputText value="#{messages.youareviewingstructured}"/>
+ <h:panelGroup rendered="#{ExistingResourceConfigurationUIBean.rawSupported}">
+ <h:outputText value=" #{messages.switch2}"/>
+ <h:outputLink value="view-raw.xhtml">
+ <f:param name="id" value="#{ResourceUIBean.id}"/>
+ <h:outputText value=" #{messages.raw}"/>
+ </h:outputLink>
</h:panelGroup>
-
-
- </ui:define>
+ <h:outputText value=" #{messages.nopermissionedit}"
+ rendered="#{!ResourceUIBean.permissions.configure}"/>
+ <h:form id="viewResourceConfigurationFormStructuredAndRaw">
+ <!-- TODO remove the id version -->
+ <input type="hidden" name="id" value="#{ResourceUIBean.id}"/>
+
+ <h:panelGrid columns="2" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ExistingResourceConfigurationViewUIBean.configuration != null and !ExistingResourceConfigurationViewUIBean.updateInProgress}">
+
+ <h:commandButton value="#{messages.editstructured}"
+ action="#{ExistingResourceConfigurationViewUIBean.editConfiguration}"
+ title="Edit this Configuration" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ <h:commandButton value="#{messages.editraw}"
+ action="#{ExistingResourceConfigurationViewUIBean.editRawConfiguration}"
+ title="Advanced Mode Edit of Raw Configuration Files" styleClass="buttonmed"
+ rendered="${ResourceUIBean.permissions.configure and !ExistingResourceConfigurationViewUIBean.updateInProgress}"/>
+ </h:panelGrid>
+
+ <onc:config
+ configurationDefinition="#{ExistingResourceConfigurationViewUIBean.configurationDefinition}"
+ configuration="#{ExistingResourceConfigurationViewUIBean.configuration}"
+ accessMapActionExpression="#{ExistingResourceConfigurationViewUIBean.accessMap}"
+ readOnly="true"
+ nullConfigurationDefinitionMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationDefinitionMessage}"
+ nullConfigurationMessage="#{ExistingResourceConfigurationViewUIBean.nullConfigurationMessage}"
+ prevalidate="true"/>
+
+ </h:form>
+ </c:when>
+ </c:choose>
+
+ <h:panelGroup layout="block" styleClass="InfoBlock"
+ rendered="#{ExistingResourceConfigurationViewUIBean.updateInProgress}">
+ <b>${msg['note']}</b> ${msg['resource.config.Current.updateInProgress']}
+ </h:panelGroup>
+
+
+ </ui:define>
</ui:composition>
commit 241126f8eaf5dcf04e3d10cb0a80419d6cfcfee7
Author: John Sanda <john(a)localhost.localdomain>
Date: Fri Jan 8 15:07:31 2010 -0500
Initial commit for raw config ui changes
At this point thing raw config ui is broken as I am trying to learn how to rebuild the UI
with faclets and richfaces. I have the config files rendering in a rich panel menu, and
selecting a file in the menu will cause its contents to be displayed in the text area.
Selecting the file will also cause the path name to change and appear above the text area
on the upper left. The download functionality has been pushed into a backing bean method.
Updating raw-config-test plugin so that RawServer supports multiple raw files now.
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
index e0a5d64..23af194 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
@@ -14,35 +14,50 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
File rawConfigDir
- File rawConfig1
+// File rawConfig1
+// File rawConfig2
+// File rawConfig3
+
+ List rawConfigs = []
def ant = new AntBuilder()
void start(ResourceContext context) {
resourceContext = context;
+ def numberOfConfigFiles = 3
+
ant = new AntBuilder()
rawConfigDir = new File("${System.getProperty('java.io.tmpdir')}/raw-config-test")
- rawConfig1 = new File(rawConfigDir, "raw-test-1.txt")
+
+ def index = 1
+
+ numberOfConfigFiles.times { rawConfigs << new File(rawConfigDir, "raw-test-${it + index++}.txt") }
+// rawConfig1 = new File(rawConfigDir, "raw-test-1.txt")
+// rawConfig2 = new File(rawConfigDir, "raw-test-2.txt")
+// rawConfig3 = new File(rawConfigDir, "raw-test-3.txt")
createRawConfigDir()
- createConfigFile()
+
+ index = 1
+ rawConfigs.each { rawConfig -> createConfigFile(rawConfig, index++) }
+// createConfigFile()
}
def createRawConfigDir() {
rawConfigDir.mkdirs()
}
- def createConfigFile() {
- if (rawConfig1.exists()) {
+ def createConfigFile(rawConfig, index) {
+ if (rawConfig.exists()) {
return null
}
- def properties = ["a": 1, "b": 2, "c": "3"]
+ def properties = ["raw${index}.a": 1, "raw${index}.b": 2, "raw${index}.c": "3"]
- rawConfig1.createNewFile()
- rawConfig1.withWriter { writer ->
+ rawConfig.createNewFile()
+ rawConfig.withWriter { writer ->
properties.each { key, value -> writer.writeLine("${key}=${value}") }
}
}
@@ -59,10 +74,15 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
}
Set<RawConfiguration> loadRawConfigurations() {
- def rawConfigs = new HashSet()
- rawConfigs.add(new RawConfiguration(path: rawConfig1.absolutePath, contents: rawConfig1.readBytes()))
+ def rawConfigSet = new HashSet()
+ rawConfigs.each { rawConfigSet.add(new RawConfiguration(path: it.absolutePath, contents: it.readBytes())) }
+
+ return rawConfigSet
- return rawConfigs
+// def rawConfigs = new HashSet()
+// rawConfigs.add(new RawConfiguration(path: rawConfig1.absolutePath, contents: rawConfig1.readBytes()))
+//
+// return rawConfigs
}
RawConfiguration mergeRawConfiguration(Configuration from, RawConfiguration to) {
commit 776bbc9717f14c39b2e56aeb38ac0606332f2ecb
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Jan 7 12:38:37 2010 -0500
Fixing typo
diff --git a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
index 64e3cb1..c4001c1 100644
--- a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
@@ -17,7 +17,7 @@
<plugin-configuration>
<c:group name="Structured">
- <c:simple-property name="faidStructuredValidation" type="boolean" default="false"/>
+ <c:simple-property name="failStructuredValidation" type="boolean" default="false"/>
<c:simple-property name="failStructuredUpdate" type="boolean" default="false"/>
</c:group>
@@ -78,4 +78,4 @@
<c:simple-property name="bam"/>
</resource-configuration>
</server>
-</plugin>
\ No newline at end of file
+</plugin>
commit 500bfae124198c5cee01f6fe9079401e109e0b96
Merge: 2750b5e... b9e3538...
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 7 10:26:48 2010 -0500
Merge branch 'master' into raw-config
Conflicts:
.classpath
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
diff --cc .classpath
index c530af4,a07522a..c8e2a2d
--- a/.classpath
+++ b/.classpath
@@@ -14,7 -16,7 +16,7 @@@
<classpathentry kind="src" path="modules/plugins/tomcat/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/jboss-cache/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/jboss-cache-v3/src/main/java"/>
- <classpathentry kind="src" path="modules/plugins/antlr-config/src/main/java"/>
- <classpathentry kind="src" path="etc/samples/perspectives/sample-perspective/app/src/main/java"/>
++ <classpathentry excluding="org/rhq/plugins/antlrconfig/" kind="src" path="modules/plugins/antlr-config/src/main/java"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/integration/jboss-profileservice-spi/5.1.0.SP1/jboss-profileservice-spi-5.1.0.SP1.jar"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/man/jboss-managed/2.1.1.GA/jboss-managed-2.1.1.GA.jar"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/man/jboss-metatype/2.1.1.GA/jboss-metatype-2.1.1.GA.jar"/>
@@@ -210,9 -217,10 +217,13 @@@
<classpathentry exported="true" kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/pircbot/pircbot/1.4.2/pircbot-1.4.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/net/homeip/yusuke/twitter4j/2.0.9/twitter4j-2.0.9.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/byteman/byteman/1.2.1/byteman-1.2.1.jar"/>
<classpathentry exported="true" kind="lib" path="modules/enterprise/remoting/webservices/target/rhq-remoting-webservices-1.4.0-SNAPSHOT/wsconsume-output"/>
+ <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
<classpathentry kind="output" path="eclipse-classes"/>
</classpath>
commit 2750b5e564f66c4594d6026942d897303d871c50
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 7 09:20:47 2010 -0500
Adding groups for plugin configuration properties
diff --git a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
index e59d833..64e3cb1 100644
--- a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
@@ -16,20 +16,26 @@
description="A fake server component that supports both structured and raw configuration">
<plugin-configuration>
- <c:simple-property name="faidStructuredValidation" type="boolean" default="false"/>
- <c:simple-property name="failStructuredUpdate" type="boolean" default="false"/>
+ <c:group name="Structured">
+ <c:simple-property name="faidStructuredValidation" type="boolean" default="false"/>
+ <c:simple-property name="failStructuredUpdate" type="boolean" default="false"/>
+ </c:group>
- <c:simple-property name="failRawValidation" type="boolean" default="false"/>
- <c:simple-property name="filesToFailValidation"
- description="A comma-delimited list of file names for which validation will fail. The entire
- path does not need to be specified. Simple matching will be done starting from
- the end of the path. For a path of /foo/bar.txt, you could specify bar.txt."/>
+ <c:group name="Raw Validation">
+ <c:simple-property name="failRawValidation" type="boolean" default="false"/>
+ <c:simple-property name="filesToFailValidation"
+ description="A whitespace-separated list of file names for which validation will fail. The entire
+ path does not need to be specified. Simple matching will be done starting from
+ the end of the path. For a path of /foo/bar.txt, you could specify bar.txt."/>
+ </c:group>
- <c:simple-property name="failRawUpdate" type="boolean" default="false"/>
- <c:simple-property name="filesToFailUpdate"
- description="A comma-delimited list of file names for which the update will fail. The entire
- path does not need to be specified. Simple matching will be done starting from
- the end of the path. For a path of /foo/bar.txt, you could specify bar.txt."/>
+ <c:group name="Raw Update">
+ <c:simple-property name="failRawUpdate" type="boolean" default="false"/>
+ <c:simple-property name="filesToFailUpdate"
+ description="A whitespace-separated list of file names for which the update will fail. The entire
+ path does not need to be specified. Simple matching will be done starting from
+ the end of the path. For a path of /foo/bar.txt, you could specify bar.txt."/>
+ </c:group>
</plugin-configuration>
<resource-configuration configurationFormat="both">
commit 9d0ee5cc056c3d555f5c0d2fa684ef760acb857e
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 7 06:40:50 2010 -0500
Removing unused classes and cleaning up imports
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
index 8389c41..dbf131b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
@@ -23,13 +23,14 @@
package org.rhq.core.pc.configuration;
-import static org.rhq.core.domain.configuration.definition.ConfigurationFormat.*;
-
+import org.apache.maven.artifact.versioning.ComparableVersion;
+import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
-import org.rhq.core.pc.util.ComponentService;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.clientapi.agent.PluginContainerException;
-import org.apache.maven.artifact.versioning.ComparableVersion;
+import org.rhq.core.pc.util.ComponentService;
+
+import static org.rhq.core.domain.configuration.definition.ConfigurationFormat.RAW;
+import static org.rhq.core.domain.configuration.definition.ConfigurationFormat.STRUCTURED;
public class ConfigManagementFactoryImpl implements ConfigManagementFactory {
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementSupport.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementSupport.java
index 5ab7269..104f41c 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementSupport.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementSupport.java
@@ -23,11 +23,11 @@
package org.rhq.core.pc.configuration;
+import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.pc.util.ComponentService;
import org.rhq.core.pc.util.FacetLockType;
-import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
-import org.rhq.core.clientapi.agent.PluginContainerException;
+import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
public abstract class ConfigManagementSupport implements ConfigManagement {
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
index b360858..5a0e155 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java
@@ -22,35 +22,38 @@
*/
package org.rhq.core.pc.configuration;
-import java.util.Set;
-import java.util.Queue;
-import java.util.LinkedList;
-import java.util.concurrent.*;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.artifact.versioning.ComparableVersion;
-
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.clientapi.agent.configuration.ConfigurationAgentService;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest;
import org.rhq.core.clientapi.server.configuration.ConfigurationServerService;
import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.ContainerService;
-import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.pc.PluginContainer;
-import org.rhq.core.pc.util.ComponentService;
+import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.pc.agent.AgentService;
+import org.rhq.core.pc.util.ComponentService;
import org.rhq.core.pc.util.ComponentUtil;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.util.LoggingThreadFactory;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
/**
* Manages configuration of all resources across all plugins.
*
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationUtilityServiceImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationUtilityServiceImpl.java
index 771b0b5..2f14f17 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationUtilityServiceImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationUtilityServiceImpl.java
@@ -23,9 +23,9 @@
package org.rhq.core.pc.configuration;
+import org.rhq.core.clientapi.agent.configuration.ConfigurationUtility;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.core.clientapi.agent.configuration.ConfigurationUtility;
import java.util.List;
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
index 98ec1c6..5f6b6ab 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
@@ -28,13 +28,9 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.RawConfiguration;
-import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
-import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
-import java.util.LinkedList;
-import java.util.List;
import java.util.Set;
public class RawConfigManagement extends ConfigManagementSupport {
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateErrorDetail.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateErrorDetail.java
deleted file mode 100644
index 7e8f9ca..0000000
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateErrorDetail.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program 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 General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.core.pc.configuration;
-
-import org.rhq.core.domain.configuration.RawConfiguration;
-
-public class RawUpdateErrorDetail {
-
- private RawConfiguration rawConfig;
-
- private Throwable error;
-
- public RawUpdateErrorDetail() {
- }
-
- public RawUpdateErrorDetail(RawConfiguration rawConfig, Throwable error) {
- this.rawConfig = rawConfig;
- this.error = error;
- }
-
- public RawConfiguration getRawConfiguration() {
- return rawConfig;
- }
-
- public void setRawConfiguration(RawConfiguration rawConfig) {
- this.rawConfig = rawConfig;
- }
-
- public Throwable getError() {
- return error;
- }
-
- public void setError(Throwable error) {
- this.error = error;
- }
-}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateException.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateException.java
deleted file mode 100644
index 22ba9f1..0000000
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateException.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program 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 General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.core.pc.configuration;
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class RawUpdateException extends ConfigurationUpdateException {
-
- private List<RawUpdateErrorDetail> details = new LinkedList<RawUpdateErrorDetail>();
-
- public RawUpdateException(List<RawUpdateErrorDetail> errors) {
- details = errors;
- }
-
- public RawUpdateException(String message, List<RawUpdateErrorDetail> errors) {
- super(message);
- details = errors;
- }
-
- public RawUpdateException(String message, Throwable cause) {
- super(message, cause);
- }
-
- public RawUpdateException(Throwable cause) {
- super(cause);
- }
-
- public List<RawUpdateErrorDetail> getDetails() {
- return details;
- }
-}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java
index b0b1728..957c973 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java
@@ -23,19 +23,19 @@
package org.rhq.core.pc.configuration;
-import static java.util.Collections.EMPTY_SET;
-
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import java.util.List;
import java.util.Set;
+import static java.util.Collections.EMPTY_SET;
+
public class StructuredAndRawConfigManagement extends ConfigManagementSupport {
private final Log log = LogFactory.getLog(StructuredAndRawConfigManagement.class);
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
index 85023a4..e2b1bb7 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
@@ -74,7 +74,6 @@ public class StructuredConfigManagement extends ConfigManagementSupport {
facet.persistStructuredConfiguration(configuration);
}
catch (Throwable t) {
-// throw new StructuredUpdateException(t);
throw new ConfigurationUpdateException(t.getMessage());
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredUpdateException.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredUpdateException.java
deleted file mode 100644
index c0ba380..0000000
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredUpdateException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program 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 General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.core.pc.configuration;
-
-public class StructuredUpdateException extends ConfigurationUpdateException {
-
- public StructuredUpdateException() {
- super();
- }
-
- public StructuredUpdateException(String message) {
- super(message);
- }
-
- public StructuredUpdateException(String message, Throwable cause) {
- super(message, cause);
- }
-
- public StructuredUpdateException(Throwable cause) {
- super(cause);
- }
-}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java
index 1ad81f6..b9c3415 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java
@@ -23,24 +23,25 @@
package org.rhq.core.pc.configuration;
+import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
-import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pc.util.ComponentService;
+import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.test.JMockTest;
-
-import static org.rhq.test.AssertUtils.*;
-import static org.testng.Assert.assertEquals;
import org.testng.annotations.BeforeMethod;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
+import static org.rhq.test.AssertUtils.assertCollectionEqualsNoOrder;
+import static org.rhq.test.AssertUtils.assertPropertiesMatch;
+import static org.testng.Assert.assertEquals;
+
public class ConfigManagementTest extends JMockTest {
Random random = new Random();
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
index 6418922..b43a892 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigurationManagerTest.java
@@ -23,28 +23,30 @@
package org.rhq.core.pc.configuration;
-import static org.testng.Assert.*;
-
+import org.hamcrest.Matcher;
import org.jmock.Expectations;
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest;
import org.rhq.core.clientapi.server.configuration.ConfigurationServerService;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.pc.ServerServices;
+import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.test.jmock.PropertyMatcher;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.hamcrest.Matcher;
import java.util.Set;
import java.util.concurrent.ScheduledExecutorService;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
public class ConfigurationManagerTest extends ConfigManagementTest {
static final String LEGACY_AMPS_VERSION = "2.0";
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
index e093d68..5db3fd1 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
@@ -23,21 +23,19 @@
package org.rhq.core.pc.configuration;
-import static org.testng.Assert.*;
-import static java.util.Collections.EMPTY_SET;
-
import org.jmock.Expectations;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
-import static org.testng.Assert.assertNull;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import java.util.List;
import java.util.Set;
+import static java.util.Collections.EMPTY_SET;
+import static org.testng.Assert.assertNull;
+
public class RawConfigManagementTest extends ConfigManagementTest {
ResourceConfigurationFacet configFacet;
@@ -126,7 +124,6 @@ public class RawConfigManagementTest extends ConfigManagementTest {
rawConfigMgmt.executeUpdate(resourceId, config);
}
-// @Test(expectedExceptions = {RawUpdateException.class})
@Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenValidationFailsForSingleRaw() throws Exception {
final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
@@ -143,7 +140,6 @@ public class RawConfigManagementTest extends ConfigManagementTest {
rawConfigMgmt.executeUpdate(resourceId, config);
}
-// @Test(expectedExceptions = {RawUpdateException.class})
@Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenUpdateFailsForSingleRaw() throws Exception {
final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
@@ -186,7 +182,6 @@ public class RawConfigManagementTest extends ConfigManagementTest {
rawConfigMgmt.executeUpdate(resourceId, config);
}
-// @Test
@Test(expectedExceptions = {ConfigurationUpdateException.class})
public void secondRawShouldStillGetUpdatedWhenFirstRawFailsValidation() throws Exception {
final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
@@ -207,30 +202,8 @@ public class RawConfigManagementTest extends ConfigManagementTest {
}});
rawConfigMgmt.executeUpdate(resourceId, config);
-
-// RawUpdateException exception = null;
-//
-// try {
-// rawConfigMgmt.executeUpdate(resourceId, config);
-// }
-// catch (RawUpdateException e) {
-// exception = e;
-// }
-//
-// assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
-// " validation fails");
-//
-// List<RawUpdateErrorDetail> errors = exception.getDetails();
-//
-// assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
-// assertEquals(
-// errors.get(0).getRawConfiguration(),
-// raw1,
-// "Expected to find " + raw1 + " since validation for it failed"
-// );
}
-// @Test
@Test(expectedExceptions = {ConfigurationUpdateException.class})
public void secondRawShouldStillGetUpdateWhenFirstRawUpdateFails() throws Exception {
final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
@@ -253,30 +226,8 @@ public class RawConfigManagementTest extends ConfigManagementTest {
}});
rawConfigMgmt.executeUpdate(resourceId, config);
-
-// RawUpdateException exception = null;
-//
-// try {
-// rawConfigMgmt.executeUpdate(resourceId, config);
-// }
-// catch (RawUpdateException e) {
-// exception = e;
-// }
-//
-// assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
-// " update fails");
-//
-// List<RawUpdateErrorDetail> errors = exception.getDetails();
-//
-// assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
-// assertEquals(
-// errors.get(0).getRawConfiguration(),
-// raw1,
-// "Expected to find " + raw1 + " since update for it failed"
-// );
}
-// @Test
@Test(expectedExceptions = {ConfigurationUpdateException.class})
public void noUpdatesShouldHappenWhenValidationFailsForBothRaws() throws Exception {
final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
@@ -295,33 +246,6 @@ public class RawConfigManagementTest extends ConfigManagementTest {
}});
rawConfigMgmt.executeUpdate(resourceId, config);
-
-// RawUpdateException exception = null;
-//
-// try {
-// rawConfigMgmt.executeUpdate(resourceId, config);
-// }
-// catch (RawUpdateException e) {
-// exception = e;
-// }
-//
-// assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
-// " update fails");
-//
-// List<RawUpdateErrorDetail> errors = exception.getDetails();
-//
-// assertEquals(errors.size(), 2, "Expected to find two errors since validation failed for both raw config files");
-// assertErrorDetailsContainsRawConfig(errors, raw1);
-// assertErrorDetailsContainsRawConfig(errors, raw2);
- }
-
- private void assertErrorDetailsContainsRawConfig(List<RawUpdateErrorDetail> errors, RawConfiguration rawConfig) {
- for (RawUpdateErrorDetail detail : errors) {
- if (detail.getRawConfiguration().equals(rawConfig)) {
- return;
- }
- }
- fail("Expected to find " + rawConfig + " in update error details");
}
private void addDefaultExpectationsForUpdate() throws Exception {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java
index b53fd00..b8903ea 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java
@@ -23,22 +23,22 @@
package org.rhq.core.pc.configuration;
-import static org.testng.Assert.*;
-import static java.util.Collections.*;
-
-import org.rhq.core.pc.util.FacetLockType;
-import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
+import org.jmock.Expectations;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pc.util.FacetLockType;
+import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.jmock.Expectations;
import java.util.Set;
+import static java.util.Collections.EMPTY_SET;
+import static org.testng.Assert.assertNull;
+
public class StructuredAndRawConfigManagementTest extends ConfigManagementTest {
ResourceConfigurationFacet configFacet;
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
index 43d5c73..b869569 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
@@ -28,10 +28,11 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
-import static org.testng.Assert.assertNull;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import static org.testng.Assert.assertNull;
+
public class StructuredConfigManagementTest extends ConfigManagementTest {
ResourceConfigurationFacet configFacet;
@@ -128,7 +129,6 @@ public class StructuredConfigManagementTest extends ConfigManagementTest {
structuredMgmt.executeUpdate(resourceId, config);
}
-// @Test(expectedExceptions = {StructuredUpdateException.class})
@Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenValidationFails() throws Exception {
final Configuration config = new Configuration();
@@ -142,7 +142,6 @@ public class StructuredConfigManagementTest extends ConfigManagementTest {
structuredMgmt.executeUpdate(resourceId, config);
}
-// @Test(expectedExceptions = {StructuredUpdateException.class})
@Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenUpdateFails() throws Exception {
final Configuration config = new Configuration();
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/UpdateResourceConfigurationRunnerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/UpdateResourceConfigurationRunnerTest.java
index 7dd18b0..54edf77 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/UpdateResourceConfigurationRunnerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/UpdateResourceConfigurationRunnerTest.java
@@ -33,13 +33,14 @@ import org.rhq.core.clientapi.server.configuration.ConfigurationServerService;
import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
-import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.FAILURE;
-import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.SUCCESS;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.test.jmock.PropertyMatcher;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.FAILURE;
+import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.SUCCESS;
+
public class UpdateResourceConfigurationRunnerTest extends ConfigManagementTest {
ConfigManagement configMgmt;
commit 6513411790aa5f03ebd26213cda8272d010c1b37
Author: John Sanda <john(a)localhost.localdomain>
Date: Thu Jan 7 06:19:40 2010 -0500
Updating/adding validation support for configs that support structured and raw
Updating logic that generates the various ConfigurationUpdateExceptions to just return the
error message as an unformatted string, not as an xml document. No longer using
StructuredUpdateException or RawUpdateException as they do not seem necessary.
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationUpdateException.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationUpdateException.java
new file mode 100644
index 0000000..fdc3018
--- /dev/null
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/configuration/ResourceConfigurationUpdateException.java
@@ -0,0 +1,49 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.core.pluginapi.configuration;
+
+
+/**
+ * This exception can be thrown by instances of {@link ResourceConfigurationFacet} to indicate an update failed. This
+ * exception can be throw by the validateXXX methods to indicate that validation failed or by the persistXXX method to
+ * indicate that the actual update failed.
+ * <br/><br/>
+ * Any unchecked exception thrown from the validateXXX or from the persistXXX methods will be treated as an update
+ * failure. When a ResourceConfigurationUpdateException is thrown, only the error messages associated with it are sent
+ * back to the server whereas with any other exception, the entire stack trace is sent up to the server. The reason for
+ * this is that with a ResourceConfigurationUpdateException, the plugin container assumes that the failure has been
+ * handled in some fashion. For instance, catching any exceptions that might thrown from attempting to apply the update.
+ * Or consider a scenario in which applying the update involves calling out to an external program. The failed update
+ * might only be reported back with some error code.
+ * <br/><br/>
+ * With any other exception, the plugin container cannot reasonably assume that any errors were handled and as such
+ * reports the entire stack trace back to the server to provide additional information for debugging if necessary.
+ */
+public class ResourceConfigurationUpdateException extends RuntimeException {
+
+ public ResourceConfigurationUpdateException(String message) {
+ super(message);
+ }
+
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
index 6193fd2..8389c41 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigManagementFactoryImpl.java
@@ -25,6 +25,7 @@ package org.rhq.core.pc.configuration;
import static org.rhq.core.domain.configuration.definition.ConfigurationFormat.*;
+import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
import org.rhq.core.pc.util.ComponentService;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.clientapi.agent.PluginContainerException;
@@ -63,6 +64,12 @@ public class ConfigManagementFactoryImpl implements ConfigManagementFactory {
ResourceType resourceType = componentService.getResourceType(resourceId);
+ ConfigurationFormat format = resourceType.getResourceConfigurationDefinition().getConfigurationFormat();
+ switch (format) {
+ case RAW: break;
+ default: ;
+ }
+
if (isStructured(resourceType)) {
return new StructuredConfigManagement();
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
index 1a9b21c..98ec1c6 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
@@ -67,7 +67,7 @@ public class RawConfigManagement extends ConfigManagementSupport {
throws PluginContainerException {
ResourceConfigurationFacet facet = loadResourceConfigFacetWithWriteLock(resourceId);
- List<RawUpdateErrorDetail> errors = new LinkedList<RawUpdateErrorDetail>();
+ StringBuilder errors = new StringBuilder();
for (RawConfiguration rawConfig : configuration.getRawConfigurations()) {
try {
@@ -76,12 +76,12 @@ public class RawConfigManagement extends ConfigManagementSupport {
}
catch (Throwable t) {
// TODO Might want to specify in the error detail whether the validate or update call failed
- errors.add(new RawUpdateErrorDetail(rawConfig, t));
+ errors.append(t.getMessage()).append("\n\n");
}
}
- if (errors.size() > 0) {
- throw new RawUpdateException(errors);
+ if (errors.length() > 0) {
+ throw new ConfigurationUpdateException(errors.toString());
}
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java
index 3f976c7..b0b1728 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java
@@ -87,9 +87,28 @@ public class StructuredAndRawConfigManagement extends ConfigManagementSupport {
public void executeUpdate(int resourceId, Configuration configuration) throws PluginContainerException {
ResourceConfigurationFacet facet = loadResourceConfigFacetWithWriteLock(resourceId);
- facet.persistStructuredConfiguration(configuration);
+ StringBuilder errors = new StringBuilder();
+
+ try {
+ facet.validateStructuredConfiguration(configuration);
+ facet.persistStructuredConfiguration(configuration);
+ }
+ catch (Throwable t) {
+ errors.append(t.getMessage());
+ }
+
for (RawConfiguration rawConfig : configuration.getRawConfigurations()) {
- facet.persistRawConfiguration(rawConfig);
+ try {
+ facet.validateRawConfiguration(rawConfig);
+ facet.persistRawConfiguration(rawConfig);
+ }
+ catch (Throwable t) {
+ errors.append(t.getMessage()).append("\n\n");
+ }
+ }
+
+ if (errors.length() > 0) {
+ throw new ConfigurationUpdateException(errors.toString());
}
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
index 7cd57b7..85023a4 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
@@ -74,7 +74,8 @@ public class StructuredConfigManagement extends ConfigManagementSupport {
facet.persistStructuredConfiguration(configuration);
}
catch (Throwable t) {
- throw new StructuredUpdateException(t);
+// throw new StructuredUpdateException(t);
+ throw new ConfigurationUpdateException(t.getMessage());
}
}
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
index c1ac859..e093d68 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
@@ -126,7 +126,8 @@ public class RawConfigManagementTest extends ConfigManagementTest {
rawConfigMgmt.executeUpdate(resourceId, config);
}
- @Test(expectedExceptions = {RawUpdateException.class})
+// @Test(expectedExceptions = {RawUpdateException.class})
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenValidationFailsForSingleRaw() throws Exception {
final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
@@ -142,7 +143,8 @@ public class RawConfigManagementTest extends ConfigManagementTest {
rawConfigMgmt.executeUpdate(resourceId, config);
}
- @Test(expectedExceptions = {RawUpdateException.class})
+// @Test(expectedExceptions = {RawUpdateException.class})
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenUpdateFailsForSingleRaw() throws Exception {
final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
@@ -184,7 +186,8 @@ public class RawConfigManagementTest extends ConfigManagementTest {
rawConfigMgmt.executeUpdate(resourceId, config);
}
- @Test
+// @Test
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
public void secondRawShouldStillGetUpdatedWhenFirstRawFailsValidation() throws Exception {
final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
final RawConfiguration raw2 = createRawConfiguration("/tmp/raw2.txt");
@@ -203,29 +206,32 @@ public class RawConfigManagementTest extends ConfigManagementTest {
oneOf(configFacet).persistRawConfiguration(raw2);
}});
- RawUpdateException exception = null;
-
- try {
- rawConfigMgmt.executeUpdate(resourceId, config);
- }
- catch (RawUpdateException e) {
- exception = e;
- }
-
- assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
- " validation fails");
-
- List<RawUpdateErrorDetail> errors = exception.getDetails();
+ rawConfigMgmt.executeUpdate(resourceId, config);
- assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
- assertEquals(
- errors.get(0).getRawConfiguration(),
- raw1,
- "Expected to find " + raw1 + " since validation for it failed"
- );
+// RawUpdateException exception = null;
+//
+// try {
+// rawConfigMgmt.executeUpdate(resourceId, config);
+// }
+// catch (RawUpdateException e) {
+// exception = e;
+// }
+//
+// assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
+// " validation fails");
+//
+// List<RawUpdateErrorDetail> errors = exception.getDetails();
+//
+// assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
+// assertEquals(
+// errors.get(0).getRawConfiguration(),
+// raw1,
+// "Expected to find " + raw1 + " since validation for it failed"
+// );
}
- @Test
+// @Test
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
public void secondRawShouldStillGetUpdateWhenFirstRawUpdateFails() throws Exception {
final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
final RawConfiguration raw2 = createRawConfiguration("/tmp/raw2.txt");
@@ -246,29 +252,32 @@ public class RawConfigManagementTest extends ConfigManagementTest {
oneOf(configFacet).persistRawConfiguration(raw2);
}});
- RawUpdateException exception = null;
-
- try {
- rawConfigMgmt.executeUpdate(resourceId, config);
- }
- catch (RawUpdateException e) {
- exception = e;
- }
-
- assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
- " update fails");
-
- List<RawUpdateErrorDetail> errors = exception.getDetails();
+ rawConfigMgmt.executeUpdate(resourceId, config);
- assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
- assertEquals(
- errors.get(0).getRawConfiguration(),
- raw1,
- "Expected to find " + raw1 + " since update for it failed"
- );
+// RawUpdateException exception = null;
+//
+// try {
+// rawConfigMgmt.executeUpdate(resourceId, config);
+// }
+// catch (RawUpdateException e) {
+// exception = e;
+// }
+//
+// assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
+// " update fails");
+//
+// List<RawUpdateErrorDetail> errors = exception.getDetails();
+//
+// assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
+// assertEquals(
+// errors.get(0).getRawConfiguration(),
+// raw1,
+// "Expected to find " + raw1 + " since update for it failed"
+// );
}
- @Test
+// @Test
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
public void noUpdatesShouldHappenWhenValidationFailsForBothRaws() throws Exception {
final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
final RawConfiguration raw2 = createRawConfiguration("/tmp/raw2.txt");
@@ -285,23 +294,25 @@ public class RawConfigManagementTest extends ConfigManagementTest {
oneOf(configFacet).validateRawConfiguration(raw2); will(throwException(new RuntimeException()));
}});
- RawUpdateException exception = null;
-
- try {
- rawConfigMgmt.executeUpdate(resourceId, config);
- }
- catch (RawUpdateException e) {
- exception = e;
- }
-
- assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
- " update fails");
-
- List<RawUpdateErrorDetail> errors = exception.getDetails();
+ rawConfigMgmt.executeUpdate(resourceId, config);
- assertEquals(errors.size(), 2, "Expected to find two errors since validation failed for both raw config files");
- assertErrorDetailsContainsRawConfig(errors, raw1);
- assertErrorDetailsContainsRawConfig(errors, raw2);
+// RawUpdateException exception = null;
+//
+// try {
+// rawConfigMgmt.executeUpdate(resourceId, config);
+// }
+// catch (RawUpdateException e) {
+// exception = e;
+// }
+//
+// assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
+// " update fails");
+//
+// List<RawUpdateErrorDetail> errors = exception.getDetails();
+//
+// assertEquals(errors.size(), 2, "Expected to find two errors since validation failed for both raw config files");
+// assertErrorDetailsContainsRawConfig(errors, raw1);
+// assertErrorDetailsContainsRawConfig(errors, raw2);
}
private void assertErrorDetailsContainsRawConfig(List<RawUpdateErrorDetail> errors, RawConfiguration rawConfig) {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java
index b3b5882..b53fd00 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagementTest.java
@@ -189,6 +189,86 @@ public class StructuredAndRawConfigManagementTest extends ConfigManagementTest {
config.addRawConfiguration(raw1);
config.addRawConfiguration(raw2);
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateStructuredConfiguration(config);
+ oneOf(configFacet).persistStructuredConfiguration(config);
+
+ oneOf(configFacet).validateRawConfiguration(raw1);
+ oneOf(configFacet).persistRawConfiguration(raw1);
+
+ oneOf(configFacet).validateRawConfiguration(raw2);
+ oneOf(configFacet).persistRawConfiguration(raw2);
+ }});
+
+ structuredAndRawConfigManagement.executeUpdate(resourceId, config);
+ }
+
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
+ public void exceptionShouldBeThrownWhenStructuredValidationFails() throws Exception {
+ final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateStructuredConfiguration(config); will(throwException(new RuntimeException()));
+
+ oneOf(configFacet).validateRawConfiguration(raw);
+ oneOf(configFacet).persistRawConfiguration(raw);
+ }});
+
+ structuredAndRawConfigManagement.executeUpdate(resourceId, config);
+ }
+
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
+ public void exceptionShouldBeThrownWhenStructuredUpdateFails() throws Exception {
+ final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateStructuredConfiguration(config);
+ oneOf(configFacet).persistStructuredConfiguration(config); will(throwException(new RuntimeException()));
+
+ oneOf(configFacet).validateRawConfiguration(raw);
+ oneOf(configFacet).persistRawConfiguration(raw);
+ }});
+
+ structuredAndRawConfigManagement.executeUpdate(resourceId, config);
+ }
+
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
+ public void structuredAndSecondRawShouldStillGetUpdatedWhenFirstRawValidationFails() throws Exception {
+ final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
+ final RawConfiguration raw2 = createRawConfiguration("/tmp/raw2.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw1);
+ config.addRawConfiguration(raw2);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateStructuredConfiguration(config);
+ oneOf(configFacet).persistStructuredConfiguration(config);
+
+ oneOf(configFacet).validateRawConfiguration(raw1); will(throwException(new RuntimeException()));
+
+ oneOf(configFacet).validateRawConfiguration(raw2);
+ oneOf(configFacet).persistRawConfiguration(raw2);
+ }});
+
+ structuredAndRawConfigManagement.executeUpdate(resourceId, config);
+ }
+
+ private void addDefaultExpectationsForUpdate() throws Exception {
final boolean isDaemonThread = false;
context.checking(new Expectations() {{
@@ -199,13 +279,7 @@ public class StructuredAndRawConfigManagementTest extends ConfigManagementTest {
isDaemonThread,
onlyIfStarted);
will(returnValue(configFacet));
-
- oneOf(configFacet).persistStructuredConfiguration(config);
- oneOf(configFacet).persistRawConfiguration(raw1);
- oneOf(configFacet).persistRawConfiguration(raw2);
}});
-
- structuredAndRawConfigManagement.executeUpdate(resourceId, config);
}
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
index 5260ed5..43d5c73 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
@@ -128,7 +128,8 @@ public class StructuredConfigManagementTest extends ConfigManagementTest {
structuredMgmt.executeUpdate(resourceId, config);
}
- @Test(expectedExceptions = {StructuredUpdateException.class})
+// @Test(expectedExceptions = {StructuredUpdateException.class})
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenValidationFails() throws Exception {
final Configuration config = new Configuration();
@@ -141,7 +142,8 @@ public class StructuredConfigManagementTest extends ConfigManagementTest {
structuredMgmt.executeUpdate(resourceId, config);
}
- @Test(expectedExceptions = {StructuredUpdateException.class})
+// @Test(expectedExceptions = {StructuredUpdateException.class})
+ @Test(expectedExceptions = {ConfigurationUpdateException.class})
public void exceptionShouldBeThrownWhenUpdateFails() throws Exception {
final Configuration config = new Configuration();
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
index ea676c4..e0a5d64 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
@@ -76,7 +76,7 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
}
void persistRawConfiguration(RawConfiguration rawConfiguration) {
- def failValidation = resourceContext.pluginConfiguration.getSimple("failValidation")
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failUpdate")
if (failValidation.getBooleanValue()) {
throw new RuntimeException("Update failed for ${rawConfiguration.path}");
}
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
index 5e19aee..359c615 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredAndRawServer.groovy
@@ -8,10 +8,11 @@ import org.rhq.core.domain.configuration.Configuration
import org.rhq.core.domain.configuration.RawConfiguration
import org.rhq.core.domain.configuration.PropertySimple
import org.apache.commons.configuration.PropertiesConfiguration
-import groovy.util.AntBuilder
class StructuredAndRawServer implements ResourceComponent, ResourceConfigurationFacet {
+ ResourceContext resourceContext
+
File rawConfigDir
File rawConfig1
@@ -23,6 +24,8 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
def ant = new AntBuilder()
void start(ResourceContext context) {
+ resourceContext = context
+
rawConfigDir = new File("${System.getProperty('java.io.tmpdir')}/raw-config-test")
rawConfig1 = new File(rawConfigDir, "structured-and-raw-test-1.txt")
rawConfig2 = new File(rawConfigDir, "structured-and-raw-test-2.txt")
@@ -148,15 +151,42 @@ class StructuredAndRawServer implements ResourceComponent, ResourceConfiguration
}
void validateRawConfiguration(RawConfiguration rawConfig) {
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failRawValidation")
+ if (failValidation.getBooleanValue()) {
+ def fileNames = resourceContext.pluginConfiguration.getSimple("filesToFailValidation").stringValue.split()
+ def match = fileNames.find { rawConfig.path.endsWith(it) }
+
+ if (match) {
+ throw new RuntimeException("Validation failed for ${rawConfig.path}");
+ }
+ }
}
void validateStructuredConfiguration(Configuration config) {
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failStructuredValidation")
+ if (failValidation.getBooleanValue()) {
+ throw new RuntimeException("Validation failed for $configuration");
+ }
}
void persistStructuredConfiguration(Configuration config) {
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failStructuredUpdate")
+ if (failValidation.getBooleanValue()) {
+ throw new RuntimeException("Update failed for $configuration");
+ }
}
void persistRawConfiguration(RawConfiguration rawConfig) {
+ def failUpdate = resourceContext.pluginConfiguration.getSimple("failRawUpdate")
+ if (failUpdate.getBooleanValue()) {
+ def fileNames = resourceContext.pluginConfiguration.getSimple("filesToFailUpdate").stringValue.split()
+ def match = fileNames.find { rawConfig.path.endsWith(it) }
+
+ if (match) {
+ throw new RuntimeException("Update failed for ${rawConfig.path}");
+ }
+ }
+
ant.copy(file: rawConfig.path, tofile: "${rawConfig.path}.orig")
ant.delete(file: rawConfig.path)
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredServer.groovy
index d92714f..e210d8d 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/StructuredServer.groovy
@@ -12,6 +12,8 @@ import groovy.util.AntBuilder
class StructuredServer implements ResourceComponent, ResourceConfigurationFacet {
+ ResourceContext resourceContext
+
File configDir
File structuredConfigFile
@@ -19,6 +21,8 @@ class StructuredServer implements ResourceComponent, ResourceConfigurationFacet
def ant = new AntBuilder()
void start(ResourceContext context) {
+ resourceContext = context
+
configDir = new File("${System.getProperty('java.io.tmpdir')}/raw-config-test")
structuredConfigFile = new File(configDir, "structured-test-1.txt")
@@ -73,6 +77,11 @@ class StructuredServer implements ResourceComponent, ResourceConfigurationFacet
}
void persistStructuredConfiguration(Configuration configuration) {
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failUpdate")
+ if (failValidation.getBooleanValue()) {
+ throw new RuntimeException("Validation failed for $configuration");
+ }
+
ant.copy(file: structuredConfigFile.absolutePath, tofile: "${structuredConfigFile.absolutePath}.orig")
ant.delete(file: structuredConfigFile)
@@ -89,6 +98,10 @@ class StructuredServer implements ResourceComponent, ResourceConfigurationFacet
}
void validateStructuredConfiguration(Configuration configuration) {
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failValidation")
+ if (failValidation.getBooleanValue()) {
+ throw new RuntimeException("Validation failed for $configuration");
+ }
}
void validateRawConfiguration(RawConfiguration rawConfiguration) {
diff --git a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
index e43262b..e59d833 100644
--- a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
@@ -14,6 +14,24 @@
class="StructuredAndRawServer"
discovery="StructuredAndRawDiscoveryComponent"
description="A fake server component that supports both structured and raw configuration">
+
+ <plugin-configuration>
+ <c:simple-property name="faidStructuredValidation" type="boolean" default="false"/>
+ <c:simple-property name="failStructuredUpdate" type="boolean" default="false"/>
+
+ <c:simple-property name="failRawValidation" type="boolean" default="false"/>
+ <c:simple-property name="filesToFailValidation"
+ description="A comma-delimited list of file names for which validation will fail. The entire
+ path does not need to be specified. Simple matching will be done starting from
+ the end of the path. For a path of /foo/bar.txt, you could specify bar.txt."/>
+
+ <c:simple-property name="failRawUpdate" type="boolean" default="false"/>
+ <c:simple-property name="filesToFailUpdate"
+ description="A comma-delimited list of file names for which the update will fail. The entire
+ path does not need to be specified. Simple matching will be done starting from
+ the end of the path. For a path of /foo/bar.txt, you could specify bar.txt."/>
+ </plugin-configuration>
+
<resource-configuration configurationFormat="both">
<c:simple-property name="x"/>
<c:simple-property name="y"/>
diff --git a/modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawConfigServerTest.groovy b/modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawConfigServerTest.groovy
deleted file mode 100644
index 52b9b68..0000000
--- a/modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawConfigServerTest.groovy
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.rhq.plugins.test.rawconfig
-/**
- * Created by IntelliJ IDEA.
- * User: john
- * Date: Nov 13, 2009
- * Time: 8:26:14 AM
- * To change this template use File | Settings | File Templates.
- */
-
-public class RawConfigServerTest {
-
-}
\ No newline at end of file
diff --git a/modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawServerTest.groovy b/modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawServerTest.groovy
index ebb84c2..efaa475 100644
--- a/modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawServerTest.groovy
+++ b/modules/plugins/raw-config-test/src/test/groovy/org/rhq/plugins/test/rawconfig/RawServerTest.groovy
@@ -5,7 +5,7 @@ import org.rhq.core.domain.configuration.RawConfiguration
class RawServerTest {
- @Test
+// @Test
void testPersistRawConfiguration() {
def rawFileName = "raw-test.txt"
def rawFile = new File(confDir, rawFileName)
commit 71f8eebf06f34e3fb3f83270ae41968356555e0f
Merge: e505346... 28dbc2f...
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 6 02:05:32 2010 -0500
Merge branch 'raw-config' of ssh://git.fedorahosted.org/git/rhq/rhq into raw-config
commit e50534652de3a0d177ad55a8252ed586d601ae1c
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 6 02:02:30 2010 -0500
[US 7] Adding initial support in test plugin for validation
Validation/update failure can be turned on or off through the resource's connection
properties. Currently implemented for RawServer.
diff --git a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
index 9acbbd8..ea676c4 100644
--- a/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
+++ b/modules/plugins/raw-config-test/src/main/groovy/org/rhq/plugins/test/rawconfig/RawServer.groovy
@@ -10,6 +10,8 @@ import groovy.util.AntBuilder
class RawServer implements ResourceComponent, ResourceConfigurationFacet {
+ ResourceContext resourceContext
+
File rawConfigDir
File rawConfig1
@@ -17,6 +19,8 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
def ant = new AntBuilder()
void start(ResourceContext context) {
+ resourceContext = context;
+
ant = new AntBuilder()
rawConfigDir = new File("${System.getProperty('java.io.tmpdir')}/raw-config-test")
@@ -72,6 +76,11 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
}
void persistRawConfiguration(RawConfiguration rawConfiguration) {
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failValidation")
+ if (failValidation.getBooleanValue()) {
+ throw new RuntimeException("Update failed for ${rawConfiguration.path}");
+ }
+
ant.copy(file: rawConfiguration.path, tofile: "${rawConfiguration.path}.orig")
ant.delete(file: rawConfiguration.path)
@@ -84,6 +93,10 @@ class RawServer implements ResourceComponent, ResourceConfigurationFacet {
}
void validateRawConfiguration(RawConfiguration rawConfiguration) {
+ def failValidation = resourceContext.pluginConfiguration.getSimple("failValidation")
+ if (failValidation.getBooleanValue()) {
+ throw new RuntimeException("Validation failed for ${rawConfiguration.path}");
+ }
}
}
diff --git a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
index 897e4f3..e43262b 100644
--- a/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/raw-config-test/src/main/resources/META-INF/rhq-plugin.xml
@@ -29,6 +29,12 @@
class="RawServer"
discovery="RawDiscoveryComponent"
description="A fake server component that supports raw configuration">
+
+ <plugin-configuration>
+ <c:simple-property name="failValidation" type="boolean" default="false"/>
+ <c:simple-property name="failUpdate" type="boolean" default="false"/>
+ </plugin-configuration>
+
<resource-configuration configurationFormat="raw"/>
</server>
@@ -36,6 +42,12 @@
class="StructuredServer"
discovery="StructuredDiscoveryComponent"
description="A fake server component that supports structured configuration">
+
+ <plugin-configuration>
+ <c:simple-property name="failValidation" type="boolean" default="false"/>
+ <c:simple-property name="failUpdate" type="boolean" default="false"/>
+ </plugin-configuration>
+
<resource-configuration configurationFormat="structured">
<c:simple-property name="foo"/>
<c:simple-property name="bar"/>
commit 1e94edabaa930c09d6bc30ae170d389436dfc102
Author: John Sanda <john(a)localhost.localdomain>
Date: Wed Jan 6 01:59:38 2010 -0500
[US 7] Adding initial support for validation of raw config in plugin container
This commit adds initial validation support for raw only and structured only. Still need
to add support for structured and raw and send back validation errors as an xml document
that can be easily parsed and displayed in the UI.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
index 5514784..1a9b21c 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawConfigManagement.java
@@ -33,6 +33,8 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Set;
public class RawConfigManagement extends ConfigManagementSupport {
@@ -65,10 +67,21 @@ public class RawConfigManagement extends ConfigManagementSupport {
throws PluginContainerException {
ResourceConfigurationFacet facet = loadResourceConfigFacetWithWriteLock(resourceId);
+ List<RawUpdateErrorDetail> errors = new LinkedList<RawUpdateErrorDetail>();
for (RawConfiguration rawConfig : configuration.getRawConfigurations()) {
- facet.persistRawConfiguration(rawConfig);
+ try {
+ facet.validateRawConfiguration(rawConfig);
+ facet.persistRawConfiguration(rawConfig);
+ }
+ catch (Throwable t) {
+ // TODO Might want to specify in the error detail whether the validate or update call failed
+ errors.add(new RawUpdateErrorDetail(rawConfig, t));
+ }
}
+ if (errors.size() > 0) {
+ throw new RawUpdateException(errors);
+ }
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateErrorDetail.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateErrorDetail.java
new file mode 100644
index 0000000..7e8f9ca
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateErrorDetail.java
@@ -0,0 +1,57 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.core.pc.configuration;
+
+import org.rhq.core.domain.configuration.RawConfiguration;
+
+public class RawUpdateErrorDetail {
+
+ private RawConfiguration rawConfig;
+
+ private Throwable error;
+
+ public RawUpdateErrorDetail() {
+ }
+
+ public RawUpdateErrorDetail(RawConfiguration rawConfig, Throwable error) {
+ this.rawConfig = rawConfig;
+ this.error = error;
+ }
+
+ public RawConfiguration getRawConfiguration() {
+ return rawConfig;
+ }
+
+ public void setRawConfiguration(RawConfiguration rawConfig) {
+ this.rawConfig = rawConfig;
+ }
+
+ public Throwable getError() {
+ return error;
+ }
+
+ public void setError(Throwable error) {
+ this.error = error;
+ }
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateException.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateException.java
new file mode 100644
index 0000000..22ba9f1
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/RawUpdateException.java
@@ -0,0 +1,53 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.core.pc.configuration;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class RawUpdateException extends ConfigurationUpdateException {
+
+ private List<RawUpdateErrorDetail> details = new LinkedList<RawUpdateErrorDetail>();
+
+ public RawUpdateException(List<RawUpdateErrorDetail> errors) {
+ details = errors;
+ }
+
+ public RawUpdateException(String message, List<RawUpdateErrorDetail> errors) {
+ super(message);
+ details = errors;
+ }
+
+ public RawUpdateException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public RawUpdateException(Throwable cause) {
+ super(cause);
+ }
+
+ public List<RawUpdateErrorDetail> getDetails() {
+ return details;
+ }
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
index f807e72..7cd57b7 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredConfigManagement.java
@@ -68,8 +68,13 @@ public class StructuredConfigManagement extends ConfigManagementSupport {
}
public void executeUpdate(int resourceId, Configuration configuration) throws PluginContainerException {
- ResourceConfigurationFacet facet = loadResourceConfigFacetWithWriteLock(resourceId);
-
- facet.persistStructuredConfiguration(configuration);
+ try {
+ ResourceConfigurationFacet facet = loadResourceConfigFacetWithWriteLock(resourceId);
+ facet.validateStructuredConfiguration(configuration);
+ facet.persistStructuredConfiguration(configuration);
+ }
+ catch (Throwable t) {
+ throw new StructuredUpdateException(t);
+ }
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredUpdateException.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredUpdateException.java
new file mode 100644
index 0000000..c0ba380
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredUpdateException.java
@@ -0,0 +1,43 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.core.pc.configuration;
+
+public class StructuredUpdateException extends ConfigurationUpdateException {
+
+ public StructuredUpdateException() {
+ super();
+ }
+
+ public StructuredUpdateException(String message) {
+ super(message);
+ }
+
+ public StructuredUpdateException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public StructuredUpdateException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
index 8d1ec7a..c1ac859 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/RawConfigManagementTest.java
@@ -23,6 +23,7 @@
package org.rhq.core.pc.configuration;
+import static org.testng.Assert.*;
import static java.util.Collections.EMPTY_SET;
import org.jmock.Expectations;
@@ -34,6 +35,7 @@ import static org.testng.Assert.assertNull;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import java.util.List;
import java.util.Set;
public class RawConfigManagementTest extends ConfigManagementTest {
@@ -116,12 +118,48 @@ public class RawConfigManagementTest extends ConfigManagementTest {
addDefaultExpectationsForUpdate();
context.checking(new Expectations() {{
+ oneOf(configFacet).validateRawConfiguration(raw);
+
oneOf(configFacet).persistRawConfiguration(raw);
}});
rawConfigMgmt.executeUpdate(resourceId, config);
}
+ @Test(expectedExceptions = {RawUpdateException.class})
+ public void exceptionShouldBeThrownWhenValidationFailsForSingleRaw() throws Exception {
+ final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateRawConfiguration(raw); will(throwException(new RuntimeException()));
+ }});
+
+ rawConfigMgmt.executeUpdate(resourceId, config);
+ }
+
+ @Test(expectedExceptions = {RawUpdateException.class})
+ public void exceptionShouldBeThrownWhenUpdateFailsForSingleRaw() throws Exception {
+ final RawConfiguration raw = createRawConfiguration("/tmp/raw.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateRawConfiguration(raw);
+
+ oneOf(configFacet).persistRawConfiguration(raw); will(throwException(new RuntimeException()));
+ }});
+
+ rawConfigMgmt.executeUpdate(resourceId, config);
+ }
+
@Test
public void facetShouldBeCalledToUpdateMultipleRaws() throws Exception {
final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
@@ -134,13 +172,147 @@ public class RawConfigManagementTest extends ConfigManagementTest {
addDefaultExpectationsForUpdate();
context.checking(new Expectations() {{
+ oneOf(configFacet).validateRawConfiguration(raw1);
+
oneOf(configFacet).persistRawConfiguration(raw1);
+
+ oneOf(configFacet).validateRawConfiguration(raw2);
+
oneOf(configFacet).persistRawConfiguration(raw2);
}});
rawConfigMgmt.executeUpdate(resourceId, config);
}
+ @Test
+ public void secondRawShouldStillGetUpdatedWhenFirstRawFailsValidation() throws Exception {
+ final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
+ final RawConfiguration raw2 = createRawConfiguration("/tmp/raw2.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw1);
+ config.addRawConfiguration(raw2);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateRawConfiguration(raw1); will(throwException(new RuntimeException()));
+
+ oneOf(configFacet).validateRawConfiguration(raw2);
+
+ oneOf(configFacet).persistRawConfiguration(raw2);
+ }});
+
+ RawUpdateException exception = null;
+
+ try {
+ rawConfigMgmt.executeUpdate(resourceId, config);
+ }
+ catch (RawUpdateException e) {
+ exception = e;
+ }
+
+ assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
+ " validation fails");
+
+ List<RawUpdateErrorDetail> errors = exception.getDetails();
+
+ assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
+ assertEquals(
+ errors.get(0).getRawConfiguration(),
+ raw1,
+ "Expected to find " + raw1 + " since validation for it failed"
+ );
+ }
+
+ @Test
+ public void secondRawShouldStillGetUpdateWhenFirstRawUpdateFails() throws Exception {
+ final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
+ final RawConfiguration raw2 = createRawConfiguration("/tmp/raw2.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw1);
+ config.addRawConfiguration(raw2);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateRawConfiguration(raw1);
+
+ oneOf(configFacet).persistRawConfiguration(raw1); will(throwException(new RuntimeException()));
+
+ oneOf(configFacet).validateRawConfiguration(raw2);
+
+ oneOf(configFacet).persistRawConfiguration(raw2);
+ }});
+
+ RawUpdateException exception = null;
+
+ try {
+ rawConfigMgmt.executeUpdate(resourceId, config);
+ }
+ catch (RawUpdateException e) {
+ exception = e;
+ }
+
+ assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
+ " update fails");
+
+ List<RawUpdateErrorDetail> errors = exception.getDetails();
+
+ assertEquals(errors.size(), 1, "Expected to find only a single error since only the update of one raw failed");
+ assertEquals(
+ errors.get(0).getRawConfiguration(),
+ raw1,
+ "Expected to find " + raw1 + " since update for it failed"
+ );
+ }
+
+ @Test
+ public void noUpdatesShouldHappenWhenValidationFailsForBothRaws() throws Exception {
+ final RawConfiguration raw1 = createRawConfiguration("/tmp/raw1.txt");
+ final RawConfiguration raw2 = createRawConfiguration("/tmp/raw2.txt");
+
+ final Configuration config = new Configuration();
+ config.addRawConfiguration(raw1);
+ config.addRawConfiguration(raw2);
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateRawConfiguration(raw1); will(throwException(new RuntimeException()));
+
+ oneOf(configFacet).validateRawConfiguration(raw2); will(throwException(new RuntimeException()));
+ }});
+
+ RawUpdateException exception = null;
+
+ try {
+ rawConfigMgmt.executeUpdate(resourceId, config);
+ }
+ catch (RawUpdateException e) {
+ exception = e;
+ }
+
+ assertNotNull(exception, "Expected a " + RawUpdateException.class.getSimpleName() + " to be thrown when " +
+ " update fails");
+
+ List<RawUpdateErrorDetail> errors = exception.getDetails();
+
+ assertEquals(errors.size(), 2, "Expected to find two errors since validation failed for both raw config files");
+ assertErrorDetailsContainsRawConfig(errors, raw1);
+ assertErrorDetailsContainsRawConfig(errors, raw2);
+ }
+
+ private void assertErrorDetailsContainsRawConfig(List<RawUpdateErrorDetail> errors, RawConfiguration rawConfig) {
+ for (RawUpdateErrorDetail detail : errors) {
+ if (detail.getRawConfiguration().equals(rawConfig)) {
+ return;
+ }
+ }
+ fail("Expected to find " + rawConfig + " in update error details");
+ }
+
private void addDefaultExpectationsForUpdate() throws Exception {
final boolean isDaemonThread = false;
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
index 9b24df7..5260ed5 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/StructuredConfigManagementTest.java
@@ -74,8 +74,6 @@ public class StructuredConfigManagementTest extends ConfigManagementTest {
@Test
public void nullShouldBeReturnedWhenStructuredIsNull() throws Exception {
- final Configuration config = null;
-
context.checking(new Expectations() {{
atLeast(1).of(componentService).getComponent(resourceId,
ResourceConfigurationFacet.class,
@@ -117,8 +115,48 @@ public class StructuredConfigManagementTest extends ConfigManagementTest {
@Test
public void facetShouldBeCalledToUpdateStructured() throws Exception {
- final Configuration structuredConfig = new Configuration();
+ final Configuration config = new Configuration();
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateStructuredConfiguration(config);
+
+ oneOf(configFacet).persistStructuredConfiguration(config);
+ }});
+
+ structuredMgmt.executeUpdate(resourceId, config);
+ }
+
+ @Test(expectedExceptions = {StructuredUpdateException.class})
+ public void exceptionShouldBeThrownWhenValidationFails() throws Exception {
+ final Configuration config = new Configuration();
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateStructuredConfiguration(config); will(throwException(new RuntimeException()));
+ }});
+
+ structuredMgmt.executeUpdate(resourceId, config);
+ }
+
+ @Test(expectedExceptions = {StructuredUpdateException.class})
+ public void exceptionShouldBeThrownWhenUpdateFails() throws Exception {
+ final Configuration config = new Configuration();
+
+ addDefaultExpectationsForUpdate();
+
+ context.checking(new Expectations() {{
+ oneOf(configFacet).validateStructuredConfiguration(config);
+
+ oneOf(configFacet).persistStructuredConfiguration(config); will(throwException(new RuntimeException()));
+ }});
+ structuredMgmt.executeUpdate(resourceId, config);
+ }
+
+ private void addDefaultExpectationsForUpdate() throws Exception {
final boolean isDaemonThread = false;
context.checking(new Expectations() {{
@@ -129,11 +167,7 @@ public class StructuredConfigManagementTest extends ConfigManagementTest {
isDaemonThread,
onlyIfStarted);
will(returnValue(configFacet));
-
- oneOf(configFacet).persistStructuredConfiguration(structuredConfig);
}});
-
- structuredMgmt.executeUpdate(resourceId, structuredConfig);
}
}
commit 28dbc2fc74f2b27dd8d829b15a9d463b20077bde
Author: Adam Young <ayoung(a)redhat.com>
Date: Tue Jan 5 20:50:04 2010 -0500
minor tweaks for spacing and removing the controls from the xhtml test page.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
index 89e12be..3bcf887 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
@@ -136,6 +136,7 @@ function MultiFileEdit() {
document.write("<tr id='file-row-" + i + "'class='" + divclass
+ "'>");
document.write("<td>");
+ document.write("<span style=\"visibility:hidden; \" > XX </span>");
document.write("<span id='dirty-span-" + i
+ "' style=\"visibility:hidden;\" > * </span>");
document.write("</td><td>");
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
index 4bca60b..1db3aee 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
@@ -22,8 +22,6 @@ THIS TEXT WILL BE REMOVED.
<a href="view-raw-config.xhtml">View</a>
<form id="testForm">
<onc:multifile></onc:multifile>
- <input type="submit" value="Commit"/>
- <input type="reset" onclick="multiFileEdit.resetArchive();" />
</form>
</ui:define>
</ui:composition>
commit 00aaa905fd6f524df1e626ca206dbb63571de62b
Author: Adam Young <ayoung(a)redhat.com>
Date: Tue Jan 5 20:40:38 2010 -0500
Fixed the Undo button colors and made the entire rendered area into a table, including the submit and reset buttons.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
index 6de5fe8..89e12be 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
@@ -34,7 +34,6 @@ function MultiFileEdit() {
}
}
}
-
this.setTextAreaValue = function(id) {
if (this.currentIndex % 2 == 0) {
@@ -59,20 +58,15 @@ function MultiFileEdit() {
document.getElementById("reset-span-" + i).style.visibility = "hidden";
}
}
-
this.resetFile = function(index){
-
if (index >= this.originalCopies.length) return;
if (index < 0 ) return;
var original = this.originalCopies[index];
this.archive[index] = new ArchiveFile(original.path,original.contents);
-
document.getElementById("dirty-span-" + index).style.visibility = "hidden";
document.getElementById("reset-span-" + index).style.visibility = "hidden";
-
this.setTextAreaValue(index);
-
}
function askConfirm() {
@@ -80,7 +74,6 @@ function MultiFileEdit() {
}
this.updateArchive = function() {
-
window.onbeforeunload = askConfirm;
this.archive[this.currentIndex].contents = document
.getElementById("testForm").textarea.value;
@@ -89,14 +82,48 @@ function MultiFileEdit() {
document.getElementById("reset-span-" + this.currentIndex).style.visibility = "visible";
}
+ this.download= function() {
+ var generator = window.open(this.downloadUrl,'');
+ }
+
+ this.upload = function(){
+ alert("upload called");
+ }
+
+ this.commit = function(){
+ alert("commit called");
+ return false;
+ }
+
+ this.drawStyleSheet = function(){
+ document.write("<style type=\"text/css\">");
+ document.write("td.multi-edit-table {");
+ document.write("vertical-align: top;");
+ document.write("valign: top;");
+ document.write("height: = 300;");
+ document.write("}");
+ document.write("tr.EvenRow {")
+ document.write("background-color:#a4b2b9;");
+ document.write("}");
+ document.write("tr.OddRow {");
+ document.write("background-color:grey;");
+ document.write("}");
+ document.write("tr.SelectedRow {");
+ document.write("background-color:white;");
+ document.write("}");
+ document.write("span.reset {");
+ document.write("background-color:grey; color:white; visibility:hidden; ");
+ document.write("}");
+
+ document.write("</style>");
+ }
+
this.generateLinks = function() {
var i = 0;
var style = 0;
var divclass = "";
- document
- .write("<table BORDER=0 RULES=NONE FRAME=BOX><th><td>Configuration File Paths</td><td></td></th>");
+ document.write("<table BORDER=0 RULES=NONE FRAME=BOX><th><td>Configuration File Paths</td><td></td></th>");
for (i = 0; i < multiFileEdit.archive.length; i++) {
-
if (i == 0) {
divclass = "SelectedRow"
} else if (style != 0) {
@@ -106,49 +133,27 @@ function MultiFileEdit() {
style = 1;
divclass = "EvenRow"
}
-
document.write("<tr id='file-row-" + i + "'class='" + divclass
+ "'>");
document.write("<td>");
document.write("<span id='dirty-span-" + i
+ "' style=\"visibility:hidden;\" > * </span>");
document.write("</td><td>");
- document
- .write("<a href=\"#\" onclick='multiFileEdit.setTextAreaValue("
+ document.write("<a href=\"#\" onclick='multiFileEdit.setTextAreaValue("
+ i + ")' >" + multiFileEdit.archive[i].path);
document.write("</a>");
-
- document.write(" <span id='reset-span-" + i
- + "' style=\"visibility:hidden;\" >");
- document.write("<a href='#' onclick=' multiFileEdit.resetFile("+i+");' >reset</a> </span>");
-
-
+ document.write("<span class='reset' id='reset-span-" + i + "' ");
+ document.write(" onmouseup=' multiFileEdit.resetFile("+i+");'>");
+ document.write(" Undo</span>");
document.write("</td></tr>");
}
document.write("</table>");
-
}
this.drawTable = function() {
this.initializeArchive();
+ this.drawStyleSheet();
- document.write("<style type=\"text/css\">");
- document.write("td.multi-edit-table {");
- document.write("vertical-align: top;");
- document.write("valign: top;");
- document.write("height: = 300;");
- document.write("}");
- document.write("tr.EvenRow {")
- document.write("background-color:#a4b2b9;");
- document.write("}");
- document.write("tr.OddRow {");
- document.write("background-color:grey;");
- document.write("}");
- document.write("tr.SelectedRow {");
- document.write("background-color:white;");
- document.write("}");
-
- document.write("</style>");
document
.write("<table class='multi-edit-table' border='0' cellpadding='0' >");
document.write("<tbody>");
@@ -175,16 +180,29 @@ function MultiFileEdit() {
.write("onkeyup='multiFileEdit.updateArchive();' cols='80' rows='25'>");
document.write(multiFileEdit.archive[0].contents);
document.write("</textarea>");
-
- document.write("<div>upload New Version</div>");
- document.write("<div>Select A File: <input type='file' onchange='alert(\"onchange called\");' /> </div>");
-
- document.write("</form>");
+ if (!this.disabled){
+ document.write("<div>upload New Version</div>");
+ document.write("<div>Select A File: <input type='file' onchange='multiFileEdit.upload();' /> </div>");
+ }
document.write("</td>");
document.write("</tr>");
+
+ document.write("<tr>");
+ document.write("<td>");
+ if (!this.disabled){
+ document.write("<input type='submit' value='commit' onclick='multiFileEdit.commit();'/>");
+ document.write("<input type='reset' onclick='multiFileEdit.resetArchive();' />");
+ }
+ document.write("</td>");
+ document.write("<td></td>");
+ document.write("</tr>");
+
document.write("</tbody>");
document.write("</table>");
+
+
+
}
@@ -219,9 +237,6 @@ function MultiFileEdit() {
generator.document.close();
}
- this.download= function() {
- var generator = window.open(this.downloadUrl,'');
- }
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
index 4acac4b..d860d1a 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
@@ -23,10 +23,8 @@
multiFileEdit.downloadUrl = "download.html";
multiFileEdit.drawTable();
-</script> <input type="submit" /><input type="reset"
- onclick="multiFileEdit.resetArchive();" /></form>
-
-
-
+</script>
+
+</form>
</body>
</html>
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html
index c1084fa..a6d15d3 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html
@@ -1,17 +1,31 @@
<html><head><title>Next Page,</title>
</head>
-<body>View Results
+<body>
<a href="edit.html">Edit</a>
-<script language="JavaScript" type="text/javascript" src="multi-file-edit.js"></script>
+
+<form id="testForm" name="viewTestConfigurationForm" method="post"
+ action="view.html" enctype="application/x-www-form-urlencoded">
+
+<script language="JavaScript" type="text/javascript"
+ src="../../../../js/multi-file-edit.js"></script>
<form id="testForm" name="viewTestConfigurationForm" method="post"
action="view.html" enctype="application/x-www-form-urlencoded">
<script type="text/javascript">
-var multiFileEdit = new MultiFileEdit();
-multiFileEdit.disabled=1;
-multiFileEdit.drawTable();
+ var multiFileEdit = new MultiFileEdit();
+ multiFileEdit.disabled=1;
+
+ for (i=0; i < 6 ;i++)
+ {
+ multiFileEdit.addArchive("/tmp/file/"+i,
+ "/tmp/file"+i +" archive = "+ i);
+ }
+ multiFileEdit.downloadUrl = "download.html";
+ multiFileEdit.drawTable();
+
</script>
+
</form>
</html>
commit 251585325bba4f982a779a6c1289bb40eab067f6
Author: Adam Young <ayoung(a)redhat.com>
Date: Tue Jan 5 17:19:26 2010 -0500
added reset on file by file basis. Added Renderer and component for MultiFile, and changed the names in the tag library. The RawConfigRenderer and ConfigUIComponent are still there, but have no component names or tags
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileRenderer.java
new file mode 100644
index 0000000..ada4926
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileRenderer.java
@@ -0,0 +1,70 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.gui.configuration;
+
+import java.io.IOException;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
+
+/**
+ * A renderer that renders an {@link RawConfigurationComponent} component as XHTML.
+ *
+ * @author Adam Young
+ */
+public class MultiFileRenderer extends Renderer {
+
+ @Override
+ public void decode(FacesContext context, UIComponent component) {
+ super.decode(context, component);
+ }
+
+ @Override
+ public boolean getRendersChildren() {
+ return true;
+ }
+
+ @Override
+ public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
+ ResponseWriter writer = context.getResponseWriter();
+
+ writer
+ .write("<script language=\"JavaScript\" type=\"text/javascript\" src=\"/js/multi-file-edit.js\" ></script>\n");
+
+ writer.write("<script type=\"text/javascript\">\n");
+ writer.write("var multiFileEdit = new MultiFileEdit();\n");
+
+ for (int i = 0; i < 6; i++) {
+ writer.write("multiFileEdit.addArchive(\"/tmp/file/" + i + "\",\"/tmp/file" + i + " archive = " + i
+ + "\");");
+ }
+
+ writer.write("multiFileEdit.downloadUrl = \"download.jsp\";\n");
+
+ writer.write("multiFileEdit.drawTable();\n");
+ writer.write("</script>\n");
+
+ }
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileUIComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileUIComponent.java
new file mode 100644
index 0000000..07acaab
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/MultiFileUIComponent.java
@@ -0,0 +1,38 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.gui.configuration;
+
+import javax.faces.component.UIComponentBase;
+
+/**
+ * @author Adam Young
+ */
+public class MultiFileUIComponent extends UIComponentBase {
+
+ private static final String family = "rhq";
+
+ @Override
+ public String getFamily() {
+ return family;
+ }
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml
index 8bb4c13..49345f6 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml
@@ -10,16 +10,14 @@
</component>
<component>
- <component-type>org.jboss.on.RawConfig</component-type>
- <component-class>org.rhq.core.gui.configuration.RawConfigUIComponent</component-class>
+ <component-type>org.jboss.on.MultiFile</component-type>
+ <component-class>org.rhq.core.gui.configuration.MultiFileUIComponent</component-class>
</component>
-
-
- <component>
- <component-type>org.rhq.ConfigurationSet</component-type>
- <component-class>org.rhq.core.gui.configuration.propset.ConfigurationSetComponent</component-class>
- </component>
+ <component>
+ <component-type>org.rhq.ConfigurationSet</component-type>
+ <component-class>org.rhq.core.gui.configuration.propset.ConfigurationSetComponent</component-class>
+ </component>
<render-kit>
<renderer>
@@ -30,10 +28,10 @@
</renderer>
<renderer>
- <description>renderer for Raw Config components</description>
+ <description>renderer for Multi-File Editor</description>
<component-family>rhq</component-family>
- <renderer-type>org.jboss.on.RawConfig</renderer-type>
- <renderer-class>org.rhq.core.gui.configuration.RawConfigRenderer</renderer-class>
+ <renderer-type>org.jboss.on.MultiFile</renderer-type>
+ <renderer-class>org.rhq.core.gui.configuration.MultiFileRenderer</renderer-class>
</renderer>
</render-kit>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tags/on.component.taglib.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tags/on.component.taglib.xml
index 0870441..1fc9928 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tags/on.component.taglib.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tags/on.component.taglib.xml
@@ -65,10 +65,10 @@
</tag>
<tag>
- <tag-name>rawconfig</tag-name>
+ <tag-name>multifile</tag-name>
<component>
- <component-type>org.jboss.on.RawConfig</component-type>
- <renderer-type>org.jboss.on.RawConfig</renderer-type>
+ <component-type>org.jboss.on.MultiFile</component-type>
+ <renderer-type>org.jboss.on.MultiFile</renderer-type>
</component>
</tag>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
index c474326..6de5fe8 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
@@ -1,103 +1,137 @@
-function ArchiveFile(p,c) {
- this.path = p;
- this.dirty = 0;
- this.contents = c;
+function ArchiveFile(p, c) {
+ this.path = p;
+ this.dirty = 0;
+ this.contents = c;
}
-
-
-
-
/*
* This is a class for editing a collection of files, represented by a map.
- * There is a list of links in the left column, each which represent a file,
- * a textarea input that changes based on which link is selected
+ * There is a list of links in the left column, each which represent a file, a
+ * textarea input that changes based on which link is selected
*/
-function MultiFileEdit(){
+function MultiFileEdit() {
this.currentIndex = 0;
- this.isDirty = 0;
- this.archive = new Array();
- this.disabled=0;
+ this.archive = [];
+ this.originalCopies = [];
+ this.disabled = 0;
+ this.uploadUrl = "upload.html";
+ this.downloadUrl = "#";
- this.initializeArchive = function(){
- var i=0;
- for (i=0; i < 6 ;i++)
- {
- this.archive[i] = new ArchiveFile("/tmp/file/"+i, "/tmp/file/"+i +" archive = "+ this.archive.length);
+
+ this.addArchive = function(p,c){
+ this.originalCopies.push( new ArchiveFile(p,c));
+ }
+
+ this.initializeArchive = function() {
+ this.archive = [];
+ if ( this.originalCopies.length < 1){
+ this.archive.push(new ArchiveFile("/dev/null","No files specified"));
+ }else {
+ var i;
+ for (i=0; i < this.originalCopies.length ;i++){
+ var original = this.originalCopies[i];
+ this.archive.push(new ArchiveFile(original.path,original.contents));
+ }
}
}
- this.setTextAreaValue = function(id)
- {
- if (this.currentIndex % 2 == 0){
- document.getElementById("file-row-"+this.currentIndex).className = "OddRow";
- }else{
- document.getElementById("file-row-"+this.currentIndex).className = "EvenRow";
+
+ this.setTextAreaValue = function(id) {
+ if (this.currentIndex % 2 == 0) {
+ document.getElementById("file-row-" + this.currentIndex).className = "OddRow";
+ } else {
+ document.getElementById("file-row-" + this.currentIndex).className = "EvenRow";
}
-
+
this.currentIndex = id;
document.getElementById("testForm").textarea.value = multiFileEdit.archive[this.currentIndex].contents;
- document.getElementById("file-row-"+id).className = "SelectedRow";
+ document.getElementById("file-row-" + id).className = "SelectedRow";
document.getElementById("testForm").textarea.focus();
document.getElementById("current-path-span").firstChild.data = multiFileEdit.archive[this.currentIndex].path;
}
-
-
- this.resetArchive = function(){
+
+ this.resetArchive = function() {
this.initializeArchive();
this.setTextAreaValue(0);
- this.isDirty = 0;
- for (i=0; i < this.archive.length ;i++)
- {
- document.getElementById("dirty-span-"+i).style.visibility="hidden";
+ window.onbeforeunload = 0;
+ for (i = 0; i < this.archive.length; i++) {
+ document.getElementById("dirty-span-" + i).style.visibility = "hidden";
+ document.getElementById("reset-span-" + i).style.visibility = "hidden";
}
}
- function askConfirm(){
+
+ this.resetFile = function(index){
+
+ if (index >= this.originalCopies.length) return;
+ if (index < 0 ) return;
+ var original = this.originalCopies[index];
+ this.archive[index] = new ArchiveFile(original.path,original.contents);
+
+ document.getElementById("dirty-span-" + index).style.visibility = "hidden";
+ document.getElementById("reset-span-" + index).style.visibility = "hidden";
+
+ this.setTextAreaValue(index);
+
+ }
+
+ function askConfirm() {
return "You have unsaved changes.";
}
-
- this.updateArchive = function(){
-
+ this.updateArchive = function() {
+
window.onbeforeunload = askConfirm;
-
- this.isDirty = 1;
- this.archive[this.currentIndex].contents = document.getElementById("testForm").textarea.value;
+ this.archive[this.currentIndex].contents = document
+ .getElementById("testForm").textarea.value;
this.archive[this.currentIndex].dirty = 1;
- document.getElementById("dirty-span-"+this.currentIndex).style.visibility="visible";
- }
+ document.getElementById("dirty-span-" + this.currentIndex).style.visibility = "visible";
+ document.getElementById("reset-span-" + this.currentIndex).style.visibility = "visible";
+ }
- this.generateLinks = function(){
- var i=0;
- var style =0;
+ this.generateLinks = function() {
+ var i = 0;
+ var style = 0;
var divclass = "";
- document.write("<table BORDER=0 RULES=NONE FRAME=BOX><th><td>Configuration File Paths</td><td></td></th>");
- for (i=0; i < multiFileEdit.archive.length ;i++){
-
- if (i == 0){
- divclass="SelectedRow"
- }else if (style != 0){
+ document
+ .write("<table BORDER=0 RULES=NONE FRAME=BOX><th><td>Configuration File Paths</td><td></td></th>");
+ for (i = 0; i < multiFileEdit.archive.length; i++) {
+
+ if (i == 0) {
+ divclass = "SelectedRow"
+ } else if (style != 0) {
style = 0;
- divclass="OddRow"
- }else{
+ divclass = "OddRow"
+ } else {
style = 1;
- divclass="EvenRow"
+ divclass = "EvenRow"
}
-
- document.write("<tr id='file-row-"+i+"'class='"+ divclass +"'>");
+
+ document.write("<tr id='file-row-" + i + "'class='" + divclass
+ + "'>");
document.write("<td>");
- document.write("<span id='dirty-span-"+i+"' style=\"visibility:hidden;\" > * </span>");
+ document.write("<span id='dirty-span-" + i
+ + "' style=\"visibility:hidden;\" > * </span>");
document.write("</td><td>");
- document.write("<a href=\"#\" onclick='multiFileEdit.setTextAreaValue("+i+")' >"+ multiFileEdit.archive[i].path);
- document.write("</a>");
+ document
+ .write("<a href=\"#\" onclick='multiFileEdit.setTextAreaValue("
+ + i + ")' >" + multiFileEdit.archive[i].path);
+ document.write("</a>");
+
+ document.write(" <span id='reset-span-" + i
+ + "' style=\"visibility:hidden;\" >");
+ document.write("<a href='#' onclick=' multiFileEdit.resetFile("+i+");' >reset</a> </span>");
+
+
document.write("</td></tr>");
}
- document.write("</table>");
-
+ document.write("</table>");
+
}
- this.drawTable = function(){
+ this.drawTable = function() {
+ this.initializeArchive();
+
document.write("<style type=\"text/css\">");
document.write("td.multi-edit-table {");
document.write("vertical-align: top;");
@@ -113,76 +147,86 @@ function MultiFileEdit(){
document.write("tr.SelectedRow {");
document.write("background-color:white;");
document.write("}");
-
-
+
document.write("</style>");
- document.write("<table class='multi-edit-table' border='0' cellpadding='0' >");
+ document
+ .write("<table class='multi-edit-table' border='0' cellpadding='0' >");
document.write("<tbody>");
document.write("<tr>");
document.write("<td class='multi-edit-table' bgcolor='#a4b2b9'>");
this.generateLinks();
document.write("</td>");
document.write("<td>");
- document.write("<div><span id='current-path-span'>Current File Name Goes here</span> ..................");
- document.write("<a href=\"#\"><img src='/images/download.png'/> Download</a>");
- document.write("<a href=\"#\" ");
- document.write("onclick=\"multiFileEdit.fullscreen()\"> ");
+ document.write("<div><span id='current-path-span'>");
+ document.write(multiFileEdit.archive[this.currentIndex].path);
+ document.write("</span> ..................");
+ document.write("<a href='#'");
+ document.write("onclick=\"multiFileEdit.download()\"> ");
+ document.write("<img src='/images/download.png'/> Download</a>");
+ document.write("<a href='#' ");
+ document.write("onclick=\"multiFileEdit.fullscreen()\"> ");
document.write("<img src='/images/viewfullscreen.png'/> Full Screen</a>")
document.write("</div>");
- document.write("<textarea id='textarea' ");
- if (this.disabled){
+ document.write("<textarea id='textarea' ");
+ if (this.disabled) {
document.write("disabled ");
}
- document.write("onkeyup='multiFileEdit.updateArchive();' cols='80' rows='40'>");
+ document
+ .write("onkeyup='multiFileEdit.updateArchive();' cols='80' rows='25'>");
document.write(multiFileEdit.archive[0].contents);
document.write("</textarea>");
document.write("<div>upload New Version</div>");
- document.write("<div>Select A File: <input type='file'/> </div>");
+ document.write("<div>Select A File: <input type='file' onchange='alert(\"onchange called\");' /> </div>");
+
+ document.write("</form>");
+
document.write("</td>");
document.write("</tr>");
document.write("</tbody>");
- document.write("</table>");
-
- }
-
- this.fullscreen= function()
- {
-
- var generator=window.open('','full screen','width=1024,height=768,left=0,top=100,screenX=0,screenY=0');
- generator.document.write('<html><head><title>Popup</title>');
- generator.document.write('<link rel="stylesheet" href="style.css">');
- generator.document.write('<script language="JavaScript" type="text/javascript" src="/js/multi-file-edit.js"></script>');
- generator.document.write('</head><body>');
- generator.document.write("<form id='full-screen-edit-form'>");
- generator.document.write("<div><span id='current-path-span'>" +multiFileEdit.archive[this.currentIndex].path+"</span> ");
- generator.document.write("<a href=\"javascript:self.close();\" >Close</a>..................");
- generator.document.write("</div>");
- generator.document.write("<textarea id='textarea' onkeyup='update_parent();' ");
- if (this.disabled){
- generator.document.write("disabled ");
- }
- generator.document.write("cols='200' rows='45'>");
- generator.document.write(multiFileEdit.archive[this.currentIndex].contents);
- generator.document.write("</textarea>");
- generator.document.write("</form>");
- generator.document.write('</body></html>');
-
- generator.document.getElementById("full-screen-edit-form").textarea.focus();
-
- generator.document.close();
-
+ document.write("</table>");
}
-
- this.initializeArchive();
-}
+ this.fullscreen = function() {
+
+ var generator = window.open('', 'full screen',
+ 'width=1024,height=768,left=0,top=100,screenX=0,screenY=0');
+ generator.document.write('<html><head><title>Popup</title>');
+ generator.document.write('<link rel="stylesheet" href="style.css">');
+ generator.document
+ .write('<script language="JavaScript" type="text/javascript" src="/js/multi-file-edit.js"></script>');
+ generator.document.write('</head><body>');
+ generator.document.write("<form id='full-screen-edit-form'>");
+ generator.document.write("<div><span id='current-path-span'>"
+ + multiFileEdit.archive[this.currentIndex].path + "</span> ");
+ generator.document
+ .write("<a href=\"javascript:self.close();\" >Close</a>..................");
+ generator.document.write("</div>");
+ generator.document
+ .write("<textarea id='textarea' onkeyup='update_parent();' ");
+ if (this.disabled) {
+ generator.document.write("disabled ");
+ }
+ generator.document.write("cols='200' rows='45'>");
+ generator.document
+ .write(multiFileEdit.archive[this.currentIndex].contents);
+ generator.document.write("</textarea>");
+ generator.document.write("</form>");
+ generator.document.write('</body></html>');
+ generator.document.getElementById("full-screen-edit-form").textarea
+ .focus();
+ generator.document.close();
+ }
-function update_parent(){
- opener.document.getElementById("testForm").textarea.value = document.getElementById("full-screen-edit-form").textarea.value;
- opener.multiFileEdit.updateArchive()
+ this.download= function() {
+ var generator = window.open(this.downloadUrl,'');
+ }
+
}
-
-
+function update_parent() {
+ opener.document.getElementById("testForm").textarea.value = document
+ .getElementById("full-screen-edit-form").textarea.value;
+ opener.multiFileEdit.updateArchive()
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
index b0ccb55..4bca60b 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
@@ -17,24 +17,15 @@ THIS TEXT WILL BE REMOVED.
THIS TEXT WILL BE REMOVED AS WELL.
- <ui:param name="pageTitle" value="View Test Configuration"/>
-
+ <ui:param name="pageTitle" value=" Raw Edit Configuration Test"/>
<ui:define name="body">
- <a href="view-raw-config.xhtml">View</a>
- <script language="JavaScript" type="text/javascript" src="/js/multi-file-edit.js"></script>
-
-
- <form id="testForm">
- <script type="text/javascript">
- var multiFileEdit = new MultiFileEdit();
- multiFileEdit.drawTable();
- </script>
- <input type="submit" />
- <input type="reset" onclick="multiFileEdit.resetArchive();" />
- </form>
-
+ <a href="view-raw-config.xhtml">View</a>
+ <form id="testForm">
+ <onc:multifile></onc:multifile>
+ <input type="submit" value="Commit"/>
+ <input type="reset" onclick="multiFileEdit.resetArchive();" />
+ </form>
</ui:define>
-
</ui:composition>
THIS TEXT WILL BE REMOVED AS WELL.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
index 4b41986..4acac4b 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
@@ -8,15 +8,23 @@
<a href="view.html">View</a>
-<script language="JavaScript" type="text/javascript" src="../../../../js/multi-file-edit.js"></script>
+<script language="JavaScript" type="text/javascript"
+ src="../../../../js/multi-file-edit.js"></script>
<form id="testForm" name="viewTestConfigurationForm" method="post"
action="view.html" enctype="application/x-www-form-urlencoded">
<script type="text/javascript">
var multiFileEdit = new MultiFileEdit();
+ for (i=0; i < 6 ;i++)
+ {
+ multiFileEdit.addArchive("/tmp/file/"+i,
+ "/tmp/file"+i +" archive = "+ i);
+ }
+ multiFileEdit.downloadUrl = "download.html";
multiFileEdit.drawTable();
-</script>
-<input type="submit" /><input type="reset" onclick="multiFileEdit.resetArchive();" /></form>
+
+</script> <input type="submit" /><input type="reset"
+ onclick="multiFileEdit.resetArchive();" /></form>
commit 5a1348549eb334763745e05fbcc2e26a03a80ee4
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 4 20:17:08 2010 -0500
an intermediate checkin of some half completed custom tag for the raw config work.
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigRenderer.java
new file mode 100644
index 0000000..823d693
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigRenderer.java
@@ -0,0 +1,58 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.gui.configuration;
+
+import java.io.IOException;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.render.Renderer;
+
+/**
+ * A renderer that renders an {@link RawConfigurationComponent} component as XHTML.
+ *
+ * @author Adam Young
+ */
+public class RawConfigRenderer extends Renderer {
+
+ @Override
+ public void decode(FacesContext context, UIComponent component) {
+ // TODO Auto-generated method stub
+ super.decode(context, component);
+ }
+
+ @Override
+ public boolean getRendersChildren() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
+ // TODO Auto-generated method stub
+ component.encodeBegin(context);
+
+ super.encodeBegin(context, component);
+ }
+
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigUIComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigUIComponent.java
new file mode 100644
index 0000000..3694f09
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/RawConfigUIComponent.java
@@ -0,0 +1,143 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.gui.configuration;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Vector;
+
+import javax.faces.component.UIComponentBase;
+import javax.faces.component.UIPanel;
+import javax.faces.component.UIParameter;
+import javax.faces.component.html.HtmlCommandLink;
+import javax.faces.component.html.HtmlInputTextarea;
+import javax.faces.component.html.HtmlPanelGrid;
+import javax.faces.context.FacesContext;
+
+import org.rhq.core.gui.util.FacesComponentIdFactory;
+import org.rhq.core.gui.util.FacesComponentUtility;
+
+/**
+
+ * @author Adam Young
+ */
+public class RawConfigUIComponent extends UIComponentBase {
+ private static final String family = "rhq";
+ private static final CharSequence TABLE_STYLE = "<style type=\"text/css\">" + "td.raw-config-table {"
+ + "vertical-align: top;" + "valign: top;" + "}" + "</style>";
+ private FacesComponentIdFactory idFactory;
+ private HtmlInputTextarea inputTextarea;
+ private ArrayList<String> configPathList;
+ public HtmlCommandLink saveLink;
+ private Vector<HtmlCommandLink> pathCommandLinks;
+ private ArrayList<UIParameter> readOnlyParms;
+ private boolean readOnly;
+
+ @Override
+ public String getFamily() {
+ return family;
+ }
+
+ private void buildChildren() {
+
+ if (getChildCount() > 0) {
+ return;
+ }
+
+ FacesComponentUtility.addVerbatimText(this, TABLE_STYLE);
+
+ UIPanel rawPanel = FacesComponentUtility.addBlockPanel(this, idFactory, "");
+
+ HtmlPanelGrid grid = FacesComponentUtility.addPanelGrid(rawPanel, idFactory, 2, "summary-props-table");
+ grid.setParent(this);
+
+ grid.setColumnClasses("raw-config-table");
+
+ HtmlPanelGrid panelLeft = FacesComponentUtility.addPanelGrid(grid, idFactory, 1, "summary-props-table");
+ panelLeft.setBgcolor("#a4b2b9");
+
+ FacesComponentUtility.addOutputText(panelLeft, idFactory, "Raw Configurations Paths", "");
+
+ int rawCount = 0;
+
+ configPathList = new ArrayList<String>();
+ Collections.sort(configPathList);
+ String oldDirname = "";
+
+ pathCommandLinks = new Vector<HtmlCommandLink>();
+ for (String s : configPathList) {
+
+ String dirname = s.substring(0, s.lastIndexOf("/") + 1);
+ String basename = s.substring(s.lastIndexOf("/") + 1, s.length());
+ if (!dirname.equals(oldDirname)) {
+ FacesComponentUtility.addOutputText(panelLeft, idFactory, dirname, "");
+ oldDirname = dirname;
+ }
+ UIPanel nextPath = FacesComponentUtility.addBlockPanel(panelLeft, idFactory, "");
+ HtmlCommandLink link = FacesComponentUtility.addCommandLink(nextPath, idFactory);
+ FacesComponentUtility.addOutputText(link, idFactory, "", "");
+ FacesComponentUtility.addOutputText(link, idFactory, basename, "");
+ FacesComponentUtility.addParameter(link, idFactory, "path", s);
+ FacesComponentUtility.addParameter(link, idFactory, "whichRaw", Integer.toString(rawCount++));
+ FacesComponentUtility.addParameter(link, idFactory, "showRaw", Boolean.TRUE.toString());
+ readOnlyParms.add(FacesComponentUtility.addParameter(link, idFactory, "readOnly", Boolean
+ .toString(readOnly)));
+
+ pathCommandLinks.add(link);
+ }
+
+ UIPanel panelRight = FacesComponentUtility.addBlockPanel(grid, idFactory, "summary-props-table");
+ UIPanel editPanel = FacesComponentUtility.addBlockPanel(panelRight, idFactory, "summary-props-table");
+ this.inputTextarea = createConfigTextArea(readOnly);
+ editPanel.getChildren().add(this.inputTextarea);
+ inputTextarea.setParent(editPanel);
+
+ }
+
+ @Override
+ public void encodeBegin(FacesContext context) throws IOException {
+ // TODO Auto-generated method stub
+ buildChildren();
+
+ }
+
+ public ArrayList<String> getConfigPathList() {
+ return configPathList;
+ }
+
+ public void setConfigPathList(ArrayList<String> configPathList) {
+ this.configPathList = configPathList;
+ }
+
+ private HtmlInputTextarea createConfigTextArea(boolean readOnly) {
+ HtmlInputTextarea inputTextarea = new HtmlInputTextarea();
+ inputTextarea.setId("rawconfigtextarea");
+ inputTextarea.setCols(80);
+ inputTextarea.setRows(40);
+ inputTextarea.setReadonly(readOnly);
+
+ return inputTextarea;
+ }
+
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/test/ViewRawTestConfigurationUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/test/ViewRawTestConfigurationUIBean.java
new file mode 100644
index 0000000..b2b6900
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/test/ViewRawTestConfigurationUIBean.java
@@ -0,0 +1,32 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.configuration.test;
+
+import org.rhq.enterprise.gui.common.Outcomes;
+
+/**
+ * @author Adam Young
+ */
+public class ViewRawTestConfigurationUIBean extends AbstractTestConfigurationUIBean {
+ public static final String MANAGED_BEAN_NAME = ViewRawTestConfigurationUIBean.class.getSimpleName();
+
+ public String editConfiguration() {
+ return Outcomes.SUCCESS;
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml
index 1f7918f..8bb4c13 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-components/configuration-components.xml
@@ -9,6 +9,13 @@
<component-class>org.rhq.core.gui.configuration.ConfigUIComponent</component-class>
</component>
+ <component>
+ <component-type>org.jboss.on.RawConfig</component-type>
+ <component-class>org.rhq.core.gui.configuration.RawConfigUIComponent</component-class>
+ </component>
+
+
+
<component>
<component-type>org.rhq.ConfigurationSet</component-type>
<component-class>org.rhq.core.gui.configuration.propset.ConfigurationSetComponent</component-class>
@@ -21,6 +28,14 @@
<renderer-type>org.jboss.on.Config</renderer-type>
<renderer-class>org.rhq.core.gui.configuration.ConfigRenderer</renderer-class>
</renderer>
+
+ <renderer>
+ <description>renderer for Raw Config components</description>
+ <component-family>rhq</component-family>
+ <renderer-type>org.jboss.on.RawConfig</renderer-type>
+ <renderer-class>org.rhq.core.gui.configuration.RawConfigRenderer</renderer-class>
+ </renderer>
+
</render-kit>
<component>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/test-beans.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/test-beans.xml
index 3ec6058..daec506 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/test-beans.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/test-beans.xml
@@ -11,6 +11,14 @@
</managed-bean>
<managed-bean>
+ <managed-bean-name>ViewRawTestConfigurationUIBean</managed-bean-name>
+ <managed-bean-class>org.rhq.enterprise.gui.configuration.test.ViewRawTestConfigurationUIBean</managed-bean-class>
+ <managed-bean-scope>request</managed-bean-scope>
+ </managed-bean>
+
+
+
+ <managed-bean>
<managed-bean-name>EditTestConfigurationUIBean</managed-bean-name>
<managed-bean-class>org.rhq.enterprise.gui.configuration.test.EditTestConfigurationUIBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
new file mode 100644
index 0000000..4b41986
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/edit.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<title>Test multi-edit control</title>
+</head>
+
+
+<body>
+
+<a href="view.html">View</a>
+
+<script language="JavaScript" type="text/javascript" src="../../../../js/multi-file-edit.js"></script>
+
+<form id="testForm" name="viewTestConfigurationForm" method="post"
+ action="view.html" enctype="application/x-www-form-urlencoded">
+<script type="text/javascript">
+ var multiFileEdit = new MultiFileEdit();
+ multiFileEdit.drawTable();
+</script>
+<input type="submit" /><input type="reset" onclick="multiFileEdit.resetArchive();" /></form>
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html
new file mode 100644
index 0000000..c1084fa
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/raw/view.html
@@ -0,0 +1,18 @@
+<html><head><title>Next Page,</title>
+</head>
+<body>View Results
+
+<a href="edit.html">Edit</a>
+<script language="JavaScript" type="text/javascript" src="multi-file-edit.js"></script>
+
+<form id="testForm" name="viewTestConfigurationForm" method="post"
+ action="view.html" enctype="application/x-www-form-urlencoded">
+<script type="text/javascript">
+var multiFileEdit = new MultiFileEdit();
+multiFileEdit.disabled=1;
+multiFileEdit.drawTable();
+</script>
+</form>
+
+</html>
+</body>
commit 038e268f4eb32afa9dcf3f60092bf75beaa67f30
Author: Adam Young <ayoung(a)redhat.com>
Date: Mon Jan 4 20:12:48 2010 -0500
Made necessary changes so the javscript multi-file-edit works inside a webapp.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
index f06e7e5..c474326 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
@@ -4,6 +4,10 @@ function ArchiveFile(p,c) {
this.contents = c;
}
+
+
+
+
/*
* This is a class for editing a collection of files, represented by a map.
* There is a list of links in the left column, each which represent a file,
@@ -29,7 +33,6 @@ function MultiFileEdit(){
document.getElementById("file-row-"+this.currentIndex).className = "OddRow";
}else{
document.getElementById("file-row-"+this.currentIndex).className = "EvenRow";
-
}
this.currentIndex = id;
@@ -60,7 +63,7 @@ function MultiFileEdit(){
window.onbeforeunload = askConfirm;
this.isDirty = 1;
- this.archive[this.currentIndex].contents = textarea.value ;
+ this.archive[this.currentIndex].contents = document.getElementById("testForm").textarea.value;
this.archive[this.currentIndex].dirty = 1;
document.getElementById("dirty-span-"+this.currentIndex).style.visibility="visible";
}
@@ -124,13 +127,13 @@ function MultiFileEdit(){
document.write("<a href=\"#\"><img src='/images/download.png'/> Download</a>");
document.write("<a href=\"#\" ");
document.write("onclick=\"multiFileEdit.fullscreen()\"> ");
- document.write("<img src='/images/fullscreen.png'/> Full Screen</a>")
+ document.write("<img src='/images/viewfullscreen.png'/> Full Screen</a>")
document.write("</div>");
document.write("<textarea id='textarea' ");
if (this.disabled){
document.write("disabled ");
}
- document.write("onkeyup='multiFileEdit.updateArchive()' cols='80' rows='40'>");
+ document.write("onkeyup='multiFileEdit.updateArchive();' cols='80' rows='40'>");
document.write(multiFileEdit.archive[0].contents);
document.write("</textarea>");
@@ -145,16 +148,15 @@ function MultiFileEdit(){
this.fullscreen= function()
{
-
var generator=window.open('','full screen','width=1024,height=768,left=0,top=100,screenX=0,screenY=0');
generator.document.write('<html><head><title>Popup</title>');
generator.document.write('<link rel="stylesheet" href="style.css">');
- generator.document.write('<script language="JavaScript" type="text/javascript" src="multi-file-edit.js"></script>');
+ generator.document.write('<script language="JavaScript" type="text/javascript" src="/js/multi-file-edit.js"></script>');
generator.document.write('</head><body>');
generator.document.write("<form id='full-screen-edit-form'>");
generator.document.write("<div><span id='current-path-span'>" +multiFileEdit.archive[this.currentIndex].path+"</span> ");
- generator.document.write("<a href=\"javascript:self.close();\">Close</a>..................");
+ generator.document.write("<a href=\"javascript:self.close();\" >Close</a>..................");
generator.document.write("</div>");
generator.document.write("<textarea id='textarea' onkeyup='update_parent();' ");
if (this.disabled){
@@ -181,3 +183,6 @@ function update_parent(){
opener.document.getElementById("testForm").textarea.value = document.getElementById("full-screen-edit-form").textarea.value;
opener.multiFileEdit.updateArchive()
}
+
+
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
index ac8521a..b0ccb55 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
@@ -24,23 +24,13 @@ THIS TEXT WILL BE REMOVED.
<script language="JavaScript" type="text/javascript" src="/js/multi-file-edit.js"></script>
- <h:messages showSummary="true"
- showDetail="true"
- errorClass="ErrorBlock"
- warnClass="ErrorBlock"
- infoClass="ConfirmationBlock"
- globalOnly="true"
- layout="table"
- width="100%"/>
<form id="testForm">
<script type="text/javascript">
var multiFileEdit = new MultiFileEdit();
multiFileEdit.drawTable();
- multiFileEdit.setTextAreaValue(0);
</script>
<input type="submit" />
<input type="reset" onclick="multiFileEdit.resetArchive();" />
- <a href="next-page.html" onclick="checkDirty()">Go to next Page</a>
</form>
</ui:define>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml
index fa8b2b3..238ccb4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml
@@ -38,7 +38,6 @@ THIS TEXT WILL BE REMOVED.
var multiFileEdit = new MultiFileEdit();
multiFileEdit.disabled=1;
multiFileEdit.drawTable();
- multiFileEdit.setTextAreaValue(0);
</script>
<input type="submit" />
<input type="reset" onclick="multiFileEdit.resetArchive();" />
commit a28c91ba90b5d5caddc3a13baf06beb15def7718
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Dec 23 20:03:26 2009 -0500
Use of visibility attribute to hide/show asterix
Modified icon paths so that they show in webapp
Initialized document in fullscreen view
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
index fee0065..f06e7e5 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
@@ -46,7 +46,7 @@ function MultiFileEdit(){
this.isDirty = 0;
for (i=0; i < this.archive.length ;i++)
{
- document.getElementById("dirty-span-"+i).firstChild.data = "O ";
+ document.getElementById("dirty-span-"+i).style.visibility="hidden";
}
}
@@ -62,14 +62,14 @@ function MultiFileEdit(){
this.isDirty = 1;
this.archive[this.currentIndex].contents = textarea.value ;
this.archive[this.currentIndex].dirty = 1;
- document.getElementById("dirty-span-"+this.currentIndex).firstChild.data = "X ";
+ document.getElementById("dirty-span-"+this.currentIndex).style.visibility="visible";
}
this.generateLinks = function(){
var i=0;
var style =0;
var divclass = "";
- document.write("<table><th><td>Configuration File Paths</td><td></td></th>");
+ document.write("<table BORDER=0 RULES=NONE FRAME=BOX><th><td>Configuration File Paths</td><td></td></th>");
for (i=0; i < multiFileEdit.archive.length ;i++){
if (i == 0){
@@ -84,7 +84,7 @@ function MultiFileEdit(){
document.write("<tr id='file-row-"+i+"'class='"+ divclass +"'>");
document.write("<td>");
- document.write("<span id='dirty-span-"+i+"'>O </span>");
+ document.write("<span id='dirty-span-"+i+"' style=\"visibility:hidden;\" > * </span>");
document.write("</td><td>");
document.write("<a href=\"#\" onclick='multiFileEdit.setTextAreaValue("+i+")' >"+ multiFileEdit.archive[i].path);
document.write("</a>");
@@ -111,6 +111,7 @@ function MultiFileEdit(){
document.write("background-color:white;");
document.write("}");
+
document.write("</style>");
document.write("<table class='multi-edit-table' border='0' cellpadding='0' >");
document.write("<tbody>");
@@ -120,10 +121,10 @@ function MultiFileEdit(){
document.write("</td>");
document.write("<td>");
document.write("<div><span id='current-path-span'>Current File Name Goes here</span> ..................");
- document.write("<a href=\"#\"><img src='images/download.png'/> Download</a>");
+ document.write("<a href=\"#\"><img src='/images/download.png'/> Download</a>");
document.write("<a href=\"#\" ");
document.write("onclick=\"multiFileEdit.fullscreen()\"> ");
- document.write("<img src='images/fullscreen.png'/> Full Screen</a>")
+ document.write("<img src='/images/fullscreen.png'/> Full Screen</a>")
document.write("</div>");
document.write("<textarea id='textarea' ");
if (this.disabled){
@@ -143,36 +144,32 @@ function MultiFileEdit(){
}
this.fullscreen= function()
- {
+ {
+
+
var generator=window.open('','full screen','width=1024,height=768,left=0,top=100,screenX=0,screenY=0');
generator.document.write('<html><head><title>Popup</title>');
- generator.document.write('<link rel="stylesheet" href="style.css">');
-
+ generator.document.write('<link rel="stylesheet" href="style.css">');
generator.document.write('<script language="JavaScript" type="text/javascript" src="multi-file-edit.js"></script>');
-
- generator.document.write('</head><body>');
-
+ generator.document.write('</head><body>');
generator.document.write("<form id='full-screen-edit-form'>");
- generator.document.write("<div><span id='current-path-span'>Current File Name Goes here</span> ");
+ generator.document.write("<div><span id='current-path-span'>" +multiFileEdit.archive[this.currentIndex].path+"</span> ");
generator.document.write("<a href=\"javascript:self.close();\">Close</a>..................");
generator.document.write("</div>");
generator.document.write("<textarea id='textarea' onkeyup='update_parent();' ");
-
if (this.disabled){
generator.document.write("disabled ");
- }
-
+ }
generator.document.write("cols='200' rows='45'>");
+ generator.document.write(multiFileEdit.archive[this.currentIndex].contents);
generator.document.write("</textarea>");
- generator.document.write("</form>");
-
+ generator.document.write("</form>");
generator.document.write('</body></html>');
- generator.document.getElementById("current-path-span").firstChild.data = multiFileEdit.archive[this.currentIndex].path;
- generator.document.getElementById("full-screen-edit-form").textarea.value = multiFileEdit.archive[this.currentIndex].contents;
generator.document.getElementById("full-screen-edit-form").textarea.focus();
-
+
generator.document.close();
+
}
commit 4b1bece8d110645b65381629180c7a2429b80e03
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Dec 23 15:22:54 2009 -0500
Classpath changes, mostly for sources.
diff --git a/.classpath b/.classpath
index 5166ebf..c530af4 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="modules/common/jboss-as/src/main/java"/>
+ <classpathentry kind="src" path="modules/test-utils/src/main/java"/>
<classpathentry kind="src" path="modules/common/jboss-as/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/jboss-as/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/jboss-as/src/test/java"/>
@@ -13,7 +14,7 @@
<classpathentry kind="src" path="modules/plugins/tomcat/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/jboss-cache/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/jboss-cache-v3/src/main/java"/>
- <classpathentry excluding="org/rhq/plugins/antlrconfig/" kind="src" path="modules/plugins/antlr-config/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/antlr-config/src/main/java"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/integration/jboss-profileservice-spi/5.1.0.SP1/jboss-profileservice-spi-5.1.0.SP1.jar"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/man/jboss-managed/2.1.1.GA/jboss-managed-2.1.1.GA.jar"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/man/jboss-metatype/2.1.1.GA/jboss-metatype-2.1.1.GA.jar"/>
@@ -110,7 +111,6 @@
<classpathentry kind="src" path="modules/plugins/antlr-config/src/main/antlr3"/>
<classpathentry kind="src" path="modules/plugins/antlr-config/target/generated-sources/antlr3"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/main/java"/>
- <classpathentry kind="src" path="modules/plugins/augeas/src/test/java"/>
<classpathentry kind="src" path="modules/helpers/rtfilter/src/main/java"/>
<classpathentry kind="src" path="modules/helpers/pluginAnnotations/src/main/java"/>
<classpathentry kind="src" path="modules/helpers/pluginGen/src/main/java"/>
@@ -211,5 +211,8 @@
<classpathentry exported="true" kind="var" path="M2_REPO/pircbot/pircbot/1.4.2/pircbot-1.4.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/net/homeip/yusuke/twitter4j/2.0.9/twitter4j-2.0.9.jar"/>
<classpathentry exported="true" kind="lib" path="modules/enterprise/remoting/webservices/target/rhq-remoting-webservices-1.4.0-SNAPSHOT/wsconsume-output"/>
+ <classpathentry kind="var" path="M2_REPO/org/jmock/jmock/2.5.1/jmock-2.5.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-library/1.1/hamcrest-library-1.1.jar"/>
<classpathentry kind="output" path="eclipse-classes"/>
</classpath>
commit bc566390a996f9839387290cb4b58153176c76cb
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Dec 23 15:22:32 2009 -0500
Added a javascript based proof of concept for raw config UI and two test pages to view.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
new file mode 100644
index 0000000..fee0065
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/multi-file-edit.js
@@ -0,0 +1,186 @@
+function ArchiveFile(p,c) {
+ this.path = p;
+ this.dirty = 0;
+ this.contents = c;
+}
+
+/*
+ * This is a class for editing a collection of files, represented by a map.
+ * There is a list of links in the left column, each which represent a file,
+ * a textarea input that changes based on which link is selected
+ */
+function MultiFileEdit(){
+ this.currentIndex = 0;
+ this.isDirty = 0;
+ this.archive = new Array();
+ this.disabled=0;
+
+ this.initializeArchive = function(){
+ var i=0;
+ for (i=0; i < 6 ;i++)
+ {
+ this.archive[i] = new ArchiveFile("/tmp/file/"+i, "/tmp/file/"+i +" archive = "+ this.archive.length);
+ }
+ }
+
+ this.setTextAreaValue = function(id)
+ {
+ if (this.currentIndex % 2 == 0){
+ document.getElementById("file-row-"+this.currentIndex).className = "OddRow";
+ }else{
+ document.getElementById("file-row-"+this.currentIndex).className = "EvenRow";
+
+ }
+
+ this.currentIndex = id;
+ document.getElementById("testForm").textarea.value = multiFileEdit.archive[this.currentIndex].contents;
+ document.getElementById("file-row-"+id).className = "SelectedRow";
+ document.getElementById("testForm").textarea.focus();
+ document.getElementById("current-path-span").firstChild.data = multiFileEdit.archive[this.currentIndex].path;
+ }
+
+
+ this.resetArchive = function(){
+ this.initializeArchive();
+ this.setTextAreaValue(0);
+ this.isDirty = 0;
+ for (i=0; i < this.archive.length ;i++)
+ {
+ document.getElementById("dirty-span-"+i).firstChild.data = "O ";
+ }
+ }
+
+ function askConfirm(){
+ return "You have unsaved changes.";
+ }
+
+
+ this.updateArchive = function(){
+
+ window.onbeforeunload = askConfirm;
+
+ this.isDirty = 1;
+ this.archive[this.currentIndex].contents = textarea.value ;
+ this.archive[this.currentIndex].dirty = 1;
+ document.getElementById("dirty-span-"+this.currentIndex).firstChild.data = "X ";
+ }
+
+ this.generateLinks = function(){
+ var i=0;
+ var style =0;
+ var divclass = "";
+ document.write("<table><th><td>Configuration File Paths</td><td></td></th>");
+ for (i=0; i < multiFileEdit.archive.length ;i++){
+
+ if (i == 0){
+ divclass="SelectedRow"
+ }else if (style != 0){
+ style = 0;
+ divclass="OddRow"
+ }else{
+ style = 1;
+ divclass="EvenRow"
+ }
+
+ document.write("<tr id='file-row-"+i+"'class='"+ divclass +"'>");
+ document.write("<td>");
+ document.write("<span id='dirty-span-"+i+"'>O </span>");
+ document.write("</td><td>");
+ document.write("<a href=\"#\" onclick='multiFileEdit.setTextAreaValue("+i+")' >"+ multiFileEdit.archive[i].path);
+ document.write("</a>");
+ document.write("</td></tr>");
+ }
+ document.write("</table>");
+
+ }
+
+ this.drawTable = function(){
+ document.write("<style type=\"text/css\">");
+ document.write("td.multi-edit-table {");
+ document.write("vertical-align: top;");
+ document.write("valign: top;");
+ document.write("height: = 300;");
+ document.write("}");
+ document.write("tr.EvenRow {")
+ document.write("background-color:#a4b2b9;");
+ document.write("}");
+ document.write("tr.OddRow {");
+ document.write("background-color:grey;");
+ document.write("}");
+ document.write("tr.SelectedRow {");
+ document.write("background-color:white;");
+ document.write("}");
+
+ document.write("</style>");
+ document.write("<table class='multi-edit-table' border='0' cellpadding='0' >");
+ document.write("<tbody>");
+ document.write("<tr>");
+ document.write("<td class='multi-edit-table' bgcolor='#a4b2b9'>");
+ this.generateLinks();
+ document.write("</td>");
+ document.write("<td>");
+ document.write("<div><span id='current-path-span'>Current File Name Goes here</span> ..................");
+ document.write("<a href=\"#\"><img src='images/download.png'/> Download</a>");
+ document.write("<a href=\"#\" ");
+ document.write("onclick=\"multiFileEdit.fullscreen()\"> ");
+ document.write("<img src='images/fullscreen.png'/> Full Screen</a>")
+ document.write("</div>");
+ document.write("<textarea id='textarea' ");
+ if (this.disabled){
+ document.write("disabled ");
+ }
+ document.write("onkeyup='multiFileEdit.updateArchive()' cols='80' rows='40'>");
+ document.write(multiFileEdit.archive[0].contents);
+ document.write("</textarea>");
+
+ document.write("<div>upload New Version</div>");
+ document.write("<div>Select A File: <input type='file'/> </div>");
+ document.write("</td>");
+ document.write("</tr>");
+ document.write("</tbody>");
+ document.write("</table>");
+
+ }
+
+ this.fullscreen= function()
+ {
+ var generator=window.open('','full screen','width=1024,height=768,left=0,top=100,screenX=0,screenY=0');
+ generator.document.write('<html><head><title>Popup</title>');
+ generator.document.write('<link rel="stylesheet" href="style.css">');
+
+ generator.document.write('<script language="JavaScript" type="text/javascript" src="multi-file-edit.js"></script>');
+
+ generator.document.write('</head><body>');
+
+ generator.document.write("<form id='full-screen-edit-form'>");
+ generator.document.write("<div><span id='current-path-span'>Current File Name Goes here</span> ");
+ generator.document.write("<a href=\"javascript:self.close();\">Close</a>..................");
+ generator.document.write("</div>");
+ generator.document.write("<textarea id='textarea' onkeyup='update_parent();' ");
+
+ if (this.disabled){
+ generator.document.write("disabled ");
+ }
+
+ generator.document.write("cols='200' rows='45'>");
+ generator.document.write("</textarea>");
+ generator.document.write("</form>");
+
+ generator.document.write('</body></html>');
+
+ generator.document.getElementById("current-path-span").firstChild.data = multiFileEdit.archive[this.currentIndex].path;
+ generator.document.getElementById("full-screen-edit-form").textarea.value = multiFileEdit.archive[this.currentIndex].contents;
+ generator.document.getElementById("full-screen-edit-form").textarea.focus();
+
+ generator.document.close();
+
+ }
+
+ this.initializeArchive();
+}
+
+
+function update_parent(){
+ opener.document.getElementById("testForm").textarea.value = document.getElementById("full-screen-edit-form").textarea.value;
+ opener.multiFileEdit.updateArchive()
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
new file mode 100644
index 0000000..ac8521a
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/edit-raw-config.xhtml
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich"
+ xmlns:onc="http://jboss.org/on/component">
+
+THIS TEXT WILL BE REMOVED.
+
+<ui:composition template="/rhq/layout/main.xhtml">
+
+ THIS TEXT WILL BE REMOVED AS WELL.
+
+ <ui:param name="pageTitle" value="View Test Configuration"/>
+
+ <ui:define name="body">
+ <a href="view-raw-config.xhtml">View</a>
+ <script language="JavaScript" type="text/javascript" src="/js/multi-file-edit.js"></script>
+
+
+ <h:messages showSummary="true"
+ showDetail="true"
+ errorClass="ErrorBlock"
+ warnClass="ErrorBlock"
+ infoClass="ConfirmationBlock"
+ globalOnly="true"
+ layout="table"
+ width="100%"/>
+ <form id="testForm">
+ <script type="text/javascript">
+ var multiFileEdit = new MultiFileEdit();
+ multiFileEdit.drawTable();
+ multiFileEdit.setTextAreaValue(0);
+ </script>
+ <input type="submit" />
+ <input type="reset" onclick="multiFileEdit.resetArchive();" />
+ <a href="next-page.html" onclick="checkDirty()">Go to next Page</a>
+ </form>
+
+ </ui:define>
+
+</ui:composition>
+
+THIS TEXT WILL BE REMOVED AS WELL.
+
+</html>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml
new file mode 100644
index 0000000..fa8b2b3
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/test/config/view-raw-config.xhtml
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich"
+ xmlns:onc="http://jboss.org/on/component">
+
+THIS TEXT WILL BE REMOVED.
+
+<ui:composition template="/rhq/layout/main.xhtml">
+
+ THIS TEXT WILL BE REMOVED AS WELL.
+
+ <ui:param name="pageTitle" value="View Test Configuration"/>
+
+ <ui:define name="body">
+
+ <script language="JavaScript" type="text/javascript" src="/js/multi-file-edit.js"></script>
+
+ <h:messages showSummary="true"
+ showDetail="true"
+ errorClass="ErrorBlock"
+ warnClass="ErrorBlock"
+ infoClass="ConfirmationBlock"
+ globalOnly="true"
+ layout="table"
+ width="100%"/>
+ <a href="edit-raw-config.xhtml">Edit</a>
+
+ <form id="testForm">
+ <script type="text/javascript">
+ var multiFileEdit = new MultiFileEdit();
+ multiFileEdit.disabled=1;
+ multiFileEdit.drawTable();
+ multiFileEdit.setTextAreaValue(0);
+ </script>
+ <input type="submit" />
+ <input type="reset" onclick="multiFileEdit.resetArchive();" />
+ </form>
+
+ </ui:define>
+
+</ui:composition>
+
+THIS TEXT WILL BE REMOVED AS WELL.
+
+</html>
commit b5fa8688432aaefa4509a9ca55acc7d4ac4dca7d
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Dec 23 15:19:22 2009 -0500
removed Overload tags. The functionas are defined in an interface, thus these are not properly overloads, but rather implementations. Eclipse complained.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 88858cf..0a39438 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -287,7 +287,6 @@ public class WebservicesManagerBean implements WebservicesRemote {
return repoManager.findPackageVersionsInRepoByCriteria(subject, criteria);
}
- @Override
public int synchronizeRepos(Subject subject, Integer[] repoIds) {
return repoManager.synchronizeRepos(subject, repoIds);
}
@@ -372,8 +371,8 @@ public class WebservicesManagerBean implements WebservicesRemote {
}
public ResourceConfigurationUpdate updateStructuredOrRawConfiguration(Subject subject, int resourceId,
- Configuration newConfiguration, boolean fromStructured)
- throws ResourceNotFoundException, ConfigurationUpdateStillInProgressException {
+ Configuration newConfiguration, boolean fromStructured) throws ResourceNotFoundException,
+ ConfigurationUpdateStillInProgressException {
return configurationManager.updateStructuredOrRawConfiguration(subject, resourceId, newConfiguration,
fromStructured);
}
commit 274b4f5769bf16369eff507fcbdcfaae945d937d
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Dec 23 15:12:34 2009 -0500
removed Overload tags. The functionas are defined in an interface, thus these are not properly overloads, but rather implementations. Eclipse complained.
diff --git a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/ApacheXmlRpcExecutor.java b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/ApacheXmlRpcExecutor.java
index f3c75e2..004608a 100644
--- a/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/ApacheXmlRpcExecutor.java
+++ b/modules/enterprise/server/plugins/rhnhosted/src/main/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/ApacheXmlRpcExecutor.java
@@ -32,12 +32,10 @@ public class ApacheXmlRpcExecutor implements XmlRpcExecutor {
this.client = clientIn;
}
- @Override
public Object execute(String methodName, Object[] params) throws XmlRpcException {
return client.execute(methodName, params);
}
- @Override
public Object execute(String pMethodName, List pParams) throws XmlRpcException {
return client.execute(pMethodName, pParams);
}
diff --git a/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/MockRhnXmlRpcExecutor.java b/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/MockRhnXmlRpcExecutor.java
index bcdfe41..c4cf6c7 100644
--- a/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/MockRhnXmlRpcExecutor.java
+++ b/modules/enterprise/server/plugins/rhnhosted/src/test/java/org/rhq/enterprise/server/plugins/rhnhosted/xmlrpc/MockRhnXmlRpcExecutor.java
@@ -70,7 +70,6 @@ public class MockRhnXmlRpcExecutor implements XmlRpcExecutor {
/* (non-Javadoc)
* @see org.rhq.enterprise.server.plugins.rhnhosted.xmlrpc.XmlRpcExecutor#execute(java.lang.String, java.lang.Object[])
*/
- @Override
public Object execute(String methodName, Object[] params) throws XmlRpcException {
//for (Object object : params) {
// System.out.println("parm: " + object);
@@ -242,7 +241,6 @@ public class MockRhnXmlRpcExecutor implements XmlRpcExecutor {
}
- @Override
public Object execute(String pMethodName, List pParams) throws XmlRpcException {
return execute(pMethodName, pParams.toArray());
}
14 years, 3 months
[rhq] modules/plugins
by Shannon Hughes
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java | 9 ++++-----
modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java | 6 ++----
2 files changed, 6 insertions(+), 9 deletions(-)
New commits:
commit d9e02aa86cd9b4a560a214c93f49cd21fed11bd1
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 28 22:08:37 2010 -0500
fixing augeas and cobber due to RawConfig refactoring
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
index 272fffb..dd900cf 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
@@ -82,7 +82,7 @@ public class AugeasRawConfigHelper {
aug.save();
toUpdate.setPath(existingConfig.getPath());
- toUpdate.setContents(FileUtils.readFileToByteArray(new File(file)));
+ toUpdate.setContents(FileUtils.readFileToString(new File(file)));
} finally {
if (aug != null) {
aug.close();
@@ -111,18 +111,17 @@ public class AugeasRawConfigHelper {
public void save(RawConfiguration config) throws Exception {
File f = new File(config.getPath());
- FileUtils.writeStringToFile(f, normalizeToUnix(config.getContents()));
+ FileUtils.writeStringToFile(f, config.getContents());
}
private String getFile(Augeas aug) {
return aug.get(transformPrefix + "/incl");
}
- private Augeas createAugeas(String lens, byte[] binary) throws Exception {
+ private Augeas createAugeas(String lens, String contents) throws Exception {
Augeas aug = new Augeas(rootPath, loadPath, Augeas.NO_MODL_AUTOLOAD);
File fl = File.createTempFile("_rhq", null);
- String contents = normalizeToUnix(binary);
- //write the 'to' file to disk
+ //write the 'to' file to disk
FileUtils.writeStringToFile(fl, contents);
aug.set(transformPrefix + "/lens", lens);
aug.set(transformPrefix + "/incl", fl.getAbsolutePath());
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index c0bb0c5..3e80c01 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -123,12 +123,12 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Au
Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
RawConfiguration modules = new RawConfiguration();
modules.setPath(MODULES_PATH);
- modules.setContents(FileUtils.readFileToByteArray(new File(MODULES_PATH)));
+ modules.setContents(FileUtils.readFileToString(new File(MODULES_PATH)));
configs.add(modules);
RawConfiguration settings = new RawConfiguration();
settings.setPath(SETTINGS_PATH);
- settings.setContents(FileUtils.readFileToByteArray(new File(SETTINGS_PATH)));
+ settings.setContents(FileUtils.readFileToString(new File(SETTINGS_PATH)));
configs.add(settings);
return configs;
} catch (Exception e) {
@@ -187,7 +187,6 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Au
// TODO Auto-generated method stub
}
- @Override
public Property createProperty(String propName, String augeasPath, Augeas aug) {
if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
return new PropertySimple(propName, "1".equals(aug.get(augeasPath)));
@@ -195,7 +194,6 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Au
return new PropertySimple(propName, aug.get(augeasPath));
}
- @Override
public String getPropertyValue(String propName, Configuration from) {
if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
PropertySimple prop = (PropertySimple) from.get(propName);
14 years, 3 months
[rhq] 146 commits - .classpath etc/eclipse-tools etc/m2 etc/modules etc/samples etc/tlds modules/core modules/enterprise modules/plugins pom.xml
by Shannon Hughes
.classpath | 10
etc/eclipse-tools/RHQ | 38
etc/m2/settings-linux-config.xml | 19
etc/m2/settings.xml | 12
etc/modules/base-perspective-war/pom.xml | 233
etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectivePagedDataUIBean.java | 38
etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveResourceUIBean.java | 49
etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java | 41
etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveClientUIBean.java | 161
etc/modules/base-perspective-war/src/main/resources/seam.properties | 3
etc/modules/base-perspective-war/src/main/webapp/WEB-INF/components.xml | 16
etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml | 28
etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml | 103
etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml | 20
etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml | 68
etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml | 108
etc/modules/base-perspective-war/src/main/webapp/index.xhtml | 36
etc/samples/perspectives/sample-perspective/app/pom.xml | 230
etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/AbstractPerspectiveUIBean.java | 83
etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResources2UIBean.java | 13
etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java | 201
etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java | 61
etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java | 31
etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java | 74
etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/faces-config.xml | 19
etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/jboss-web.xml | 16
etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/web.xml | 118
etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml | 160
etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml | 77
etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml | 77
etc/samples/perspectives/sample-perspective/app/src/main/webapp/currentResource.xhtml | 114
etc/samples/perspectives/sample-perspective/app/src/main/webapp/randomResource.xhtml | 64
etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml | 905
etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml | 151
etc/tlds/README.txt | 3
etc/tlds/f.tld | 1973 +
etc/tlds/fn.tld | 207
etc/tlds/h.tld |14417 ++++++++++
etc/tlds/ui.tld | 292
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java | 11
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceTypeFacet.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceFacets.java | 45
modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java | 34
modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java | 25
modules/core/domain/src/main/java/org/rhq/core/domain/util/PersistenceUtility.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/util/UnlimitedPageControl.java | 34
modules/core/gui/pom.xml | 29
modules/core/gui/src/main/java/org/rhq/core/gui/model/AbstractPagedDataModel2.java | 315
modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java | 65
modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataModel.java | 396
modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java | 37
modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java | 182
modules/core/gui/src/main/java/org/rhq/core/gui/table/component/AllRowsSelectorComponent.java | 85
modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java | 153
modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java | 124
modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java | 135
modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java | 298
modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java | 235
modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java | 140
modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java | 130
modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java | 238
modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java | 106
modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SortableColumnHeaderRenderer.java | 110
modules/core/gui/src/main/resources/META-INF/faces-config.xml | 78
modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml | 43
modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js | 57
modules/core/gui/src/main/resources/seam.properties | 3
modules/core/native-system/src/test/java/org/rhq/core/system/SigarTest.java | 123
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/Log4JLogEntryProcessor.java | 72
modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactNotFoundException.java | 32
modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java | 146
modules/enterprise/gui/installer-war/pom.xml | 58
modules/enterprise/gui/portal-war/pom.xml | 22
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java | 61
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/paging/PagedListDataModel.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateContentSourceUIBean.java | 22
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java | 10
modules/enterprise/gui/portal-war/src/main/webapp/css/win.css | 22
modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png |binary
modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_open.png |binary
modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_down_16.png |binary
modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_up_16.png |binary
modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/visibility/ChartLayout.jsp | 2
modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml | 30
modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/createContentProvider.xhtml | 5
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/view.xhtml | 1560 -
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml | 20
modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java | 127
modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ConfigurationClassBuilder.java | 82
modules/enterprise/remoting/client-api/pom.xml | 32
modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java | 46
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/event/EventManagerBean.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java | 7
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java | 75
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java | 58
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java | 48
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java | 232
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java | 62
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerRemote.java | 163
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveTarget.java | 108
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java | 53
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java | 92
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java | 269
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/InventoryActivator.java | 62
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ResourceTypeActivator.java | 34
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/TraitActivator.java | 73
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/AbstractResourceOrGroupActivationContext.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/GroupActivationContext.java | 23
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/ResourceActivationContext.java | 15
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/PerspectiveServerPluginManager.java | 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/metadata/PerspectivePluginMetadataManager.java | 46
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 7
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java | 7
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java | 24
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java | 104
modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml | 916
modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd | 1299
modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml | 4
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java | 60
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryDiscoveryComponent.java | 12
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java | 151
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java | 84
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java | 116
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java | 198
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ModJKDiscoveryComponent.java | 2
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/ApacheAugeasTree.java | 36
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/AugeasTreeBuilderApache.java | 5
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/ConfigurationTimestamp.java | 2
modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java | 247
modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml | 31
modules/plugins/augeas/pom.xml | 29
modules/plugins/augeas/src/main/java/org/rhq/augeas/AugeasProxy.java | 2
modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/AugeasTree.java | 13
modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AbstractAugeasTree.java | 211
modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeLazy.java | 144
modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeReal.java | 131
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java | 68
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java | 137
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasTranslator.java | 37
modules/plugins/cobbler/pom.xml | 256
modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java | 210
modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerDiscoveryComponent.java | 30
modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml | 93
modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java | 121
modules/plugins/cron/src/main/java/org/rhq/plugins/cron/CronDiscoveryComponent.java | 17
modules/plugins/cron/src/main/resources/META-INF/rhq-plugin.xml | 14
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java | 846
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerOperationsDelegate.java | 30
modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml | 6
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java | 85
modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml | 2
modules/plugins/oracle/pom.xml | 7
modules/plugins/platform/src/main/java/org/rhq/plugins/platform/LinuxDistroInfo.java | 2
modules/plugins/pom.xml | 1
modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java | 114
modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml | 39
modules/plugins/samba/src/test/java/org/rhq/plugins/samba/SambaComponentTest.java | 4
modules/plugins/services/README.txt | 4
modules/plugins/services/pom.xml | 260
modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ChkconfigService.java | 37
modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Introspectable.java | 30
modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Service.java | 30
modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ServiceHerder.java | 45
modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/SysVService.java | 48
modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/XinetdService.java | 32
modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceComponent.java | 78
modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceDiscoveryComponent.java | 46
modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesComponent.java | 157
modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesDiscoveryComponent.java | 77
modules/plugins/services/src/main/java/org/rhq/services/Service.java | 102
modules/plugins/services/src/main/java/org/rhq/services/ServiceManager.java | 55
modules/plugins/services/src/main/java/org/rhq/services/ServiceStatus.java | 28
modules/plugins/services/src/main/java/org/rhq/services/SysVService.java | 149
modules/plugins/services/src/main/java/org/rhq/services/XinetdService.java | 74
modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml | 49
modules/plugins/services/src/test/resources/log4j.xml | 40
modules/plugins/validate-all-plugins/pom.xml | 1
pom.xml | 37
186 files changed, 30099 insertions(+), 4588 deletions(-)
New commits:
commit 0d1eb673a948f025c10a1d4dd5694281b71abec7
Merge: eef9371... 16f0613...
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 28 20:38:06 2010 -0500
using 3.3.2.sr1 for richfaces conflict.
Conflicts:
pom.xml
commit 16f0613e65135a12f748fed01bdc8455473167b6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Jan 28 18:43:37 2010 -0500
More work for the search value escaping
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index ec06f74..67ab54b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -369,7 +369,7 @@ public final class CriteriaQueryGenerator {
* Double escape backslashes if they are not treated as string literals by the db vendor
* http://opensource.atlassian.com/projects/hibernate/browse/HHH-2674
*/
- formattedValue = QueryUtility.escapeSearchParameter(formattedValue);
+ formattedValue = QueryUtility.handleDoubleEscaping(formattedValue);
if (wantsFuzzyMatching) {
// append '%' onto edges that don't already have '%' explicitly set from the caller
@@ -378,7 +378,9 @@ public final class CriteriaQueryGenerator {
}
value = formattedValue;
}
- LOG.debug("Bind: (" + critField.getKey() + ", " + value + ")");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Bind: (" + critField.getKey() + ", " + value + ")");
+ }
query.setParameter(critField.getKey(), value);
}
if (null != this.authorizationPermsFragment) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
index 64f0d4c..7f8ab50 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
@@ -27,6 +27,8 @@ import org.rhq.core.db.DatabaseTypeFactory;
public class QueryUtility {
private static String ESCAPE_CHARACTER = null;
+ private static String ESCAPED_PERCENT = null;
+ private static String ESCAPED_UNDERSCORE = null;
/**
* Given the settings for the current DatabaseType, properly handle escaping special SQL characters.
@@ -39,13 +41,14 @@ public class QueryUtility {
return null;
}
- boolean handleEscapedBackslash = "\\\\".equals(getEscapeCharacter());
-
- if (handleEscapedBackslash) {
- value = ((String) value).replaceAll("\\_", "\\\\_");
- value = ((String) value).replaceAll("\\%", "\\\\%");
+ if (null == ESCAPED_UNDERSCORE) {
+ ESCAPED_UNDERSCORE = getEscapeCharacter() + "_";
+ ESCAPED_PERCENT = getEscapeCharacter() + "%";
}
+ value = value.replaceAll("_", ESCAPED_UNDERSCORE);
+ value = value.replaceAll("%", ESCAPED_PERCENT);
+
return value;
}
@@ -78,4 +81,24 @@ public class QueryUtility {
return ESCAPE_CHARACTER;
}
+ /**
+ * If the current DatabaseType requires double escaping then ensure it is set correctly. This may be useful
+ * if the search string has been constructed outside of QueryUtil.formatSearchParameter(String).
+ *
+ * @param value single escaped search string value
+ * @return The double escaped string
+ */
+ public static String handleDoubleEscaping(String value) {
+ if (null == ESCAPE_CHARACTER) {
+ ESCAPE_CHARACTER = DatabaseTypeFactory.getDefaultDatabaseType().getEscapeCharacter();
+ }
+
+ if ("\\\\".equals(ESCAPE_CHARACTER)) {
+ value = value.replaceAll("\\\\_", ESCAPED_UNDERSCORE);
+ value = value.replaceAll("\\\\%", ESCAPED_PERCENT);
+ }
+
+ return value;
+ }
+
}
commit f843d03101366ec585edf56e158c37381af485d0
Merge: bebdbe5... 642e623...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Jan 28 11:38:20 2010 -0500
Merge branch 'linux-config' into linux-config-dev
commit bebdbe5b29bbe38b408528dc1d08aeb61be2b1cb
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Jan 28 11:16:59 2010 -0500
Treat percent sign as a literal as well as underscore for search filter
strings. These are both special characters in SQL LIKE syntax. The special
interpretation of percent (match any sequence of characters) should
not be applied to what the user enters.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
index c5adb5c..64f0d4c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
@@ -43,6 +43,7 @@ public class QueryUtility {
if (handleEscapedBackslash) {
value = ((String) value).replaceAll("\\_", "\\\\_");
+ value = ((String) value).replaceAll("\\%", "\\\\%");
}
return value;
commit 66b5e21c6c922e68a30fcc6aa7884eb120404056
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 27 22:00:38 2010 -0500
remove formatSearchParameter() as it badly assumed that all db vendors use
double escaping. It's not the standard despite Postgres
being that way out of the box. Oracle does follow the standard
(a single '\'). Even Postgres can be configured to follow the standard
and may actually ship that way in the future.
This is replaced by a similar function in QueryUtility. This class is in
in the server jar as it needs to access methods outside the reach of the
domain jar.
Refactored several classes to use the new utility class.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PersistenceUtility.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PersistenceUtility.java
index 5c0a96d..282faec 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PersistenceUtility.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PersistenceUtility.java
@@ -224,14 +224,6 @@ public class PersistenceUtility {
}
}
- public static String formatSearchParameter(String value) {
- if (value == null || value.trim().equals("")) {
- return null;
- }
-
- return "%" + value.replaceAll("\\_", "\\\\_").toUpperCase() + "%";
- }
-
/**
* Creates and executes a filter query for a collection relationship. This executes without passing back the query
* object because the most common case is to simply paginate for a relationship. Use the createFilter method to
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java
index c1decce..119c8fa 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java
@@ -50,6 +50,7 @@ import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.core.AgentManagerLocal;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* This session beans acts as the underlying implementation the distribution algorithm will
@@ -210,7 +211,7 @@ public class PartitionEventManagerBean implements PartitionEventManagerLocal {
pageControl);
Query countQuery = PersistenceUtility.createCountQuery(entityManager, PartitionEvent.QUERY_FIND_ALL);
- details = PersistenceUtility.formatSearchParameter(details);
+ details = QueryUtility.formatSearchParameter(details);
query.setParameter("type", type);
countQuery.setParameter("type", type);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
index 6c6d77e..349c63d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
@@ -77,6 +77,7 @@ import org.rhq.enterprise.server.plugin.pc.content.RepoGroupDetails;
import org.rhq.enterprise.server.plugin.pc.content.RepoImportReport;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import org.rhq.enterprise.server.util.QueryUtility;
@Stateless
public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
@@ -290,7 +291,7 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
PackageVersion.QUERY_FIND_BY_REPO_ID_WITH_PACKAGE_FILTERED, pc);
query.setParameter("repoId", repoId);
- query.setParameter("filter", PersistenceUtility.formatSearchParameter(filter));
+ query.setParameter("filter", QueryUtility.formatSearchParameter(filter));
List<PackageVersion> results = query.getResultList();
long count = getPackageVersionCountFromRepo(subject, filter, repoId);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/event/EventManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/event/EventManagerBean.java
index 632141b..df90bfb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/event/EventManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/event/EventManagerBean.java
@@ -76,6 +76,7 @@ import org.rhq.enterprise.server.measurement.instrumentation.MeasurementMonitor;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* Manager for Handling of {@link Event}s.
@@ -480,9 +481,9 @@ public class EventManagerBean implements EventManagerLocal, EventManagerRemote {
}
}
if (isFilled(searchString))
- stm.setString(i++, PersistenceUtility.formatSearchParameter(searchString));
+ stm.setString(i++, QueryUtility.formatSearchParameter(searchString));
if (isFilled(source))
- stm.setString(i++, PersistenceUtility.formatSearchParameter(source));
+ stm.setString(i++, QueryUtility.formatSearchParameter(source));
rs = stm.executeQuery();
while (rs.next()) {
@@ -526,9 +527,9 @@ public class EventManagerBean implements EventManagerLocal, EventManagerRemote {
}
}
if (isFilled(searchString))
- stm.setString(i++, PersistenceUtility.formatSearchParameter(searchString));
+ stm.setString(i++, QueryUtility.formatSearchParameter(searchString));
if (isFilled(source))
- stm.setString(i++, PersistenceUtility.formatSearchParameter(source));
+ stm.setString(i++, QueryUtility.formatSearchParameter(source));
rs = stm.executeQuery();
while (rs.next()) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
index e9a40b7..d2503bc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
@@ -58,6 +58,7 @@ import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* Manager bean for Out-of-Bound measurements.
@@ -274,9 +275,9 @@ public class MeasurementOOBManagerBean implements MeasurementOOBManagerLocal {
Query queryCount = PersistenceUtility.createCountQuery(entityManager, queryName, "sched.id");
Query query = PersistenceUtility.createQueryWithOrderBy(entityManager, queryName, pc);
- metricNameFilter = PersistenceUtility.formatSearchParameter(metricNameFilter);
- resourceNameFilter = PersistenceUtility.formatSearchParameter(resourceNameFilter);
- parentNameFilter = PersistenceUtility.formatSearchParameter(parentNameFilter);
+ metricNameFilter = QueryUtility.formatSearchParameter(metricNameFilter);
+ resourceNameFilter = QueryUtility.formatSearchParameter(resourceNameFilter);
+ parentNameFilter = QueryUtility.formatSearchParameter(parentNameFilter);
query.setParameter("metricName", metricNameFilter);
queryCount.setParameter("metricName", metricNameFilter);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 5b2716c..5643df4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -117,6 +117,7 @@ import org.rhq.enterprise.server.operation.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* A manager that provides methods for creating, updating, deleting, and querying {@link Resource}s.
@@ -850,7 +851,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
query.setParameter("subject", user);
}
- searchString = PersistenceUtility.formatSearchParameter(searchString);
+ searchString = QueryUtility.formatSearchParameter(searchString);
query.setParameter("category", category);
queryCount.setParameter("category", category);
@@ -1448,7 +1449,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
query.setParameter("excludeIds", excludeList);
}
- nameFilter = PersistenceUtility.formatSearchParameter(nameFilter);
+ nameFilter = QueryUtility.formatSearchParameter(nameFilter);
queryCount.setParameter("groupId", groupId);
query.setParameter("groupId", groupId);
@@ -1485,7 +1486,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
queryCount.setParameter("repoId", repoId);
query.setParameter("repoId", repoId);
- search = PersistenceUtility.formatSearchParameter(search);
+ search = QueryUtility.formatSearchParameter(search);
queryCount.setParameter("search", search);
query.setParameter("search", search);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
index 547b7a5..d8e0c33 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
@@ -50,12 +50,12 @@ import org.rhq.core.domain.resource.composite.ResourceFacets;
import org.rhq.core.domain.resource.composite.ResourceTypeTemplateCountComposite;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* A manager that provides methods for creating, updating, deleting, and querying
@@ -222,7 +222,7 @@ public class ResourceTypeManagerBean implements ResourceTypeManagerLocal, Resour
}
query.setParameter("category", category);
- query.setParameter("nameFilter", PersistenceUtility.formatSearchParameter(nameFilter));
+ query.setParameter("nameFilter", QueryUtility.formatSearchParameter(nameFilter));
query.setParameter("pluginName", pluginName);
query.setParameter("inventoryStatus", InventoryStatus.COMMITTED);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
index b84b7c5..394a309 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
@@ -93,6 +93,7 @@ import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeNotFoundException;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* A manager that provides methods for creating, updating, deleting, and querying
@@ -975,7 +976,7 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
if (field.equals("groupName") == false) {
pc.addDefaultOrderingField("groupName");
}
- nameFilter = PersistenceUtility.formatSearchParameter(nameFilter);
+ nameFilter = QueryUtility.formatSearchParameter(nameFilter);
Connection conn = null;
PreparedStatement stmt = null;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java
index 48a8e53..761442a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/framework/ExpressionEvaluator.java
@@ -40,6 +40,7 @@ import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.enterprise.server.common.EntityManagerFacadeLocal;
import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.util.QueryUtility;
public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result> {
@@ -550,11 +551,11 @@ public class ExpressionEvaluator implements Iterable<ExpressionEvaluator.Result>
String argumentValue = (String) whereReplacements.get(lastArgumentName);
if (nextToken.equals("startswith")) {
- argumentValue = argumentValue.replaceAll("\\_", "\\\\_") + "%";
+ argumentValue = QueryUtility.escapeSearchParameter(argumentValue) + "%";
} else if (nextToken.equals("endswith")) {
- argumentValue = "%" + argumentValue.replaceAll("\\_", "\\\\_");
+ argumentValue = "%" + QueryUtility.escapeSearchParameter(argumentValue);
} else if (nextToken.equals("contains")) {
- argumentValue = "%" + argumentValue.replaceAll("\\_", "\\\\_") + "%";
+ argumentValue = "%" + QueryUtility.escapeSearchParameter(argumentValue) + "%";
} else {
throw new InvalidExpressionException("Unrecognized string function '" + nextToken
+ "' at end of condition");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java
index eba2982..abd8978 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java
@@ -45,6 +45,7 @@ import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.AlertManagerLocal;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* @author Joseph Marques
@@ -83,8 +84,8 @@ public class AlertSubsystemManagerBean implements AlertSubsystemManagerLocal {
query.setParameter("subjectId", subject.getId());
}
- resourceFilter = PersistenceUtility.formatSearchParameter(resourceFilter);
- parentFilter = PersistenceUtility.formatSearchParameter(parentFilter);
+ resourceFilter = QueryUtility.formatSearchParameter(resourceFilter);
+ parentFilter = QueryUtility.formatSearchParameter(parentFilter);
queryCount.setParameter("resourceFilter", resourceFilter);
query.setParameter("resourceFilter", resourceFilter);
@@ -127,8 +128,8 @@ public class AlertSubsystemManagerBean implements AlertSubsystemManagerLocal {
query.setParameter("subjectId", subject.getId());
}
- resourceFilter = PersistenceUtility.formatSearchParameter(resourceFilter);
- parentFilter = PersistenceUtility.formatSearchParameter(parentFilter);
+ resourceFilter = QueryUtility.formatSearchParameter(resourceFilter);
+ parentFilter = QueryUtility.formatSearchParameter(parentFilter);
queryCount.setParameter("resourceFilter", resourceFilter);
query.setParameter("resourceFilter", resourceFilter);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java
index ca74cab..0d73a88 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java
@@ -36,6 +36,7 @@ import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* @author Joseph Marques
@@ -72,8 +73,8 @@ public class ConfigurationSubsystemManagerBean implements ConfigurationSubsystem
query.setParameter("subjectId", subject.getId());
}
- resourceFilter = PersistenceUtility.formatSearchParameter(resourceFilter);
- parentFilter = PersistenceUtility.formatSearchParameter(parentFilter);
+ resourceFilter = QueryUtility.formatSearchParameter(resourceFilter);
+ parentFilter = QueryUtility.formatSearchParameter(parentFilter);
queryCount.setParameter("resourceFilter", resourceFilter);
query.setParameter("resourceFilter", resourceFilter);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java
index 295aa97..b811d1f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java
@@ -36,6 +36,7 @@ import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.util.QueryUtility;
/**
* @author Joseph Marques
@@ -72,8 +73,8 @@ public class OperationHistorySubsystemManagerBean implements OperationHistorySub
query.setParameter("subjectId", subject.getId());
}
- resourceFilter = PersistenceUtility.formatSearchParameter(resourceFilter);
- parentFilter = PersistenceUtility.formatSearchParameter(parentFilter);
+ resourceFilter = QueryUtility.formatSearchParameter(resourceFilter);
+ parentFilter = QueryUtility.formatSearchParameter(parentFilter);
queryCount.setParameter("resourceFilter", resourceFilter);
query.setParameter("resourceFilter", resourceFilter);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index 5d945a5..ec06f74 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -34,7 +34,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.annotations.IndexColumn;
-import org.rhq.core.db.DatabaseTypeFactory;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.AlertCriteria;
import org.rhq.core.domain.criteria.Criteria;
@@ -71,7 +70,6 @@ public final class CriteriaQueryGenerator {
private String alias;
private String className;
private static String NL = System.getProperty("line.separator");
- private static String ESCAPE_CHARACTER = null;
private List<Field> persistentBagFields = new ArrayList<Field>();
@@ -118,7 +116,7 @@ public final class CriteriaQueryGenerator {
}
if (fuzzyMatch) {
- expression += " ESCAPE '" + getEscapeCharacter() + "'";
+ expression += " ESCAPE '" + QueryUtility.getEscapeCharacter() + "'";
}
return expression;
@@ -230,7 +228,7 @@ public final class CriteriaQueryGenerator {
} else {
fragment = alias + "." + fieldName + " " + operator + " :" + fieldName;
}
- fragment += " ESCAPE '" + getEscapeCharacter() + "'";
+ fragment += " ESCAPE '" + QueryUtility.getEscapeCharacter() + "'";
} else {
fragment = alias + "." + fieldName + " " + operator + " :" + fieldName;
}
@@ -359,7 +357,6 @@ public final class CriteriaQueryGenerator {
private void setBindValues(Query query, boolean countQuery) {
boolean wantCaseInsensitiveMatch = !criteria.isCaseSensitive();
boolean wantsFuzzyMatching = !criteria.isStrict();
- boolean handleEscapedBackslash = "\\\\".equals(getEscapeCharacter());
for (Map.Entry<String, Object> critField : criteria.getFilterFields().entrySet()) {
Object value = critField.getValue();
@@ -372,9 +369,8 @@ public final class CriteriaQueryGenerator {
* Double escape backslashes if they are not treated as string literals by the db vendor
* http://opensource.atlassian.com/projects/hibernate/browse/HHH-2674
*/
- if (handleEscapedBackslash) {
- formattedValue = ((String) formattedValue).replaceAll("\\_", "\\\\_");
- }
+ formattedValue = QueryUtility.escapeSearchParameter(formattedValue);
+
if (wantsFuzzyMatching) {
// append '%' onto edges that don't already have '%' explicitly set from the caller
formattedValue = (formattedValue.startsWith("%") ? "" : "%") + formattedValue
@@ -392,14 +388,6 @@ public final class CriteriaQueryGenerator {
}
}
- public static String getEscapeCharacter() {
- if (null == ESCAPE_CHARACTER) {
- ESCAPE_CHARACTER = DatabaseTypeFactory.getDefaultDatabaseType().getEscapeCharacter();
- }
-
- return ESCAPE_CHARACTER;
- }
-
public static void main(String[] args) {
//testSubjectCriteria();
//testAlertCriteria();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
new file mode 100644
index 0000000..c5adb5c
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
@@ -0,0 +1,80 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.server.util;
+
+import org.rhq.core.db.DatabaseTypeFactory;
+
+public class QueryUtility {
+
+ private static String ESCAPE_CHARACTER = null;
+
+ /**
+ * Given the settings for the current DatabaseType, properly handle escaping special SQL characters.
+ *
+ * @param value
+ * @return the properly escaped value.
+ */
+ public static String escapeSearchParameter(String value) {
+ if (value == null || value.trim().equals("")) {
+ return null;
+ }
+
+ boolean handleEscapedBackslash = "\\\\".equals(getEscapeCharacter());
+
+ if (handleEscapedBackslash) {
+ value = ((String) value).replaceAll("\\_", "\\\\_");
+ }
+
+ return value;
+ }
+
+ /**
+ * Given the settings for the current DatabaseType, properly handle escaping special SQL characters as
+ * well as upcasing the value (standard for rhq filter searches) and wrapping with SQL wildcard for
+ * implicit "contains" (i.e. '%' characters)
+ *
+ * @param value
+ * @return the properly escaped and formatted value.
+ */
+ public static String formatSearchParameter(String value) {
+ if (value == null || value.trim().equals("")) {
+ return null;
+ }
+
+ return "%" + escapeSearchParameter(value).toUpperCase() + "%";
+ }
+
+ /**
+ * Get the proper escape character for the current DatabaseType.
+ *
+ * @return The escape character(s)
+ */
+ public static String getEscapeCharacter() {
+ if (null == ESCAPE_CHARACTER) {
+ ESCAPE_CHARACTER = DatabaseTypeFactory.getDefaultDatabaseType().getEscapeCharacter();
+ }
+
+ return ESCAPE_CHARACTER;
+ }
+
+}
commit a2e59af2bb5b902b2f315fb70740f79f5e4de5a4
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 27 21:46:26 2010 -0500
BZ 559339
Change from greedy to reluctant matching for the first the date
portion (group 1). This way the first occurrence of severity will be
captured (group 2) and any others will be left in the detail (group 3)
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/Log4JLogEntryProcessor.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/Log4JLogEntryProcessor.java
index a541eba..8b5caa0 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/Log4JLogEntryProcessor.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/Log4JLogEntryProcessor.java
@@ -1,25 +1,25 @@
- /*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program 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 General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.core.pluginapi.event.log;
import java.io.File;
@@ -42,7 +42,7 @@ public class Log4JLogEntryProcessor extends MultiLineLogEntryProcessor {
// For now, we only support the default pattern: date priority '['category']' message
// e.g.: 2007-12-09 15:32:49,514 DEBUG [com.example.FooBar] run: IdleRemover notifying pools, interval: 450000
// NOTE: The message portion may contain multiple lines.
- private static final String REGEX = "(.*) (TRACE|DEBUG|INFO|WARN|ERROR|FATAL) (.*)";
+ private static final String REGEX = "(.*?) (TRACE|DEBUG|INFO|WARN|ERROR|FATAL) (.*)";
private static final Pattern PATTERN = Pattern.compile(REGEX);
private static final String ISO8601_DATE_PATTERN = "yyyy-MM-dd kk:mm:ss,SSS";
@@ -52,7 +52,7 @@ public class Log4JLogEntryProcessor extends MultiLineLogEntryProcessor {
private static final String DATE_DATE_PATTERN = "dd MMM yyyy kk:mm:ss,SSS";
private static final DateFormat DATE_DATE_FORMAT = new SimpleDateFormat(DATE_DATE_PATTERN);
- private static final Map<Priority, EventSeverity> PRIORITY_TO_SEVERITY_MAP = new LinkedHashMap<Priority,EventSeverity>();
+ private static final Map<Priority, EventSeverity> PRIORITY_TO_SEVERITY_MAP = new LinkedHashMap<Priority, EventSeverity>();
static {
PRIORITY_TO_SEVERITY_MAP.put(Priority.TRACE, EventSeverity.DEBUG);
@@ -78,8 +78,7 @@ public class Log4JLogEntryProcessor extends MultiLineLogEntryProcessor {
Priority priority;
try {
priority = Priority.valueOf(priorityString);
- }
- catch (IllegalArgumentException e) {
+ } catch (IllegalArgumentException e) {
throw new ParseException("Unknown priority: " + priorityString);
}
EventSeverity severity = PRIORITY_TO_SEVERITY_MAP.get(priority);
@@ -95,19 +94,15 @@ public class Log4JLogEntryProcessor extends MultiLineLogEntryProcessor {
Date timestamp;
try {
timestamp = super.parseDateString(dateString);
- }
- catch (ParseException e) {
+ } catch (ParseException e) {
try {
timestamp = DATE_DATE_FORMAT.parse(dateString);
- }
- catch (java.text.ParseException e1) {
+ } catch (java.text.ParseException e1) {
try {
timestamp = ABSOLUTE_DATE_FORMAT.parse(dateString);
- }
- catch (java.text.ParseException e2) {
- throw new ParseException(
- "Unable to parse date '" + dateString +
- "' using either ISO8601, DATE, or ABSOLUTE date formats. Please specify a date format.");
+ } catch (java.text.ParseException e2) {
+ throw new ParseException("Unable to parse date '" + dateString
+ + "' using either ISO8601, DATE, or ABSOLUTE date formats. Please specify a date format.");
}
}
}
@@ -116,11 +111,6 @@ public class Log4JLogEntryProcessor extends MultiLineLogEntryProcessor {
}
private enum Priority {
- TRACE,
- DEBUG,
- INFO,
- WARN,
- ERROR,
- FATAL
+ TRACE, DEBUG, INFO, WARN, ERROR, FATAL
}
}
commit 642e623979ae0132afb2de4cd88a3a5afac381d2
Merge: 8ab6acb... d291388...
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 27 15:27:20 2010 -0500
Fixed merge conflicts
diff --cc modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
index d8be5f2,1162a69..67dbe94
--- a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
+++ b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
@@@ -76,13 -79,13 +79,14 @@@ public class RemoteClient
ContentManager(ContentManagerRemote.class), //
DataAccessManager(DataAccessManagerRemote.class), //
DiscoveryBoss(DiscoveryBossRemote.class), //
- DistributionManager(DistributionManagerRemote.class),//
++ DistributionManager(DistributionManagerRemote.class), //
EventManager(EventManagerRemote.class), //
MeasurementBaselineManager(MeasurementBaselineManagerRemote.class), //
MeasurementDataManager(MeasurementDataManagerRemote.class), //
- MeasurementDefinitionManager(MeasurementDefinitionManagerRemote.class), //
+ MeasurementDefinitionManager(MeasurementDefinitionManagerRemote.class), //
MeasurementScheduleManager(MeasurementScheduleManagerRemote.class), //
OperationManager(OperationManagerRemote.class), //
+ PerspectiveManager(PerspectiveManagerRemote.class), //
ResourceManager(ResourceManagerRemote.class), //
ResourceFactoryManager(ResourceFactoryManagerRemote.class), //
ResourceGroupManager(ResourceGroupManagerRemote.class), //
@@@ -212,10 -215,15 +216,9 @@@
/**
* Connects to the remote server but does not establish a user session. This can be used
* with the limited API that does not require a Subject.
- *
+ *
* After successfully executing this, {@link #isConnected()} will be <code>true</code>
* and {@link #getSubject()} will return the subject that this method returns.
- *
- *
- * @param user
- * @param password
- *
- * @return the logged in user
- *
* @throws Exception if failed to connect to the server or log in
*/
public void connect() throws Exception {
commit b7ca3ac36e0c791e5858f3305970f08572b26ca6
Merge: 53868d2... 8ab6acb...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 27 09:47:32 2010 -0500
Merge branch 'linux-config' into linux-config-dev
commit 8ab6acb17a8d3429a5c192ba1cfef2eb08326baf
Merge: 7635830... c61da5c...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Wed Jan 27 00:44:40 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 76358306dff12b4af8da096fe61b42319bd196e6
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Wed Jan 27 00:44:07 2010 -0500
downgrade Facelets version from 1.1.15 to 1.1.15.B1 due to nasty NPE caused by regression in 1.1.15 (see https://facelets.dev.java.net/issues/show_bug.cgi?id=364)
diff --git a/etc/modules/base-perspective-war/pom.xml b/etc/modules/base-perspective-war/pom.xml
index b525142..db49b91 100644
--- a/etc/modules/base-perspective-war/pom.xml
+++ b/etc/modules/base-perspective-war/pom.xml
@@ -23,7 +23,7 @@
<properties>
<jsf.version>1.2_14</jsf.version>
- <facelets.version>1.1.15</facelets.version>
+ <facelets.version>1.1.15.B1</facelets.version>
<!-- NOTE: Seam 2.1.2 and 2.2.0 can't be used in webapps deployed to the RHQ Server
due to https://jira.jboss.org/jira/browse/JBSEAM-4029. Seam 2.2.1 can be
used once it's released. -->
diff --git a/modules/enterprise/gui/portal-war/pom.xml b/modules/enterprise/gui/portal-war/pom.xml
index 8de2098..912b70a 100644
--- a/modules/enterprise/gui/portal-war/pom.xml
+++ b/modules/enterprise/gui/portal-war/pom.xml
@@ -24,7 +24,7 @@
<!-- dependency versions -->
<el.version>1.0</el.version>
- <jsf-facelets.version>1.1.15</jsf-facelets.version>
+ <jsf-facelets.version>1.1.15.B1</jsf-facelets.version>
<seam.version>2.1.0.SP1</seam.version>
<!-- plugin versions -->
commit 53868d24d710df0fbfc8d722e725d82a6dba7ea5
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Jan 26 17:19:16 2010 -0500
Refactored initActivator logic from the extension classes into
ActivatorHelper static methods. This removes code duplication as, for
example, PageLink and MenuItem are both GlobalActivatorType and
did the same processing.
Also, removed some improper Overrides annotations.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java
index 4042aba..67ecbd1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java
@@ -20,20 +20,9 @@ package org.rhq.enterprise.server.perspective;
import java.util.ArrayList;
import java.util.List;
-import java.util.Locale;
-import org.rhq.core.domain.authz.Permission;
import org.rhq.enterprise.server.perspective.activator.Activator;
-import org.rhq.enterprise.server.perspective.activator.GlobalPermissionActivator;
-import org.rhq.enterprise.server.perspective.activator.LicenseFeature;
-import org.rhq.enterprise.server.perspective.activator.LicenseFeatureActivator;
-import org.rhq.enterprise.server.perspective.activator.SuperuserActivator;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.CommonActivatorsType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.DebugModeActivatorType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ExtensionType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.GlobalPermissionActivatorType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.LicenseFeatureActivatorType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.SuperuserActivatorType;
/**
* A GUI extension defined by the Perspective subsystem. Currently there are four types of extensions -
@@ -41,19 +30,19 @@ import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.Su
*
* @author Ian Springer
*/
-@SuppressWarnings("unchecked")
public abstract class Extension {
protected String perspectiveName;
protected String name;
protected String url;
protected boolean debugMode;
- private List<Activator> activators;
+ private List<Activator<?>> activators;
public Extension(ExtensionType rawExtension, String perspectiveName, String url) {
this.perspectiveName = perspectiveName;
this.name = rawExtension.getName();
this.url = url;
- this.activators = new ArrayList<Activator>();
+ this.activators = new ArrayList<Activator<?>>();
+ this.debugMode = false;
}
public String getPerspectiveName() {
@@ -72,43 +61,10 @@ public abstract class Extension {
return debugMode;
}
- public List<Activator> getActivators() {
+ public List<Activator<?>> getActivators() {
return activators;
}
- protected void initCommonActivators(CommonActivatorsType rawActivators) {
- if (rawActivators == null) {
- return;
- }
-
- DebugModeActivatorType rawDebugModeActivator = rawActivators.getDebugMode();
- if (rawDebugModeActivator != null) {
- this.debugMode = true;
- }
-
- List<LicenseFeatureActivatorType> rawLicenseFeatures = rawActivators.getLicenseFeature();
- for (LicenseFeatureActivatorType rawLicenseFeature : rawLicenseFeatures) {
- String rawName = rawLicenseFeature.getName().value();
- LicenseFeature licenseFeature = LicenseFeature.valueOf(rawName.toUpperCase(Locale.US));
- LicenseFeatureActivator licenseFeatureActivator = new LicenseFeatureActivator(licenseFeature);
- this.activators.add(licenseFeatureActivator);
- }
-
- SuperuserActivatorType rawSuperuserActivator = rawActivators.getSuperuser();
- if (rawSuperuserActivator != null) {
- SuperuserActivator superuserActivator = new SuperuserActivator();
- this.activators.add(superuserActivator);
- }
-
- List<GlobalPermissionActivatorType> rawGlobalPermissionActivators = rawActivators.getGlobalPermission();
- for (GlobalPermissionActivatorType rawGlobalPermissionActivator : rawGlobalPermissionActivators) {
- String rawName = rawGlobalPermissionActivator.getName().value();
- Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
- GlobalPermissionActivator globalPermissionActivator = new GlobalPermissionActivator(permission);
- this.activators.add(globalPermissionActivator);
- }
- }
-
@Override
public boolean equals(Object o) {
if (this == o)
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
index 9698ac2..5d7758a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
@@ -20,25 +20,13 @@ package org.rhq.enterprise.server.perspective;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.regex.Pattern;
import org.jetbrains.annotations.NotNull;
-import org.rhq.core.domain.authz.Permission;
-import org.rhq.enterprise.server.perspective.activator.InventoryActivator;
-import org.rhq.enterprise.server.perspective.activator.ResourceConditionSet;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.GlobalActivatorsType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.InventoryActivatorType;
+import org.rhq.enterprise.server.perspective.activator.ActivatorHelper;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.MenuItemFeatureType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.MenuItemType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourcePermissionActivatorType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourceType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TraitActivatorType;
/**
* An item in the RHQ GUI's menu.
@@ -57,8 +45,7 @@ public class MenuItem extends RenderedExtension implements Serializable, Cloneab
this.newWindow = rawMenuItem.isNewWindow();
this.addBreak = rawMenuItem.isAddBreak();
this.children = new ArrayList<MenuItem>();
-
- initActivators(rawMenuItem.getActivators());
+ this.debugMode = ActivatorHelper.initGlobalActivators(rawMenuItem.getActivators(), getActivators());
}
public MenuItemFeatureType getFeature() {
@@ -91,45 +78,6 @@ public class MenuItem extends RenderedExtension implements Serializable, Cloneab
return (null == displayName || "".equals(displayName.trim()));
}
- private void initActivators(GlobalActivatorsType rawActivators) {
- if (rawActivators == null) {
- return;
- }
-
- // Let our super class init the "common" activators.
- initCommonActivators(rawActivators);
-
- List<InventoryActivatorType> rawInventoryActivators = rawActivators.getInventory();
- for (InventoryActivatorType rawInventoryActivator : rawInventoryActivators) {
- List<ResourceType> rawResourceConditions = rawInventoryActivator.getResource();
- List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
- rawResourceConditions.size());
- for (ResourceType rawResourceCondition : rawResourceConditions) {
- List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
- EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
- for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
- String rawName = rawPermission.getName().toString();
- Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
- permissions.add(permission);
- }
-
- List<TraitActivatorType> rawTraits = rawResourceCondition.getTrait();
- Map<String, Pattern> traits = new HashMap<String, Pattern>();
- for (TraitActivatorType rawTraitActivator : rawTraits) {
- String name = rawTraitActivator.getName();
- String value = rawTraitActivator.getValue();
- traits.put(name, Pattern.compile(value));
- }
-
- ResourceConditionSet resourceConditionSet = new ResourceConditionSet(rawResourceCondition.getPlugin(),
- rawResourceCondition.getType(), permissions, traits);
- resourceConditionSets.add(resourceConditionSet);
- }
- InventoryActivator resourceTypeActivator = new InventoryActivator(resourceConditionSets);
- getActivators().add(resourceTypeActivator);
- }
- }
-
/**
* Note that this will clone the children list but not the child MenuItem objects themselves.
* @see java.lang.Object#clone()
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java
index 2776875..4454555 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java
@@ -19,23 +19,9 @@
package org.rhq.enterprise.server.perspective;
import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.regex.Pattern;
-import org.rhq.core.domain.authz.Permission;
-import org.rhq.enterprise.server.perspective.activator.InventoryActivator;
-import org.rhq.enterprise.server.perspective.activator.ResourceConditionSet;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.GlobalActivatorsType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.InventoryActivatorType;
+import org.rhq.enterprise.server.perspective.activator.ActivatorHelper;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.PageLinkType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourcePermissionActivatorType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourceType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TraitActivatorType;
/**
* An item in the RHQ GUI's menu.
@@ -49,47 +35,7 @@ public class PageLink extends Extension implements Serializable, Cloneable {
super(rawPageLink, perspectiveName, url);
this.pageName = pageName;
-
- initActivators(rawPageLink.getActivators());
- }
-
- private void initActivators(GlobalActivatorsType rawActivators) {
- if (rawActivators == null) {
- return;
- }
-
- // Let our super class init the "common" activators.
- initCommonActivators(rawActivators);
-
- List<InventoryActivatorType> rawInventoryActivators = rawActivators.getInventory();
- for (InventoryActivatorType rawInventoryActivator : rawInventoryActivators) {
- List<ResourceType> rawResourceConditions = rawInventoryActivator.getResource();
- List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
- rawResourceConditions.size());
- for (ResourceType rawResourceCondition : rawResourceConditions) {
- List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
- EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
- for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
- String rawName = rawPermission.getName().toString();
- Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
- permissions.add(permission);
- }
-
- List<TraitActivatorType> rawTraits = rawResourceCondition.getTrait();
- Map<String, Pattern> traits = new HashMap<String, Pattern>();
- for (TraitActivatorType rawTraitActivator : rawTraits) {
- String name = rawTraitActivator.getName();
- String value = rawTraitActivator.getValue();
- traits.put(name, Pattern.compile(value));
- }
-
- ResourceConditionSet resourceConditionSet = new ResourceConditionSet(rawResourceCondition.getPlugin(),
- rawResourceCondition.getType(), permissions, traits);
- resourceConditionSets.add(resourceConditionSet);
- }
- InventoryActivator resourceTypeActivator = new InventoryActivator(resourceConditionSets);
- getActivators().add(resourceTypeActivator);
- }
+ this.debugMode = ActivatorHelper.initGlobalActivators(rawPageLink.getActivators(), getActivators());
}
/**
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
index 51bd27d..e2ab6e4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
@@ -177,7 +177,7 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
@SuppressWarnings("unchecked")
private boolean isActive(ActivationContext context, EnumSet<ActivationContextScope> scopes, Extension extension) {
- List<Activator> activators = extension.getActivators();
+ List<Activator<?>> activators = extension.getActivators();
for (Activator activator : activators) {
if (scopes.contains(activator.getScope()) && !activator.isActive(context)) {
return false;
@@ -307,7 +307,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/* (non-Javadoc)
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getMenuUrl(org.rhq.core.domain.auth.Subject, java.lang.String)
*/
- @Override
public String getMenuItemUrl(Subject subject, String menuItemName, boolean makeExplicit, boolean makeSecure) {
if (null == menuItemName) {
throw new IllegalArgumentException("Invalid menuItemName: null ");
@@ -350,7 +349,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/* (non-Javadoc)
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getResourceTabUrl(org.rhq.core.domain.auth.Subject, java.lang.String)
*/
- @Override
public String getResourceTabUrl(Subject subject, String tabName, int resourceId, boolean makeExplicit,
boolean makeSecure) {
if (null == tabName) {
@@ -395,7 +393,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/*
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getRootUrl(org.rhq.core.domain.auth.Subject)
*/
- @Override
public String getRootUrl(Subject subject, boolean makeExplicit, boolean makeSecure) {
return makeUrl("/", makeExplicit, makeSecure);
}
@@ -403,7 +400,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/*
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getTargetUrl(org.rhq.core.domain.auth.Subject, org.rhq.enterprise.server.perspective.PerspectiveTarget, int, boolean, boolean)
*/
- @Override
public String getTargetUrl(Subject subject, PerspectiveTarget target, int targetId, boolean makeExplicit,
boolean makeSecure) {
@@ -413,7 +409,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/*
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getTargetUrls(org.rhq.core.domain.auth.Subject, org.rhq.enterprise.server.perspective.PerspectiveTarget, int[], boolean, boolean)
*/
- @Override
public Map<Integer, String> getTargetUrls(Subject subject, PerspectiveTarget target, int[] targetIds,
boolean makeExplicit, boolean makeSecure) {
@@ -429,7 +424,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/*
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getResourceTargetUrl(org.rhq.core.domain.auth.Subject, int, org.rhq.enterprise.server.perspective.PerspectiveTarget, int, boolean, boolean)
*/
- @Override
public String getResourceTargetUrl(Subject subject, int resourceId, PerspectiveTarget target, int targetId,
boolean makeExplicit, boolean makeSecure) {
@@ -439,7 +433,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/*
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getResourceTargetUrls(org.rhq.core.domain.auth.Subject, int, org.rhq.enterprise.server.perspective.PerspectiveTarget, int[], boolean, boolean)
*/
- @Override
public Map<Integer, String> getResourceTargetUrls(Subject subject, int resourceId, PerspectiveTarget target,
int[] targetIds, boolean makeExplicit, boolean makeSecure) {
@@ -455,7 +448,6 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
/* (non-Javadoc)
* @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getTemplateTargetUrl(org.rhq.core.domain.auth.Subject, int, org.rhq.enterprise.server.perspective.PerspectiveTarget, int, boolean, boolean)
*/
- @Override
public String getTemplateTargetUrl(Subject subject, int resourceId, PerspectiveTarget target, int targetId,
boolean makeExplicit, boolean makeSecure) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java
index 2ae5920..f21d0d5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java
@@ -26,7 +26,6 @@ import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.Re
*
* @author Ian Springer
*/
-@SuppressWarnings("unchecked")
public abstract class RenderedExtension extends Extension {
private String displayName;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
index 4c05922..4d833f8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
@@ -20,29 +20,12 @@ package org.rhq.enterprise.server.perspective;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.regex.Pattern;
import org.jetbrains.annotations.NotNull;
-import org.rhq.core.domain.authz.Permission;
-import org.rhq.core.domain.resource.ResourceTypeFacet;
-import org.rhq.enterprise.server.perspective.activator.FacetActivator;
-import org.rhq.enterprise.server.perspective.activator.ResourceConditionSet;
-import org.rhq.enterprise.server.perspective.activator.ResourcePermissionActivator;
-import org.rhq.enterprise.server.perspective.activator.ResourceTypeActivator;
-import org.rhq.enterprise.server.perspective.activator.TraitActivator;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.FacetActivatorType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.InventoryActivatorType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourceActivatorsType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourcePermissionActivatorType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourceType;
+import org.rhq.enterprise.server.perspective.activator.ActivatorHelper;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TabType;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TraitActivatorType;
/**
* A tab in the Resource or Group view.
@@ -64,7 +47,7 @@ public class Tab extends RenderedExtension implements Serializable, Cloneable {
this.url += "&tab=" + this.qualifiedName;
}
this.children = new ArrayList<Tab>();
- initActivators(rawTab.getActivators());
+ this.debugMode = ActivatorHelper.initResourceActivators(rawTab.getActivators(), getActivators());
}
@NotNull
@@ -89,69 +72,6 @@ public class Tab extends RenderedExtension implements Serializable, Cloneable {
return qualifiedName.substring(lastDotIndex + 1);
}
- private void initActivators(ResourceActivatorsType rawActivators) {
- if (rawActivators == null) {
- return;
- }
-
- // Let our super class init the "common" activators.
- initCommonActivators(rawActivators);
-
- List<FacetActivatorType> rawFacetActivators = rawActivators.getFacet();
- for (FacetActivatorType rawFacetActivator : rawFacetActivators) {
- String rawName = rawFacetActivator.getName().toString();
- FacetActivator facetActivator = new FacetActivator(ResourceTypeFacet
- .valueOf(rawName.toUpperCase(Locale.US)));
- getActivators().add(facetActivator);
- }
-
- List<ResourcePermissionActivatorType> rawResourcePermissionActivators = rawActivators.getResourcePermission();
- for (ResourcePermissionActivatorType rawResourcePermissionActivator : rawResourcePermissionActivators) {
- String rawName = rawResourcePermissionActivator.getName().toString();
- Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
- ResourcePermissionActivator resourcePermissionActivator = new ResourcePermissionActivator(permission);
- getActivators().add(resourcePermissionActivator);
- }
-
- List<TraitActivatorType> rawTraitActivators = rawActivators.getTrait();
- for (TraitActivatorType rawTraitActivator : rawTraitActivators) {
- String name = rawTraitActivator.getName();
- String value = rawTraitActivator.getValue();
- TraitActivator traitActivator = new TraitActivator(name, Pattern.compile(value));
- getActivators().add(traitActivator);
- }
-
- List<InventoryActivatorType> rawInventoryActivators = rawActivators.getResourceType();
- for (InventoryActivatorType rawInventoryActivator : rawInventoryActivators) {
- List<ResourceType> rawResourceConditions = rawInventoryActivator.getResource();
- List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
- rawResourceConditions.size());
- for (ResourceType rawResourceCondition : rawResourceConditions) {
- List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
- EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
- for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
- String rawName = rawPermission.getName().toString();
- Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
- permissions.add(permission);
- }
-
- List<TraitActivatorType> rawTraits = rawResourceCondition.getTrait();
- Map<String, Pattern> traits = new HashMap<String, Pattern>();
- for (TraitActivatorType rawTraitActivator : rawTraits) {
- String name = rawTraitActivator.getName();
- String value = rawTraitActivator.getValue();
- traits.put(name, Pattern.compile(value));
- }
-
- ResourceConditionSet resourceConditionSet = new ResourceConditionSet(rawResourceCondition.getPlugin(),
- rawResourceCondition.getType(), permissions, traits);
- resourceConditionSets.add(resourceConditionSet);
- }
- ResourceTypeActivator resourceTypeActivator = new ResourceTypeActivator(resourceConditionSets);
- getActivators().add(resourceTypeActivator);
- }
- }
-
/**
* Note that this will clone the children list but not the child Tab objects themselves.
* @see java.lang.Object#clone()
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java
index 21b63a1..3e36830 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java
@@ -19,19 +19,38 @@
package org.rhq.enterprise.server.perspective.activator;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceTypeFacet;
import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.CommonActivatorsType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.DebugModeActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.FacetActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.GlobalActivatorsType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.GlobalPermissionActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.InventoryActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.LicenseFeatureActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourceActivatorsType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourcePermissionActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourceType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.SuperuserActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TraitActivatorType;
public class ActivatorHelper {
@@ -104,4 +123,147 @@ public class ActivatorHelper {
return matchAll;
}
+ public static boolean initCommonActivators(CommonActivatorsType rawActivators, List<Activator<?>> activators) {
+ boolean debugMode = false;
+
+ if (rawActivators == null) {
+ return debugMode;
+ }
+
+ DebugModeActivatorType rawDebugModeActivator = rawActivators.getDebugMode();
+ if (rawDebugModeActivator != null) {
+ debugMode = true;
+ }
+
+ List<LicenseFeatureActivatorType> rawLicenseFeatures = rawActivators.getLicenseFeature();
+ for (LicenseFeatureActivatorType rawLicenseFeature : rawLicenseFeatures) {
+ String rawName = rawLicenseFeature.getName().value();
+ LicenseFeature licenseFeature = LicenseFeature.valueOf(rawName.toUpperCase(Locale.US));
+ LicenseFeatureActivator licenseFeatureActivator = new LicenseFeatureActivator(licenseFeature);
+ activators.add(licenseFeatureActivator);
+ }
+
+ SuperuserActivatorType rawSuperuserActivator = rawActivators.getSuperuser();
+ if (rawSuperuserActivator != null) {
+ SuperuserActivator superuserActivator = new SuperuserActivator();
+ activators.add(superuserActivator);
+ }
+
+ List<GlobalPermissionActivatorType> rawGlobalPermissionActivators = rawActivators.getGlobalPermission();
+ for (GlobalPermissionActivatorType rawGlobalPermissionActivator : rawGlobalPermissionActivators) {
+ String rawName = rawGlobalPermissionActivator.getName().value();
+ Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
+ GlobalPermissionActivator globalPermissionActivator = new GlobalPermissionActivator(permission);
+ activators.add(globalPermissionActivator);
+ }
+
+ return debugMode;
+ }
+
+ public static boolean initGlobalActivators(GlobalActivatorsType rawActivators, List<Activator<?>> activators) {
+ if (rawActivators == null) {
+ return false;
+ }
+
+ // Let our super class init the "common" activators.
+ boolean debugMode = initCommonActivators(rawActivators, activators);
+
+ List<InventoryActivatorType> rawInventoryActivators = rawActivators.getInventory();
+ for (InventoryActivatorType rawInventoryActivator : rawInventoryActivators) {
+ List<ResourceType> rawResourceConditions = rawInventoryActivator.getResource();
+ List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
+ rawResourceConditions.size());
+ for (ResourceType rawResourceCondition : rawResourceConditions) {
+ List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
+ EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
+ for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
+ String rawName = rawPermission.getName().toString();
+ Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
+ permissions.add(permission);
+ }
+
+ List<TraitActivatorType> rawTraits = rawResourceCondition.getTrait();
+ Map<String, Pattern> traits = new HashMap<String, Pattern>();
+ for (TraitActivatorType rawTraitActivator : rawTraits) {
+ String name = rawTraitActivator.getName();
+ String value = rawTraitActivator.getValue();
+ traits.put(name, Pattern.compile(value));
+ }
+
+ ResourceConditionSet resourceConditionSet = new ResourceConditionSet(rawResourceCondition.getPlugin(),
+ rawResourceCondition.getType(), permissions, traits);
+ resourceConditionSets.add(resourceConditionSet);
+ }
+ InventoryActivator resourceTypeActivator = new InventoryActivator(resourceConditionSets);
+ activators.add(resourceTypeActivator);
+ }
+
+ return debugMode;
+ }
+
+ public static boolean initResourceActivators(ResourceActivatorsType rawActivators, List<Activator<?>> activators) {
+ if (rawActivators == null) {
+ return false;
+ }
+
+ // Let our super class init the "common" activators.
+ boolean debugMode = initCommonActivators(rawActivators, activators);
+
+ List<FacetActivatorType> rawFacetActivators = rawActivators.getFacet();
+ for (FacetActivatorType rawFacetActivator : rawFacetActivators) {
+ String rawName = rawFacetActivator.getName().toString();
+ FacetActivator facetActivator = new FacetActivator(ResourceTypeFacet
+ .valueOf(rawName.toUpperCase(Locale.US)));
+ activators.add(facetActivator);
+ }
+
+ List<ResourcePermissionActivatorType> rawResourcePermissionActivators = rawActivators.getResourcePermission();
+ for (ResourcePermissionActivatorType rawResourcePermissionActivator : rawResourcePermissionActivators) {
+ String rawName = rawResourcePermissionActivator.getName().toString();
+ Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
+ ResourcePermissionActivator resourcePermissionActivator = new ResourcePermissionActivator(permission);
+ activators.add(resourcePermissionActivator);
+ }
+
+ List<TraitActivatorType> rawTraitActivators = rawActivators.getTrait();
+ for (TraitActivatorType rawTraitActivator : rawTraitActivators) {
+ String name = rawTraitActivator.getName();
+ String value = rawTraitActivator.getValue();
+ TraitActivator traitActivator = new TraitActivator(name, Pattern.compile(value));
+ activators.add(traitActivator);
+ }
+
+ List<InventoryActivatorType> rawInventoryActivators = rawActivators.getResourceType();
+ for (InventoryActivatorType rawInventoryActivator : rawInventoryActivators) {
+ List<ResourceType> rawResourceConditions = rawInventoryActivator.getResource();
+ List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
+ rawResourceConditions.size());
+ for (ResourceType rawResourceCondition : rawResourceConditions) {
+ List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
+ EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
+ for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
+ String rawName = rawPermission.getName().toString();
+ Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
+ permissions.add(permission);
+ }
+
+ List<TraitActivatorType> rawTraits = rawResourceCondition.getTrait();
+ Map<String, Pattern> traits = new HashMap<String, Pattern>();
+ for (TraitActivatorType rawTraitActivator : rawTraits) {
+ String name = rawTraitActivator.getName();
+ String value = rawTraitActivator.getValue();
+ traits.put(name, Pattern.compile(value));
+ }
+
+ ResourceConditionSet resourceConditionSet = new ResourceConditionSet(rawResourceCondition.getPlugin(),
+ rawResourceCondition.getType(), permissions, traits);
+ resourceConditionSets.add(resourceConditionSet);
+ }
+ ResourceTypeActivator resourceTypeActivator = new ResourceTypeActivator(resourceConditionSets);
+ activators.add(resourceTypeActivator);
+ }
+
+ return debugMode;
+ }
+
}
commit c61da5c8eef249b6f67b42a285ec758cddb69d39
Merge: 322e4b4... 9ba9416...
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Jan 26 15:05:23 2010 -0500
Fixed merge conflicts
commit 322e4b434e5e76734a9daf6525d2391a0312d580
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Jan 26 14:27:01 2010 -0500
Added a nicer service name.
diff --git a/modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml
index 9723932..77010ce 100644
--- a/modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml
@@ -8,8 +8,8 @@
xmlns="urn:xmlns:rhq-plugin"
xmlns:c="urn:xmlns:rhq-configuration">
- <service name="Services File"
- description="the local file used for mapping host names to IP addresses"
+ <service name="Services Manager"
+ description="the list of services"
discovery="ServicesDiscoveryComponent"
class="ServicesComponent"
supportsManualAdd="true">
commit c229b88895ce39855553ba62e62b3622a6a835ae
Merge: 689eea6... 6ee8a12...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Jan 26 09:40:49 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 689eea6b1a7507e80cc3d1aec4b6a508332b5967
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Jan 26 09:38:55 2010 -0500
improve data for sample page re: page links
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml
index 5243ea3..dcaa8d0 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml
@@ -21,7 +21,7 @@
</title>
</head>
- <body style="background-color: #CCFF66">
+ <body style="background-color: #CCCC99">
<f:view contentType="text/html; charset=UTF-8">
@@ -31,10 +31,41 @@
<div style="padding: 10px; height: 1000px;">
<h4>It's always good to see something from another perspective.</h4>
- <p>You should have arrived at this page by choosing to create a new
- JBoss AS Patch Provider Type.
-
- This page would typically start a workflow to create said provider...
+ <p>You should have arrived at this page by choosing to create a new<br/>
+ <br/>
+ <b>JBoss AS Patch Provider Type</b>.<br/>
+ <br/>
+ This page would typically start a workflow to create said provider...<br/>
+ <br/>
+ It was invoked via a Perspective Page Extension defined in the Sample Perspective via:
+<pre>
+
+<!-- Page extensions -->
+
+<page
+ name="createContentProvider">
+ <page-link
+ name="RHNSource"
+ application="sample"
+ url="createContentProviderRHN.xhtml" />
+ <page-link
+ name="JBossASPatchSource"
+ application="sample"
+ url="createContentProviderJBossASPatch.xhtml" />
+</page>
+
+</pre>
+...and by enhancing the CreateContentProvider page to be an "Extension Point":
+<pre>
+
+<h:outputLink value="\#{CreateContentSourceUIBean.getCreateContentProviderPageLink(item.name)}">
+ <!-- note, do not use f:param with perspectives -->
+
+ <h:outputText value="#{item.displayName}" />
+ <h:outputText value=" *" rendered="#{(not empty param.typeName) and (param.typeName eq item.name)}"/>
+</h:outputLink>
+
+</pre>
</p>
</div>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml
index 6e091c5..c9f66d2 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml
@@ -17,11 +17,11 @@
<head>
<title>
- Create RHN Content Provider
+ Create JBoss AS Patch Content Provider
</title>
</head>
- <body style="background-color: #CCFF66">
+ <body style="background-color: #CCCC99">
<f:view contentType="text/html; charset=UTF-8">
@@ -31,10 +31,41 @@
<div style="padding: 10px; height: 1000px;">
<h4>It's always good to see something from another perspective.</h4>
- <p>You should have arrived at this page by choosing to create a new
- RHN Provider Type.
-
- This page would typically start a workflow to create said provider...
+ <p>You should have arrived at this page by choosing to create a new<br/>
+ <br/>
+ <b>RHN Provider Type</b>.<br/>
+ <br/>
+ This page would typically start a workflow to create said provider...<br/>
+ <br/>
+ It was invoked via a Perspective Page Extension defined in the Sample Perspective via:
+<pre>
+
+<!-- Page extensions -->
+
+<page
+ name="createContentProvider">
+ <page-link
+ name="RHNSource"
+ application="sample"
+ url="createContentProviderRHN.xhtml" />
+ <page-link
+ name="JBossASPatchSource"
+ application="sample"
+ url="createContentProviderJBossASPatch.xhtml" />
+</page>
+
+</pre>
+...and by enhancing the CreateContentProvider page to be an "Extension Point":
+<pre>
+
+<h:outputLink value="\#{CreateContentSourceUIBean.getCreateContentProviderPageLink(item.name)}">
+ <!-- note, do not use f:param with perspectives -->
+
+ <h:outputText value="#{item.displayName}" />
+ <h:outputText value=" *" rendered="#{(not empty param.typeName) and (param.typeName eq item.name)}"/>
+</h:outputLink>
+
+</pre>
</p>
</div>
commit 6ee8a1292535ba2f0fabeb0ccc2b11c9da0e5e61
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 21:59:00 2010 -0500
include Facelets version in About box when debug mode is enabled
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java
index 92ae337..2c9104d 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java
@@ -18,6 +18,9 @@
*/
package org.rhq.enterprise.gui.common.framework;
+import com.sun.facelets.Facelet;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.jboss.seam.Component;
import org.rhq.core.util.maven.MavenArtifactNotFoundException;
import org.rhq.core.util.maven.MavenArtifactProperties;
@@ -36,6 +39,8 @@ import java.util.TimeZone;
public class ServerInfoUIBean {
private static final String UNKNOWN_VERSION = "UNKNOWN";
+ private final Log log = LogFactory.getLog(this.getClass());
+
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
@@ -46,11 +51,15 @@ public class ServerInfoUIBean {
}
public String getFacesVersion() {
- return getVersion(UIComponent.class);
+ return getManifestVersion(UIComponent.class);
+ }
+
+ public String getFaceletsVersion() {
+ return getManifestVersion(Facelet.class);
}
public String getSeamVersion() {
- return getVersion(Component.class);
+ return getManifestVersion(Component.class);
}
public String getRichFacesVersion() {
@@ -58,20 +67,27 @@ public class ServerInfoUIBean {
try {
richFacesMavenProps = MavenArtifactProperties.getInstance("org.richfaces.framework", "richfaces-api");
} catch (MavenArtifactNotFoundException e) {
- // This really should never happen. TODO: Log an error.
+ log.error("Could not ascertain RichFaces version.", e);
richFacesMavenProps = null;
}
- String richFacesVersion = (richFacesMavenProps != null) ? richFacesMavenProps.getVersion() : UNKNOWN_VERSION;
+ String richFacesVersion = (richFacesMavenProps != null) ? richFacesMavenProps.getVersion() : null;
return (richFacesVersion != null) ? richFacesVersion : UNKNOWN_VERSION;
}
- private static String getVersion(Class clazz) {
+ private String getManifestVersion(Class clazz) {
String version = null;
try {
- return clazz.getPackage().getImplementationVersion();
+ Package pkg = clazz.getPackage();
+ if (pkg != null) {
+ version = pkg.getImplementationVersion();
+ if (version == null) {
+ version = pkg.getSpecificationVersion();
+ }
+ }
}
catch (Exception e) {
- return UNKNOWN_VERSION;
+ log.error("Error while looking up manifest version for " + clazz + ".", e);
}
+ return version;
}
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
index ef72e30..aa68e46 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
@@ -240,6 +240,9 @@
<h:panelGroup style="font-weight: bold">JSF RI Version:</h:panelGroup>
<h:panelGroup style="font-color: red">#{ServerInfoUIBean.facesVersion}</h:panelGroup>
+ <h:panelGroup style="font-weight: bold">Facelets Version:</h:panelGroup>
+ <h:panelGroup style="font-color: red">#{ServerInfoUIBean.faceletsVersion}</h:panelGroup>
+
<h:panelGroup style="font-weight: bold">Seam Version:</h:panelGroup>
<h:panelGroup style="font-color: red">#{ServerInfoUIBean.seamVersion}</h:panelGroup>
commit 0f5170bb75f42b6eeb234b9ea03171a53cae5bd0
Merge: 81147b1... 52421a1...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 19:09:03 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 81147b13f404a17f27d954a379e9079ddb1dd4ce
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 19:07:34 2010 -0500
implement PageControl.equals() and refactor getRowData() to leverage it; get sorting working using AJAX
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
index c0f6bac..2faad02 100644
--- a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
@@ -64,8 +64,8 @@
stepControls="show"
fastControls="hide"
boundaryControls="hide"
- maxPages="#{pagedDataUIBean.maximumPages}"
- page="#{pageControl.pageNumber}">
+ maxPages="#{pagedDataUIBean.dataScrollerMaxPages}"
+ page="#{pagedDataUIBean.dataScrollerPage}">
<f:facet name="next">
<h:panelGroup>
<h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright.gif"
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
index 8e47198..6d92dc4 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
@@ -22,6 +22,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.ajax4jsf.event.AjaxEvent;
+import org.ajax4jsf.event.AjaxListener;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@@ -33,13 +35,17 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.gui.model.PagedDataProvider;
+import org.rhq.core.gui.table.component.SortableColumnHeaderComponent;
import org.rhq.core.gui.table.model.PagedListDataModel;
+import org.rhq.core.gui.util.FacesComponentUtility;
import org.rhq.enterprise.client.RemoteClient;
import org.rhq.enterprise.server.perspective.AbstractPerspectivePagedDataUIBean;
import org.rhq.enterprise.server.perspective.PerspectiveManagerRemote;
import org.rhq.enterprise.server.perspective.PerspectiveTarget;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
+import javax.faces.component.UIData;
+
/**
* A Seam component that utilizes the RHQ remote API to obtain a paged list of all inventoried Resources.
*
@@ -47,7 +53,7 @@ import org.rhq.enterprise.server.resource.ResourceManagerRemote;
*/
@Name("BrowseResourcesUIBean")
@Scope(ScopeType.CONVERSATION)
-public class BrowseResourcesUIBean extends AbstractPerspectivePagedDataUIBean {
+public class BrowseResourcesUIBean extends AbstractPerspectivePagedDataUIBean implements AjaxListener {
private List<Resource> selectedResources;
private Map<Integer, String> resourceUrlMap = new HashMap<Integer, String>();
@@ -129,8 +135,7 @@ public class BrowseResourcesUIBean extends AbstractPerspectivePagedDataUIBean {
this.resourceUrlMap = perspectiveManager.getTargetUrls(subject, PerspectiveTarget.RESOURCE, ids, false,
false);
} catch (Exception e) {
- // for the demo, just dump a stack in this unlikely case
- e.printStackTrace();
+ throw new RuntimeException("Failed to retrieve Resource URLs.", e);
}
}
@@ -138,6 +143,24 @@ public class BrowseResourcesUIBean extends AbstractPerspectivePagedDataUIBean {
return this.resourceUrlMap;
}
+ public AjaxListener getAjaxSortListener() {
+ return this;
+ }
+
+ public void processAjax(AjaxEvent ajaxEvent) {
+ SortableColumnHeaderComponent sortableColumnHeader = (SortableColumnHeaderComponent)ajaxEvent.getComponent();
+ String sortBy = sortableColumnHeader.getSortBy();
+
+ UIData data = FacesComponentUtility.getAncestorOfType(sortableColumnHeader, UIData.class);
+ PagedListDataModel<?> model = (PagedListDataModel<?>) data.getValue();
+
+ PageControl pageControl = model.getPageControl();
+ pageControl.sortBy(sortBy);
+ // Even though its the same PageControl instance, call setPageControl() so the updated version gets
+ // persisted.
+ model.setPageControl(pageControl);
+ }
+
private class ResourcesDataProvider implements PagedDataProvider<Resource> {
private Subject subject;
private ResourceManagerRemote resourceManager;
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index 7664c4a..b425a61 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -18,7 +18,7 @@
<ui:define name="body">
<ui:remove><!-- NOTE: The table needs to be surrounded by a form for paging and sorting to work! --></ui:remove>
- <a4j:form ajaxSubmit="true" reRender="resourcesDataTable">
+ <a4j:form ajaxSubmit="false" reRender="resourcesDataTable">
<rich:dataTable id="resourcesDataTable"
value="#{BrowseResourcesUIBean.dataModel}" var="resource"
@@ -37,6 +37,8 @@
<rich:column width="55" sortBy="r.id">
<f:facet name="header">
<rhq:sortableColumnHeader sortBy="r.id">
+ <a4j:support event="onclick"
+ actionListener="#{BrowseResourcesUIBean.ajaxSortListener}"/>
<h:outputText value="Id"/>
</rhq:sortableColumnHeader>
</f:facet>
@@ -49,6 +51,8 @@
<rich:column sortBy="r.name" width="235">
<f:facet name="header">
<rhq:sortableColumnHeader sortBy="r.name">
+ <a4j:support event="onclick"
+ actionListener="#{BrowseResourcesUIBean.ajaxSortListener}"/>
<h:outputText value="Name"/>
</rhq:sortableColumnHeader>
</f:facet>
@@ -59,6 +63,8 @@
<rich:column sortBy="r.description">
<f:facet name="header">
<rhq:sortableColumnHeader sortBy="r.description">
+ <a4j:support event="onclick"
+ actionListener="#{BrowseResourcesUIBean.ajaxSortListener}"/>
<h:outputText value="Description"/>
</rhq:sortableColumnHeader>
</f:facet>
@@ -71,9 +77,7 @@
<rich:column colspan="4">
<rhq:selectedRowsCommandButton
value="UNINVENTORY"
- action="#{BrowseResourcesUIBean.uninventorySelectedResources}">
- <a4j:support event="onclick" reRender="resourcesDataTable"/>
- </rhq:selectedRowsCommandButton>
+ action="#{BrowseResourcesUIBean.uninventorySelectedResources}"/>
<ui:include src="/WEB-INF/includes/pageControls.xhtml">
<ui:param name="pagedDataUIBean" value="#{BrowseResourcesUIBean}"/>
@@ -85,7 +89,7 @@
</rich:dataTable>
</a4j:form>
- <a4j:form ajaxSubmit="true" reRender="resources2Panel">
+ <a4j:form ajaxSubmit="true" reRender="resources2DataTable" rendered="#{not empty param['t2']}">
<rich:dataTable id="resources2DataTable"
value="#{BrowseResources2UIBean.dataModel}" var="resource"
first="#{BrowseResources2UIBean.pageControl.pageNumber}"
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
index 0366380..76eabd6 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
@@ -237,6 +237,28 @@ public class PageControl implements Serializable, Cloneable {
}
@Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ PageControl that = (PageControl) o;
+
+ if (pageNumber != that.pageNumber) return false;
+ if (pageSize != that.pageSize) return false;
+ if (!orderingFields.equals(that.orderingFields)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = pageNumber;
+ result = 31 * result + pageSize;
+ result = 31 * result + orderingFields.hashCode();
+ return result;
+ }
+
+ @Override
public String toString() {
StringBuilder buf = new StringBuilder("PageControl[");
buf.append("page=").append(pageNumber).append(", ");
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java
index d4ce3c2..8e8abe4 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java
@@ -44,7 +44,7 @@ public abstract class AbstractPagedDataUIBean<T> {
/** The number of specific pages to display on the data scroller - limit to 7 pages until we find a general fix for
* RHQ-1813. */
- private static final int MAXIMUM_PAGES = 7;
+ private static final int DATA_SCROLLER_MAX_PAGES = 7;
@In
protected FacesMessages facesMessages;
@@ -68,8 +68,18 @@ public abstract class AbstractPagedDataUIBean<T> {
return DEFAULT_PAGE_SIZE;
}
- public int getMaximumPages() {
- return MAXIMUM_PAGES;
+ public int getDataScrollerMaxPages() {
+ return DATA_SCROLLER_MAX_PAGES;
+ }
+
+ public int getDataScrollerPage() {
+ // rich:dataScroller expects its 'page' attribute to be 1-indexed, not 0-indexed.
+ return getPageControl().getPageNumber() + 1;
+ }
+
+ public void setDataScrollerPage(int i) {
+ // rich:dataScroller expects its 'page' attribute to be 1-indexed, not 0-indexed.
+ getPageControl().setPageNumber(i - 1);
}
@NotNull
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
index a3883b9..5be7b6a 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
@@ -18,6 +18,7 @@
*/
package org.rhq.core.gui.table.component;
+import org.ajax4jsf.event.AjaxSource;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.gui.util.FacesExpressionUtility;
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java
index 46f4b03..6e9922c 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java
@@ -18,6 +18,9 @@
*/
package org.rhq.core.gui.table.component;
+import org.ajax4jsf.event.AjaxEvent;
+import org.ajax4jsf.event.AjaxListener;
+import org.ajax4jsf.event.AjaxSource;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.gui.table.model.PagedListDataModel;
import org.rhq.core.gui.util.FacesComponentUtility;
@@ -29,23 +32,26 @@ import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
/**
* @author Ian Springer
* @author Joseph Marques
*/
-public class SortableColumnHeaderComponent extends HtmlCommandLink {
+public class SortableColumnHeaderComponent extends HtmlCommandLink implements AjaxSource {
public static final String COMPONENT_TYPE = "org.rhq.SortableColumnHeader";
public static final String COMPONENT_FAMILY = "org.rhq.SortableColumnHeader";
private String sortBy;
+ private List<AjaxListener> ajaxListeners;
public SortableColumnHeaderComponent() {
super();
- addActionListener(new SortableColumnHeaderActionListener());
-
- // TODO - Do we need this? I don't think so.
- //setActionExpression(FacesExpressionUtility.createMethodExpression("#{TableSorter.obtainFromOutcome}", String.class, new Class[] {}));
+ SortableColumnHeaderListener listener = new SortableColumnHeaderListener();
+ addActionListener(listener);
+ this.ajaxListeners = new ArrayList<AjaxListener>(1);
+ addAjaxListener(listener);
}
public String getSortBy() {
@@ -64,6 +70,19 @@ public class SortableColumnHeaderComponent extends HtmlCommandLink {
return COMPONENT_FAMILY;
}
+
+ public void addAjaxListener(AjaxListener listener) {
+ this.ajaxListeners.add(listener);
+ }
+
+ public AjaxListener[] getAjaxListeners() {
+ return this.ajaxListeners.toArray(new AjaxListener[this.ajaxListeners.size()]);
+ }
+
+ public void removeAjaxListener(AjaxListener listener) {
+ this.ajaxListeners.remove(listener);
+ }
+
private Object[] values;
public Object saveState(FacesContext context) {
@@ -88,23 +107,29 @@ public class SortableColumnHeaderComponent extends HtmlCommandLink {
this.sortBy = (String) values[1];
}
- private class SortableColumnHeaderActionListener implements ActionListener {
+
+ public class SortableColumnHeaderListener implements ActionListener, AjaxListener {
public void processAction(ActionEvent event) throws AbortProcessingException {
SortableColumnHeaderComponent sortableColumnHeader = (SortableColumnHeaderComponent)event.getComponent();
- String sortBy = sortableColumnHeader.getSortBy();
+ sort(sortableColumnHeader);
+ }
+
+ public void processAjax(AjaxEvent event) {
+ SortableColumnHeaderComponent sortableColumnHeader = (SortableColumnHeaderComponent)event.getComponent();
+ sort(sortableColumnHeader);
+ }
- UIData table = FacesComponentUtility.getAncestorOfType(sortableColumnHeader, UIData.class);
- PagedListDataModel<?> model = (PagedListDataModel<?>) table.getValue();
+ private void sort(SortableColumnHeaderComponent sortableColumnHeader) {
+ String sortBy = sortableColumnHeader.getSortBy();
- // work-around to bypass stale data model caused by a4j:keepAlive for the PagedDataTableUIBean
- //PageControlView pageControlView = model.getPageControlView();
- //PagedDataTableUIBean pagedDataTableUIBean = pageControlView.getPagedDataTableUIBean();
- //pagedDataTableUIBean.setDataModel(null);
+ UIData data = FacesComponentUtility.getAncestorOfType(sortableColumnHeader, UIData.class);
+ PagedListDataModel<?> model = (PagedListDataModel<?>) data.getValue();
PageControl pageControl = model.getPageControl();
pageControl.sortBy(sortBy);
+ // Even though its the same PageControl instance, call setPageControl() so the updated version gets
+ // persisted.
model.setPageControl(pageControl);
-
}
}
}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java
index 743a7ba..efb5f56 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java
@@ -28,8 +28,8 @@ import org.rhq.core.gui.table.bean.AbstractPagedDataUIBean;
import javax.faces.model.DataModel;
/**
- * @author Joseph Marques
* @author Ian Springer
+ * @author Joseph Marques
*
* @param <T> the data object type
*/
@@ -86,7 +86,7 @@ public abstract class PagedListDataModel<T> extends DataModel {
*/
@Override
public int getRowCount() {
- return getPage().getTotalSize();
+ return getCurrentPage().getTotalSize();
}
/**
@@ -95,10 +95,17 @@ public abstract class PagedListDataModel<T> extends DataModel {
*
* @return the current page
*/
- private PageList<T> getPage() {
+ private PageList<T> getCurrentPage() {
// ensure page exists - first time going to this view
if (this.pageList == null) {
this.pageList = getDataPage();
+ } else {
+ PageControl currentPageControl = this.pagedDataBean.getPageControl();
+ PageControl lastUsedPageControl = this.pageList.getPageControl();
+ if (!currentPageControl.equals(lastUsedPageControl)) {
+ // One or more paging/sorting settings have been updated - we need to load a new page.
+ this.pageList = getDataPage();
+ }
}
return this.pageList;
}
@@ -113,67 +120,24 @@ public abstract class PagedListDataModel<T> extends DataModel {
*/
@Override
public Object getRowData() {
- if (this.currentRowIndex < 0) {
- throw new IllegalArgumentException("Invalid rowIndex for PagedListDataModel; not within page");
- }
-
- PageControl pageControl = this.pagedDataBean.getPageControl();
-
- int startRow = pageControl.getStartRow();
- int endRow;
-
- if (pageControl.getPageSize() == PageControl.SIZE_UNLIMITED) {
- endRow = Integer.MAX_VALUE;
- } else {
- int nRows = pageControl.getPageSize();
- endRow = startRow + nRows - 1;
- }
-
- // paging backwards - will we ever get in this if-statement if pageControl.getPageSize == SIZE_UNLIMITED?
- if (currentRowIndex < startRow) {
- int rowsBack = startRow - currentRowIndex;
- int pagesBack = (int) Math.ceil(rowsBack / (double) pageControl.getPageSize());
- int newPage = pageControl.getPageNumber() - pagesBack;
-
- if (newPage < 0) {
- newPage = 0;
- }
-
- pageControl.setPageNumber(newPage);
- pageList = getDataPage();
- startRow = pageControl.getStartRow();
- }
-
- // paging forwards
- else if (currentRowIndex > endRow) {
- int rowsForward = currentRowIndex - endRow;
- int pagesForward = (int) Math.ceil(rowsForward / (double) pageControl.getPageSize());
- int newPage = pageControl.getPageNumber() + pagesForward;
-
- pageControl.setPageNumber(newPage);
- pageList = getDataPage();
- startRow = pageControl.getStartRow();
- }
-
- /*
- * March 11, 2009 - the only currently known way this can fail is if the countQuery returned 0 but the
- * actual data query returned nothing; generally, this is a programming error, but it's possible that
- * the facelet changed (new columns shown, other columns removed) or the query itself changed (and perhaps
- * the sortable columns are different); in either case, let's be paranoid and try it all over again with
- * a default PageControl object.
- */
- int getIndex = currentRowIndex - startRow;
- if (getIndex < 0 || getIndex >= pageList.size()) {
- // getting the default will repersist the new PageControl too
+ getCurrentPage();
+ if (!isRowAvailable()) {
+ /*
+ * March 11, 2009 - the only currently known way this can fail is if the countQuery returned 0 but the
+ * actual data query returned nothing; generally, this is a programming error, but it's possible that
+ * the facelet changed (new columns shown, other columns removed) or the query itself changed (and perhaps
+ * the sortable columns are different); in either case, let's be paranoid and try it all over again with
+ * a default PageControl object.
+ */
+ // Reset back to the default page control, which will also persist the default page control.
this.pagedDataBean.resetPageControl();
- this.pageList = getDataPage();
-
- // pageControl startRow should now be zero
- this.currentRowIndex = 0; // and tell the framework to start back at 0
- getIndex = 0; // now the getIndex should be 0
+ getCurrentPage();
+ // Tell the framework to start back at the first row in the page.
+ this.currentRowIndex = 0;
}
+ int pageIndex = this.currentRowIndex - getPageControl().getStartRow();
- return pageList.get(getIndex);
+ return this.pageList.get(pageIndex);
}
@Override
@@ -191,19 +155,10 @@ public abstract class PagedListDataModel<T> extends DataModel {
*/
@Override
public boolean isRowAvailable() {
- PageList<T> page = getPage();
- if (page == null) {
- return false;
- }
-
- int rowIndex = getRowIndex();
- if (rowIndex < 0) {
- return false;
- } else if (rowIndex >= page.getTotalSize()) {
- return false;
- } else {
- return true;
- }
+ getCurrentPage();
+ return (this.pageList != null &&
+ this.currentRowIndex >= 0 &&
+ this.currentRowIndex < pageList.getTotalSize());
}
private PageList<T> getDataPage() {
commit 52421a1acf7774db7ef34f575d1a21647e141ff5
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Mon Jan 25 16:37:52 2010 -0500
more css ui work on left nav
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
index 91c28c8..583a9fe 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
@@ -2248,6 +2248,7 @@ ul.radio-group .unspecified {
font-weight: normal;
font-family: tahoma, verdana, sans-serif;
font-size: 11px;
+ cursor: pointer;
}
.availLinkUp {
@@ -2327,3 +2328,12 @@ ul.radio-group .unspecified {
text-decoration: none;
color: #000;
}
+
+.rich-tree-node-selected {
+ border-color:#D4CFC7;
+ background: #E5E5E5;
+}
+
+.rich-tree-h-ic-img, .rich-tree-node-handleicon-collapsed, .rich-tree-node-handleicon-expanded {
+ cursor:pointer;
+}
commit b57d0c20a37817a44831bdd5a823455b7b113ac8
Merge: be7dd2d... 615f198...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 25 14:56:37 2010 -0500
Merge branch 'linux-config' into linux-config-dev
commit be7dd2dc6a4dd70e7a3b8e86df3636909c204deb
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 25 14:54:13 2010 -0500
Add page link extensions to RHQ and AS Patch provider types. This should
probably get enhanced to direct back to the real pages since it
borks the ability to actually create those providers.
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml
new file mode 100644
index 0000000..5243ea3
--- /dev/null
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderJBossASPatch.xhtml
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
+<ui:remove>
+ <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
+ other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
+ We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
+ including an xml prolog causes IE6 to go into the undesirable "quirks mode".
+ (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
+</ui:remove>
+
+ <head>
+ <title>
+ Create JBoss AS Patch Content Provider
+ </title>
+ </head>
+
+ <body style="background-color: #CCFF66">
+
+ <f:view contentType="text/html; charset=UTF-8">
+
+ <!-- Force the page to be taller than the height of the browser
+ to test that a vertical scrollbar is not added to the
+ enclosing iframe. -->
+ <div style="padding: 10px; height: 1000px;">
+ <h4>It's always good to see something from another perspective.</h4>
+
+ <p>You should have arrived at this page by choosing to create a new
+ JBoss AS Patch Provider Type.
+
+ This page would typically start a workflow to create said provider...
+ </p>
+
+ </div>
+
+ </f:view>
+
+ </body>
+
+</html>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml
new file mode 100644
index 0000000..6e091c5
--- /dev/null
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/createContentProviderRHN.xhtml
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
+<ui:remove>
+ <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
+ other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
+ We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
+ including an xml prolog causes IE6 to go into the undesirable "quirks mode".
+ (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
+</ui:remove>
+
+ <head>
+ <title>
+ Create RHN Content Provider
+ </title>
+ </head>
+
+ <body style="background-color: #CCFF66">
+
+ <f:view contentType="text/html; charset=UTF-8">
+
+ <!-- Force the page to be taller than the height of the browser
+ to test that a vertical scrollbar is not added to the
+ enclosing iframe. -->
+ <div style="padding: 10px; height: 1000px;">
+ <h4>It's always good to see something from another perspective.</h4>
+
+ <p>You should have arrived at this page by choosing to create a new
+ RHN Provider Type.
+
+ This page would typically start a workflow to create said provider...
+ </p>
+
+ </div>
+
+ </f:view>
+
+ </body>
+
+</html>
diff --git a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index b58db40..15da210 100644
--- a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -248,4 +248,19 @@
placement="after" />
</tab>
+ <!-- Page extensions -->
+
+ <page
+ name="createContentProvider">
+ <page-link
+ name="RHNSource"
+ application="sample"
+ url="createContentProviderRHN.xhtml" />
+ <page-link
+ name="JBossASPatchSource"
+ application="sample"
+ url="createContentProviderJBossASPatch.xhtml" />
+ </page>
+
+
</perspective-plugin>
\ No newline at end of file
commit d2ed7aa7260aee51543711d2f21e12314bbbf6c0
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 25 14:52:32 2010 -0500
Utilize PageLink extensions in the CreateContentProvider page.
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateContentSourceUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateContentSourceUIBean.java
index 1d85618..67a61c0 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateContentSourceUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/CreateContentSourceUIBean.java
@@ -41,12 +41,15 @@ import org.rhq.enterprise.gui.common.paging.PagedListDataModel;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.content.ContentException;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
+import org.rhq.enterprise.server.perspective.PerspectiveManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
public class CreateContentSourceUIBean extends PagedDataTableUIBean {
public static final String MANAGED_BEAN_NAME = "CreateContentSourceUIBean";
- private ContentSourceManagerLocal manager = LookupUtil.getContentSourceManager();
+ private ContentSourceManagerLocal contentSourceManager = LookupUtil.getContentSourceManager();
+
+ private PerspectiveManagerLocal perspectiveManager = LookupUtil.getPerspectiveManager();
private ContentSource newContentSource = new ContentSource();
private ContentSourceType selectedContentSourceType = null;
@@ -176,7 +179,7 @@ public class CreateContentSourceUIBean extends PagedDataTableUIBean {
if (this.selectedContentSourceType == null
|| (this.selectedContentSourceType != null && !typeName.equals(this.selectedContentSourceType
.getName()))) {
- this.selectedContentSourceType = manager.getContentSourceType(typeName);
+ this.selectedContentSourceType = contentSourceManager.getContentSourceType(typeName);
updateSelectedContentSourceType(this.selectedContentSourceType);
}
}
@@ -192,11 +195,24 @@ public class CreateContentSourceUIBean extends PagedDataTableUIBean {
@Override
public PageList<ContentSourceType> fetchPage(PageControl pc) {
- Set<ContentSourceType> types = manager.getAllContentSourceTypes();
+ Set<ContentSourceType> types = contentSourceManager.getAllContentSourceTypes();
PageList<ContentSourceType> results = null;
results = new PageList<ContentSourceType>(types, types.size(), PageControl.getUnlimitedInstance());
return results;
}
}
+
+ public String getCreateContentProviderPageLink(String typeName) {
+ Subject subject = EnterpriseFacesContextUtility.getSubject();
+ String link = perspectiveManager.getPageLink(subject, "createContentProvider", typeName, null);
+
+ if (null == link) {
+ link = "/rhq/content/createContentProvider.xhtml?mode=new&typeName=" + typeName;
+ } else {
+ link += "&mode=new&typeName=" + typeName;
+ }
+
+ return link;
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/createContentProvider.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/createContentProvider.xhtml
index 5f6bef7..1a48919 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/createContentProvider.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/createContentProvider.xhtml
@@ -70,9 +70,8 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputLink value="/rhq/content/createContentProvider.xhtml">
- <f:param name="typeName" value="#{item.name}" />
- <f:param name="mode" value="new"/>
+ <h:outputLink value="#{CreateContentSourceUIBean.getCreateContentProviderPageLink(item.name)}">
+ <!-- note, do not use f:param with perspectives -->
<h:outputText value="#{item.displayName}" />
<h:outputText value=" *" rendered="#{(not empty param.typeName) and (param.typeName eq item.name)}"/>
commit b9debfe783c89d1c1182519f7201e128653c17cb
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 25 14:51:09 2010 -0500
Split ExtensionType into ExtensionType and RenderedExtensionType to better
support PageLinkType. PageLinkType is a new (non-rendered) extension type for allowing
certain UI pages to use perspectives to replace links at runtime.
Also, consolidate url into base ExtensionType
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java
index 6aa8322..4042aba 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Extension.java
@@ -43,20 +43,16 @@ import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.Su
*/
@SuppressWarnings("unchecked")
public abstract class Extension {
- private String perspectiveName;
- private String name;
- private String displayName;
- private String url;
- private String iconUrl;
- private boolean debugMode;
+ protected String perspectiveName;
+ protected String name;
+ protected String url;
+ protected boolean debugMode;
private List<Activator> activators;
public Extension(ExtensionType rawExtension, String perspectiveName, String url) {
this.perspectiveName = perspectiveName;
this.name = rawExtension.getName();
- this.displayName = rawExtension.getDisplayName();
this.url = url;
- this.iconUrl = rawExtension.getIconUrl();
this.activators = new ArrayList<Activator>();
}
@@ -68,18 +64,10 @@ public abstract class Extension {
return name;
}
- public String getDisplayName() {
- return displayName;
- }
-
public String getUrl() {
return url;
}
- public String getIconUrl() {
- return iconUrl;
- }
-
public boolean isDebugMode() {
return debugMode;
}
@@ -143,7 +131,6 @@ public abstract class Extension {
@Override
public String toString() {
- return this.getClass().getSimpleName() + "[name=" + this.name + ", displayName=" + this.displayName + ", url="
- + this.url + ", iconUrl=" + this.iconUrl + "]";
+ return this.getClass().getSimpleName() + "[name=" + this.name + ", url=" + this.url + "]";
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
index c5d21ca..9698ac2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
@@ -43,7 +43,7 @@ import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.Tr
/**
* An item in the RHQ GUI's menu.
*/
-public class MenuItem extends Extension implements Serializable, Cloneable {
+public class MenuItem extends RenderedExtension implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
private MenuItemFeatureType feature;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java
new file mode 100644
index 0000000..2776875
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PageLink.java
@@ -0,0 +1,102 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.perspective;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.rhq.core.domain.authz.Permission;
+import org.rhq.enterprise.server.perspective.activator.InventoryActivator;
+import org.rhq.enterprise.server.perspective.activator.ResourceConditionSet;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.GlobalActivatorsType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.InventoryActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.PageLinkType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourcePermissionActivatorType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ResourceType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TraitActivatorType;
+
+/**
+ * An item in the RHQ GUI's menu.
+ */
+public class PageLink extends Extension implements Serializable, Cloneable {
+ private static final long serialVersionUID = 1L;
+
+ private String pageName;
+
+ public PageLink(PageLinkType rawPageLink, String perspectiveName, String pageName, String url) {
+ super(rawPageLink, perspectiveName, url);
+
+ this.pageName = pageName;
+
+ initActivators(rawPageLink.getActivators());
+ }
+
+ private void initActivators(GlobalActivatorsType rawActivators) {
+ if (rawActivators == null) {
+ return;
+ }
+
+ // Let our super class init the "common" activators.
+ initCommonActivators(rawActivators);
+
+ List<InventoryActivatorType> rawInventoryActivators = rawActivators.getInventory();
+ for (InventoryActivatorType rawInventoryActivator : rawInventoryActivators) {
+ List<ResourceType> rawResourceConditions = rawInventoryActivator.getResource();
+ List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
+ rawResourceConditions.size());
+ for (ResourceType rawResourceCondition : rawResourceConditions) {
+ List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
+ EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
+ for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
+ String rawName = rawPermission.getName().toString();
+ Permission permission = Permission.valueOf(rawName.toUpperCase(Locale.US));
+ permissions.add(permission);
+ }
+
+ List<TraitActivatorType> rawTraits = rawResourceCondition.getTrait();
+ Map<String, Pattern> traits = new HashMap<String, Pattern>();
+ for (TraitActivatorType rawTraitActivator : rawTraits) {
+ String name = rawTraitActivator.getName();
+ String value = rawTraitActivator.getValue();
+ traits.put(name, Pattern.compile(value));
+ }
+
+ ResourceConditionSet resourceConditionSet = new ResourceConditionSet(rawResourceCondition.getPlugin(),
+ rawResourceCondition.getType(), permissions, traits);
+ resourceConditionSets.add(resourceConditionSet);
+ }
+ InventoryActivator resourceTypeActivator = new InventoryActivator(resourceConditionSets);
+ getActivators().add(resourceTypeActivator);
+ }
+ }
+
+ /**
+ * @return the pageName
+ */
+ public String getPageName() {
+ return pageName;
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
index 5a7bf55..51bd27d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
@@ -91,6 +91,22 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
return filteredTabs;
}
+ public String getPageLink(Subject subject, String pageName, String linkName, String defaultValue) {
+ CacheEntry cacheEntry = getCacheEntry(subject);
+ List<PageLink> pageLinks = cacheEntry.getPageLinks();
+
+ String result = defaultValue;
+
+ for (PageLink pageLink : pageLinks) {
+ if (pageLink.getPageName().equals(pageName) && pageLink.getName().equals(linkName)) {
+ result = pageLink.getUrl();
+ break;
+ }
+ }
+
+ return result;
+ }
+
/**
* Recursively applies activators, based on the specified contexts, to a menu, and returns a
* filtered, deep copy of the menu. The supplied <menu> is unmodified.
@@ -142,6 +158,23 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
return filteredTabs;
}
+ /**
+ * Applies activators, based on the specified contexts, to a list of PageLinks, and returns a
+ * filtered list. The supplied <List> is unmodified.
+ */
+ private List<PageLink> applyActivatorsToPageLinks(ActivationContext context,
+ EnumSet<ActivationContextScope> scopes, List<PageLink> pageLinks) {
+
+ List<PageLink> filteredPageLinks = new ArrayList<PageLink>();
+ for (PageLink pageLink : pageLinks) {
+ if (isActive(context, scopes, pageLink)) {
+ filteredPageLinks.add(pageLink);
+ }
+ }
+
+ return filteredPageLinks;
+ }
+
@SuppressWarnings("unchecked")
private boolean isActive(ActivationContext context, EnumSet<ActivationContextScope> scopes, Extension extension) {
List<Activator> activators = extension.getActivators();
@@ -170,7 +203,10 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
List<Tab> baseTabs = getPluginMetadataManager().getResourceTabs();
List<Tab> filteredTabs = applyActivatorsToTabs(context, scopes, baseTabs);
- cacheEntry = new CacheEntry(metadataLastModifiedTime, filteredMenu, filteredTabs);
+ List<PageLink> basePageLinks = getPluginMetadataManager().getPageLinks();
+ List<PageLink> filteredPageLinks = applyActivatorsToPageLinks(context, scopes, basePageLinks);
+
+ cacheEntry = new CacheEntry(metadataLastModifiedTime, filteredMenu, filteredTabs, filteredPageLinks);
CACHE.put(sessionId, cacheEntry);
}
return cacheEntry;
@@ -223,10 +259,16 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
// We cache it because the variables used by the global activators do not change very often.
private List<Tab> tabs;
- public CacheEntry(long metadataLastModifiedTime, List<MenuItem> menu, List<Tab> tabs) {
+ // This is a list of references into the base pageLinks that has had all global-scoped activators
+ // already applied to it. We cache it because the variables used by the global activators do not
+ // change very often.
+ private List<PageLink> pageLinks;
+
+ public CacheEntry(long metadataLastModifiedTime, List<MenuItem> menu, List<Tab> tabs, List<PageLink> pageLinks) {
this.metadataLastModifiedTime = metadataLastModifiedTime;
this.menu = menu;
this.tabs = tabs;
+ this.pageLinks = pageLinks;
}
public long getMetadataLastModifiedTime() {
@@ -240,6 +282,10 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
public List<Tab> getTabs() {
return tabs;
}
+
+ public List<PageLink> getPageLinks() {
+ return pageLinks;
+ }
}
/**
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java
index 009d258..5ee4491 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java
@@ -50,6 +50,17 @@ public interface PerspectiveManagerLocal {
List<Tab> getResourceTabs(Subject subject, Resource resource);
/**
+ * Return the url for the given page and name, if one is defined.
+ *
+ * @param subject a user
+ * @param pageName, a valid page extension point
+ * @param linkName, the link that should be replaced
+ * @param defaultValue, if no perspective link is defined for the pageName+linkName, the value to return
+ * @return the page link extenstion's url. defaultValue if not found
+ */
+ String getPageLink(Subject subject, String pageName, String linkName, String defaultValue);
+
+ /**
* Given a targetUrlKey parameter value, as set in the extension, resolve that key into the targetUrl
* for the extension's content.
*
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java
new file mode 100644
index 0000000..2ae5920
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/RenderedExtension.java
@@ -0,0 +1,54 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.perspective;
+
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.RenderedExtensionType;
+
+/**
+ * A GUI extension defined by the Perspective subsystem. Currently there are four types of extensions -
+ * menu item, tab, global task, and Resource task.
+ *
+ * @author Ian Springer
+ */
+@SuppressWarnings("unchecked")
+public abstract class RenderedExtension extends Extension {
+
+ private String displayName;
+ private String iconUrl;
+
+ public RenderedExtension(RenderedExtensionType rawExtension, String perspectiveName, String url) {
+ super(rawExtension, perspectiveName, url);
+ this.displayName = rawExtension.getDisplayName();
+ this.iconUrl = rawExtension.getIconUrl();
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public String getIconUrl() {
+ return iconUrl;
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + "[name=" + this.name + ", displayName=" + this.displayName + ", url="
+ + this.url + ", iconUrl=" + this.iconUrl + "]";
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
index 50e43f0..4c05922 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
@@ -49,19 +49,17 @@ import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.Tr
*
* @author Ian Springer
*/
-public class Tab extends Extension implements Serializable, Cloneable {
+public class Tab extends RenderedExtension implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
private String name;
private String qualifiedName;
- private String url;
private List<Tab> children;
public Tab(TabType rawTab, String perspectiveName) {
super(rawTab, perspectiveName, rawTab.getUrl());
this.name = getSimpleName(rawTab.getName());
this.qualifiedName = rawTab.getName();
- this.url = rawTab.getUrl();
if (rawTab.getApplication() != null) {
this.url += "&tab=" + this.qualifiedName;
}
@@ -86,10 +84,6 @@ public class Tab extends Extension implements Serializable, Cloneable {
return name;
}
- public String getUrl() {
- return url;
- }
-
private static String getSimpleName(String qualifiedName) {
int lastDotIndex = qualifiedName.lastIndexOf(".");
return qualifiedName.substring(lastDotIndex + 1);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/metadata/PerspectivePluginMetadataManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/metadata/PerspectivePluginMetadataManager.java
index 610503a..72d62b5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/metadata/PerspectivePluginMetadataManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/metadata/PerspectivePluginMetadataManager.java
@@ -27,14 +27,18 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.enterprise.server.perspective.MenuItem;
+import org.rhq.enterprise.server.perspective.PageLink;
import org.rhq.enterprise.server.perspective.Tab;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ActionType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ApplicationType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.ExtensionType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.MenuItemType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.PageLinkType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.PageType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.PerspectivePluginDescriptorType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.PlacementType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.PositionType;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.RenderedExtensionType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TabType;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.TaskType;
@@ -54,8 +58,8 @@ import org.rhq.enterprise.server.xmlschema.generated.serverplugin.perspective.Ta
public class PerspectivePluginMetadataManager {
private final String CORE_PERSPECTIVE_NAME = "CorePerspective";
- private static final String MENU_ITEM_TARGET_URL = "/rhq/perspective/main.xhtml?targetUrlKey=";
- private static final String TAB_TARGET_URL = "/rhq/perspective/resource.xhtml?targetUrlKey=";
+ private static final String TARGET_MAIN_URL = "/rhq/perspective/main.xhtml?targetUrlKey=";
+ private static final String TARGET_RESOURCE_URL = "/rhq/perspective/resource.xhtml?targetUrlKey=";
private static final Map<Integer, String> KEY_URL_MAP = new HashMap<Integer, String>();
@@ -67,6 +71,7 @@ public class PerspectivePluginMetadataManager {
private long lastModifiedTime;
private List<Tab> resourceTabs;
private List<MenuItem> menu;
+ private List<PageLink> pageLinks;
public PerspectivePluginMetadataManager() {
}
@@ -92,6 +97,7 @@ public class PerspectivePluginMetadataManager {
this.menu = new ArrayList<MenuItem>();
this.resourceTabs = new ArrayList<Tab>();
// TODO: Init lists of global tasks and resource tasks.
+ this.pageLinks = new ArrayList<PageLink>();
// Always process the Core perspective first as other perspectives may remove extensions it defines.
processCorePerspective();
@@ -138,7 +144,7 @@ public class PerspectivePluginMetadataManager {
// Process MenuItem Extensions
for (MenuItemType rawMenuItem : perspective.getMenuItem()) {
- resolveUrls(applications, rawMenuItem, MENU_ITEM_TARGET_URL);
+ resolveUrls(applications, rawMenuItem, TARGET_MAIN_URL);
ActionType action = rawMenuItem.getAction();
switch (action) {
case ADD:
@@ -152,7 +158,7 @@ public class PerspectivePluginMetadataManager {
// Process Tab Extensions
for (TabType rawTab : perspective.getTab()) {
- resolveUrls(applications, rawTab, TAB_TARGET_URL);
+ resolveUrls(applications, rawTab, TARGET_RESOURCE_URL);
ActionType action = rawTab.getAction();
switch (action) {
case ADD:
@@ -165,6 +171,18 @@ public class PerspectivePluginMetadataManager {
}
// TODO: Process global tasks and resource tasks.
+
+ // Process Page Extensions
+ // For now just assume there are a reasonable number of page extesnions such that throwing
+ // them all into one list will have acceptable performance. If necessary we could segregate
+ // by page name etc...
+ for (PageType rawPage : perspective.getPage()) {
+ for (PageLinkType rawPageLink : rawPage.getPageLink()) {
+ resolveUrls(applications, rawPageLink, TARGET_MAIN_URL);
+ this.pageLinks.add(new PageLink(rawPageLink, perspective.getName(), rawPage.getName(), rawPageLink
+ .getUrl()));
+ }
+ }
}
/**
@@ -188,10 +206,16 @@ public class PerspectivePluginMetadataManager {
TabType tab = (TabType) extension;
String resolvedUrl = resolveUrl(applicationType, tab.getUrl(), targetUrl);
tab.setUrl(resolvedUrl);
+ } else if (extension instanceof PageLinkType) {
+ PageLinkType pageLink = (PageLinkType) extension;
+ String resolvedUrl = resolveUrl(applicationType, pageLink.getUrl(), targetUrl);
+ pageLink.setUrl(resolvedUrl);
}
- String resolvedIconUrl = resolveUrl(applicationType, extension.getIconUrl(), null);
- extension.setIconUrl(resolvedIconUrl);
+ if (extension instanceof RenderedExtensionType) {
+ String resolvedIconUrl = resolveUrl(applicationType, ((RenderedExtensionType) extension).getIconUrl(), null);
+ ((RenderedExtensionType) extension).setIconUrl(resolvedIconUrl);
+ }
}
private String resolveUrl(ApplicationType applicationType, String url, String targetUrl) {
@@ -465,6 +489,16 @@ public class PerspectivePluginMetadataManager {
return this.resourceTabs;
}
+ /**
+ * Returns the full set of defined PageLink extensions with no activators applied. Callers should not
+ * modify the returned list or any of its descendant lists.
+ *
+ * @return the full Resource tab bar, with no activators applied
+ */
+ public List<PageLink> getPageLinks() {
+ return this.pageLinks;
+ }
+
public synchronized boolean isStarted() {
return this.isStarted;
}
diff --git a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
index d58b739..f112cf1 100644
--- a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
+++ b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
@@ -83,6 +83,12 @@
minOccurs="0"
maxOccurs="unbounded">
</xs:element>
+ <xs:element
+ name="page"
+ type="perspective:PageType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
@@ -156,23 +162,6 @@
</xs:annotation>
</xs:attribute>
<xs:attribute
- name="displayName"
- type="perspective:DisplayNameType"
- use="required">
- <xs:annotation>
- <xs:documentation>The display name for this extension.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="iconUrl"
- type="xs:anyURI"
- use="optional">
- <xs:annotation>
- <xs:documentation>The request URL for the icon displayed for this extension. If omitted, no icon is
- displayed. Required if displayName is an empty string.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
name="application"
type="xs:string"
use="optional">
@@ -182,14 +171,11 @@
</xs:annotation>
</xs:attribute>
<xs:attribute
- name="action"
- type="perspective:ActionType"
- use="optional"
- default="add">
+ name="url"
+ type="xs:anyURI"
+ use="optional">
<xs:annotation>
- <xs:documentation>Add the extension or remove an extension with the given name and position that was defined
- by the Core perspective. For removal, all but the name attribute are ignored. The default is add. Note, a
- Remove followed by an Add can be used to replace an extension from the Core perspective.
+ <xs:documentation>The request URL for this extension. Typically kicks off a wizard or similar workflow.
</xs:documentation>
</xs:annotation>
</xs:attribute>
@@ -197,20 +183,57 @@
</xs:complexType>
<xs:complexType
- name="TaskType">
+ name="RenderedExtensionType"
+ abstract="true">
+ <xs:annotation>
+ <xs:documentation>All rendered extensions extend this type.</xs:documentation>
+ </xs:annotation>
<xs:complexContent>
<xs:extension
base="perspective:ExtensionType">
+
<xs:attribute
- name="url"
- type="xs:anyURI"
+ name="displayName"
+ type="perspective:DisplayNameType"
use="required">
<xs:annotation>
- <xs:documentation>The request URL for this task. Typically kicks off a wizard or similar workflow.
- </xs:documentation>
+ <xs:documentation>The display name for this extension.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="iconUrl"
+ type="xs:anyURI"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The request URL for the icon displayed for this extension. If omitted, no icon is
+ displayed. Required if displayName is an empty string.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute
+ name="action"
+ type="perspective:ActionType"
+ use="optional"
+ default="add">
+ <xs:annotation>
+ <xs:documentation>Add the extension or remove an extension with the given name and position that was
+ defined
+ by the Core perspective. For removal, all but the name attribute are ignored. The default is
+ add. Note, a
+ Remove followed by an Add can be used to replace an extension from the Core
+ perspective.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType
+ name="TaskType">
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:RenderedExtensionType">
+ <xs:attribute
name="category"
type="xs:string"
use="optional">
@@ -273,7 +296,7 @@
</xs:annotation>
<xs:complexContent>
<xs:extension
- base="perspective:ExtensionType">
+ base="perspective:RenderedExtensionType">
<xs:sequence>
<xs:element
name="position"
@@ -295,16 +318,6 @@
</xs:sequence>
<xs:attribute
- name="url"
- type="xs:anyURI"
- use="optional">
- <xs:annotation>
- <xs:documentation>The request URL for this menu item. Typically kicks off a wizard or similar
- workflow.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
name="feature"
type="perspective:MenuItemFeatureType"
use="optional">
@@ -344,7 +357,7 @@
</xs:annotation>
<xs:complexContent>
<xs:extension
- base="perspective:ExtensionType">
+ base="perspective:RenderedExtensionType">
<xs:sequence>
<xs:element
name="position"
@@ -365,20 +378,61 @@
</xs:annotation>
</xs:element>
</xs:sequence>
-
- <xs:attribute
- name="url"
- type="xs:anyURI"
- use="optional">
- <xs:annotation>
- <xs:documentation>The request URL for this tab. Typically kicks off a wizard or similar workflow.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
+ <xs:complexType
+ name="PageType">
+ <xs:annotation>
+ <xs:documentation>A page extension that injects perspective links into a core page.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:sequence>
+ <xs:element
+ name="page-link"
+ type="perspective:PageLinkType"
+ minOccurs="1"
+ maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>A replacement url for a named link on a given page.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+
+ <xs:attribute
+ name="name"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The page extension point name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType
+ name="PageLinkType">
+ <xs:annotation>
+ <xs:documentation>A page link extension for a named link in a page extension point.</xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ExtensionType">
+ <xs:sequence>
+ <xs:element
+ name="activators"
+ type="perspective:GlobalActivatorsType"
+ minOccurs="0"
+ maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
+ order for this page link extension to be active.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
<!-- =========================================== Activators =============================================
@@ -735,7 +789,7 @@
<xs:annotation>
<xs:documentation>The in-context package's type. The internal name.</xs:documentation>
</xs:annotation>
- </xs:attribute>
+ </xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
commit 615f198138b9432888ea29bd7f7c77da3e8c6b1f
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 14:38:26 2010 -0500
two tables on single page, both using AJAX, now working
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml
index 217fc6c..9b7826e 100644
--- a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml
@@ -55,7 +55,11 @@ Firefox and other Gecko-based browsers to render the page in "Almost Standards"
<h1>#{(!empty pageTitle) ? pageTitle : defaultPageTitle}</h1>
-<rich:messages globalOnly="true" infoClass="InfoBlock" warnClass="WarnBlock" errorClass="ErrorBlock" fatalClass="FatalBlock" />
+<rich:messages globalOnly="true"
+ infoClass="InfoBlock"
+ warnClass="WarnBlock"
+ errorClass="ErrorBlock"
+ fatalClass="FatalBlock" />
<ui:insert name="body"/>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index 23ade4d..7664c4a 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -1,24 +1,25 @@
<?xml version="1.0"?>
<ui:composition
- template="/WEB-INF/templates/mainTemplate.xhtml"
- xmlns="http://www.w3.org/1999/xhtml"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:fn="http://java.sun.com/jsp/jstl/functions"
- xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.org/rich"
- xmlns:rhq="http://rhq-project.org/rhq"
- xmlns:onc="http://jboss.org/on/component">
+ template="/WEB-INF/templates/mainTemplate.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
<ui:param name="pageTitle" value="Browse Resources"/>
-
+
<ui:define name="body">
<ui:remove><!-- NOTE: The table needs to be surrounded by a form for paging and sorting to work! --></ui:remove>
- <a4j:form ajaxSubmit="true" ajaxSingle="true">
+ <a4j:form ajaxSubmit="true" reRender="resourcesDataTable">
+
<rich:dataTable id="resourcesDataTable"
value="#{BrowseResourcesUIBean.dataModel}" var="resource"
first="#{BrowseResourcesUIBean.pageControl.pageNumber}"
@@ -76,7 +77,7 @@
<ui:include src="/WEB-INF/includes/pageControls.xhtml">
<ui:param name="pagedDataUIBean" value="#{BrowseResourcesUIBean}"/>
- <ui:param name="dataTableName" value="resourcesDataTable"/>
+ <ui:param name="dataTableName" value="resourcesDataTable"/>
</ui:include>
</rich:column>
</rich:columnGroup>
@@ -84,7 +85,7 @@
</rich:dataTable>
</a4j:form>
- <a4j:form ajaxSubmit="true" ajaxSingle="true">
+ <a4j:form ajaxSubmit="true" reRender="resources2Panel">
<rich:dataTable id="resources2DataTable"
value="#{BrowseResources2UIBean.dataModel}" var="resource"
first="#{BrowseResources2UIBean.pageControl.pageNumber}"
@@ -148,7 +149,7 @@
</rich:columnGroup>
</f:facet>
</rich:dataTable>
- </a4j:form>
+ </a4j:form>
</ui:define>
commit 9e1f7f7fd05cfae60580f1e3e334dd1b1f3817c1
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 14:10:08 2010 -0500
the About modal now includes versions of some key 3rd party libs (JSF RI, Seam, and RichFaces) if debug mode is enabled
diff --git a/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactNotFoundException.java b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactNotFoundException.java
new file mode 100644
index 0000000..db3a743
--- /dev/null
+++ b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactNotFoundException.java
@@ -0,0 +1,32 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.util.maven;
+
+/**
+ * @author Ian Springer
+ */
+public class MavenArtifactNotFoundException extends Exception {
+ public MavenArtifactNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
index 10b5f12..4e749b5 100644
--- a/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
+++ b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
@@ -78,27 +78,58 @@ public class MavenArtifactProperties {
}
/**
- * Returns a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id,
- * or null if no such artifact is in the this class loader.
+ * Returns a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id.
+ * First tries to load the pom.properties file for the artifact using the context class loader. If that
+ * fails, then tries to load it using our class loader.
*
* @param groupId the group id of the Maven artifact
* @param artifactId the artifact id of the Maven artifact
*
- * @return a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id,
- * or null if no such artifact is in the this class loader
+ * @return a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id
+ *
+ * @throws MavenArtifactNotFoundException if a pom.properties file for the artifact could not be found in the context
+ * class loader or in our class loader
+ */
+ @Nullable
+ public static MavenArtifactProperties getInstance(String groupId, String artifactId)
+ throws MavenArtifactNotFoundException {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ MavenArtifactProperties instance;
+ try {
+ instance = getInstance(groupId, artifactId, contextClassLoader);
+ } catch (MavenArtifactNotFoundException e) {
+ ClassLoader ourClassLoader = MavenArtifactProperties.class.getClassLoader();
+ instance = getInstance(groupId, artifactId, ourClassLoader);
+ }
+ return instance;
+ }
+
+ /**
+ * Returns a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id.
+ * Tries to load the pom.properties file for the artifact using the specified class loader.
+ *
+ * @param groupId the group id of the Maven artifact
+ * @param artifactId the artifact id of the Maven artifact
+ * @param classLoader the class loader in which to look for the artifact
+ *
+ * @return a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id
+ *
+ * @throws MavenArtifactNotFoundException if a pom.properties file for the artifact could not be found in the
+ * specified class loader
*/
@Nullable
- public static MavenArtifactProperties getInstance(String groupId, String artifactId) {
+ public static MavenArtifactProperties getInstance(String groupId, String artifactId, ClassLoader classLoader)
+ throws MavenArtifactNotFoundException {
String cacheKey = groupId + ":" + artifactId;
MavenArtifactProperties instance = INSTANCE_CACHE.get(cacheKey);
if (instance != null) {
return instance;
}
- ClassLoader classLoader = MavenArtifactProperties.class.getClassLoader();
- String resourcePath = "META-INF/maven/" + groupId + "/" + artifactId + "pom.properties";
+
+ String resourcePath = "META-INF/maven/" + groupId + "/" + artifactId + "/pom.properties";
InputStream inputStream = classLoader.getResourceAsStream(resourcePath);
if (inputStream == null) {
- return null;
+ throw new MavenArtifactNotFoundException(cacheKey);
}
Properties props = new Properties();
try {
@@ -107,6 +138,9 @@ public class MavenArtifactProperties {
LOG.error("Failed to load resource " + resourcePath + " into Properties object.", e);
return null;
}
- return new MavenArtifactProperties(props);
+ instance = new MavenArtifactProperties(props);
+
+ INSTANCE_CACHE.put(cacheKey, instance);
+ return instance;
}
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java
index ac449a4..92ae337 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/framework/ServerInfoUIBean.java
@@ -18,6 +18,14 @@
*/
package org.rhq.enterprise.gui.common.framework;
+import org.jboss.seam.Component;
+import org.rhq.core.util.maven.MavenArtifactNotFoundException;
+import org.rhq.core.util.maven.MavenArtifactProperties;
+import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.system.SystemManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+import javax.faces.component.UIComponent;
import java.util.TimeZone;
/**
@@ -26,7 +34,44 @@ import java.util.TimeZone;
* @author Ian Springer
*/
public class ServerInfoUIBean {
+ private static final String UNKNOWN_VERSION = "UNKNOWN";
+
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
+
+ public boolean isDebugModeEnabled() {
+ SystemManagerLocal systemManager = LookupUtil.getSystemManager();
+ return Boolean.valueOf(systemManager.getSystemConfiguration().getProperty(RHQConstants.EnableDebugMode));
+ }
+
+ public String getFacesVersion() {
+ return getVersion(UIComponent.class);
+ }
+
+ public String getSeamVersion() {
+ return getVersion(Component.class);
+ }
+
+ public String getRichFacesVersion() {
+ MavenArtifactProperties richFacesMavenProps;
+ try {
+ richFacesMavenProps = MavenArtifactProperties.getInstance("org.richfaces.framework", "richfaces-api");
+ } catch (MavenArtifactNotFoundException e) {
+ // This really should never happen. TODO: Log an error.
+ richFacesMavenProps = null;
+ }
+ String richFacesVersion = (richFacesMavenProps != null) ? richFacesMavenProps.getVersion() : UNKNOWN_VERSION;
+ return (richFacesVersion != null) ? richFacesVersion : UNKNOWN_VERSION;
+ }
+
+ private static String getVersion(Class clazz) {
+ String version = null;
+ try {
+ return clazz.getPackage().getImplementationVersion();
+ }
+ catch (Exception e) {
+ return UNKNOWN_VERSION;
+ }
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
index 3bd4af6..ef72e30 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml
@@ -206,11 +206,13 @@
resizeable="false"
width="320"
height="250">
+
<f:facet name="header">
<h:panelGroup>
<h:outputText value="#{msg['about.Title']}" />
</h:panelGroup>
</f:facet>
+
<f:facet name="controls">
<h:panelGroup>
<h:graphicImage
@@ -225,11 +227,27 @@
</h:panelGroup>
</f:facet>
- <p><span class="DisplaySubhead"><h:outputText value="#{msg['footer.aboutLink']}" /></span><br />
+ <p>
+ <span class="DisplaySubhead">
+ <a href="http://rhq-project.org/">#{msg['footer.aboutLink']}</a>
+ </span><br />
<span class="DisplayLabel"><h:outputText value="#{msg['footer.version']}: #{msg['product.version']}" /></span><br />
<span class="DisplayLabel"><h:outputText
value="#{msg['footer.buildNumber']}: #{msg['product.buildNumber']}" /></span></p>
+ <rich:panel rendered="#{ServerInfoUIBean.debugModeEnabled}">
+ <h:panelGrid columns="2" border="0">
+ <h:panelGroup style="font-weight: bold">JSF RI Version:</h:panelGroup>
+ <h:panelGroup style="font-color: red">#{ServerInfoUIBean.facesVersion}</h:panelGroup>
+
+ <h:panelGroup style="font-weight: bold">Seam Version:</h:panelGroup>
+ <h:panelGroup style="font-color: red">#{ServerInfoUIBean.seamVersion}</h:panelGroup>
+
+ <h:panelGroup style="font-weight: bold">RichFaces Version:</h:panelGroup>
+ <h:panelGroup style="font-color: red">#{ServerInfoUIBean.richFacesVersion}</h:panelGroup>
+ </h:panelGrid>
+ </rich:panel>
+
<p><a href="http://jboss.org/"> <img
src="/images/jboss_logo.png"
alt="JBoss Homepage"
@@ -240,15 +258,14 @@
<h:outputText value="#{msg['footer.copyright']}" />
</f:verbatim> <h:outputText value="#{msg['about.Copyright.Content']}" /></p>
- <p><a href="http://jboss.org/jopr"> <h:graphicImage
- value="/images/logo_icon.png"
- style="vertical-align:middle" /> Jopr Project </a> <ui:remove>
+
+ <ui:remove>
<!--<h:outputText value="#{msg['about.MoreInfo.Label']}"/><br/>-->
<!--
<a href='mailto:<h:outputText value="#{msg['about.MoreInfo.LinkSales']}"/>'><h:outputText value="#{msg['about.MoreInfo.LinkSales']}"/></a><br/>
<a href='mailto:<h:outputText value="#{msg['about.MoreInfo.LinkSupport']}"/>'><h:outputText value="#{msg['about.MoreInfo.LinkSupport']}"/></a>
-->
- </ui:remove></p>
+ </ui:remove>
<input
type="button"
commit 5fd8ffd134318c5e1f74c764c7844244ef3e804a
Merge: d540438... f9a81bf...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 12:25:08 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit d5404386efa0f9d9834899579874641080758800
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 12:24:06 2010 -0500
add a 2nd table on the page to to test out usage of AJAX
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResources2UIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResources2UIBean.java
new file mode 100644
index 0000000..86cc318
--- /dev/null
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResources2UIBean.java
@@ -0,0 +1,13 @@
+package org.rhq.sample.perspective;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+
+/**
+ *
+ */
+@Name("BrowseResources2UIBean")
+(a)Scope(ScopeType.CONVERSATION)
+public class BrowseResources2UIBean extends BrowseResourcesUIBean {
+}
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index e866b98..23ade4d 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -18,7 +18,7 @@
<ui:define name="body">
<ui:remove><!-- NOTE: The table needs to be surrounded by a form for paging and sorting to work! --></ui:remove>
- <h:form>
+ <a4j:form ajaxSubmit="true" ajaxSingle="true">
<rich:dataTable id="resourcesDataTable"
value="#{BrowseResourcesUIBean.dataModel}" var="resource"
first="#{BrowseResourcesUIBean.pageControl.pageNumber}"
@@ -82,7 +82,73 @@
</rich:columnGroup>
</f:facet>
</rich:dataTable>
- </h:form>
+ </a4j:form>
+
+ <a4j:form ajaxSubmit="true" ajaxSingle="true">
+ <rich:dataTable id="resources2DataTable"
+ value="#{BrowseResources2UIBean.dataModel}" var="resource"
+ first="#{BrowseResources2UIBean.pageControl.pageNumber}"
+ rows="#{BrowseResources2UIBean.pageControl.pageSize}"
+ sortMode="multi"
+ width="100%">
+
+ <rich:column width="20">
+ <f:facet name="header">
+ <rhq:allRowsSelector/>
+ </f:facet>
+ <rhq:rowSelector value="#{BrowseResources2UIBean.selectedResources}"/>
+ </rich:column>
+
+ <rich:column width="55" sortBy="r.id">
+ <f:facet name="header">
+ <rhq:sortableColumnHeader sortBy="r.id">
+ <h:outputText value="Id"/>
+ </rhq:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputLink value="#{BrowseResources2UIBean.resourceUrlMap[resource.id]}" target="_top">
+ <h:outputText value="#{resource.id}"/>
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column sortBy="r.name" width="235">
+ <f:facet name="header">
+ <rhq:sortableColumnHeader sortBy="r.name">
+ <h:outputText value="Name"/>
+ </rhq:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{resource.name}"/>
+ </rich:column>
+
+ <rich:column sortBy="r.description">
+ <f:facet name="header">
+ <rhq:sortableColumnHeader sortBy="r.description">
+ <h:outputText value="Description"/>
+ </rhq:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{resource.description}"/>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="4">
+ <rhq:selectedRowsCommandButton
+ value="UNINVENTORY"
+ action="#{BrowseResources2UIBean.uninventorySelectedResources}">
+ <a4j:support event="onclick" reRender="resources2DataTable"/>
+ </rhq:selectedRowsCommandButton>
+
+ <ui:include src="/WEB-INF/includes/pageControls.xhtml">
+ <ui:param name="pagedDataUIBean" value="#{BrowseResources2UIBean}"/>
+ <ui:param name="dataTableName" value="resources2DataTable"/>
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+ </rich:dataTable>
+ </a4j:form>
</ui:define>
commit 810907eb1fd80527b8b755de2f52a1bb718f7a9c
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 12:22:59 2010 -0500
finish this up
diff --git a/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
index bcd8f54..10b5f12 100644
--- a/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
+++ b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
@@ -22,11 +22,14 @@
*/
package org.rhq.core.util.maven;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.Nullable;
+
import java.io.IOException;
import java.io.InputStream;
-import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@@ -34,71 +37,57 @@ import java.util.Set;
/**
* @author Ian Springer
*/
-public class MavenArtifactProperties extends HashMap<String, String> {
+public class MavenArtifactProperties {
+ private static final Log LOG = LogFactory.getLog(MavenArtifactProperties.class);
+
private static final Map<String, MavenArtifactProperties> INSTANCE_CACHE =
new HashMap<String, MavenArtifactProperties>();
+ private Properties props;
+ private Set<String> propNames;
+
private MavenArtifactProperties(Properties props) {
- super();
- for (Object key : props.keySet()) {
- Object value = get(key);
- if (key instanceof String && value instanceof String) {
- put((String)key, (String)value);
- }
- }
+ this.props = props;
}
- @Override
- public void putAll(Map<? extends String, ? extends String> m) {
- throw new UnsupportedOperationException("This object is immutable.");
+ public String getGroupId() {
+ return getProperty("groupId");
}
- @Override
- public String put(String key, String value) {
- throw new UnsupportedOperationException("This object is immutable.");
+ public String getArtifactId() {
+ return getProperty("artifactId");
}
- @Override
- public void clear() {
- throw new UnsupportedOperationException("This object is immutable.");
+ public String getVersion() {
+ return getProperty("version");
}
- @Override
- public String remove(Object key) {
- throw new UnsupportedOperationException("This object is immutable.");
+ public String getProperty(String propName) {
+ return this.props.getProperty(propName);
}
- private transient Map<String,String> unmodifiableMap;
-
- @Override
- public Set<String> keySet() {
- if (this.unmodifiableMap == null) {
- this.unmodifiableMap = Collections.unmodifiableMap(this);
- }
- return this.unmodifiableMap.keySet();
- }
-
- @Override
- public Set<Map.Entry<String,String>> entrySet() {
- if (this.unmodifiableMap == null) {
- this.unmodifiableMap = Collections.unmodifiableMap(this);
+ public Set<String> getPropertyNames() {
+ if (this.propNames == null) {
+ this.propNames = new LinkedHashSet<String>(this.props.size());
+ Set<Object> keys = this.props.keySet();
+ for (Object key : keys) {
+ this.propNames.add((String) key);
+ }
}
- return this.unmodifiableMap.entrySet();
- }
+ return this.propNames;
+ }
- @Override
- public Collection<String> values() {
- if (this.unmodifiableMap == null) {
- this.unmodifiableMap = Collections.unmodifiableMap(this);
- }
- return this.unmodifiableMap.values();
- }
/**
- * TODO
- * @param groupId
- * @param artifactId
- * @return
+ * Returns a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id,
+ * or null if no such artifact is in the this class loader.
+ *
+ * @param groupId the group id of the Maven artifact
+ * @param artifactId the artifact id of the Maven artifact
+ *
+ * @return a MavenArtifactProperties for the Maven artifact with the specified group id and artifact id,
+ * or null if no such artifact is in the this class loader
*/
+ @Nullable
public static MavenArtifactProperties getInstance(String groupId, String artifactId) {
String cacheKey = groupId + ":" + artifactId;
MavenArtifactProperties instance = INSTANCE_CACHE.get(cacheKey);
@@ -115,7 +104,7 @@ public class MavenArtifactProperties extends HashMap<String, String> {
try {
props.load(inputStream);
} catch (IOException e) {
- //("Failed to load resource " + resourcePath + " into Properties object.", e);
+ LOG.error("Failed to load resource " + resourcePath + " into Properties object.", e);
return null;
}
return new MavenArtifactProperties(props);
commit 8fac7f9bab73ea1f873e0db2badb27547eb5e039
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 12:09:29 2010 -0500
a new utility for obtaining Maven artifact versions of jars in current classloader
diff --git a/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
new file mode 100644
index 0000000..bcd8f54
--- /dev/null
+++ b/modules/core/util/src/main/java/org/rhq/core/util/maven/MavenArtifactProperties.java
@@ -0,0 +1,123 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.util.maven;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * @author Ian Springer
+ */
+public class MavenArtifactProperties extends HashMap<String, String> {
+ private static final Map<String, MavenArtifactProperties> INSTANCE_CACHE =
+ new HashMap<String, MavenArtifactProperties>();
+
+ private MavenArtifactProperties(Properties props) {
+ super();
+ for (Object key : props.keySet()) {
+ Object value = get(key);
+ if (key instanceof String && value instanceof String) {
+ put((String)key, (String)value);
+ }
+ }
+ }
+
+ @Override
+ public void putAll(Map<? extends String, ? extends String> m) {
+ throw new UnsupportedOperationException("This object is immutable.");
+ }
+
+ @Override
+ public String put(String key, String value) {
+ throw new UnsupportedOperationException("This object is immutable.");
+ }
+
+ @Override
+ public void clear() {
+ throw new UnsupportedOperationException("This object is immutable.");
+ }
+
+ @Override
+ public String remove(Object key) {
+ throw new UnsupportedOperationException("This object is immutable.");
+ }
+
+ private transient Map<String,String> unmodifiableMap;
+
+ @Override
+ public Set<String> keySet() {
+ if (this.unmodifiableMap == null) {
+ this.unmodifiableMap = Collections.unmodifiableMap(this);
+ }
+ return this.unmodifiableMap.keySet();
+ }
+
+ @Override
+ public Set<Map.Entry<String,String>> entrySet() {
+ if (this.unmodifiableMap == null) {
+ this.unmodifiableMap = Collections.unmodifiableMap(this);
+ }
+ return this.unmodifiableMap.entrySet();
+ }
+
+ @Override
+ public Collection<String> values() {
+ if (this.unmodifiableMap == null) {
+ this.unmodifiableMap = Collections.unmodifiableMap(this);
+ }
+ return this.unmodifiableMap.values();
+ }
+ /**
+ * TODO
+ * @param groupId
+ * @param artifactId
+ * @return
+ */
+ public static MavenArtifactProperties getInstance(String groupId, String artifactId) {
+ String cacheKey = groupId + ":" + artifactId;
+ MavenArtifactProperties instance = INSTANCE_CACHE.get(cacheKey);
+ if (instance != null) {
+ return instance;
+ }
+ ClassLoader classLoader = MavenArtifactProperties.class.getClassLoader();
+ String resourcePath = "META-INF/maven/" + groupId + "/" + artifactId + "pom.properties";
+ InputStream inputStream = classLoader.getResourceAsStream(resourcePath);
+ if (inputStream == null) {
+ return null;
+ }
+ Properties props = new Properties();
+ try {
+ props.load(inputStream);
+ } catch (IOException e) {
+ //("Failed to load resource " + resourcePath + " into Properties object.", e);
+ return null;
+ }
+ return new MavenArtifactProperties(props);
+ }
+}
commit a17a188b9a81296ce9b1e01b9a4e2a911cadac09
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 25 11:52:26 2010 -0500
downgrade RichFaces from 3.3.2.SR1 to 3.3.2.GA to fix https://bugzilla.redhat.com/558528
diff --git a/pom.xml b/pom.xml
index c5cfd44..bcf59d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
<postgresql.version>8.4-701.jdbc3</postgresql.version>
<h2.version>1.1.117</h2.version>
<jtds.version>1.2.2</jtds.version>
- <richfaces.version>3.3.2.SR1</richfaces.version>
+ <richfaces.version>3.3.2.GA</richfaces.version>
<sigar.version>1.6.3.82</sigar.version>
<quartz.version>1.6.5</quartz.version>
<jna.version>3.2.2</jna.version>
commit f9a81bfb845f9d4c9e93e218ec8c9a57494b9f22
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Jan 25 09:35:05 2010 -0500
Added code to handle boolean properties in the cobbler plugin
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
index 92d5b84..272fffb 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
@@ -31,7 +31,7 @@ import net.augeas.Augeas;
import org.apache.commons.io.FileUtils;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.RawConfiguration;
/**
@@ -42,14 +42,16 @@ public class AugeasRawConfigHelper {
private String rootPath;
private String loadPath;
private String rootNodePath;
+ private AugeasTranslator translator;
private Map<String, List<String>> nodePaths = new HashMap<String, List<String>>();
private final String transformPrefix = "/augeas/load/custom" + System.currentTimeMillis();
private Map<String, String> configMap = new HashMap<String, String>();
- public AugeasRawConfigHelper(String augeasRootPath, String augeasLoadPath, String rootNode) {
+ public AugeasRawConfigHelper(String augeasRootPath, String augeasLoadPath, String rootNode, AugeasTranslator t) {
rootPath = augeasRootPath;
loadPath = augeasLoadPath;
rootNodePath = rootNode;
+ translator = t;
}
public void addLens(String lensName, String configFilePath) {
@@ -73,7 +75,8 @@ public class AugeasRawConfigHelper {
for (String pathSuffix : nodePaths.get(existingConfig.getPath())) {
String propName = ("/files" + existingConfig.getPath() + "/" + pathSuffix).substring(rootNodePath
.length());
- String propValue = from.getSimpleValue(propName, "");
+ String propValue = translator.getPropertyValue(propName, from);
+
aug.set("/files" + file + "/" + pathSuffix, propValue);
}
aug.save();
@@ -95,7 +98,9 @@ public class AugeasRawConfigHelper {
String file = getFile(aug);
for (String pathSuffix : nodePaths.get(from.getPath())) {
String propName = ("/files" + from.getPath() + "/" + pathSuffix).substring(rootNodePath.length());
- toUpdate.put(new PropertySimple(propName, aug.get("/files" + file + "/" + pathSuffix)));
+ String augeasPath = "/files" + file + "/" + pathSuffix;
+ Property property = translator.createProperty(propName, augeasPath, aug);
+ toUpdate.put(property);
}
} finally {
if (aug != null) {
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasTranslator.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasTranslator.java
new file mode 100644
index 0000000..bd80078
--- /dev/null
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasTranslator.java
@@ -0,0 +1,37 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.plugins.augeas.helper;
+
+import net.augeas.Augeas;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+
+/**
+ * @author paji
+ *
+ */
+public interface AugeasTranslator {
+
+ Property createProperty(String propName, String augeasPath, Augeas aug);
+
+ String getPropertyValue(String propName, Configuration from);
+
+}
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index baa2f02..c0bb0c5 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -19,7 +19,6 @@
package org.rhq.plugins.cobbler;
import java.io.File;
-import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.Set;
@@ -30,20 +29,26 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
+import org.rhq.plugins.augeas.helper.AugeasNode;
import org.rhq.plugins.augeas.helper.AugeasRawConfigHelper;
+import org.rhq.plugins.augeas.helper.AugeasTranslator;
/**
* The ResourceComponent for the "Cobbler File" ResourceType.
*
* @author Ian Springer
*/
-public class CobblerComponent extends AugeasConfigurationComponent implements ResourceConfigurationFacet {
+public class CobblerComponent extends AugeasConfigurationComponent implements AugeasTranslator,
+ ResourceConfigurationFacet {
private static final String MODULES_PATH = "/etc/cobbler/modules.conf";
private static final String SETTINGS_PATH = "/etc/cobbler/settings";
private final Log log = LogFactory.getLog(this.getClass());
@@ -53,7 +58,7 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception {
super.start(resourceContext);
rawConfigHelper = new AugeasRawConfigHelper(getAugeasRootPath(), AUGEAS_LOAD_PATH,
- getResourceConfigurationRootPath());
+ getResourceConfigurationRootPath(), this);
rawConfigHelper.addLens("CobblerSettings.lns", SETTINGS_PATH);
rawConfigHelper.addLens("CobblerModules.lns", MODULES_PATH);
@@ -63,8 +68,8 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
rawConfigHelper.addNode(SETTINGS_PATH, "default_kickstart");
rawConfigHelper.addNode(SETTINGS_PATH, "snippetsdir");
- // rawConfigHelper.addNode(SETTINGS_PATH, "manage_dhcp");
- // rawConfigHelper.addNode(SETTINGS_PATH, "manage_dns");
+ rawConfigHelper.addNode(SETTINGS_PATH, "manage_dhcp");
+ rawConfigHelper.addNode(SETTINGS_PATH, "manage_dns");
rawConfigHelper.addNode(SETTINGS_PATH, "manage_reverse_zones");
rawConfigHelper.addNode(SETTINGS_PATH, "manage_forward_zones");
@@ -81,6 +86,27 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
@Override
+ protected Object toPropertyValue(PropertyDefinitionSimple propDefSimple, Augeas augeas, AugeasNode node) {
+ if ("manage_dhcp".equals(node.getName()) || "manage_dns".equals(node.getName())) {
+ return "1".equals(augeas.get(node.getPath()));
+ }
+ return super.toPropertyValue(propDefSimple, augeas, node);
+ }
+
+ @Override
+ protected String toNodeValue(Augeas augeas, AugeasNode node, PropertyDefinitionSimple propDefSimple,
+ PropertySimple propSimple) {
+ if ("manage_dhcp".equals(node.getName()) || "manage_dns".equals(node.getName())) {
+ if (propSimple.getBooleanValue()) {
+ return "1";
+ }
+ return "0";
+ }
+
+ return super.toNodeValue(augeas, node, propDefSimple, propSimple);
+ }
+
+ @Override
protected void setupAugeasModules(Augeas augeas) {
augeas.set("/augeas/load/CobblerSettings/lens", "CobblerSettings.lns");
augeas.set("/augeas/load/CobblerSettings/incl[1]", SETTINGS_PATH);
@@ -161,8 +187,24 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
// TODO Auto-generated method stub
}
- private String normalizeToUnix(byte[] contents) throws UnsupportedEncodingException {
- String s = new String(contents, "UTF8");
- return s.replaceAll("\r\n", "\n");
+ @Override
+ public Property createProperty(String propName, String augeasPath, Augeas aug) {
+ if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
+ return new PropertySimple(propName, "1".equals(aug.get(augeasPath)));
+ }
+ return new PropertySimple(propName, aug.get(augeasPath));
+ }
+
+ @Override
+ public String getPropertyValue(String propName, Configuration from) {
+ if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
+ PropertySimple prop = (PropertySimple) from.get(propName);
+ if (prop.getBooleanValue()) {
+ return "1";
+ }
+ return "0";
+ }
+
+ return from.getSimpleValue(propName, "");
}
}
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index 9af509c..2a16400 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -30,7 +30,7 @@
default="/etc/cobbler/settings|/etc/cobbler/modules.conf" required="true" readOnly="true"
description="the absolute paths of the configuration files, delimited with pipe characters; wildcards are permitted in the last component of the path (e.g. /etc/cron.d/*)"/>
<c:simple-property name="resourceConfigurationRootNode" required="true" readOnly="true"
- default="/files/etc/cobbler/"/>
+ default="/files/etc/cobbler/"/>
</plugin-configuration>
<resource-configuration configurationFormat="both">
@@ -43,17 +43,13 @@
<c:simple-property name="settings/snippetsdir" displayName="Snippets Directory" type="string" required="true" activationPolicy="immediate"
description="The directory of files that cobbler uses to make templating of kickstarts easier. For more information check https://fedorahosted.org/cobbler/wiki/KickstartSnippets"/>
-
- <c:simple-property name="settings/kernel_options" displayName="Kernel Options" type="longString" required="true" activationPolicy="immediate"
- description="The kernel options that should be present in every cobbler installation. The kernel options can also be applied at the distro/profile/system level. Each option is separated by a new line"/>
-
<c:simple-property name="modules.conf/authentication/module" displayName="Authentication Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that authenticates the allowable users that can log into the cobbler WebUI and Read-Write XMLRPC. Choose one of authn_denyall, authn_configfile, authn_passthru, authn_ldap, authn_spacewalk, authn_testing, or a user supplied authentication scheme."/>
<c:simple-property name="modules.conf/authorization/module" displayName="Authorization Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that specifies the operations an authenticated user can do in cobbler. Choose one of authz_allowall, authz_ownership, or a user supplied authentication scheme."/>
</c:group>
<c:group name = "DHCP Management">
- <c:simple-property name="enableDhcp" displayName="Enable DHCP" type="boolean" required="true" activationPolicy="immediate"
+ <c:simple-property name="settings/manage_dhcp" displayName="Enable DHCP" type="boolean" required="true" activationPolicy="immediate"
description="True if dhcp management is to be enabled. Note the DHCP module must be appropriately selected. "/>
<c:simple-property name="modules.conf/dhcp/module" displayName="DHCP Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DHCP management engine if manage_dhcp is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDhcp ">
<c:property-options>
@@ -66,7 +62,7 @@
description="The IP address of the cobbler server which will be used by guests who are booting via PXE."/>
</c:group>
<c:group name = "DNS Management">
- <c:simple-property name="enableDns" displayName="Enable DNS" type="boolean" required="true" activationPolicy="immediate"
+ <c:simple-property name="settings/manage_dns" displayName="Enable DNS" type="boolean" required="true" activationPolicy="immediate"
description="True if dns management is to be enabled. Note the DNS module must be appropriately selected. "/>
<c:simple-property name="modules.conf/dns/module" displayName="DNS Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DNS management engine if manage_dns is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDns">
<c:property-options>
commit 525647c1bd738892eddd08bbc44eec0b3cc2f283
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Jan 25 06:06:58 2010 -0500
Created Raw Config helper to facilitate merge between structured to raw
diff --git a/modules/plugins/augeas/pom.xml b/modules/plugins/augeas/pom.xml
index 1005122..855db73 100644
--- a/modules/plugins/augeas/pom.xml
+++ b/modules/plugins/augeas/pom.xml
@@ -32,7 +32,11 @@
<artifactId>rhq-platform-plugin</artifactId>
<version>${project.version}</version>
</dependency>
-
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.4</version>
+ </dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
@@ -162,6 +166,29 @@
</executions>
</plugin>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>copy-commons-io-jar</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.4</version>
+ </artifactItem>
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
new file mode 100644
index 0000000..92d5b84
--- /dev/null
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java
@@ -0,0 +1,132 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.plugins.augeas.helper;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import net.augeas.Augeas;
+
+import org.apache.commons.io.FileUtils;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.RawConfiguration;
+
+/**
+ * @author paji
+ *
+ */
+public class AugeasRawConfigHelper {
+ private String rootPath;
+ private String loadPath;
+ private String rootNodePath;
+ private Map<String, List<String>> nodePaths = new HashMap<String, List<String>>();
+ private final String transformPrefix = "/augeas/load/custom" + System.currentTimeMillis();
+ private Map<String, String> configMap = new HashMap<String, String>();
+
+ public AugeasRawConfigHelper(String augeasRootPath, String augeasLoadPath, String rootNode) {
+ rootPath = augeasRootPath;
+ loadPath = augeasLoadPath;
+ rootNodePath = rootNode;
+ }
+
+ public void addLens(String lensName, String configFilePath) {
+ configMap.put(configFilePath, lensName);
+ }
+
+ public void addNode(String configFilePath, String nodeSuffix) {
+ if (!nodePaths.containsKey(configFilePath)) {
+ nodePaths.put(configFilePath, new LinkedList<String>());
+ }
+ nodePaths.get(configFilePath).add(nodeSuffix);
+ }
+
+ public void mergeRawConfig(Configuration from, RawConfiguration existingConfig, RawConfiguration toUpdate)
+ throws Exception {
+ Augeas aug = null;
+ try {
+ String lens = configMap.get(existingConfig.getPath());
+ aug = createAugeas(lens, existingConfig.getContents());
+ String file = getFile(aug);
+ for (String pathSuffix : nodePaths.get(existingConfig.getPath())) {
+ String propName = ("/files" + existingConfig.getPath() + "/" + pathSuffix).substring(rootNodePath
+ .length());
+ String propValue = from.getSimpleValue(propName, "");
+ aug.set("/files" + file + "/" + pathSuffix, propValue);
+ }
+ aug.save();
+
+ toUpdate.setPath(existingConfig.getPath());
+ toUpdate.setContents(FileUtils.readFileToByteArray(new File(file)));
+ } finally {
+ if (aug != null) {
+ aug.close();
+ }
+ }
+ }
+
+ public void mergeStructured(RawConfiguration from, Configuration toUpdate) throws Exception {
+ Augeas aug = null;
+ try {
+ String lens = configMap.get(from.getPath());
+ aug = createAugeas(lens, from.getContents());
+ String file = getFile(aug);
+ for (String pathSuffix : nodePaths.get(from.getPath())) {
+ String propName = ("/files" + from.getPath() + "/" + pathSuffix).substring(rootNodePath.length());
+ toUpdate.put(new PropertySimple(propName, aug.get("/files" + file + "/" + pathSuffix)));
+ }
+ } finally {
+ if (aug != null) {
+ aug.close();
+ }
+ }
+ }
+
+ public void save(RawConfiguration config) throws Exception {
+ File f = new File(config.getPath());
+ FileUtils.writeStringToFile(f, normalizeToUnix(config.getContents()));
+ }
+
+ private String getFile(Augeas aug) {
+ return aug.get(transformPrefix + "/incl");
+ }
+
+ private Augeas createAugeas(String lens, byte[] binary) throws Exception {
+ Augeas aug = new Augeas(rootPath, loadPath, Augeas.NO_MODL_AUTOLOAD);
+ File fl = File.createTempFile("_rhq", null);
+ String contents = normalizeToUnix(binary);
+ //write the 'to' file to disk
+ FileUtils.writeStringToFile(fl, contents);
+ aug.set(transformPrefix + "/lens", lens);
+ aug.set(transformPrefix + "/incl", fl.getAbsolutePath());
+ aug.load();
+ return aug;
+ }
+
+ private String normalizeToUnix(byte[] contents) throws UnsupportedEncodingException {
+ String s = new String(contents, "UTF8");
+ return s.replaceAll("\r\n", "\n");
+ }
+}
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index 0a0b322..baa2f02 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -30,11 +30,13 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
+import org.rhq.plugins.augeas.helper.AugeasRawConfigHelper;
/**
* The ResourceComponent for the "Cobbler File" ResourceType.
@@ -45,6 +47,38 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
private static final String MODULES_PATH = "/etc/cobbler/modules.conf";
private static final String SETTINGS_PATH = "/etc/cobbler/settings";
private final Log log = LogFactory.getLog(this.getClass());
+ private AugeasRawConfigHelper rawConfigHelper;
+
+ @Override
+ public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception {
+ super.start(resourceContext);
+ rawConfigHelper = new AugeasRawConfigHelper(getAugeasRootPath(), AUGEAS_LOAD_PATH,
+ getResourceConfigurationRootPath());
+ rawConfigHelper.addLens("CobblerSettings.lns", SETTINGS_PATH);
+ rawConfigHelper.addLens("CobblerModules.lns", MODULES_PATH);
+
+ rawConfigHelper.addNode(SETTINGS_PATH, "server");
+ rawConfigHelper.addNode(SETTINGS_PATH, "next_server");
+ rawConfigHelper.addNode(SETTINGS_PATH, "http_port");
+ rawConfigHelper.addNode(SETTINGS_PATH, "default_kickstart");
+ rawConfigHelper.addNode(SETTINGS_PATH, "snippetsdir");
+
+ // rawConfigHelper.addNode(SETTINGS_PATH, "manage_dhcp");
+ // rawConfigHelper.addNode(SETTINGS_PATH, "manage_dns");
+ rawConfigHelper.addNode(SETTINGS_PATH, "manage_reverse_zones");
+ rawConfigHelper.addNode(SETTINGS_PATH, "manage_forward_zones");
+
+ rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_bridge");
+ rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_file_size");
+ rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_ram");
+ rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_type");
+
+ rawConfigHelper.addNode(MODULES_PATH, "authentication/module");
+ rawConfigHelper.addNode(MODULES_PATH, "authorization/module");
+ rawConfigHelper.addNode(MODULES_PATH, "dhcp/module");
+ rawConfigHelper.addNode(MODULES_PATH, "dns/module");
+
+ }
@Override
protected void setupAugeasModules(Augeas augeas) {
@@ -82,46 +116,12 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
} catch (Exception e) {
throw new RuntimeException(e);
}
-
- }
-
- private Augeas createAugeas(String lens, byte[] binary) {
- try {
- Augeas aug = new Augeas(getAugeasRootPath(), AUGEAS_LOAD_PATH, Augeas.NO_MODL_AUTOLOAD);
- File fl = File.createTempFile("_rhq", null);
- String contents = normalizeToUnix(binary);
- //write the 'to' file to disk
- FileUtils.writeStringToFile(fl, contents);
- aug.set("/augeas/load/CobblerTransform/lens", lens);
- aug.set("/augeas/load/CobblerTransform/incl", fl.getAbsolutePath());
- aug.load();
- return aug;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
}
public RawConfiguration mergeRawConfiguration(Configuration from, RawConfiguration to) {
try {
- String lens = "CobblerModules.lns";
- if (SETTINGS_PATH.equals(to.getPath())) {
- lens = "CobblerSettings.lns";
- }
- Augeas aug = createAugeas(lens, to.getContents());
- String file = aug.get("/augeas/load/CobblerTransform/incl");
- //apply structured changes
- if (SETTINGS_PATH.equals(to.getPath())) {
- String server = from.getSimpleValue("settings/server", "");
- aug.set("/files" + file + "/server", server);
- }
- aug.save();
-
- //FInally create a new configuration
RawConfiguration config = new RawConfiguration();
- config.setPath(to.getPath());
- config.setContents(FileUtils.readFileToByteArray(new File(file)));
- aug.close();
+ rawConfigHelper.mergeRawConfig(from, to, config);
return config;
} catch (Exception e) {
throw new RuntimeException(e);
@@ -130,14 +130,7 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
public void mergeStructuredConfiguration(RawConfiguration from, Configuration to) {
try {
- String lens = "CobblerModules.lns";
- if (SETTINGS_PATH.equals(from.getPath())) {
- lens = "CobblerSettings.lns";
- Augeas aug = createAugeas(lens, from.getContents());
- String file = aug.get("/augeas/load/CobblerTransform/incl");
- to.put(new PropertySimple("settings/server", aug.get("/files" + file + "/server")));
- aug.close();
- }
+ rawConfigHelper.mergeStructured(from, to);
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -146,8 +139,7 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
public void persistRawConfiguration(RawConfiguration rawConfiguration) {
try {
- File f = new File(rawConfiguration.getPath());
- FileUtils.writeStringToFile(f, normalizeToUnix(rawConfiguration.getContents()));
+ rawConfigHelper.save(rawConfiguration);
} catch (Exception e) {
throw new RuntimeException(e);
}
commit 2e74e492ade5ee20af54d6d760ef7fde4dcfd438
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Jan 25 02:26:15 2010 -0500
Fixed a compile error
diff --git a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
index 4e8cc1a..d8be5f2 100644
--- a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
+++ b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
@@ -18,8 +18,6 @@
*/
package org.rhq.enterprise.client;
-import java.lang.Override;
-import java.lang.String;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@@ -282,6 +280,10 @@ public class RemoteClient {
return this.port;
}
+ public String getTransport() {
+ return transport;
+ }
+
protected String guessTransport(int port) {
return String.valueOf(port).endsWith("443") ? SECURE_TRANSPORT : NONSECURE_TRANSPORT;
}
@@ -426,15 +428,9 @@ public class RemoteClient {
@Override
public String toString() {
- return this.getClass().getSimpleName() + "[" +
- "transport=" + transport +
- ", host=" + host +
- ", port=" + port +
- ", subsystem=" + subsystem +
- ", connected=" + connected +
- ", loggedIn=" + loggedIn +
- ", subject=" + subject +
- ']';
+ return this.getClass().getSimpleName() + "[" + "transport=" + transport + ", host=" + host + ", port=" + port
+ + ", subsystem=" + subsystem + ", connected=" + connected + ", loggedIn=" + loggedIn + ", subject="
+ + subject + ']';
}
/**
commit 4576dfee25512416b2dffaeeb64c11c529831e6d
Merge: 263aaae... c04db03...
Author: Partha Aji <paji(a)redhat.com>
Date: Sun Jan 24 16:09:19 2010 -0500
Merge branch 'master' into linux-config
commit 263aaae22c44602d36dbdf1fabf62ea74de4f215
Author: Partha Aji <paji(a)redhat.com>
Date: Sun Jan 24 15:59:16 2010 -0500
Added a nice comprehensive list of cobbler structured options
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index 7eda279..9af509c 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -34,26 +34,64 @@
</plugin-configuration>
<resource-configuration configurationFormat="both">
+ <c:group name ="Basic Settings">
<c:simple-property name="settings/server" displayName="Server" type="string" required="true" activationPolicy="immediate"
description="The IP address of the cobbler server."/>
+ <c:simple-property name="settings/http_port" displayName="Http Port" type="string" required="true" activationPolicy="immediate"
+ description="The default port to use to download Kickstart Files."/>
+ <c:simple-property name="settings/default_kickstart" displayName="Default Kickstart Template" type="string" required="true" activationPolicy="immediate" description="The path to the kicktart template that will be used if no kickstart file is provided to a kickstart profile."/>
+ <c:simple-property name="settings/snippetsdir" displayName="Snippets Directory" type="string" required="true" activationPolicy="immediate"
+ description="The directory of files that cobbler uses to make templating of kickstarts easier. For more information check https://fedorahosted.org/cobbler/wiki/KickstartSnippets"/>
+
+
+ <c:simple-property name="settings/kernel_options" displayName="Kernel Options" type="longString" required="true" activationPolicy="immediate"
+ description="The kernel options that should be present in every cobbler installation. The kernel options can also be applied at the distro/profile/system level. Each option is separated by a new line"/>
+
+ <c:simple-property name="modules.conf/authentication/module" displayName="Authentication Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that authenticates the allowable users that can log into the cobbler WebUI and Read-Write XMLRPC. Choose one of authn_denyall, authn_configfile, authn_passthru, authn_ldap, authn_spacewalk, authn_testing, or a user supplied authentication scheme."/>
+ <c:simple-property name="modules.conf/authorization/module" displayName="Authorization Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that specifies the operations an authenticated user can do in cobbler. Choose one of authz_allowall, authz_ownership, or a user supplied authentication scheme."/>
+ </c:group>
- <c:simple-property name="modules.conf/authentication/module" displayName="Authentication Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that authenticates the allowable users that can log into the cobbler WebUI and Read-Write XMLRPC. Choose one of authn_denyall, authn_configfile, authn_passthru, authn_ldap, authn_spacewalk, authn_testing, or a user supplied authentication scheme."/>
- <c:simple-property name="modules.conf/authorization/module" displayName="Authorization Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that specifies the operations an authenticated user can do in cobbler. Choose one of authz_allowall, authz_ownership, or a user supplied authentication scheme."/>
- <c:simple-property name="modules.conf/authorization/module" displayName="Authorization Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that specifies the operations an authenticated user can do in cobbler. Choose one of authz_allowall, authz_ownership, or a user supplied authentication scheme."/>
- <c:simple-property name="modules.conf/dns/module" displayName="DNS Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DNS management engine if manage_dns is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDns ">
- <c:property-options>
- <c:option value="manage_bind"/>
- <c:option value="manage_dnsmasq"/>
- </c:property-options>
+
+ <c:group name = "DHCP Management">
+ <c:simple-property name="enableDhcp" displayName="Enable DHCP" type="boolean" required="true" activationPolicy="immediate"
+ description="True if dhcp management is to be enabled. Note the DHCP module must be appropriately selected. "/>
+ <c:simple-property name="modules.conf/dhcp/module" displayName="DHCP Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DHCP management engine if manage_dhcp is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDhcp ">
+ <c:property-options>
+ <c:option value="manage_isc"/>
+ <c:option value="manage_dnsmasq"/>
+ </c:property-options>
+ </c:simple-property>
+
+ <c:simple-property name="settings/next_server" displayName="Next Server for PXE" type="string" required="true" activationPolicy="immediate"
+ description="The IP address of the cobbler server which will be used by guests who are booting via PXE."/>
+ </c:group>
+ <c:group name = "DNS Management">
+ <c:simple-property name="enableDns" displayName="Enable DNS" type="boolean" required="true" activationPolicy="immediate"
+ description="True if dns management is to be enabled. Note the DNS module must be appropriately selected. "/>
+ <c:simple-property name="modules.conf/dns/module" displayName="DNS Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DNS management engine if manage_dns is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDns">
+ <c:property-options>
+ <c:option value="manage_bind"/>
+ <c:option value="manage_dnsmasq"/>
+ </c:property-options>
</c:simple-property>
- <c:simple-property name="modules.conf/dhcp/module" displayName="DHCP Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DHCP management engine if manage_dns is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDhcp ">
- <c:property-options>
- <c:option value="manage_isc"/>
- <c:option value="manage_dnsmasq"/>
- </c:property-options>
- </c:simple-property>
-
-
+ <c:simple-property name="settings/manage_forward_zones" displayName="Forward Zones" type="string" required="false" activationPolicy="immediate"
+ description="If using BIND (named) for DNS management, this is a list of zone that are to be managed. For more information check https://fedorahosted.org/cobbler/wiki/ManageDns"/>
+ <c:simple-property name="settings/manage_reverse_zones" displayName="Reverse Zones" type="string" required="false" activationPolicy="immediate"
+ description="If using BIND (named) for DNS management, this is a list of zone that are to be managed. For more information check https://fedorahosted.org/cobbler/wiki/ManageDns"/>
+ </c:group>
+ <c:group name="Default Virtualization Settings">
+ <c:simple-property name="settings/default_virt_bridge" displayName="Bridge" type="string" required="true" activationPolicy="immediate" description="The default virtualization brige to use if no value is specified in the profile/system record. For EL 4/5 hosts this should be xenbr0. For fedora try virbr0"/>
+ <c:simple-property name="settings/default_virt_file_size" displayName="File Size" type="string" required="true" activationPolicy="immediate" description="Default disk size for virt guests (GB)."/>
+ <c:simple-property name="settings/default_virt_ram" displayName="Memory" type="string" required="true" activationPolicy="immediate" description="Default memory size for virt guests (MB)."/>
+ <c:simple-property name="settings/default_virt_type" displayName="Virtualization Type" type="string" required="true" activationPolicy="immediate" description="Default virtualization type if no virt type is specified in the profile/system. ">
+ <c:property-options>
+ <c:option value="xenpv"/>
+ <c:option value="xenfv"/>
+ <c:option value="qemu"/>
+ <c:option value="vmware"/>
+ </c:property-options>
+ </c:simple-property>
+ </c:group>
</resource-configuration>
</server>
</plugin>
\ No newline at end of file
commit cf135f0a98a91c5c35eedc3af7fba555ca3708b5
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Sat Jan 23 17:46:03 2010 -0500
re-enable JSP precompilation and upgrade to latest version of Jetty jspc Maven plugin; remove unused version properties and commented-out deps
diff --git a/modules/enterprise/gui/installer-war/pom.xml b/modules/enterprise/gui/installer-war/pom.xml
index 40c8268..111a873 100644
--- a/modules/enterprise/gui/installer-war/pom.xml
+++ b/modules/enterprise/gui/installer-war/pom.xml
@@ -13,7 +13,7 @@
<packaging>war</packaging>
<name>RHQ Enterprise Installer War</name>
- <description>The ON Enterprise Installer webapp</description>
+ <description>The RHQ Enterprise Installer webapp</description>
<scm>
<connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/gui/ins...</connection>
@@ -24,10 +24,8 @@
<scm.module.path>modules/enterprise/gui/installer-war/</scm.module.path>
<war.dir>${basedir}/target/${final.name}</war.dir>
- <!-- dependency versions -->
- <el.version>1.0</el.version>
- <jsf-facelets.version>1.1.14</jsf-facelets.version>
- <jetty-jspc.version>7.0.0.RC6</jetty-jspc.version>
+ <!-- plugin versions -->
+ <jetty-jspc-maven-plugin.version>7.0.1.v20091125</jetty-jspc-maven-plugin.version>
<product.shortName>RHQ</product.shortName>
<product.name>RHQ</product.name>
@@ -84,39 +82,6 @@
<scope>provided</scope> <!-- by JBossAS -->
</dependency>
- <!--
- <dependency>
- <groupId>com.sun.facelets</groupId>
- <artifactId>jsf-facelets</artifactId>
- <version>${jsf-facelets.version}</version>
- </dependency>
- -->
-
- <!--
- <dependency>
- <groupId>commons-el</groupId>
- <artifactId>commons-el</artifactId>
- <version>1.0</version>
- </dependency>
- -->
-
- <!--
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.0.4</version>
- </dependency>
- -->
-
- <!--
- <dependency>
- <groupId>javax.el</groupId>
- <artifactId>el-api</artifactId>
- <version>${el.version}</version>
- <scope>provided</scope>
- </dependency>
- -->
-
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
@@ -124,15 +89,6 @@
<scope>provided</scope> <!-- by JBossAS -->
</dependency>
- <!--
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.0</version>
- <scope>provided</scope>
- </dependency>
- -->
-
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
@@ -299,7 +255,6 @@
</build>
</profile>
- <!--
<profile>
<id>dist</id>
@@ -307,13 +262,13 @@
<plugins>
<plugin>
- // See http://jetty.mortbay.org/jspc-maven-plugin/
+ <!-- See http://jetty.mortbay.org/jspc-maven-plugin/ -->
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-jspc-maven-plugin</artifactId>
- <version>${jetty-jspc.version}</version>
+ <version>${jetty-jspc-maven-plugin.version}</version>
<configuration>
<keepSources>false</keepSources>
- <validateXml>false</validateXml> // TODO: set to true
+ <validateXml>false</validateXml>
<generatedClasses>${project.build.outputDirectory}</generatedClasses>
</configuration>
<executions>
@@ -324,7 +279,6 @@
</plugins>
</build>
</profile>
- -->
</profiles>
commit 9f1f7e31f5e1bec67d5c928005092f4f4c70106b
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Sat Jan 23 17:42:47 2010 -0500
upgrade Facelets dep version from 1.1.14 to 1.1.15; re-enable JSP precompilation and upgrade to latest version of Jetty jspc Maven plugin
diff --git a/modules/enterprise/gui/portal-war/pom.xml b/modules/enterprise/gui/portal-war/pom.xml
index 7de6682..8de2098 100644
--- a/modules/enterprise/gui/portal-war/pom.xml
+++ b/modules/enterprise/gui/portal-war/pom.xml
@@ -24,9 +24,11 @@
<!-- dependency versions -->
<el.version>1.0</el.version>
- <jsf-facelets.version>1.1.14</jsf-facelets.version>
+ <jsf-facelets.version>1.1.15</jsf-facelets.version>
<seam.version>2.1.0.SP1</seam.version>
- <jetty-jspc.version>7.0.0.RC6</jetty-jspc.version>
+
+ <!-- plugin versions -->
+ <jetty-jspc-maven-plugin.version>7.0.1.v20091125</jetty-jspc-maven-plugin.version>
<product.shortName>RHQ</product.shortName>
<product.name>RHQ</product.name>
@@ -359,14 +361,6 @@
<version>1.1.2</version>
</dependency>
- <!-- new jetty based jsp compiler -->
- <dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-jspc-maven-plugin</artifactId>
- <version>${jetty-jspc.version}</version>
- <scope>provided</scope>
- </dependency>
-
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
@@ -542,7 +536,6 @@
</build>
</profile>
- <!--
<profile>
<id>dist</id>
@@ -550,13 +543,13 @@
<plugins>
<plugin>
- // See http://jetty.mortbay.org/jspc-maven-plugin/
+ <!-- See http://jetty.mortbay.org/jspc-maven-plugin/ -->
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-jspc-maven-plugin</artifactId>
- <version>${jetty-jspc.version}</version>
+ <version>${jetty-jspc-maven-plugin.version}</version>
<configuration>
<keepSources>false</keepSources>
- <validateXml>false</validateXml> // TODO: set to true
+ <validateXml>false</validateXml>
<generatedClasses>${project.build.outputDirectory}</generatedClasses>
</configuration>
<executions>
@@ -567,7 +560,6 @@
</plugins>
</build>
</profile>
- -->
</profiles>
commit a1389798ba76f75e021ceb9bb697f2e2bd218109
Merge: 06735ce... 082fce8...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Sat Jan 23 15:56:25 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 06735ceff1c884bc561dbad01aed685811ad6281
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Sat Jan 23 15:55:54 2010 -0500
reimplement sorting using non-RF data model based on Joseph's original data model (we now have the little numbers in the headers of sorted columns); refactor base persp war base classes; add mainTemplate.xhtml to base persp war and update each of the sample persp apges to use it; pull in CSS files from portal-war; add new UnlimitedPageControl class in domain module; impl toString() in RemoteClient and make a few other minor refactorings
diff --git a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPagedDataPerspectiveUIBean.java b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPagedDataPerspectiveUIBean.java
deleted file mode 100644
index 5741a0f..0000000
--- a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPagedDataPerspectiveUIBean.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2009-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.perspective;
-
-import org.jboss.seam.annotations.In;
-import org.rhq.core.domain.util.PageControl;
-import org.rhq.core.gui.model.DefaultPageControlSettingsUIBean;
-
-/**
- * A base class for Seam components that utilize the RHQ remote API to retrieve a paged data set of objects, which are
- * typically rendered using a dataTable component.
- *
- * @author Ian Springer
- */
-public class AbstractPagedDataPerspectiveUIBean extends AbstractPerspectiveUIBean {
- @In(value = "DefaultPageControlSettingsUIBean", create = true)
- private DefaultPageControlSettingsUIBean defaultPageControlSettings;
-
- private PageControl pageControl;
-
- public PageControl getPageControl() {
- if (this.pageControl == null) {
- this.pageControl = getDefaultPageControl();
- }
- return pageControl;
- }
-
- public void setPageControl(PageControl pageControl) {
- this.pageControl = pageControl;
- }
-
- protected PageControl getDefaultPageControl() {
- return new PageControl(0, this.defaultPageControlSettings.getDefaultPageSize());
- }
-}
diff --git a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectivePagedDataUIBean.java b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectivePagedDataUIBean.java
new file mode 100644
index 0000000..1430a79
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectivePagedDataUIBean.java
@@ -0,0 +1,38 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.perspective;
+
+import org.jboss.seam.Component;
+import org.jboss.seam.annotations.Create;
+import org.rhq.core.gui.table.bean.AbstractPagedDataUIBean;
+
+/**
+ * A base class for Seam components that utilize the RHQ remote API to retrieve a paged data set of objects, which are
+ * typically rendered using a dataTable component.
+ *
+ * @author Ian Springer
+ */
+public abstract class AbstractPerspectivePagedDataUIBean extends AbstractPagedDataUIBean {
+ protected PerspectiveClientUIBean perspectiveClient;
+
+ @Create
+ public void init() {
+ this.perspectiveClient = (PerspectiveClientUIBean) Component.getInstance(PerspectiveClientUIBean.class, true);
+ }
+}
diff --git a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveResourceUIBean.java b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveResourceUIBean.java
new file mode 100644
index 0000000..b6ea66c
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveResourceUIBean.java
@@ -0,0 +1,49 @@
+package org.rhq.enterprise.server.perspective;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.seam.annotations.web.RequestParameter;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.client.RemoteClient;
+import org.rhq.enterprise.server.resource.ResourceManagerRemote;
+
+/**
+ * A base class for Seam components that utilize the RHQ remote API in the context of a specific Resource.
+ */
+public class AbstractPerspectiveResourceUIBean extends AbstractPerspectiveUIBean {
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @RequestParameter
+ private Integer rhqResourceId;
+
+ private Resource resource;
+
+ public Resource getResource() throws Exception {
+ if (this.resource == null) {
+ this.resource = loadResource();
+ log.debug("Retrieved current Resource " + this.resource);
+ }
+ return this.resource;
+ }
+
+ private Resource loadResource() throws Exception {
+ if (this.rhqResourceId == null) {
+ throw new IllegalStateException("The 'rhqResourceId' HTTP request parameter is required by this page.");
+ }
+ RemoteClient remoteClient = this.perspectiveClient.getRemoteClient();
+ Subject subject = this.perspectiveClient.getSubject();
+
+ // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
+ ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
+ ResourceCriteria resourceCriteria = new ResourceCriteria();
+ resourceCriteria.addFilterId(this.rhqResourceId);
+ PageList<Resource> resources = resourceManager.findResourcesByCriteria(subject, resourceCriteria);
+ if (resources.isEmpty()) {
+ throw new IllegalStateException("No Resource exists with the id " + this.rhqResourceId + ".");
+ }
+ return resources.get(0);
+ }
+}
diff --git a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java
index c24da91..56034bb 100644
--- a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java
+++ b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java
@@ -18,15 +18,10 @@
*/
package org.rhq.enterprise.server.perspective;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.jboss.seam.Component;
+import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.In;
import org.jboss.seam.faces.FacesMessages;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.enterprise.client.RemoteClient;
-import org.rhq.enterprise.server.auth.SubjectManagerRemote;
-
-import org.jboss.seam.annotations.web.RequestParameter;
/**
* A base class for Seam components that utilize the RHQ remote API.
@@ -34,77 +29,13 @@ import org.jboss.seam.annotations.web.RequestParameter;
* @author Ian Springer
*/
public abstract class AbstractPerspectiveUIBean {
- private static final String DEFAULT_SERVER_HOST = "127.0.0.1";
- private static final int DEFAULT_SERVER_PORT = 7080;
- private static final String DEFAULT_USERNAME = "rhqadmin";
- private static final String DEFAULT_PASSWORD = "rhqadmin";
-
- private final Log log = LogFactory.getLog(this.getClass());
-
- @RequestParameter("rhqServerHost")
- private String serverHost;
-
- @RequestParameter("rhqServerPort")
- private Integer serverPort;
-
- @RequestParameter("rhqUsername")
- private String username;
-
- @RequestParameter("rhqPassword")
- private String password;
-
- @RequestParameter("rhqSessionId")
- private Integer sessionId;
-
@In
- private FacesMessages facesMessages;
-
- private RemoteClient remoteClient;
- private Subject subject;
-
- protected FacesMessages getFacesMessages() {
- return facesMessages;
- }
-
- protected RemoteClient getRemoteClient() throws Exception {
- if (this.remoteClient == null) {
- this.remoteClient = new RemoteClient(null, getServerHost(), getServerPort());
- }
- if (!this.remoteClient.isConnected()) {
- this.remoteClient.connect();
- }
- return this.remoteClient;
- }
-
- protected Subject getSubject() throws Exception {
- if (subject == null) {
- RemoteClient remoteClient = getRemoteClient();
- // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
- SubjectManagerRemote subjectManager = remoteClient.getSubjectManagerRemote();
- if (this.sessionId != null) {
- log.info("Retrieving subject for user [" + getUsername() + "] and sessionId [" + this.sessionId + "]...");
- this.subject = subjectManager.getSubjectByNameAndSessionId(getUsername(), this.sessionId);
- } else {
- log.info("Logging in as user [" + getUsername() + "] with password [" + getPassword() + "]...");
- this.subject = subjectManager.login(getUsername(), getPassword());
- }
- }
- return this.subject;
- }
+ protected FacesMessages facesMessages;
- private String getServerHost() {
- return (this.serverHost != null) ? this.serverHost : DEFAULT_SERVER_HOST;
- }
-
- private int getServerPort() {
- return (this.serverPort != null) ? this.serverPort : DEFAULT_SERVER_PORT;
- }
-
- private String getUsername() {
- return (this.username != null) ? this.username : DEFAULT_USERNAME;
- }
+ protected PerspectiveClientUIBean perspectiveClient;
- private String getPassword() {
- return (this.password != null) ? this.password : DEFAULT_PASSWORD;
+ @Create
+ public void init() {
+ this.perspectiveClient = (PerspectiveClientUIBean) Component.getInstance(PerspectiveClientUIBean.class, true);
}
}
\ No newline at end of file
diff --git a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveClientUIBean.java b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveClientUIBean.java
new file mode 100644
index 0000000..59c9c63
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveClientUIBean.java
@@ -0,0 +1,161 @@
+package org.rhq.enterprise.server.perspective;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.web.RequestParameter;
+import org.jboss.seam.core.Conversation;
+import org.jetbrains.annotations.NotNull;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.client.RemoteClient;
+import org.rhq.enterprise.server.auth.SubjectManagerRemote;
+
+/**
+ * @author Ian Springer
+ */
+(a)Name(PerspectiveClientUIBean.NAME)
+(a)Scope(ScopeType.CONVERSATION)
+@AutoCreate
+public class PerspectiveClientUIBean {
+ public static final String NAME = "PerspectiveClientUIBean";
+
+ private static final String DEFAULT_SERVER_HOST = "127.0.0.1";
+ private static final int DEFAULT_SERVER_PORT = 7080;
+ private static final String DEFAULT_USERNAME = "rhqadmin";
+ private static final String DEFAULT_PASSWORD = "rhqadmin";
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @RequestParameter
+ private String rhqServerHost;
+ private String serverHost;
+
+ @RequestParameter
+ private Integer rhqServerPort;
+ private Integer serverPort;
+
+ @RequestParameter
+ private String rhqUsername;
+ private String username;
+
+ @RequestParameter
+ private String rhqPassword;
+ private String password;
+
+ @RequestParameter
+ private Integer rhqSessionId;
+
+ private RemoteClient remoteClient;
+ private Subject subject;
+ private String coreGuiBaseUrl;
+
+ @NotNull
+ public RemoteClient getRemoteClient() throws Exception {
+ if (this.remoteClient == null) {
+ this.remoteClient = new RemoteClient(null, getServerHost(), getServerPort());
+ }
+ if (!this.remoteClient.isConnected()) {
+ try {
+ this.remoteClient.connect();
+ } catch (Exception e) {
+ this.remoteClient = null;
+ log.info("Ending perspective client Conversation with id " + Conversation.instance().getId() + "...");
+ Conversation.instance().end();
+ throw e;
+ }
+ Conversation.instance().begin();
+ log.info("Began perspective client Conversation with id " + Conversation.instance().getId() + ".");
+ }
+ return this.remoteClient;
+ }
+
+ /**
+ * Returns the currently logged in RHQ user.
+ *
+ * @return the currently logged in RHQ user
+ *
+ * @throws Exception if we are unable to obtain the Subject - hopefully this will encourage callers to set a
+ * FacesMessage and return null to give the user a friendlier error
+ */
+ @NotNull
+ public Subject getSubject() throws Exception {
+ if (subject == null) {
+ RemoteClient remoteClient = getRemoteClient();
+ // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
+ SubjectManagerRemote subjectManager = remoteClient.getSubjectManagerRemote();
+ if (this.rhqSessionId != null) {
+ log.info("Retrieving subject for user [" + getUsername() + "] and sessionId [" + this.rhqSessionId + "]...");
+ this.subject = subjectManager.getSubjectByNameAndSessionId(getUsername(), this.rhqSessionId);
+ } else {
+ log.info("Logging in as user [" + getUsername() + "] with password [" + getPassword() + "]...");
+ this.subject = subjectManager.login(getUsername(), getPassword());
+ }
+ }
+ return this.subject;
+ }
+
+ @NotNull
+ public String getCoreGuiBaseUrl() throws Exception {
+ if (this.coreGuiBaseUrl == null) {
+ RemoteClient remoteClient = getRemoteClient();
+ Subject subject = getSubject();
+ PerspectiveManagerRemote perspectiveManager = remoteClient.getPerspectiveManagerRemote();
+ this.coreGuiBaseUrl = perspectiveManager.getRootUrl(subject, true, false);
+ }
+ return this.coreGuiBaseUrl;
+ }
+
+ @NotNull
+ private String getServerHost() {
+ if (this.serverHost == null) {
+ if (this.rhqServerHost != null) {
+ this.serverHost = this.rhqServerHost;
+ } else {
+ return DEFAULT_SERVER_HOST;
+ }
+ } else {
+ if (this.rhqServerHost != null && this.serverHost.equals(this.rhqServerHost)) {
+
+ }
+ }
+ return this.serverHost;
+ }
+
+ private int getServerPort() {
+ if (this.serverPort == null) {
+ if (this.rhqServerPort != null) {
+ this.serverPort = this.rhqServerPort;
+ } else {
+ return DEFAULT_SERVER_PORT;
+ }
+ }
+ return this.serverPort;
+ }
+
+ @NotNull
+ private String getUsername() {
+ if (this.username == null) {
+ if (this.rhqUsername != null) {
+ this.username = this.rhqUsername;
+ } else {
+ return DEFAULT_USERNAME;
+ }
+ }
+ return this.username;
+ }
+
+ @NotNull
+ private String getPassword() {
+ if (this.password == null) {
+ if (this.rhqPassword != null) {
+ this.password = this.rhqPassword;
+ } else {
+ return DEFAULT_PASSWORD;
+ }
+ }
+ return this.password;
+ }
+}
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
index 263bbb2..c0f6bac 100644
--- a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
@@ -1,110 +1,103 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0"?>
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html
- xmlns:h="http://java.sun.com/jsf/html"
+<ui:composition
+ xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
- xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:onf="http://jboss.org/on/function">
-<body>
-
- Usage: The following parameters must be set in the calling page:
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
- dataTableName - Name of the data table to be controlled
- dataModel - Data model of the underlying table being controlled (used for total row count)
- pageControl - Page control value to set when changing the number of rows per page
- pageControlSettingsUIBean (optional, defaults to #{DefaultPageControlSettingsUIBean}") - page control settings
+ <ui:remove>
+ Usage: The following parameters must be set in the calling page:
- <ui:composition>
+ pagedDataUIBean - an instance of AbstractPagedDataUIBean, which provides access to a data model, a page
+ control, and page control settings (valid page sizes, etc.)
+ dataTableName - name of the data table to be controlled
+ </ui:remove>
- <h:panelGroup layout="block" style="float: right; margin-right: 30px">
- <ui:param name="dataScrollerName" value="#{dataTableName}Scroller"/>
- <c:if test="#{empty pageControlSettingsUIBean}">
- <ui:param name="pageControlSettingsUIBean" value="#{DefaultPageControlSettingsUIBean}"/>
- </c:if>
+ <h:panelGroup layout="block" style="float: right; margin-right: 30px">
+ <ui:param name="dataScrollerName" value="#{dataTableName}Scroller"/>
+ <ui:param name="dataModel" value="#{pagedDataUIBean.dataModel}"/>
+ <ui:param name="pageControl" value="#{pagedDataUIBean.pageControl}"/>
- <table>
- <tr>
- <td nowrap="nowrap">
+ <table>
+ <tr>
+ <td nowrap="nowrap">
- <h:outputText value="Total: #{dataModel.rowCount}"
- style="margin-right: 2em; font-weight: bold; "/>
+ <h:outputText value="Total: #{dataModel.rowCount}"
+ style="margin-right: 2em; font-weight: bold; "/>
- <h:panelGroup layout="block" rendered="#{dataModel.rowCount gt pageControlSettingsUIBean.minimumPageSize
+ <h:panelGroup layout="block" rendered="#{dataModel.rowCount gt pagedDataUIBean.minimumPageSize
and pageControl.pageSize gt 0}">
- <h:outputText value="Items Per Page: #{pageControl.pageSize}"
- style="font-weight: bold; "
- rendered="#{pageControlSettingsUIBean.pageSizeCount le 1}"/>
- <h:panelGroup layout="block" rendered="#{pageControlSettingsUIBean.pageSizeCount gt 1}">
- <h:outputText value="Items Per Page:"
- style="margin-right: 1em; font-weight: bold; "/>
- <h:selectOneListbox id="currentPageSize"
- size="1"
- value="#{pageControl.pageSize}">
- <a4j:support event="onchange"
- status="commonStatus"
- reRender="#{dataTableName}, #{dataScrollerName}"/>
- <f:selectItems value="#{pageControlSettingsUIBean.pageSizeSelectItems}"/>
- </h:selectOneListbox>
- </h:panelGroup>
+ <h:outputText value="Items Per Page: #{pageControl.pageSize}"
+ style="font-weight: bold; "
+ rendered="#{pagedDataUIBean.pageSizeCount le 1}"/>
+ <h:panelGroup layout="block" rendered="#{pagedDataUIBean.pageSizeCount gt 1}">
+ <h:outputText value="Items Per Page:"
+ style="margin-right: 1em; font-weight: bold; "/>
+ <h:selectOneListbox id="currentPageSize"
+ size="1"
+ value="#{pageControl.pageSize}">
+ <a4j:support event="onchange"
+ status="commonStatus"
+ reRender="#{dataTableName}, #{dataScrollerName}"/>
+ <f:selectItems value="#{pagedDataUIBean.pageSizeSelectItems}"/>
+ </h:selectOneListbox>
</h:panelGroup>
+ </h:panelGroup>
+
+ </td>
+
+ <td nowrap="nowrap">
+
+ <rich:datascroller id="#{dataScrollerName}"
+ for="#{dataTableName}"
+ status="commonStatus"
+ rendered="#{pageControl.pageSize gt 0}"
+ selectedStyle="font-weight: bold;"
+ inactiveStyle="font-weight: normal;"
+ stepControls="show"
+ fastControls="hide"
+ boundaryControls="hide"
+ maxPages="#{pagedDataUIBean.maximumPages}"
+ page="#{pageControl.pageNumber}">
+ <f:facet name="next">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="next_disabled">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright_gray.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="previous">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="previous_disabled">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft_gray.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ </rich:datascroller>
- </td>
-
- <td nowrap="nowrap">
-
- <rich:datascroller id="#{dataScrollerName}"
- for="#{dataTableName}"
- status="commonStatus"
- rendered="#{pageControl.pageSize gt 0}"
- selectedStyle="font-weight: bold;"
- inactiveStyle="font-weight: normal;"
- stepControls="show"
- fastControls="hide"
- boundaryControls="hide"
- maxPages="#{pageControlSettingsUIBean.maximumPages}"
- page="#{pageControl.pageNumber}">
- <f:facet name="next">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright.gif"
- style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- <f:facet name="next_disabled">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright_gray.gif"
- style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- <f:facet name="previous">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft.gif" style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- <f:facet name="previous_disabled">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft_gray.gif"
- style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- </rich:datascroller>
-
- </td>
- </tr>
- </table>
-
- </h:panelGroup>
+ </td>
+ </tr>
+ </table>
- <div style="clear: both;"/>
+ </h:panelGroup>
- </ui:composition>
+ <div style="clear: both;"/>
-</body>
-</html>
-
\ No newline at end of file
+</ui:composition>
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml
new file mode 100644
index 0000000..217fc6c
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/templates/mainTemplate.xhtml
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
+
+<ui:remove>
+ <!-- Set the content type to "text/html" (overriding the default of "application/xhtml+xml") to force
+Firefox and other Gecko-based browsers to render the page in "Almost Standards" (i.e. transitional) mode. -->
+</ui:remove>
+<f:view contentType="text/html; charset=UTF-8">
+
+<head>
+ <title>${msg["product.shortName"]} - #{(!empty pageTitle) ? pageTitle : defaultPageTitle}</title>
+
+ <ui:insert name="metaHeaders"/>
+
+ <link rel="stylesheet" type="text/css" media="screen" href="#{PerspectiveClientUIBean.coreGuiBaseUrl}/css/win.css"/>
+ <link rel="stylesheet" type="text/css" media="screen" href="#{PerspectiveClientUIBean.coreGuiBaseUrl}/css/form-style.css"/>
+ <link rel="stylesheet" type="text/css" media="screen" href="#{PerspectiveClientUIBean.coreGuiBaseUrl}/css/menu.css"/>
+
+ <!-- Trims up the headers of RF toggle panel headers -->
+ <style type="text/css">
+ .BlockTitle {
+ padding-top: 3px;
+ padding-bottom: 3px;
+ }
+
+ HTML, BODY {
+ overflow: hidden;
+ }
+ </style>
+
+ <link rel="stylesheet" type="text/css" media="screen" href="#{PerspectiveClientUIBean.coreGuiBaseUrl}/css/tabular.css"/>
+ <link rel="stylesheet" type="text/css" media="screen" href="#{PerspectiveClientUIBean.coreGuiBaseUrl}/css/layout.css"/>
+
+ <script type="text/javascript">
+ var imagePath = "/images/";
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF" style="height: 100%;">
+
+<h1>#{(!empty pageTitle) ? pageTitle : defaultPageTitle}</h1>
+
+<rich:messages globalOnly="true" infoClass="InfoBlock" warnClass="WarnBlock" errorClass="ErrorBlock" fatalClass="FatalBlock" />
+
+<ui:insert name="body"/>
+
+</body>
+</f:view>
+</html>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
index 5a02b3b..8e47198 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
@@ -18,23 +18,24 @@
*/
package org.rhq.sample.perspective;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jboss.seam.ScopeType;
-import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.international.StatusMessage;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.gui.model.PagedDataModel;
import org.rhq.core.gui.model.PagedDataProvider;
+import org.rhq.core.gui.table.model.PagedListDataModel;
import org.rhq.enterprise.client.RemoteClient;
-import org.rhq.enterprise.server.perspective.AbstractPagedDataPerspectiveUIBean;
+import org.rhq.enterprise.server.perspective.AbstractPerspectivePagedDataUIBean;
import org.rhq.enterprise.server.perspective.PerspectiveManagerRemote;
import org.rhq.enterprise.server.perspective.PerspectiveTarget;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
@@ -46,18 +47,9 @@ import org.rhq.enterprise.server.resource.ResourceManagerRemote;
*/
@Name("BrowseResourcesUIBean")
@Scope(ScopeType.CONVERSATION)
-public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
- private PagedDataModel<Resource> dataModel;
+public class BrowseResourcesUIBean extends AbstractPerspectivePagedDataUIBean {
private List<Resource> selectedResources;
- private Map<Integer, String> resourceUrlMap;
-
- @Begin(join = true)
- public PagedDataModel<Resource> getDataModel() throws Exception {
- if (this.dataModel == null) {
- this.dataModel = createDataModel();
- }
- return this.dataModel;
- }
+ private Map<Integer, String> resourceUrlMap = new HashMap<Integer, String>();
public List<Resource> getSelectedResources() {
return this.selectedResources;
@@ -68,9 +60,16 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
}
public void uninventorySelectedResources() throws Exception {
- RemoteClient remoteClient = getRemoteClient();
- Subject subject = getSubject();
-
+ RemoteClient remoteClient;
+ Subject subject;
+ try {
+ remoteClient = this.perspectiveClient.getRemoteClient();
+ subject = this.perspectiveClient.getSubject();
+ } catch (Exception e) {
+ this.facesMessages.add(StatusMessage.Severity.FATAL, "Failed to connect to RHQ Server - cause: " + e);
+ return;
+ }
+
// ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
@@ -84,10 +83,11 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
// Add message to tell the user the uninventory was a success.
String pluralizer = (this.selectedResources.size() == 1) ? "" : "s";
- getFacesMessages().add("Uninventoried " + this.selectedResources.size() + " Resource" + pluralizer + ".");
+ this.facesMessages.add("Uninventoried " + this.selectedResources.size() + " Resource" + pluralizer + ".");
// Reset the data model, so the current page will get refreshed to reflect the Resources we just uninventoried.
- this.dataModel = null;
+ // This is essential, since we are CONVERSATION-scoped and will live on beyond this request.
+ setDataModel(null);
}
@Override
@@ -97,15 +97,45 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
return defaultPageControl;
}
- private PagedDataModel<Resource> createDataModel() throws Exception {
- RemoteClient remoteClient = getRemoteClient();
- Subject subject = getSubject();
+ public DataModel createDataModel() {
+ RemoteClient remoteClient;
+ Subject subject;
+ try {
+ remoteClient = this.perspectiveClient.getRemoteClient();
+ subject = this.perspectiveClient.getSubject();
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to connect to RHQ Server.", e);
+ }
// ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
- ResourcesDataProvider dataProvider = new ResourcesDataProvider(subject, resourceManager);
- return new PagedDataModel<Resource>(dataProvider);
+ //ResourcesDataProvider dataProvider = new ResourcesDataProvider(subject, resourceManager);
+ //return new PagedDataModel<Resource>(dataProvider);
+ return new DataModel(subject, resourceManager);
+
+ }
+
+ private void setLinkBackUrls(List<Resource> resources) {
+ int[] ids = new int[resources.size()];
+ for (int i = 0, size = resources.size(); (i < size); ++i) {
+ ids[i] = resources.get(i).getId();
+ }
+
+ try {
+ RemoteClient remoteClient = this.perspectiveClient.getRemoteClient();
+ Subject subject = this.perspectiveClient.getSubject();
+ PerspectiveManagerRemote perspectiveManager = remoteClient.getPerspectiveManagerRemote();
+ this.resourceUrlMap = perspectiveManager.getTargetUrls(subject, PerspectiveTarget.RESOURCE, ids, false,
+ false);
+ } catch (Exception e) {
+ // for the demo, just dump a stack in this unlikely case
+ e.printStackTrace();
+ }
+ }
+
+ public Map<Integer, String> getResourceUrlMap() {
+ return this.resourceUrlMap;
}
private class ResourcesDataProvider implements PagedDataProvider<Resource> {
@@ -126,27 +156,23 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
}
}
- private void setLinkBackUrls(List<Resource> resources) {
- int[] ids = new int[resources.size()];
- for (int i = 0, size = resources.size(); (i < size); ++i) {
- ids[i] = resources.get(i).getId();
- }
+ private class DataModel extends PagedListDataModel<Resource> {
+ private Subject subject;
+ private ResourceManagerRemote resourceManager;
- try {
- RemoteClient remoteClient = getRemoteClient();
- Subject subject = getSubject();
- PerspectiveManagerRemote perspectiveManager = remoteClient.getPerspectiveManagerRemote();
- this.resourceUrlMap = perspectiveManager.getTargetUrls(subject, PerspectiveTarget.RESOURCE, ids, false,
- false);
- } catch (Exception e) {
- // for the demo, just dump a stack in this unlikely case
- e.printStackTrace();
+ private DataModel(Subject subject, ResourceManagerRemote resourceManager) {
+ super(BrowseResourcesUIBean.this);
+ this.subject = subject;
+ this.resourceManager = resourceManager;
}
- }
- public String getResourceUrl(int resourceId) {
- String url = this.resourceUrlMap.get(resourceId);
- return url;
+ @Override
+ public PageList<Resource> fetchPage(PageControl pageControl) {
+ ResourceCriteria resourceCriteria = new ResourceCriteria();
+ resourceCriteria.setPageControl(pageControl);
+ PageList<Resource> resources = this.resourceManager.findResourcesByCriteria(this.subject, resourceCriteria);
+ setLinkBackUrls(resources);
+ return resources;
+ }
}
-
}
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
index 827274a..2560be2 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
@@ -25,6 +25,7 @@ import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.client.RemoteClient;
+import org.rhq.enterprise.server.perspective.AbstractPerspectiveResourceUIBean;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import org.rhq.enterprise.server.perspective.AbstractPerspectiveUIBean;
@@ -32,48 +33,11 @@ import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.web.RequestParameter;
/**
- * A Seam component that utilizes the RHQ remote API to obtain the Resource with the id specified by the 'rhqResourceId'
+ * A Seam component that utilizes the RHQ remote API to obtain the current Resource as specified via the 'rhqResourceId'
* HTTP request parameter.
*
* @author Ian Springer
*/
@Name("CurrentResourceUIBean")
-public class CurrentResourceUIBean extends AbstractPerspectiveUIBean {
- private final Log log = LogFactory.getLog(this.getClass());
-
- @RequestParameter("rhqResourceId")
- private Integer resourceId;
-
- private Resource resource;
-
- public CurrentResourceUIBean() {
- return;
- }
-
- public Resource getResource() throws Exception {
- if (this.resource == null) {
- this.resource = createResource();
- log.info("Retrieved current Resource " + this.resource);
- }
- return this.resource;
- }
-
- private Resource createResource() throws Exception {
- if (this.resourceId == null) {
- throw new IllegalStateException("The 'rhqResourceId' HTTP request parameter is required by this page.");
- }
- RemoteClient remoteClient = getRemoteClient();
- Subject subject = getSubject();
-
- // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
- ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
- ResourceCriteria resourceCriteria = new ResourceCriteria();
- resourceCriteria.addFilterId(this.resourceId);
- PageList<Resource> resources = resourceManager.findResourcesByCriteria(subject, resourceCriteria);
- if (resources.isEmpty()) {
- throw new IllegalStateException("No Resource exists with the id " + this.resourceId + ".");
- }
- remoteClient.disconnect();
- return resources.get(0);
- }
+public class CurrentResourceUIBean extends AbstractPerspectiveResourceUIBean {
}
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
index d5dc17d..6701b46 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
@@ -43,21 +43,17 @@ public class RandomResourceUIBean extends AbstractPerspectiveUIBean {
private Resource randomResource;
- public RandomResourceUIBean() {
- return;
- }
-
public Resource getRandomResource() throws Exception {
if (this.randomResource == null) {
this.randomResource = createRandomResource();
- log.info("Retrieved random Resource " + this.randomResource);
+ log.debug("Retrieved random Resource " + this.randomResource);
}
return this.randomResource;
}
private Resource createRandomResource() throws Exception {
- RemoteClient remoteClient = getRemoteClient();
- Subject subject = getSubject();
+ RemoteClient remoteClient = this.perspectiveClient.getRemoteClient();
+ Subject subject = this.perspectiveClient.getSubject();
// ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
ResourceCriteria resourceCriteria = new ResourceCriteria();
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
index 0e63ad2..ab416e0 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
@@ -18,12 +18,14 @@
*/
package org.rhq.sample.perspective;
+import java.util.HashMap;
import java.util.Map;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.international.StatusMessage;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
@@ -145,7 +147,7 @@ public class WizardBean extends AbstractPerspectiveUIBean {
private boolean enableLogin = true;
private PageList<Resource> resources;
- private Map<Integer, String> resourceUrlMap;
+ private Map<Integer, String> resourceUrlMap = new HashMap<Integer, String>();
//// STEP N:
@@ -163,9 +165,15 @@ public class WizardBean extends AbstractPerspectiveUIBean {
String stepCompleted = "(incomplete)";
- //retrieve remote client references
- RemoteClient remoteClient = getRemoteClient();
- Subject subject = getSubject();
+ RemoteClient remoteClient;
+ Subject subject;
+ try {
+ remoteClient = this.perspectiveClient.getRemoteClient();
+ subject = this.perspectiveClient.getSubject();
+ } catch (Exception e) {
+ this.facesMessages.add(StatusMessage.Severity.FATAL, "Failed to connect to RHQ Server - cause: " + e);
+ return null;
+ }
switch (this.currentStep) {
case One: //create Group for visibility
@@ -642,28 +650,27 @@ public class WizardBean extends AbstractPerspectiveUIBean {
return resources;
}
- public String getResourceUrl(int resourceId) {
- String url = this.resourceUrlMap.get(resourceId);
- return url;
+ public Map<Integer, String> getResourceUrlMap() {
+ return this.resourceUrlMap;
}
public String getGroupsUrl() throws Exception {
- PerspectiveManagerRemote perspectiveManager = getRemoteClient().getPerspectiveManagerRemote();
- String url = perspectiveManager.getMenuItemUrl(getSubject(),
+ PerspectiveManagerRemote perspectiveManager = this.perspectiveClient.getRemoteClient().getPerspectiveManagerRemote();
+ String url = perspectiveManager.getMenuItemUrl(this.perspectiveClient.getSubject(),
((Group.valueOf(this.groupType) == Group.Mixed) ? "groups.mixedGroups" : "groups.compatibleGroups"), false,
false);
return url;
}
public String getRolesUrl() throws Exception {
- PerspectiveManagerRemote perspectiveManager = getRemoteClient().getPerspectiveManagerRemote();
- String url = perspectiveManager.getMenuItemUrl(getSubject(), "administration.security.roles", false, false);
+ PerspectiveManagerRemote perspectiveManager = this.perspectiveClient.getRemoteClient().getPerspectiveManagerRemote();
+ String url = perspectiveManager.getMenuItemUrl(this.perspectiveClient.getSubject(), "administration.security.roles", false, false);
return url;
}
public String getUsersUrl() throws Exception {
- PerspectiveManagerRemote perspectiveManager = getRemoteClient().getPerspectiveManagerRemote();
- String url = perspectiveManager.getMenuItemUrl(getSubject(), "administration.security.users", false, false);
+ PerspectiveManagerRemote perspectiveManager = this.perspectiveClient.getRemoteClient().getPerspectiveManagerRemote();
+ String url = perspectiveManager.getMenuItemUrl(this.perspectiveClient.getSubject(), "administration.security.users", false, false);
return url;
}
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index e9bb529..e866b98 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -1,108 +1,89 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<?xml version="1.0"?>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
- xmlns:h="http://java.sun.com/jsf/html"
+<ui:composition
+ template="/WEB-INF/templates/mainTemplate.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
- xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
- xmlns:rhq="http://rhq-project.org/rhq">
-<ui:remove>
- <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
- other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
- We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
- including an xml prolog causes IE6 to go into the undesirable "quirks mode".
- (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
-</ui:remove>
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
- <head>
- <title>
- Browse Resources
- </title>
- </head>
+ <ui:param name="pageTitle" value="Browse Resources"/>
- <body style="background-color: #FFF">
+ <ui:define name="body">
- <f:view contentType="text/html; charset=UTF-8">
+ <ui:remove><!-- NOTE: The table needs to be surrounded by a form for paging and sorting to work! --></ui:remove>
+ <h:form>
+ <rich:dataTable id="resourcesDataTable"
+ value="#{BrowseResourcesUIBean.dataModel}" var="resource"
+ first="#{BrowseResourcesUIBean.pageControl.pageNumber}"
+ rows="#{BrowseResourcesUIBean.pageControl.pageSize}"
+ sortMode="multi"
+ width="100%">
- <h2>Browse Resources</h2>
+ <rich:column width="20">
+ <f:facet name="header">
+ <rhq:allRowsSelector/>
+ </f:facet>
+ <rhq:rowSelector value="#{BrowseResourcesUIBean.selectedResources}"/>
+ </rich:column>
- <style type="text/css">
- .infoBlock {
- background-color: #BFF1B5; /* light green */
- border-top-color: #00AC3D; /* medium green */
- }
+ <rich:column width="55" sortBy="r.id">
+ <f:facet name="header">
+ <rhq:sortableColumnHeader sortBy="r.id">
+ <h:outputText value="Id"/>
+ </rhq:sortableColumnHeader>
+ </f:facet>
- .warnBlock {
- background-color: #FFFD99; /* light yellow */
- border-top-color: #FF9C15; /* medium orange */
- }
- </style>
- <rich:messages globalOnly="true" infoClass="infoBlock" warnClass="warnBlock"/>
+ <h:outputLink value="#{BrowseResourcesUIBean.resourceUrlMap[resource.id]}" target="_top">
+ <h:outputText value="#{resource.id}"/>
+ </h:outputLink>
+ </rich:column>
- <ui:remove><!-- The table needs to be surrounded by a form for paging and sorting to work! --></ui:remove>
- <h:form>
- <rich:dataTable id="resourcesDataTable"
- value="#{BrowseResourcesUIBean.dataModel}" var="resource"
- first="#{BrowseResourcesUIBean.pageControl.pageNumber}"
- rows="#{BrowseResourcesUIBean.pageControl.pageSize}"
- sortMode="multi"
- width="100%">
+ <rich:column sortBy="r.name" width="235">
+ <f:facet name="header">
+ <rhq:sortableColumnHeader sortBy="r.name">
+ <h:outputText value="Name"/>
+ </rhq:sortableColumnHeader>
+ </f:facet>
- <rich:column width="20">
- <f:facet name="header">
- <rhq:allRowsSelector/>
- </f:facet>
- <rhq:rowSelector mode="multi" value="#{BrowseResourcesUIBean.selectedResources}"/>
- </rich:column>
+ <h:outputText value="#{resource.name}"/>
+ </rich:column>
- <rich:column sortBy="#{r.id}" width="60">
- <f:facet name="header">
- <h:outputLabel for="id" value="Id" />
- </f:facet>
+ <rich:column sortBy="r.description">
+ <f:facet name="header">
+ <rhq:sortableColumnHeader sortBy="r.description">
+ <h:outputText value="Description"/>
+ </rhq:sortableColumnHeader>
+ </f:facet>
- <h:outputLink value="#{BrowseResourcesUIBean.getResourceUrl(resource.id)}" target="_top">
- <h:outputText id="id" value="#{resource.id}" />
- </h:outputLink>
- </rich:column>
+ <h:outputText value="#{resource.description}"/>
+ </rich:column>
- <rich:column sortBy="#{r.name}" width="240">
- <f:facet name="header">
- <h:outputLabel for="name" value="Name" />
- </f:facet>
- <h:outputText id="name" value="#{resource.name}" />
- </rich:column>
-
- <rich:column sortBy="#{r.description}">
- <f:facet name="header">
- <h:outputLabel for="description" value="Description" />
- </f:facet>
- <h:outputText id="description" value="#{resource.description}" />
- </rich:column>
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="4">
+ <rhq:selectedRowsCommandButton
+ value="UNINVENTORY"
+ action="#{BrowseResourcesUIBean.uninventorySelectedResources}">
+ <a4j:support event="onclick" reRender="resourcesDataTable"/>
+ </rhq:selectedRowsCommandButton>
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="8">
- <rhq:selectedRowsCommandButton
- value="UNINVENTORY"
- action="#{BrowseResourcesUIBean.uninventorySelectedResources}">
- <a4j:support event="onclick" reRender="resourcesDataTable" />
- </rhq:selectedRowsCommandButton>
-
- <ui:include src="/WEB-INF/includes/pageControls.xhtml">
- <ui:param name="dataTableName" value="resourcesDataTable"/>
- <ui:param name="dataModel" value="#{BrowseResourcesUIBean.dataModel}"/>
- <ui:param name="pageControl" value="#{BrowseResourcesUIBean.pageControl}"/>
- </ui:include>
- </rich:column>
- </rich:columnGroup>
- </f:facet>
- </rich:dataTable>
+ <ui:include src="/WEB-INF/includes/pageControls.xhtml">
+ <ui:param name="pagedDataUIBean" value="#{BrowseResourcesUIBean}"/>
+ <ui:param name="dataTableName" value="resourcesDataTable"/>
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+ </rich:dataTable>
</h:form>
- </f:view>
-
- </body>
+ </ui:define>
-</html>
+</ui:composition>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/currentResource.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/currentResource.xhtml
index 64d44ed..1900ced 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/currentResource.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/currentResource.xhtml
@@ -1,61 +1,53 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:s="http://jboss.com/products/seam/taglib"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.org/rich">
-<ui:remove>
- <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
- other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
- We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
- including an xml prolog causes IE6 to go into the undesirable "quirks mode".
- (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
-</ui:remove>
-
- <head>
- <title>
- Current Resource
- </title>
- </head>
-
- <body style="background-color: #FF66CC">
-
- <f:view contentType="text/html; charset=UTF-8">
-
- <!-- Force the page to be taller than the height of the browser
- to test that a vertical scrollbar is not added to the
- enclosing iframe. -->
- <div style="padding: 10px; height: 1000px;">
- <h4>It's always good to see something from another perspective.</h4>
-
- <p>You should have arrived at this page by clicking on a Resource
- tab defined by the sample perspective.
- As evidenced by the URL in your browser's address bar, this
- page was loaded from the core RHQ GUI. However, the
- pink portion of this page is an IFRAME whose content was
- loaded from rhq-sample-perspective.war, a WAR deployed to the
- RHQ Server, as a sibling of rhq.ear.</p>
-
- <h3>Resource Info</h3>
-
- <h4>Here's some info about the current Resource:</h4>
-
- <h:panelGrid columns="2">
- <h:outputText value="Type" style="font-weight: bold" />
- <h:outputText value="#{CurrentResourceUIBean.resource.resourceType.name}" />
- <h:outputText value="Name" style="font-weight: bold" />
- <h:outputText value="#{CurrentResourceUIBean.resource.name}" />
- <h:outputText value="Id" style="font-weight: bold" />
- <h:outputText value="#{CurrentResourceUIBean.resource.id}" />
- </h:panelGrid>
-
- </div>
-
- </f:view>
-
- </body>
-
-</html>
+<?xml version="1.0"?>
+
+<ui:composition
+ template="/WEB-INF/templates/mainTemplate.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
+
+ <ui:param name="pageTitle" value="Meet Your Soul-Resource!"/>
+
+ <ui:define name="body">
+
+ <h1>Current Resource</h1>
+
+ <!-- Force the page to be taller than the height of the browser
+ to test that a vertical scrollbar is not added to the
+ enclosing iframe. -->
+ <div style="padding: 10px; height: 1000px;">
+ <h4>It's always good to see something from another perspective.</h4>
+
+ <p>You should have arrived at this page by clicking on a Resource
+ tab defined by the sample perspective.
+ As evidenced by the URL in your browser's address bar, this
+ page was loaded from the core RHQ GUI. However, the
+ pink portion of this page is an IFRAME whose content was
+ loaded from rhq-sample-perspective.war, a WAR deployed to the
+ RHQ Server, as a sibling of rhq.ear.</p>
+
+ <h3>Resource Info</h3>
+
+ <h4>Here's some info about the current Resource:</h4>
+
+ <h:panelGrid columns="2">
+ <h:outputText value="Type" style="font-weight: bold"/>
+ <h:outputText value="#{CurrentResourceUIBean.resource.resourceType.name}"/>
+ <h:outputText value="Name" style="font-weight: bold"/>
+ <h:outputText value="#{CurrentResourceUIBean.resource.name}"/>
+ <h:outputText value="Id" style="font-weight: bold"/>
+ <h:outputText value="#{CurrentResourceUIBean.resource.id}"/>
+ </h:panelGrid>
+
+ </div>
+
+ </ui:define>
+
+</ui:composition>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/randomResource.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/randomResource.xhtml
index 7d58996..984a9cc 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/randomResource.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/randomResource.xhtml
@@ -1,42 +1,27 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<?xml version="1.0"?>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
- xmlns:h="http://java.sun.com/jsf/html"
+<ui:composition
+ template="/WEB-INF/templates/mainTemplate.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
- xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.org/rich">
-<ui:remove>
- <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
- other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
- We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
- including an xml prolog causes IE6 to go into the undesirable "quirks mode".
- (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
-</ui:remove>
-
- <head>
- <title>
- Meet Your Soul-Resource!
- </title>
- </head>
-
- <body bgcolor="#DDF">
-
- <f:view contentType="text/html; charset=UTF-8">
-
- <h1>Meet Your Soul-Resource!</h1>
-
- <p>
- This page uses a Seam component which connects to the RHQ Server running on 127.0.0.1:7080 and
- utilizes the RHQ remote API to obtain a Resource from that Server's inventory that has been
- matched to you based on 29 dimensions of compatibility for lasting and fulfilling relationships.
- </p>
-
- <rich:panel>
- <f:facet name="header">
- This is a RichFaces panel component.
- </f:facet>
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
+
+ <ui:param name="pageTitle" value="Meet Your Soul-Resource!"/>
+
+ <ui:define name="body">
+
+ <h:panelGroup layout="block">
+ This page uses a Seam component which connects to the RHQ Server running on 127.0.0.1:7080 and
+ utilizes the RHQ remote API to obtain a Resource from that Server's inventory that has been
+ matched to you based on 29 dimensions of compatibility for lasting and fulfilling relationships.
+ </h:panelGroup>
<h3>And the lucky Resource is...</h3>
@@ -44,12 +29,9 @@
with id #{RandomResourceUIBean.randomResource.id}</h2>
<a href="javascript:location.reload(true)">
- #{RandomResourceUIBean.randomResource.resourceType.name}s are not my ResourceType - find me another one.
+ #{RandomResourceUIBean.randomResource.resourceType.name}s are just not my ResourceType - find me another one.
</a>
- </rich:panel>
- </f:view>
-
- </body>
+ </ui:define>
-</html>
+</ui:composition>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml
index cc736a9..41065f2 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml
@@ -1,489 +1,543 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<?xml version="1.0"?>
-<html
- xmlns="http://www.w3.org/1999/xhtml"
- xml:lang="en"
- lang="en"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:s="http://jboss.com/products/seam/taglib"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.org/rich">
-<ui:remove>
- <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
- other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
- We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
- including an xml prolog causes IE6 to go into the undesirable "quirks mode".
- (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
-</ui:remove>
+<ui:composition
+ template="/WEB-INF/templates/mainTemplate.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq"
+ xmlns:onc="http://jboss.org/on/component">
-<head>
-<title>EJB Administrator Wizard</title>
-</head>
+<ui:param name="pageTitle" value="EJB Admin Wizard"/>
-<body bgcolor="#FAFFCC">
+<ui:define name="body">
-<f:view contentType="text/html; charset=UTF-8">
-
- <table cellpadding="2">
- <tr>
- <td
- width="200"
- height="650"
- style="vertical-align: top;"><rich:panel style="width:200px;background-color:#FAFFCC;height:650px">
- <f:facet name="header">Steps:</f:facet>
- <table style="border-style: solid;">
- <!-- <table border="1" style="border-top-style: solid; border-top-width:1px;">-->
- <tr>
- <td><rich:spacer height="50" /></td>
- </tr>
- <c:forEach
- var="step"
- items="#{WizardBean.allSteps}">
- <tr>
- <td><rich:spacer height="1" /></td>
- </tr>
- <c:choose>
- <c:when test="#{WizardBean.currentStep eq step}">
+<table cellpadding="2">
+<tr>
+<td
+ width="200"
+ height="650"
+ style="vertical-align: top;">
+ <rich:panel style="width:200px;background-color:#FAFFCC;height:650px">
+ <f:facet name="header">Steps:</f:facet>
+ <table style="border-style: solid;">
+ <!-- <table border="1" style="border-top-style: solid; border-top-width:1px;">-->
+ <tr>
+ <td>
+ <rich:spacer height="50"/>
+ </td>
+ </tr>
+ <c:forEach
+ var="step"
+ items="#{WizardBean.allSteps}">
+ <tr>
+ <td>
+ <rich:spacer height="1"/>
+ </td>
+ </tr>
+ <c:choose>
+ <c:when test="#{WizardBean.currentStep eq step}">
<tr bgcolor="#D5DBBD">
- <td style="border-style: solid;"><b style="font-size: 20px">Step: #{step}</b></td>
+ <td style="border-style: solid;"><b style="font-size: 20px">Step: #{step}</b></td>
</tr>
- </c:when>
- <c:otherwise>
+ </c:when>
+ <c:otherwise>
<tr>
- <td style="border-style: solid;"><b style="font-size: 20px">Step: #{step}</b></td>
- </tr>
- </c:otherwise>
- </c:choose>
- </c:forEach>
- <tr>
- <td><rich:spacer height="50" /></td>
- </tr>
- </table>
- </rich:panel></td>
- <td
- style="overflow-y: auto; vertical-align: top;"
- width="600"
- height="650"><h:form
- id="submit"
- action="null">
+ <td style="border-style: solid;"><b style="font-size: 20px">Step: #{step}</b></td>
+ </tr>
+ </c:otherwise>
+ </c:choose>
+ </c:forEach>
+ <tr>
+ <td>
+ <rich:spacer height="50"/>
+ </td>
+ </tr>
+ </table>
+ </rich:panel>
+</td>
+<td
+ style="overflow-y: auto; vertical-align: top;"
+ width="600"
+ height="650">
+<h:form
+ id="submit"
+ action="null">
- <h:outputText
- id="title"
- valueRef="#{WizardBean.title}"></h:outputText>
+<h:outputText
+ id="title"
+ valueRef="#{WizardBean.title}"></h:outputText>
- <ui:remove>Display welcome to wizard and ask first questions.</ui:remove>
- <ui:remove>In c:choose, define c:when statements for each step.</ui:remove>
+<ui:remove>Display welcome to wizard and ask first questions.</ui:remove>
+<ui:remove>In c:choose, define c:when statements for each step.</ui:remove>
- <rich:panel style="width:600px;background-color:#FAFFCC;height:650px">
- <f:facet name="header">The EJB Administrator Account Wizard:</f:facet>
+<rich:panel style="width:600px;background-color:#FAFFCC;height:650px">
+<f:facet name="header">The EJB Administrator Account Wizard:</f:facet>
- <c:choose>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'One'}">
- <h:outputText id="message2">The wizard will walk you through creation
- of a EJB Administrator user account with associated groups and roles.<br />
- </h:outputText>
- <rich:spacer height="100" />
- (to group RHQ EJB resources) <br />
- <table>
- <tr>
- <th>New Group</th>
- <th>Values</th>
- </tr>
- <tr>
- <td>* Name:</td>
- <td><h:inputText
- id="groupName"
- value="#{WizardBean.groupName}"
- required="true">
- <f:validateLength
- minimum="1"
- maximum="100" />
- </h:inputText></td>
- </tr>
- <tr>
- <td>Description:</td>
- <td><h:inputText
- id="groupDescription"
- value="#{WizardBean.groupDescription}"></h:inputText></td>
- </tr>
- <tr>
- <td>Location:</td>
- <td><h:inputText
- id="location"
- value="#{WizardBean.groupLocation}"></h:inputText></td>
- </tr>
- <tr>
- <td>Type:</td>
- <td><h:selectOneMenu
- id="groupType"
- value="#{WizardBean.groupType}">
- <f:selectItem
- id="Mixed"
- itemLabel="Mixed"
- itemValue="Mixed" />
- <f:selectItem
- id="Compatible"
- itemLabel="Compatible"
- itemValue="Compatible" />
- </h:selectOneMenu></td>
- </tr>
- <tr>
- <td>Make group recursive:</td>
- <td><h:selectBooleanCheckbox
- id="isRecursive"
- value="#{WizardBean.recursive}" /></td>
- </tr>
- </table>
- <br />
- <h:message
- for="groupName"
- errorStyle="color:blue" />
- </c:when>
+<c:choose>
+<ui:remove>------------------------------------------------------------------</ui:remove>
+<c:when test="${WizardBean.currentStep == 'One'}">
+ <h:outputText id="message2">The wizard will walk you through creation
+ of a EJB Administrator user account with associated groups and roles.<br/>
+ </h:outputText>
+ <rich:spacer height="100"/>
+ (to group RHQ EJB resources) <br/>
+ <table>
+ <tr>
+ <th>New Group</th>
+ <th>Values</th>
+ </tr>
+ <tr>
+ <td>* Name:</td>
+ <td>
+ <h:inputText
+ id="groupName"
+ value="#{WizardBean.groupName}"
+ required="true">
+ <f:validateLength
+ minimum="1"
+ maximum="100"/>
+ </h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>Description:</td>
+ <td>
+ <h:inputText
+ id="groupDescription"
+ value="#{WizardBean.groupDescription}"></h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>Location:</td>
+ <td>
+ <h:inputText
+ id="location"
+ value="#{WizardBean.groupLocation}"></h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>Type:</td>
+ <td>
+ <h:selectOneMenu
+ id="groupType"
+ value="#{WizardBean.groupType}">
+ <f:selectItem
+ id="Mixed"
+ itemLabel="Mixed"
+ itemValue="Mixed"/>
+ <f:selectItem
+ id="Compatible"
+ itemLabel="Compatible"
+ itemValue="Compatible"/>
+ </h:selectOneMenu>
+ </td>
+ </tr>
+ <tr>
+ <td>Make group recursive:</td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="isRecursive"
+ value="#{WizardBean.recursive}"/>
+ </td>
+ </tr>
+ </table>
+ <br/>
+ <h:message
+ for="groupName"
+ errorStyle="color:blue"/>
+</c:when>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'Two'}">
- <h:outputText id="message">Role Configuration:<br />
- </h:outputText>
- <rich:spacer height="100" />
- (Role defines permissions for RHQ EJB3 resources)
- <table>
- <tr>
- <th>New Role</th>
- <th>Values</th>
- </tr>
- <tr>
- <td>* Name:</td>
- <td><h:inputText
- id="roleName"
- value="#{WizardBean.roleName}"
- required="true">
- <f:validateLength maximum="100" />
- </h:inputText></td>
- </tr>
- <tr>
- <td>Description:</td>
- <td><h:inputText
- id="roleDescription"
- value="#{WizardBean.roleDescription}">
- <f:validateLength maximum="100" />
- </h:inputText></td>
- </tr>
- <tr>
- <td><b>Manage Security:</b></td>
- <td><h:selectBooleanCheckbox
- id="manageSecurity"
- value="#{WizardBean.manageSecurityEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Manage Inventory:</b></td>
- <td><h:selectBooleanCheckbox
- id="manageInventory"
- value="#{WizardBean.manageInventoryEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Manage RHQ Settings:</b></td>
- <td><h:selectBooleanCheckbox
- id="manageRhqServerSettings"
- value="#{WizardBean.administerRhqServerSettingsEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Modify :</b></td>
- <td><h:selectBooleanCheckbox
- id="modifyEnabled"
- value="#{WizardBean.modifyEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Delete :</b></td>
- <td><h:selectBooleanCheckbox
- id="deleteEnabled"
- value="#{WizardBean.deleteEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Create Children:</b></td>
- <td><h:selectBooleanCheckbox
- id="createChildEnabled"
- value="#{WizardBean.createChildrenEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Alert:</b></td>
- <td><h:selectBooleanCheckbox
- id="alertEnabled"
- value="#{WizardBean.alertEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Measure:</b></td>
- <td><h:selectBooleanCheckbox
- id="measureEnabled"
- value="#{WizardBean.measureEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Content:</b></td>
- <td><h:selectBooleanCheckbox
- id="contentEnabled"
- value="#{WizardBean.contentEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Control:</b></td>
- <td><h:selectBooleanCheckbox
- id="controlEnabled"
- value="#{WizardBean.controlEnabled}" /></td>
- </tr>
- <tr>
- <td><b>Configure:</b></td>
- <td><h:selectBooleanCheckbox
- id="configureEnabled"
- value="#{WizardBean.configureEnabled}" /></td>
- </tr>
+<ui:remove>------------------------------------------------------------------</ui:remove>
+<c:when test="${WizardBean.currentStep == 'Two'}">
+ <h:outputText id="message">Role Configuration:<br/>
+ </h:outputText>
+ <rich:spacer height="100"/>
+ (Role defines permissions for RHQ EJB3 resources)
+ <table>
+ <tr>
+ <th>New Role</th>
+ <th>Values</th>
+ </tr>
+ <tr>
+ <td>* Name:</td>
+ <td>
+ <h:inputText
+ id="roleName"
+ value="#{WizardBean.roleName}"
+ required="true">
+ <f:validateLength maximum="100"/>
+ </h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>Description:</td>
+ <td>
+ <h:inputText
+ id="roleDescription"
+ value="#{WizardBean.roleDescription}">
+ <f:validateLength maximum="100"/>
+ </h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Manage Security:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="manageSecurity"
+ value="#{WizardBean.manageSecurityEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Manage Inventory:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="manageInventory"
+ value="#{WizardBean.manageInventoryEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Manage RHQ Settings:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="manageRhqServerSettings"
+ value="#{WizardBean.administerRhqServerSettingsEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Modify :</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="modifyEnabled"
+ value="#{WizardBean.modifyEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Delete :</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="deleteEnabled"
+ value="#{WizardBean.deleteEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Create Children:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="createChildEnabled"
+ value="#{WizardBean.createChildrenEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Alert:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="alertEnabled"
+ value="#{WizardBean.alertEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Measure:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="measureEnabled"
+ value="#{WizardBean.measureEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Content:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="contentEnabled"
+ value="#{WizardBean.contentEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Control:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="controlEnabled"
+ value="#{WizardBean.controlEnabled}"/>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Configure:</b></td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="configureEnabled"
+ value="#{WizardBean.configureEnabled}"/>
+ </td>
+ </tr>
- </table>
- <br />
- <h:message
- for="roleName"
- errorStyle="color:blue" />
- </c:when>
+ </table>
+ <br/>
+ <h:message
+ for="roleName"
+ errorStyle="color:blue"/>
+</c:when>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'Three'}">
- <h:outputText id="message">
- <b>New User Account Details</b>
- <br />
- </h:outputText>
- <h:outputText id="message2">The following actions will occur:<br />
- </h:outputText>
- <rich:spacer height="100" />
- (new User account details) <br />
- <table>
- <tr>
- <th>New User</th>
- <th>Values</th>
- </tr>
- <tr>
- <td>* First Name:</td>
- <td><h:inputText
- id="firstName"
- value="#{WizardBean.firstName}"
- required="true">
- <f:validateLength minimum="1" />
- </h:inputText></td>
- </tr>
- <tr>
- <td>Last Name:</td>
- <td><h:inputText
- id="lastName"
- value="#{WizardBean.lastName}"></h:inputText></td>
- </tr>
- <tr>
- <td>* User Name:</td>
- <td><h:inputText
- id="newUserName"
- value="#{WizardBean.newUserName}">
- <f:validateLength minimum="6" />
- </h:inputText></td>
- </tr>
- <tr>
- <td>* Enter New Password:</td>
- <td><h:inputSecret
- id="password"
- value="#{WizardBean.password}"
- required="true">
- <f:validateLength
- minimum="3"
- maximum="16" />
- </h:inputSecret></td>
- </tr>
- <tr>
- <td>* Confirm New Password:</td>
- <td><h:inputSecret
- id="password2"
- value="#{WizardBean.password2}"
- required="true">
- <f:validateLength
- minimum="3"
- maximum="16" />
- </h:inputSecret></td>
- </tr>
- <tr>
- <td>Phone:</td>
- <td><h:inputText
- id="phone"
- value="#{WizardBean.phone}"></h:inputText></td>
- </tr>
- <tr>
- <td>Email:</td>
- <td><h:inputText
- id="email"
- value="#{WizardBean.email}"></h:inputText></td>
- </tr>
- <tr>
- <td>Department:</td>
- <td><h:inputText
- id="department"
- value="#{WizardBean.department}"></h:inputText></td>
- </tr>
+<ui:remove>------------------------------------------------------------------</ui:remove>
+<c:when test="${WizardBean.currentStep == 'Three'}">
+ <h:outputText id="message">
+ <b>New User Account Details</b>
+ <br/>
+ </h:outputText>
+ <h:outputText id="message2">The following actions will occur:<br/>
+ </h:outputText>
+ <rich:spacer height="100"/>
+ (new User account details) <br/>
+ <table>
+ <tr>
+ <th>New User</th>
+ <th>Values</th>
+ </tr>
+ <tr>
+ <td>* First Name:</td>
+ <td>
+ <h:inputText
+ id="firstName"
+ value="#{WizardBean.firstName}"
+ required="true">
+ <f:validateLength minimum="1"/>
+ </h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>Last Name:</td>
+ <td>
+ <h:inputText
+ id="lastName"
+ value="#{WizardBean.lastName}"></h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>* User Name:</td>
+ <td>
+ <h:inputText
+ id="newUserName"
+ value="#{WizardBean.newUserName}">
+ <f:validateLength minimum="6"/>
+ </h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>* Enter New Password:</td>
+ <td>
+ <h:inputSecret
+ id="password"
+ value="#{WizardBean.password}"
+ required="true">
+ <f:validateLength
+ minimum="3"
+ maximum="16"/>
+ </h:inputSecret>
+ </td>
+ </tr>
+ <tr>
+ <td>* Confirm New Password:</td>
+ <td>
+ <h:inputSecret
+ id="password2"
+ value="#{WizardBean.password2}"
+ required="true">
+ <f:validateLength
+ minimum="3"
+ maximum="16"/>
+ </h:inputSecret>
+ </td>
+ </tr>
+ <tr>
+ <td>Phone:</td>
+ <td>
+ <h:inputText
+ id="phone"
+ value="#{WizardBean.phone}"></h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>Email:</td>
+ <td>
+ <h:inputText
+ id="email"
+ value="#{WizardBean.email}"></h:inputText>
+ </td>
+ </tr>
+ <tr>
+ <td>Department:</td>
+ <td>
+ <h:inputText
+ id="department"
+ value="#{WizardBean.department}"></h:inputText>
+ </td>
+ </tr>
- <tr>
- <td>Enable this account:</td>
- <td><h:selectBooleanCheckbox
- id="isEnableLogin"
- value="#{WizardBean.enableLogin}" /></td>
- </tr>
- </table>
+ <tr>
+ <td>Enable this account:</td>
+ <td>
+ <h:selectBooleanCheckbox
+ id="isEnableLogin"
+ value="#{WizardBean.enableLogin}"/>
+ </td>
+ </tr>
+ </table>
- <br />
- <h:message
- for="firstName"
- errorStyle="color:blue" />
- <br />
- <h:message
- for="newUserName"
- errorStyle="color:blue" />
- <br />
- <h:message
- for="password"
- errorStyle="color:blue" />
- <br />
- <h:message
- for="password2"
- errorStyle="color:blue" />
- <br />
- <br />
- </c:when>
+ <br/>
+ <h:message
+ for="firstName"
+ errorStyle="color:blue"/>
+ <br/>
+ <h:message
+ for="newUserName"
+ errorStyle="color:blue"/>
+ <br/>
+ <h:message
+ for="password"
+ errorStyle="color:blue"/>
+ <br/>
+ <h:message
+ for="password2"
+ errorStyle="color:blue"/>
+ <br/>
+ <br/>
+</c:when>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'Confirm'}">
- <h:outputText id="message">You're almost done.<br />
- </h:outputText>
- <h:outputText id="message2">The following will occur when click 'Next':<br />
- </h:outputText>
- <rich:spacer height="50" />
- <h:outputText>1) A new Group, '<b>#{WizardBean.groupName}</b>' will be created to group RHQ EJB3
- resources.<br />
- </h:outputText>
- <h:outputText>2) A new Role, '<b>#{WizardBean.roleName}</b>' will be created defining resource
- access rights.<br />
- </h:outputText>
- <h:outputText>3) The user '<b>#{WizardBean.newUserName}</b>' will be created with attached role and
- group from steps 1 and 2.<br />
- </h:outputText>
- <br />
- <h:outputText>Hit the 'Cancel' button below if you would like to abort this operation.
- </h:outputText>
- <br />
- </c:when>
+<ui:remove>------------------------------------------------------------------</ui:remove>
+<c:when test="${WizardBean.currentStep == 'Confirm'}">
+ <h:outputText id="message">You're almost done.<br/>
+ </h:outputText>
+ <h:outputText id="message2">The following will occur when click 'Next':<br/>
+ </h:outputText>
+ <rich:spacer height="50"/>
+ <h:outputText>1) A new Group, '<b>#{WizardBean.groupName}</b>' will be created to group RHQ EJB3
+ resources.<br/>
+ </h:outputText>
+ <h:outputText>2) A new Role, '<b>#{WizardBean.roleName}</b>' will be created defining resource
+ access rights.<br/>
+ </h:outputText>
+ <h:outputText>3) The user '<b>#{WizardBean.newUserName}</b>' will be created with attached role and
+ group from steps 1 and 2.<br/>
+ </h:outputText>
+ <br/>
+ <h:outputText>Hit the 'Cancel' button below if you would like to abort this operation.
+ </h:outputText>
+ <br/>
+</c:when>
- <c:when test="${WizardBean.currentStep == 'Complete'}">
- <rich:panel style="width:500px">
- <f:facet name="header">Success</f:facet>
- The user '<b>#{WizardBean.newUserName}</b>' has been successfully
- created, activated and associated with new role '<b>#{WizardBean.roleName}'</b> and new group
- '<b>#{WizardBean.groupName}</b>'. This user has permissions for all EJB3
- Session beans in inventory, displayed below.
- <br />
- <h:outputLink value="#{WizardBean.usersUrl}" target="_top">
- <h:outputText value="Go To Users" />
- </h:outputLink>
- <br />
- <h:outputLink value="#{WizardBean.rolesUrl}" target="_top">
- <h:outputText value="Go To Roles" />
- </h:outputLink>
- <br />
- <h:outputLink value="#{WizardBean.groupsUrl}" target="_top">
- <h:outputText value="Go To Groups" />
- </h:outputLink>
- </rich:panel>
+<c:when test="${WizardBean.currentStep == 'Complete'}">
+ <rich:panel style="width:500px">
+ <f:facet name="header">Success</f:facet>
+ The user '<b>#{WizardBean.newUserName}</b>' has been successfully
+ created, activated and associated with new role '<b>#{WizardBean.roleName}'</b> and new group
+ '<b>#{WizardBean.groupName}</b>'. This user has permissions for all EJB3
+ Session beans in inventory, displayed below.
+ <br/>
+ <h:outputLink value="#{WizardBean.usersUrl}" target="_top">
+ <h:outputText value="Go To Users"/>
+ </h:outputLink>
+ <br/>
+ <h:outputLink value="#{WizardBean.rolesUrl}" target="_top">
+ <h:outputText value="Go To Roles"/>
+ </h:outputLink>
+ <br/>
+ <h:outputLink value="#{WizardBean.groupsUrl}" target="_top">
+ <h:outputText value="Go To Groups"/>
+ </h:outputLink>
+ </rich:panel>
- <rich:spacer height="50" />
+ <rich:spacer height="50"/>
- <rich:dataTable
- onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
- cellpadding="0"
- cellspacing="0"
- rows="15"
- width="500"
- border="0"
- var="resource"
- value="#{WizardBean.resources}">
+ <rich:dataTable
+ onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
+ cellpadding="0"
+ cellspacing="0"
+ rows="15"
+ width="500"
+ border="0"
+ var="resource"
+ value="#{WizardBean.resources}">
- <rich:column sortBy="#{resource.id}">
- <f:facet name="header">
- <h:outputText value="Id" />
- </f:facet>
+ <rich:column sortBy="#{resource.id}">
+ <f:facet name="header">
+ <h:outputText value="Id"/>
+ </f:facet>
- <h:outputLink value="#{WizardBean.getResourceUrl(resource.id)}" target="_top">
- <h:outputText value="#{resource.id}" />
- </h:outputLink>
- </rich:column>
+ <h:outputLink value="#{WizardBean.resourceUrlMap[resource.id]}" target="_top">
+ <h:outputText value="#{resource.id}"/>
+ </h:outputLink>
+ </rich:column>
- <rich:column sortBy="#{resource.name}">
- <f:facet name="header">
- <h:outputText value="Name" />
- </f:facet>
- <h:outputText value="#{resource.name}" />
- </rich:column>
+ <rich:column sortBy="#{resource.name}">
+ <f:facet name="header">
+ <h:outputText value="Name"/>
+ </f:facet>
+ <h:outputText value="#{resource.name}"/>
+ </rich:column>
- <rich:column sortBy="#{resource.description}">
- <f:facet name="header">
- <h:outputText value="Description" />
- </f:facet>
- <h:outputText value="#{resource.description}" />
- </rich:column>
+ <rich:column sortBy="#{resource.description}">
+ <f:facet name="header">
+ <h:outputText value="Description"/>
+ </f:facet>
+ <h:outputText value="#{resource.description}"/>
+ </rich:column>
- <f:facet name="footer">
- <rich:datascroller selectedStyle="font-weight:bold" />
- </f:facet>
- </rich:dataTable>
- </c:when>
+ <f:facet name="footer">
+ <rich:datascroller selectedStyle="font-weight:bold"/>
+ </f:facet>
+ </rich:dataTable>
+</c:when>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:otherwise>
- <b>NO CONDIDTIONS MATCHED: Contact system administrator.</b>
- </c:otherwise>
- </c:choose>
+<ui:remove>------------------------------------------------------------------</ui:remove>
+<c:otherwise>
+ <b>NO CONDITIONS MATCHED: Contact system administrator.</b>
+</c:otherwise>
+</c:choose>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <br />
- <br />
- <h:commandButton
- id="cancel"
- value="Cancel"
- rendered="#{WizardBean.currentStep != 'Complete'}"
- disabled="#{WizardBean.currentStep eq WizardBean.end}"
- immediate="true"
- action="#{WizardBean.cancel}">
- </h:commandButton>
- <rich:spacer width="100" />
+<ui:remove>------------------------------------------------------------------</ui:remove>
+<br/>
+<br/>
+<h:commandButton
+ id="cancel"
+ value="Cancel"
+ rendered="#{WizardBean.currentStep != 'Complete'}"
+ disabled="#{WizardBean.currentStep eq WizardBean.end}"
+ immediate="true"
+ action="#{WizardBean.cancel}">
+</h:commandButton>
+<rich:spacer width="100"/>
- <h:commandButton
- id="previous"
- value="Back"
- disabled="#{WizardBean.currentStep eq WizardBean.start or WizardBean.currentStep == 'Complete'}"
- rendered="#{WizardBean.currentStep != 'Complete'}"
- immediate="true"
- action="#{WizardBean.processReverse}">
- </h:commandButton>
- <h:commandButton
- id="next"
- value="Next"
- rendered="#{WizardBean.currentStep != 'Complete'}"
- disabled="#{WizardBean.currentStep eq WizardBean.end}"
- action="#{WizardBean.processActions}">
- </h:commandButton>
+<h:commandButton
+ id="previous"
+ value="Back"
+ disabled="#{WizardBean.currentStep eq WizardBean.start or WizardBean.currentStep == 'Complete'}"
+ rendered="#{WizardBean.currentStep != 'Complete'}"
+ immediate="true"
+ action="#{WizardBean.processReverse}">
+</h:commandButton>
+<h:commandButton
+ id="next"
+ value="Next"
+ rendered="#{WizardBean.currentStep != 'Complete'}"
+ disabled="#{WizardBean.currentStep eq WizardBean.end}"
+ action="#{WizardBean.processActions}">
+</h:commandButton>
- <br />
- <br />
- <h:outputText rendered="#{WizardBean.currentStep != 'Confirm' and WizardBean.currentStep != 'Complete' }">
- * Required field</h:outputText>
- </rich:panel>
- </h:form></td>
- </tr>
- </table>
-</f:view>
+<br/>
+<br/>
+<h:outputText rendered="#{WizardBean.currentStep != 'Confirm' and WizardBean.currentStep != 'Complete' }">
+ * Required field
+</h:outputText>
+</rich:panel>
+</h:form>
+</td>
+</tr>
+</table>
-</body>
+</ui:define>
-</html>
+</ui:composition>
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index b58db40..3552a29 100644
--- a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -102,7 +102,7 @@
</menu-item>
<menu-item
name="sample.child4"
- displayName="Create EJB3 Admin User"
+ displayName="EJB Admin Wizard"
application="sample"
url="wizard.seam">
<position
@@ -176,6 +176,17 @@
</activators>
</menu-item>
+ <!-- A tab that is always displayed -->
+ <tab
+ name="Sample"
+ displayName="Sample"
+ iconUrl="/images/icons/Favorite_16.png"
+ application="sample"
+ url="currentResource.seam">
+ <position
+ name="Content"
+ placement="after" />
+ </tab>
<!-- A tab that shows up whenever the RT implements the Support Facet and user can execute operations -->
<tab
@@ -185,7 +196,7 @@
application="sample"
url="currentResource.seam">
<position
- name="Content"
+ name="Sample"
placement="after" />
<activators>
<facet
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java
index e0a8197..36f19aa 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java
@@ -22,6 +22,8 @@
*/
package org.rhq.core.domain.util;
+import org.jetbrains.annotations.NotNull;
+
import java.io.Serializable;
/**
@@ -53,6 +55,7 @@ public class OrderingField implements Serializable {
this.field = field;
}
+ @NotNull
public PageOrdering getOrdering() {
return ordering;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
index 0561a55..0366380 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
@@ -121,7 +121,7 @@ public class PageControl implements Serializable, Cloneable {
}
public void setPageSize(int pageSize) {
- this.pageNumber = (pageSize != 0) ? (getStartRow() / pageSize) : 0;
+ this.pageNumber = (pageSize != 0 && pageSize != SIZE_UNLIMITED) ? (getStartRow() / pageSize) : 0;
this.pageSize = pageSize;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/UnlimitedPageControl.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/UnlimitedPageControl.java
new file mode 100644
index 0000000..cd6874f
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/UnlimitedPageControl.java
@@ -0,0 +1,34 @@
+package org.rhq.core.domain.util;
+
+/**
+ * A page control that shows all results. The page number and page size are 0 and @{link #SIZE_UNLIMITED} respectively,
+ * and are immutable.
+ *
+ * @author Ian Springer
+ */
+public class UnlimitedPageControl extends PageControl {
+ public UnlimitedPageControl() {
+ this(new OrderingField[0]);
+ }
+
+ public UnlimitedPageControl(OrderingField... orderingFields) {
+ super(0, SIZE_UNLIMITED, orderingFields);
+ }
+
+ @Override
+ public void setPageNumber(int pageNumber) {
+ throw new UnsupportedOperationException("page number cannot be changed from 0 for an UnlimitedPageControl.");
+ }
+
+ @Override
+ public void setPageSize(int pageSize) {
+ throw new UnsupportedOperationException("page size cannot be changed from " + SIZE_UNLIMITED + " for an UnlimitedPageControl.");
+ }
+
+ @Override
+ public void reset() {
+ getOrderingFields().clear();
+ }
+
+
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java
new file mode 100644
index 0000000..d4ce3c2
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/bean/AbstractPagedDataUIBean.java
@@ -0,0 +1,172 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.bean;
+
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.faces.FacesMessages;
+import org.jetbrains.annotations.NotNull;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.UnlimitedPageControl;
+import org.rhq.core.gui.table.model.PagedListDataModel;
+
+import javax.faces.context.FacesContext;
+import javax.faces.model.SelectItem;
+
+/**
+ * @author Ian Springer
+ */
+public abstract class AbstractPagedDataUIBean<T> {
+ private static final int[] PAGE_SIZES = new int[] {15, 30, 45};
+ private static final SelectItem[] PAGE_SIZE_SELECT_ITEMS = new SelectItem[PAGE_SIZES.length];
+ static {
+ for (int i = 0; i < PAGE_SIZES.length; i++) {
+ PAGE_SIZE_SELECT_ITEMS[i] = new SelectItem(PAGE_SIZES[i], Integer.valueOf(PAGE_SIZES[i]).toString());
+ }
+ }
+ private static final int MINIMUM_PAGE_SIZE = PAGE_SIZES[0];
+ private static final int DEFAULT_PAGE_SIZE = PAGE_SIZES[0];
+
+ /** The number of specific pages to display on the data scroller - limit to 7 pages until we find a general fix for
+ * RHQ-1813. */
+ private static final int MAXIMUM_PAGES = 7;
+
+ @In
+ protected FacesMessages facesMessages;
+
+ private PageControl pageControl;
+ private PagedListDataModel<T> dataModel;
+
+ public SelectItem[] getPageSizeSelectItems() {
+ return PAGE_SIZE_SELECT_ITEMS;
+ }
+
+ public int getPageSizeCount() {
+ return PAGE_SIZES.length;
+ }
+
+ public int getMinimumPageSize() {
+ return MINIMUM_PAGE_SIZE;
+ }
+
+ public int getDefaultPageSize() {
+ return DEFAULT_PAGE_SIZE;
+ }
+
+ public int getMaximumPages() {
+ return MAXIMUM_PAGES;
+ }
+
+ @NotNull
+ public PageControl getPageControl() {
+ if (this.pageControl == null) {
+ this.pageControl = loadPageControl(FacesContext.getCurrentInstance());
+ if (this.pageControl == null) {
+ this.pageControl = getDefaultPageControl();
+ if (this.pageControl == null) {
+ throw new IllegalStateException("getDefaultPageControl() returned null - this is not allowed.");
+ }
+ }
+ }
+
+ /*
+ * if an invalid value was already persisted to the database, this needs to be fixed;
+ * this can occur when the value was valid at some point in the past, but new overrides
+ * changes the valid list of page sizes; generally, the user can correct this themselves
+ * at the user interface by selecting a different pageSize (which would cause the new
+ * value to be persisted), unless there is only one allowable value in which case it's
+ * not possible for the user to correct the issue themselves; to handle both of these
+ * cases, let's just pessimistically determine whether we need to "fix" the PageControl
+ * and, if so, repersist the adjusted values
+ */
+ if (!(this.pageControl instanceof UnlimitedPageControl)) {
+ String pageSize = String.valueOf(pageControl.getPageSize());
+ boolean hasValidSize = false;
+ for (SelectItem validPageSize : getPageSizeSelectItems()) {
+ if (validPageSize.getValue().toString().equals(pageSize)) {
+ hasValidSize = true;
+ break;
+ }
+ }
+ if (!hasValidSize) {
+ this.pageControl.setPageSize(getMinimumPageSize());
+ storePageControl(FacesContext.getCurrentInstance(), this.pageControl);
+ }
+ }
+
+ return this.pageControl;
+ }
+
+ public void setPageControl(PageControl pageControl) {
+ // TODO: Implement equals() on PageControl, so we can skip reloading the page if the paging and sorting
+ // settings have not changed at all.
+ this.pageControl = pageControl;
+ storePageControl(FacesContext.getCurrentInstance(), this.pageControl);
+ // Reset the data model, so it will load a new page using the new PageControl.
+ this.dataModel.reset();
+ }
+
+ public void resetPageControl() {
+ setPageControl(null);
+ }
+
+ /**
+ * Subclasses can override this to change the default page size or to provide default ordering fields.
+ *
+ * @return the default page control (i.e. the page control to use when
+ * {@link #loadPageControl(javax.faces.context.FacesContext)} returns null); must never return null
+ */
+ protected PageControl getDefaultPageControl() {
+ return new PageControl(0, MINIMUM_PAGE_SIZE);
+ }
+
+ /**
+ * TODO
+ * @param context
+ * @return
+ */
+ protected PageControl loadPageControl(FacesContext context) {
+ // TODO: Provide a default impl that stores a Map<String, PageContro> in APPLICATION scope. The key would be
+ // viewRoot+dataTableClientId.
+ return null;
+ }
+
+ /**
+ * Subclasses can override this to persist page controls somewhere. They would typically be keyed off the
+ * current user and the current data table, so the GUI will remember a user's preferences for various tables.
+ *
+ * @param context
+ * @param pageControl
+ */
+ protected void storePageControl(FacesContext context, PageControl pageControl) {
+ return;
+ }
+
+ public PagedListDataModel<T> getDataModel() {
+ if (this.dataModel == null) {
+ this.dataModel = createDataModel();
+ }
+ return this.dataModel;
+ }
+
+ public void setDataModel(PagedListDataModel<T> dataModel) {
+ this.dataModel = dataModel;
+ }
+
+ public abstract PagedListDataModel<T> createDataModel();
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java
new file mode 100644
index 0000000..46f4b03
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SortableColumnHeaderComponent.java
@@ -0,0 +1,110 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.component;
+
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.gui.table.model.PagedListDataModel;
+import org.rhq.core.gui.util.FacesComponentUtility;
+
+import javax.el.ValueExpression;
+import javax.faces.component.UIData;
+import javax.faces.component.html.HtmlCommandLink;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.ActionEvent;
+import javax.faces.event.ActionListener;
+
+/**
+ * @author Ian Springer
+ * @author Joseph Marques
+ */
+public class SortableColumnHeaderComponent extends HtmlCommandLink {
+ public static final String COMPONENT_TYPE = "org.rhq.SortableColumnHeader";
+ public static final String COMPONENT_FAMILY = "org.rhq.SortableColumnHeader";
+
+ private String sortBy;
+
+ public SortableColumnHeaderComponent() {
+ super();
+ addActionListener(new SortableColumnHeaderActionListener());
+
+ // TODO - Do we need this? I don't think so.
+ //setActionExpression(FacesExpressionUtility.createMethodExpression("#{TableSorter.obtainFromOutcome}", String.class, new Class[] {}));
+ }
+
+ public String getSortBy() {
+ ValueExpression valueExp = getValueExpression("sortBy");
+ if (valueExp != null) {
+ this.sortBy = (java.lang.String) valueExp.getValue(getFacesContext().getELContext());
+ }
+ return this.sortBy;
+ }
+
+ public void setSortBy(String sortBy) {
+ this.sortBy = sortBy;
+ }
+
+ public String getFamily() {
+ return COMPONENT_FAMILY;
+ }
+
+ private Object[] values;
+
+ public Object saveState(FacesContext context) {
+ for (ActionListener listener : getActionListeners()) {
+ removeActionListener(listener);
+ }
+
+ if (values == null) {
+ values = new Object[2];
+ }
+
+ values[0] = super.saveState(context);
+ values[1] = sortBy;
+
+ return values;
+ }
+
+ public void restoreState(FacesContext context, Object state) {
+ values = (Object[]) state;
+
+ super.restoreState(context, values[0]);
+ this.sortBy = (String) values[1];
+ }
+
+ private class SortableColumnHeaderActionListener implements ActionListener {
+ public void processAction(ActionEvent event) throws AbortProcessingException {
+ SortableColumnHeaderComponent sortableColumnHeader = (SortableColumnHeaderComponent)event.getComponent();
+ String sortBy = sortableColumnHeader.getSortBy();
+
+ UIData table = FacesComponentUtility.getAncestorOfType(sortableColumnHeader, UIData.class);
+ PagedListDataModel<?> model = (PagedListDataModel<?>) table.getValue();
+
+ // work-around to bypass stale data model caused by a4j:keepAlive for the PagedDataTableUIBean
+ //PageControlView pageControlView = model.getPageControlView();
+ //PagedDataTableUIBean pagedDataTableUIBean = pageControlView.getPagedDataTableUIBean();
+ //pagedDataTableUIBean.setDataModel(null);
+
+ PageControl pageControl = model.getPageControl();
+ pageControl.sortBy(sortBy);
+ model.setPageControl(pageControl);
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java
new file mode 100644
index 0000000..743a7ba
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/model/PagedListDataModel.java
@@ -0,0 +1,343 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.model;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.core.gui.table.bean.AbstractPagedDataUIBean;
+
+import javax.faces.model.DataModel;
+
+/**
+ * @author Joseph Marques
+ * @author Ian Springer
+ *
+ * @param <T> the data object type
+ */
+public abstract class PagedListDataModel<T> extends DataModel {
+
+ private final Log log = LogFactory.getLog(PagedListDataModel.class);
+
+ private int currentRowIndex;
+ private PageList<T> pageList;
+ private AbstractPagedDataUIBean pagedDataBean;
+
+ /**
+ * Create a data model that pages through the data set, showing the specified number of rows on each page.
+ */
+ public PagedListDataModel(AbstractPagedDataUIBean pagedDataBean) {
+ super();
+ this.currentRowIndex = -1;
+ this.pagedDataBean = pagedDataBean;
+ }
+
+ /**
+ * Not used in this class; data is fetched via a callback to the {@link #getDataPage()} method rather
+ * than by explicitly assigning a list.
+ *
+ * @param o unused
+ *
+ * @throws UnsupportedOperationException thrown when this method is called
+ */
+ @Override
+ public void setWrappedData(Object o) {
+ throw new UnsupportedOperationException("setWrappedData");
+ }
+
+ @Override
+ public int getRowIndex() {
+ return this.currentRowIndex;
+ }
+
+ /**
+ * Specify what the "current row" within the dataset is. Note that the UIData component will repeatedly call this
+ * method followed by getRowData to obtain the objects to render in the table.
+ *
+ * @param index current row index, indexes start at 0
+ */
+ @Override
+ public void setRowIndex(int index) {
+ this.currentRowIndex = index;
+ }
+
+ /**
+ * Return the total number of rows of data available (not just the number of rows in the current page!).
+ *
+ * @return number of rows in the full dataset
+ */
+ @Override
+ public int getRowCount() {
+ return getPage().getTotalSize();
+ }
+
+ /**
+ * Return a PageList object; if one is not currently available, then fetch one. Note that this doesn't ensure that
+ * the PageList returned includes the current {@link #getRowIndex()} row; see {@link #getRowData()}.
+ *
+ * @return the current page
+ */
+ private PageList<T> getPage() {
+ // ensure page exists - first time going to this view
+ if (this.pageList == null) {
+ this.pageList = getDataPage();
+ }
+ return this.pageList;
+ }
+
+ /**
+ * Return the object corresponding to the current {@link #getRowIndex()}. If the PageList object currently cached
+ * doesn't include that index then {@link #getDataPage()} is called to retrieve the appropriate page.
+ *
+ * @return the row data that corresponds to {@link #getRowIndex()}
+ *
+ * @throws IllegalArgumentException if the {@link #getRowIndex()} is outside the range of the dataset size
+ */
+ @Override
+ public Object getRowData() {
+ if (this.currentRowIndex < 0) {
+ throw new IllegalArgumentException("Invalid rowIndex for PagedListDataModel; not within page");
+ }
+
+ PageControl pageControl = this.pagedDataBean.getPageControl();
+
+ int startRow = pageControl.getStartRow();
+ int endRow;
+
+ if (pageControl.getPageSize() == PageControl.SIZE_UNLIMITED) {
+ endRow = Integer.MAX_VALUE;
+ } else {
+ int nRows = pageControl.getPageSize();
+ endRow = startRow + nRows - 1;
+ }
+
+ // paging backwards - will we ever get in this if-statement if pageControl.getPageSize == SIZE_UNLIMITED?
+ if (currentRowIndex < startRow) {
+ int rowsBack = startRow - currentRowIndex;
+ int pagesBack = (int) Math.ceil(rowsBack / (double) pageControl.getPageSize());
+ int newPage = pageControl.getPageNumber() - pagesBack;
+
+ if (newPage < 0) {
+ newPage = 0;
+ }
+
+ pageControl.setPageNumber(newPage);
+ pageList = getDataPage();
+ startRow = pageControl.getStartRow();
+ }
+
+ // paging forwards
+ else if (currentRowIndex > endRow) {
+ int rowsForward = currentRowIndex - endRow;
+ int pagesForward = (int) Math.ceil(rowsForward / (double) pageControl.getPageSize());
+ int newPage = pageControl.getPageNumber() + pagesForward;
+
+ pageControl.setPageNumber(newPage);
+ pageList = getDataPage();
+ startRow = pageControl.getStartRow();
+ }
+
+ /*
+ * March 11, 2009 - the only currently known way this can fail is if the countQuery returned 0 but the
+ * actual data query returned nothing; generally, this is a programming error, but it's possible that
+ * the facelet changed (new columns shown, other columns removed) or the query itself changed (and perhaps
+ * the sortable columns are different); in either case, let's be paranoid and try it all over again with
+ * a default PageControl object.
+ */
+ int getIndex = currentRowIndex - startRow;
+ if (getIndex < 0 || getIndex >= pageList.size()) {
+ // getting the default will repersist the new PageControl too
+ this.pagedDataBean.resetPageControl();
+ this.pageList = getDataPage();
+
+ // pageControl startRow should now be zero
+ this.currentRowIndex = 0; // and tell the framework to start back at 0
+ getIndex = 0; // now the getIndex should be 0
+ }
+
+ return pageList.get(getIndex);
+ }
+
+ @Override
+ public Object getWrappedData() {
+ return pageList;
+ }
+
+ /**
+ * Return <code>true</code> if the {@link #getRowIndex()} value is currently set to a value that matches some
+ * element in the dataset. Note that it may match a row that is not in the currently cached PageList; if so then
+ * when {@link #getRowData()} is called the required PageList will be fetched by calling
+ * {@link #getDataPage()}.
+ *
+ * @return <code>true</code> if the row is available
+ */
+ @Override
+ public boolean isRowAvailable() {
+ PageList<T> page = getPage();
+ if (page == null) {
+ return false;
+ }
+
+ int rowIndex = getRowIndex();
+ if (rowIndex < 0) {
+ return false;
+ } else if (rowIndex >= page.getTotalSize()) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ private PageList<T> getDataPage() {
+ long start = System.currentTimeMillis();
+ PageControl pageControl = this.pagedDataBean.getPageControl();
+ PageList<T> results = fetchPageGuarded(pageControl);
+ if (log.isDebugEnabled()) {
+ long time = System.currentTimeMillis() - start;
+
+ log.debug("Fetch time was [" + time + "]ms for " + pageControl);
+ if (time > 2000L) {
+ log.debug("Slow loading page " + pageControl);
+ }
+ }
+ return results;
+ }
+
+ @NotNull
+ private PageList<T> fetchPageGuarded(PageControl pageControl) {
+ PageList<T> results = null;
+ boolean tryQueryAgain = false;
+ try {
+
+ if (pageControl.getPageSize() == PageControl.SIZE_UNLIMITED && pageControl.getPageNumber() != 0) {
+ /*
+ * user is trying to get all of the results (SIZE_UNLIMITED), but not starting
+ * on the first page. while this is technically allowable, it generally doesn't
+ * make all that much sense and was most likely due to a mistake upstream in the
+ * usage of the pagination / sorting framework.
+ */
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Forcing UNLIMITED PageControl's pageNumber to 0");
+ }
+ pageControl.setPageNumber(0);
+ }
+
+ // try the data fetch with the potentially changed (and persisted) PageControl object
+ if (log.isTraceEnabled()) {
+ log.trace("Fetching page using: " + pageControl);
+ }
+ results = fetchPage(pageControl);
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Successfully fetched page (first time)");
+ }
+
+ /*
+ * do the results make sense? there are certain times when no exception will be thrown but the
+ * user interface won't be properly updated because of the multi-user environment. if one user
+ * is looking at some data set while another user deletes that entire data set, the current user
+ * upon next sort or pagination action should realize that no results exist for his current page
+ * and the view should be rendered to reflect that. however, due to some defensive coding in the
+ * RF components, the DataTable component does not see this change. so, we have to explicitly
+ * update the page control to get the view consistent with the backend once again.
+ */
+ if (results.getTotalSize() <= pageControl.getStartRow() || (results.isEmpty() && pageControl.getPageNumber() != 0)) {
+ if (log.isTraceEnabled()) {
+ if (results.getTotalSize() <= pageControl.getStartRow()) {
+ //log.trace(pageControlView + ": Results size[" + results.getTotalSize()
+ // + "] was less than PageControl startRow[" + pageControl.getStartRow() + "]");
+ } else {
+ //log.trace(pageControlView + ": Results were empty, but pageNumber was non-zero");
+ }
+ }
+ pageControl.reset();
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": resetting to " + pageControl);
+ }
+ tryQueryAgain = true;
+ }
+ } catch (Throwable t) {
+ /*
+ * known issues during pagination:
+ *
+ * 1) IndexOutOfBoundsException - trying to access a non-existent page
+ * 2) QuerySyntaxException - when the token passed by the SortableColumnHeaderListener does not
+ * match some alias on the underlying query that fetches the results
+ *
+ * but let's be extra careful and catch Throwable so as to handle any other exceptional case
+ * we've yet to uncover. however, we still want to return value data to the user, so let's
+ * try the query once again; this time, we want the first page and will not specify any explicit
+ * ordering (though the underlying SLSB may add a default ordering downstream).
+ */
+ pageControl.reset();
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Received error[" + t.getMessage() + "], resetting to " + pageControl);
+ }
+ tryQueryAgain = true;
+ }
+
+ // round 2 should be guaranteed because of use of defaultPageControl
+ if (tryQueryAgain) {
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Trying query again");
+ }
+ try {
+ results = fetchPage(pageControl);
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Successfully fetched page (second time)");
+ }
+ } catch (Throwable t) {
+ //log.error("Could not retrieve collection for " + pageControlView, t);
+ }
+ }
+
+ if (results == null) {
+ results = new PageList<T>();
+ }
+
+ return results;
+ }
+
+ @NotNull
+ public PageControl getPageControl() {
+ return this.pagedDataBean.getPageControl();
+ }
+
+ public void setPageControl(PageControl pageControl) {
+ this.pagedDataBean.setPageControl(pageControl);
+ }
+
+ /**
+ * Method which must be implemented in cooperation with the managed bean class to fetch data on demand.
+ *
+ * @param pageControl information such as the first row of data to be fetched, the number of rows of data to be fetched and
+ * sorting data
+ *
+ * @return the data page with the rows in memory
+ */
+ public abstract PageList<T> fetchPage(PageControl pageControl);
+
+ /**
+ * TODO
+ */
+ public void reset() {
+ this.pageList = null;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SortableColumnHeaderRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SortableColumnHeaderRenderer.java
new file mode 100644
index 0000000..1f80312
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SortableColumnHeaderRenderer.java
@@ -0,0 +1,110 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.renderer;
+
+import com.sun.faces.renderkit.html_basic.CommandLinkRenderer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.util.OrderingField;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.gui.table.component.SortableColumnHeaderComponent;
+import org.rhq.core.gui.table.model.PagedListDataModel;
+import org.rhq.core.gui.util.FacesComponentUtility;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIData;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import java.io.IOException;
+
+/**
+ * @author Ian Springer
+ * @author Joseph Marques
+ */
+public class SortableColumnHeaderRenderer extends CommandLinkRenderer {
+ private static final String BASE_IMAGE_URL = "http://127.0.0.1:7080/images";
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @Override
+ public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
+ rendererParamsNotNull(context, component);
+
+ String sortBy = ((SortableColumnHeaderComponent) component).getSortBy();
+ if (sortBy == null) {
+ log.error("Required attribute 'sortBy' missing for " + component.getClass().getSimpleName()
+ + " component with id" + component.getId() + " on page "
+ + FacesContext.getCurrentInstance().getViewRoot().getViewId() + ".");
+ return;
+ }
+
+ ResponseWriter writer = context.getResponseWriter();
+
+ PageControl pageControl = getPageControl(component);
+ boolean sortFieldFound = false;
+ for (int i = 0, orderingFieldsSize = pageControl.getOrderingFields().size(); i < orderingFieldsSize; i++) {
+ OrderingField field = pageControl.getOrderingFields().get(i);
+ if (field.getField().equals(sortBy)) {
+ sortFieldFound = true;
+ writer.startElement("img", component);
+ String imageFileName = null;
+ switch (field.getOrdering()) {
+ case ASC:
+ imageFileName = (i == 0) ? "tb_sortup.gif" : "tb_sortup_inactive.gif";
+ break;
+ case DESC:
+ imageFileName = (i == 0) ? "tb_sortdown.gif" : "tb_sortdown_inactive.gif";
+ break;
+ }
+ String imageUrl = BASE_IMAGE_URL + "/" + imageFileName;
+ writer.writeAttribute("src", imageUrl, null);
+ writer.writeAttribute("border", 0, null);
+ writer.endElement("img");
+
+ // Add a tiny number to indicate the column's sort precedence, "1" being the highest precedence.
+ Integer precedence = i + 1;
+ writer.writeText(precedence, null);
+
+ break;
+ }
+ }
+
+ if (!sortFieldFound) {
+ log.error("Value of attribute 'sortBy' for " + component.getClass().getSimpleName()
+ + " component with id" + component.getId() + " on page "
+ + FacesContext.getCurrentInstance().getViewRoot().getViewId() + " not valid for " + pageControl
+ + ".");
+ }
+ super.encodeEnd(context, component);
+ }
+
+ private PageControl getPageControl(UIComponent component) {
+ UIData enclosingTable = getEnclosingData(component);
+ PagedListDataModel pagedListDataModel = (PagedListDataModel)enclosingTable.getValue();
+ return pagedListDataModel.getPageControl();
+ }
+
+ private UIData getEnclosingData(UIComponent component) {
+ UIData data = FacesComponentUtility.getAncestorOfType(component, UIData.class);
+ if (data == null) {
+ throw new IllegalStateException("No data!");
+ }
+ return data;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/resources/META-INF/faces-config.xml b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
index 71369dd..6b2cb7a 100644
--- a/modules/core/gui/src/main/resources/META-INF/faces-config.xml
+++ b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
@@ -6,6 +6,15 @@
version="1.2">
<component>
+ <component-type>org.rhq.SortableColumnHeader</component-type>
+ <component-class>org.rhq.core.gui.table.component.SortableColumnHeaderComponent</component-class>
+ <component-extension>
+ <component-family>org.rhq.SortableColumnHeader</component-family>
+ <renderer-type>org.rhq.SortableColumnHeader</renderer-type>
+ </component-extension>
+ </component>
+
+ <component>
<component-type>org.rhq.RowSelector</component-type>
<component-class>org.rhq.core.gui.table.component.RowSelectorComponent</component-class>
<component-extension>
@@ -34,6 +43,13 @@
<render-kit>
+ <renderer>
+ <description>TODO</description>
+ <component-family>org.rhq.SortableColumnHeader</component-family>
+ <renderer-type>org.rhq.SortableColumnHeader</renderer-type>
+ <renderer-class>org.rhq.core.gui.table.renderer.SortableColumnHeaderRenderer</renderer-class>
+ </renderer>
+
<renderer>
<description>renders either one radio button or one checkbox per data table row, which the user can select in
order to select the corresponding row</description>
diff --git a/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
index 3b162d2..d3c287e 100644
--- a/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
+++ b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
@@ -9,6 +9,14 @@
<namespace>http://rhq-project.org/rhq</namespace>
<tag>
+ <tag-name>sortableColumnHeader</tag-name>
+ <component>
+ <component-type>org.rhq.SortableColumnHeader</component-type>
+ <renderer-type>org.rhq.SortableColumnHeader</renderer-type>
+ </component>
+ </tag>
+
+ <tag>
<tag-name>rowSelector</tag-name>
<component>
<component-type>org.rhq.RowSelector</component-type>
diff --git a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
index e003d7c..4e8cc1a 100644
--- a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
+++ b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
@@ -18,6 +18,8 @@
*/
package org.rhq.enterprise.client;
+import java.lang.Override;
+import java.lang.String;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@@ -56,7 +58,7 @@ import org.rhq.enterprise.server.system.ServerVersion;
import org.rhq.enterprise.server.system.SystemManagerRemote;
/**
- * A remote access client with transparent proxies to RHQ servers.
+ * A remote access client that provides transparent servlet-based proxies to an RHQ Server.
*
* @author Greg Hinkle
* @author Simeon Pinder
@@ -154,13 +156,13 @@ public class RemoteClient {
* @param port
*/
public RemoteClient(String transport, String host, int port) {
- this.transport = transport;
- this.host = host;
- this.port = port;
+ this(transport, host, port, null);
}
public RemoteClient(String transport, String host, int port, String subsystem) {
- this(null, host, port);
+ this.transport = (transport != null) ? transport : guessTransport(port);
+ this.host = host;
+ this.port = port;
this.subsystem = subsystem;
}
@@ -216,11 +218,6 @@ public class RemoteClient {
* After successfully executing this, {@link #isConnected()} will be <code>true</code>
* and {@link #getSubject()} will return the subject that this method returns.
*
- * @param user
- * @param password
- *
- * @return the logged in user
- *
* @throws Exception if failed to connect to the server or log in
*/
public void connect() throws Exception {
@@ -285,14 +282,8 @@ public class RemoteClient {
return this.port;
}
- public String getTransport() {
- if (this.transport != null) {
- return this.transport;
- } else if (String.valueOf(this.port).endsWith("443")) {
- return SECURE_TRANSPORT;
- } else {
- return NONSECURE_TRANSPORT;
- }
+ protected String guessTransport(int port) {
+ return String.valueOf(port).endsWith("443") ? SECURE_TRANSPORT : NONSECURE_TRANSPORT;
}
/**
@@ -433,6 +424,19 @@ public class RemoteClient {
return this.managers;
}
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + "[" +
+ "transport=" + transport +
+ ", host=" + host +
+ ", port=" + port +
+ ", subsystem=" + subsystem +
+ ", connected=" + connected +
+ ", loggedIn=" + loggedIn +
+ ", subject=" + subject +
+ ']';
+ }
+
/**
* Returns the internal JBoss/Remoting client used to perform the low-level
* comm with the server.
@@ -458,7 +462,7 @@ public class RemoteClient {
}
private void doConnect() throws Exception {
- String locatorURI = getTransport() + "://" + this.host + ":" + this.port
+ String locatorURI = this.transport + "://" + this.host + ":" + this.port
+ "/jboss-remoting-servlet-invoker/ServerInvokerServlet";
InvokerLocator locator = new InvokerLocator(locatorURI);
commit 06bef06e8241a3052cf3aab7cfcd88dbd8f7f598
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Sat Jan 23 14:13:34 2010 -0500
add tld files for f, h, ui, and fn namespaces and update README
diff --git a/etc/tlds/README.txt b/etc/tlds/README.txt
index 42bf3fc..e38ce08 100644
--- a/etc/tlds/README.txt
+++ b/etc/tlds/README.txt
@@ -9,12 +9,15 @@ To get auto-completion working for the JSTL Core, Seam, Ajax4JSF, and RichFaces
URI Location
-------------------------------------------------------------
http://java.sun.com/jstl/core RHQ/etc/tlds/c.tld
+ http://java.sun.com/jsp/jstl/functions RHQ/etc/tlds/fn.tld
http://jboss.com/products/seam/taglib RHQ/etc/tlds/s.tld
http://richfaces.org/a4j RHQ/etc/tlds/a4j.tld
https://ajax4jsf.dev.java.net/ajax RHQ/etc/tlds/a4j.tld
http://richfaces.org/rich RHQ/etc/tlds/rich.tld
http://richfaces.ajax4jsf.org/rich RHQ/etc/tlds/rich.tld
+Note, you do not need to configure external resources for the JSF Core (f), JSF HTML (h), and JSF Facelets (ui) namespaces, since IDEA provides built-in mappings for those. However, I stuck the tld files for these three namespaces in RHQ/etc/ in case they're of use to Eclipse users.
+
3) While you're adding external resources, you may want to also add mappings for the various RHQ schemas to enable auto-completion when editing XML documents using those schemas, e.g.:
URI Location
diff --git a/etc/tlds/f.tld b/etc/tlds/f.tld
new file mode 100644
index 0000000..04ba567
--- /dev/null
+++ b/etc/tlds/f.tld
@@ -0,0 +1,1973 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+
+<taglib xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+ version="2.1">
+
+
+ <!-- ========== Tag Library Description Elements ========================= -->
+
+ <description>
+ The core JavaServer Faces custom actions that are independent of
+ any particular RenderKit.
+ </description>
+ <tlib-version>1.2</tlib-version>
+ <short-name>f</short-name>
+ <uri>http://java.sun.com/jsf/core</uri>
+
+
+ <!-- ========== Tag Library Validator ==================================== -->
+
+
+ <!-- This TLV verifies that a Faces tag has an ID if it is a
+child or sibling of a JSTL conditional or iterator tag -->
+ <validator>
+ <description>
+ This tag library validator verifies certain semantic restrictions on the
+ use of JavaServer Faces component actions, including the requirement that
+ component tags nested inside a JSTL conditional tag must have a value
+ specified for the "id" attribute.
+ </description>
+ <validator-class>
+ com.sun.faces.taglib.jsf_core.CoreValidator
+ </validator-class>
+ </validator>
+
+
+ <!-- ============== Configuration Listener ============== -->
+
+ <!--
+ This ServletContextListener initializes the runtime environment
+ of the JavaServer Faces Reference Implementation when a web
+ application including it is initialized by the container.
+ -->
+ <listener>
+ <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
+ </listener>
+
+ <!-- ========== Tag Descriptions ========================================= -->
+
+
+ <tag>
+ <description>
+
+ <![CDATA[<p>Register an ActionListener instance on the
+ UIComponent associated with the closest parent UIComponent
+ custom action.</p>]]>
+ </description>
+ <name>actionListener</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ActionListenerTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Fully qualified Java class name of an ActionListener to be
+ created and registered.
+ </description>
+ <name>type</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description>
+ Value binding expression that evaluates to an object that
+ implements javax.faces.event.ActionListener.
+ </description>
+ <name>binding</name>
+ <required>false</required>
+ <deferred-value>
+ <type>javax.faces.event.ActionListener</type>
+ </deferred-value>
+
+ </attribute>
+ <attribute>
+ <description>
+ Value binding expression that evaluates to an object that
+ implements javax.faces.event.ActionListener.
+ </description>
+ <name>for</name>
+ <required>false</required>
+ <deferred-value>
+ <type>javax.faces.event.ActionListener</type>
+ </deferred-value>
+
+ </attribute>
+
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Add an attribute to the UIComponent associated with the closest
+ parent UIComponent custom action.
+ </description>
+ <name>attribute</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.AttributeTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ The name of the component attribute to be set.
+ </description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ The value of the component attribute to be set.
+ </description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+
+
+ <tag>
+ <description>
+ Register a DateTimeConverter instance on the UIComponent associated
+ with the closest parent UIComponent custom action.
+ </description>
+ <name>convertDateTime</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ConvertDateTimeTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Predefined formatting style which determines how the date
+ component of a date string is to be formatted and parsed.
+ Applied only if type is "date" or "both". Valid values
+ are "default", "short", "medium", "long", and "full".
+ Default value is "default".
+ </description>
+ <name>dateStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Locale whose predefined styles for dates and times are used
+ during formatting or parsing. If not specified, the Locale
+ returned by FacesContext.getViewRoot().getLocale() will be used.
+ Value must be either a VB expression that evaluates to a
+ java.util.Locale instance, or a String that is valid to pass as
+ the first argument to the constructor java.util.Locale(String
+ language, String country). The empty string is passed as the
+ second argument.
+ </description>
+ <name>locale</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Custom formatting pattern which determines how the
+ date/time string should be formatted and parsed.
+ </description>
+ <name>pattern</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Predefined formatting style which determines how the
+ time component of a date string is to be formatted and
+ parsed. Applied only if type is "time" or "both".
+ Valid values are "default", "short", "medium", "long",
+ and "full". Default value is "default".
+ </description>
+ <name>timeStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Time zone in which to interpret any time information in the date
+ String. Value must be either a VB expression that evaluates to
+ a java.util.TimeZone instance, or a String that is a timezone ID
+ as described in the javadocs for
+ java.util.TimeZone.getTimeZone().
+ </description>
+ <name>timeZone</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Specifies what contents the string value will be
+ formatted to include, or parsed expecting. Valid
+ values are "date", "time", and "both". Default
+ value is "date".
+ </description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ javax.faces.convert.DateTimeConverter.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.convert.DateTimeConverter</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>
+ Register a NumberConverter instance on the UIComponent associated
+ with the closest parent UIComponent custom action.
+ </description>
+ <name>convertNumber</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ConvertNumberTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ ISO 4217 currency code, applied only when
+ formatting currencies.
+ </description>
+ <name>currencyCode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Currency symbol, applied only when formatting
+ currencies.
+ </description>
+ <name>currencySymbol</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Flag specifying whether formatted output will
+ contain grouping separators. Expressions must
+ evaluate to a boolean. Default value
+ is true.
+ </description>
+ <name>groupingUsed</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Flag specifying whether only the integer part
+ of the value will be formatted and parsed.
+ Expressions must evaluate to a boolean.
+ Default value is false.
+ </description>
+ <name>integerOnly</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[<p>
+
+ <span class="changed_modified_2_0">Locale</span> whose
+ predefined styles for numbers are used during formatting
+ and parsing. If not specified, the Locale returned by
+ FacesContext.getViewRoot().getLocale() will be used.
+ Expressions must evaluate to a java.util.Locale <span
+ class="changed_modified_2_0">or a String that is valid to
+ pass as the first argument to the constructor
+ java.util.Locale(String language, String country). The
+ empty string is passed as the second argument.</span>
+
+ </p>]]></description>
+ <name>locale</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Maximum number of digits that will be formatted
+ in the fractional portion of the output. Expressions
+ must evaluate to an int.
+ </description>
+ <name>maxFractionDigits</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Maximum number of digits that will be formatted
+ in the integer portion of the output. Expressions
+ must evaluate to an int.
+ </description>
+ <name>maxIntegerDigits</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Minimum number of digits that will be formatted
+ in the fractional portion of the output. Expressions
+ must evaluate to an int.
+ </description>
+ <name>minFractionDigits</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Minimum number of digits that will be formatted
+ in the integer portion of the output. Expressions
+ must evaluate to an int.
+ </description>
+ <name>minIntegerDigits</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Custom formatting pattern which determins how the
+ number string should be formatted and parsed.
+ </description>
+ <name>pattern</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Specifies how the number string will be formatted
+ and parsed. Valid values are "number", "currency",
+ and "percent". Default value is "number".
+ </description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ javax.faces.convert.NumberConverter.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.convert.NumberConverter</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>
+ Register a named Converter instance on the UIComponent
+ associated with the closest parent UIComponent custom action.
+ </description>
+ <name>converter</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ConverterTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Converter identifier of the Converter instance to be
+ created and registered.
+ </description>
+ <name>converterId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an object that
+ implements javax.faces.convert.Converter.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an object that
+ implements javax.faces.convert.Converter.
+ </description>
+ <name>for</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description><![CDATA[
+
+ <p><span class="changed_modified_2_0">Register</span> a
+ named facet on the UIComponent associated with the closest
+ parent UIComponent custom action.</p>
+
+ ]]></description>
+ <name>facet</name>
+ <tag-class>javax.faces.webapp.FacetTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ Name of the facet to be created.
+ </description>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Load a resource bundle localized for the Locale of the current
+ view, and expose it as a java.util.Map in the request attributes
+ of the current request under the key specified by the value of the
+ "var" attribute of this tag. The Map must behave such that if a
+ get() call is made for a key that does not exist in the Map, the
+ literal string ???KEY??? is returned from the Map, where KEY is
+ the key being looked up in the Map, instead of a
+ MissingResourceException being thrown. If the ResourceBundle does
+ not exist, a JspException must be thrown.
+ </description>
+ <name>loadBundle</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.LoadBundleTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Base name of the resource bundle
+ to be loaded.
+ </description>
+ <name>basename</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Name of a request scope attribute under which
+ the resource bundle will be exposed as a Map.
+ </description>
+ <name>var</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ </tag>
+
+
+ <tag>
+ <description>
+ Add a child UIParameter component to the UIComponent
+ associated with the closed parent UIComponent custom
+ action.
+ </description>
+ <name>param</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ParameterTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ ValueExpression to a backing bean
+ property bound to the component instance for
+ the UIComponent created by this custom action.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Component identifier of the UIParameter component
+ to be created.
+ </description>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <description>
+ Name of the parameter to be created.
+ </description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Value of the parameter to be set.
+ </description>
+ <name>value</name>
+ <deferred-value/>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description><![CDATA[
+
+ <p class="changed_added_2_0">Used inside of the metada facet
+ of a view, this tag causes a <a target="_"
+ href="../../../javadocs/javax/faces/component/UIViewParameter.html">UIViewParameter</a>
+ to be attached as metadata for the current view. Because
+ <code>UIViewParameter</code> extends <code>UIInput</code>
+ all of the attributes and nested child content for any
+ <code>UIInput</code> tags are valid on this tag as well.</p>
+
+ ]]></description>
+ <name>viewParam</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ParameterTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+
+ <attribute>
+ <description>
+ <![CDATA[The maximum number of characters that may
+ be entered in this field.]]>
+ </description>
+ <name>
+ maxlength
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+
+ <description>
+ Register a PhaseListener instance on the UIViewRoot in which
+ this tag is nested.
+ </description>
+ <name>phaseListener</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.PhaseListenerTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Fully qualified Java class name of an PhaseListener to be
+ created and registered.
+ </description>
+ <name>type</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description>
+ Value binding expression that evaluates to an object that
+ implements javax.faces.event.PhaseListener.
+ </description>
+ <name>binding</name>
+ <required>false</required>
+ <deferred-value>
+ <type>javax.faces.event.PhaseListener</type>
+ </deferred-value>
+
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ <![CDATA[
+
+ <p><span class="changed_modified_2_0">Add</span> a child
+ UISelectItem component to the UIComponent associated with
+ the closed parent UIComponent custom action.</p>
+
+ ]]>
+ </description>
+ <name>selectItem</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.SelectItemTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Value binding expression to a backing bean
+ property bound to the component instance for
+ the UIComponent created by this custom action.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Component identifier of the UISelectItem
+ component to be created.
+ </description>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <description>
+ Description of this option, for use in
+ development tools.
+ </description>
+ <name>itemDescription</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Flag indicating whether the option created
+ by this component is disabled. Expressions
+ must evaluate to a boolean. Default value
+ is false.
+ </description>
+ <name>itemDisabled</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Label to be displayed to the user
+ for this option.
+ </description>
+ <name>itemLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Flag indicating that characters that are sensitive in
+ the value of the <![CDATA[<code>itemLabel</code>]]>
+ attribute must be escaped. This flag is set to "true" by
+ default.
+ </description>
+ <name>escape</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Value to be returned to the server if this
+ option is selected by the user.
+ </description>
+ <name>itemValue</name>
+ <deferred-value/>
+ </attribute>
+
+ <attribute>
+ <description>
+ Value binding expression pointing at a
+ SelectItem instance containing the
+ information for this option.
+ </description>
+ <name>value</name>
+ <deferred-value>
+ <type>javax.faces.model.SelectItem</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ <![CDATA[
+
+ <p class="changed_added_2_0">Flag indicating whether the
+ option created by this component represents the special
+ "no selection" option. Expressions must evaluate to a
+ boolean. Default value is false.</p>
+
+ ]]>
+ </description>
+ <name>noSelectionOption</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+
+ </tag>
+
+
+ <tag>
+ <description>
+ <![CDATA[<p><span class="changed_modified_2_0">Add</span> a
+ child UISelectItems component to the UIComponent associated
+ with the closed parent UIComponent custom action.</p>
+
+ <p class="changed_modified_2_0">When iterating over the
+ select items, <code>toString()</code> mest be called on the
+ string rendered attribute values.</p>
+
+<p class="changed_added_2_0">Version 2 of the specification introduces
+several new attributes, described below. These are: var, itemValue,
+itemLabel, itemDescription, itemDisabled, and itemLabelEscaped.</p>
+
+ ]]>
+
+ </description>
+ <name>selectItems</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.SelectItemsTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Value binding expression to a backing bean
+ property bound to the component instance for
+ the UIComponent created by this custom action.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Component identifier of the UISelectItems
+ component to be created.
+ </description>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <description>
+ <![CDATA[
+
+ <p>Value expression pointing at <span
+ class="changed_modified_2_0">any <code>Collection</code>
+ or array.</span> The member elements may be instances of
+ <code>SelectItem</code> <span
+ class="changed_added_2_0">or any Java Object. In the
+ case where the member elements are plain Java Objects,
+ several additional attributes must be used by the page
+ author to correctly identify the data to the enclosing
+ <code>UISelectOne</code> or <code>UISelectMany</code>
+ component, as shown in the following example.</span>
+
+<div class="syntax"><div class="html4strict" style="font-family: monospace;"><ol><li class="li1"><div class="de1"><span class="sc2"><h:selectOneListbox <span class="kw3">size</span>=<span class="st0">"1"</span> <span class="kw3">id</span>=<span class="st0">"escape02"</span> <span class="kw3">value</span>=<span class="st0">"#{select05NoSelection.initialCollectionValues}"</span><span class="kw2">></span></span></div></li>
+<li class="li2"><div class="de2"> <span class="sc2"><f:selectItems <span class="kw3">value</span>=<span class="st0">"#{select05NoSelection.hobbitList}"</span></div></li>
+<li class="li1"><div class="de1"> var=<span class="st0">"n"</span></div></li>
+<li class="li2"><div class="de2"> itemValue=<span class="st0">"#{n}"</span></div></li>
+<li class="li1"><div class="de1"> itemLabel=<span class="st0">"#{n.bio}"</span></div></li>
+<li class="li2"><div class="de2"> itemDescription=<span class="st0">"#{n.description}"</span></div></li>
+<li class="li1"><div class="de1"> itemDisabled=<span class="st0">"#{n.disabled}"</span></div></li>
+<li class="li2"><div class="de2"> itemLabelEscaped=<span class="st0">"true"</span></div></li>
+<li class="li1"><div class="de1"> noSelectionValue=<span class="st0">"#{select05NoSelection.hobbitList[0]}"</span>/<span class="kw2">></span></span></div></li>
+<li class="li2"><div class="de2"><span class="sc2"><span class="kw2"><</span>/h:selectOneListbox></span> </div></li></ol></div></div>
+
+<p class="changed_added_2_0">In the preceding example, the
+<code>value</code> attribute on line 1 points to a
+<code>Collection<HobbitBean></code>. <code>HobbitBean</code> is
+just a regular Java Object (POJO) that conforms to JavaBeans naming
+conventions for its properties. The <code>value</code> attribute on
+line 2 points to a <code>List<HobbitBean></code>, though it could
+just as well point to a <code>Collection</code>, array, or
+<code>javax.faces.model.DataModel</code>. The attributes on lines 3
+through 9, inclusive, leverage the fact that the value is a collection
+of POJOs.
+</p>
+
+
+</p>
+
+ ]]>
+ </description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ <![CDATA[
+
+<p class="changed_added_2_0">Expose the value from the
+<code>value</code> attribute under this request scoped key so that it
+may be referred to in EL for the value of other attributes.</p>
+
+ ]]>
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ <attribute>
+ <description>
+
+ <![CDATA[ <p class="changed_added_2_0">evaluates to a
+<code>Collection</code>, array, or <code>Map</code> from which the items
+to be shown will be rendered.</p> ]]>
+
+ </description>
+ <name>itemValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+
+ <![CDATA[ <p class="changed_added_2_0">evaluates to a String that will
+serve as the label to be shown for the item.</p> ]]>
+
+ </description>
+ <name>itemLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+
+
+ <![CDATA[ <p class="changed_added_2_0">evaluates to a String that will
+serve as the description to be shown for the item.</p> ]]>
+
+ </description>
+ <name>itemDescription</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+
+ <![CDATA[ <p class="changed_added_2_0">evaluates to a boolean that will
+determine if the item value is selectable or not.</p> ]]>
+
+ </description>
+ <name>itemDisabled</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+
+ <![CDATA[ <p class="changed_added_2_0">evaluates to a boolean that will
+determine if the rendered markup for the item receives normal JSF HTML escaping or not.</p> ]]>
+
+ </description>
+ <name>itemLabelEscaped</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+
+ <![CDATA[ <p class="changed_added_2_0">Is either an EL expression
+pointing to the element in the value collection whose value should be
+marked as a “no selection” item, or a literal string that
+exactly matches the value of the item in the collection that must be
+marked as the “no selection” item. If the user selects such
+an item <strong>and</strong> the field is marked as required, then it
+will not pass validation.</p> ]]>
+
+ </description>
+ <name>itemLabelEscaped</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>
+ <![CDATA[<p>Register an ActionListener instance on the UIComponent
+ associated with the closest parent UIComponent custom action.
+ This actionListener will cause the value given by the "value"
+ attribute to be set into the ValueExpression given by the "target"
+ attribute.</p>
+
+ <p>The implementation of this tag creates a special
+ <code>ActionListener</code> instance and registers it on the
+ <code>ActionSource</code> associated with our most immediate surrounding
+ instance of a tag whose implementation class is a subclass of
+ <code>UIComponentTag</code>. This tag creates no output to the page
+ currently being created.</p>
+
+ <p>The <code>ActionListener</code> instance created and installed by
+ this tag has the following behavior and contract.</p>
+
+ <ul>
+
+ <li>Only create and register the <code>ActionListener</code> instance
+ the first time the component for this tag is created</li>
+
+ <li>The "target" and "value" tag attributes are ValueExpression
+ instances and are stored unevaluated as instance variables of the
+ listener.</li>
+
+ <li>When the listener executes, perform the following:
+ <ul>
+ Call getValue() on the "value" ValueExpression.
+ </ul>
+ <ul>
+ If value of the "value" expression is null, call setValue() on
+ the "target" ValueExpression with the null value.
+ </ul>
+ <ul>
+ If the value of the "value" expression is not null, call getType()
+ on the "value" and "target" ValueExpressions to determine their
+ property types.
+ </ul>
+ <ul>
+ Coerce the value of the "value" expression to the "target"
+ expression value type following the Expression Language coercion
+ rules. Call setValue() on the "target" ValueExpression with the
+ resulting value.
+ </ul>
+ <ul>
+ If either coercion or the execution of setValue() fails throw an
+ AbortProcessingException.
+ </ul>
+ </li>
+
+ </ul>]]>
+ </description>
+ <name>setPropertyActionListener</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.SetPropertyActionListenerTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ ValueExpression to be stored as the value of the target
+ attribute.
+ </description>
+ <name>value</name>
+ <required>true</required>
+ <deferred-value/>
+ </attribute>
+
+ <attribute>
+ <description>
+ ValueExpression that is the destination of the value
+ attribute.
+ </description>
+ <name>target</name>
+ <required>true</required>
+ <deferred-value/>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Container action for all JavaServer Faces core and
+ custom component actions used on a nested page via
+ "jsp:include" or any custom action that dynamically
+ includes another page from the same web application,
+ such as JSTL's "c:import".
+ </description>
+ <name>subview</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.SubviewTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ <attribute>
+ <description>
+ Value binding expression to a backing bean
+ property bound to the component instance for
+ the UIComponent created by this custom action.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Component identifier of the UINamingContainer
+ component to be created.
+ </description>
+ <name>id</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <description>
+ Flag indicating whether this component (and its
+ children) should be rendered. Expressions must
+ evaluate to a boolean.
+ </description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Register a DoubleRangeValidator instance on the
+ UIComponent associated with the closest parent
+ UIComponent custom action.
+ </description>
+ <name>validateDoubleRange</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ValidateDoubleRangeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ Maximum value allowed for this component.
+ </description>
+ <name>maximum</name>
+ <deferred-value>
+ <type>java.lang.Double</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Minimum value allowed for this component.
+ </description>
+ <name>minimum</name>
+ <deferred-value>
+ <type>java.lang.Double</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ DoubleRangeValidator.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.validator.DoubleRangeValidator</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Register a LengthValidator instance on the
+ UIComponent associated with the closest parent
+ UIComponent custom action.
+ </description>
+ <name>validateLength</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ValidateLengthTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ Maximum length allowed for this component.
+ </description>
+ <name>maximum</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description>
+ Minimum length allowed for this component.
+ </description>
+ <name>minimum</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ LenghtValidator.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.validator.LengthValidator</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Register a LongRangeValidator instance on the
+ UIComponent associated with the closest parent
+ UIComponent custom action.
+ </description>
+ <name>validateLongRange</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ValidateLongRangeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ Maximum value allowed for this component.
+ </description>
+ <name>maximum</name>
+ <deferred-value>
+ <type>java.lang.Long</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description>
+ Minimum value allowed for this component.
+ </description>
+ <name>minimum</name>
+ <deferred-value>
+ <type>java.lang.Long</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ LongRangeValidator.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.validator.LongRangeValidator</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description><![CDATA[<p>
+
+ <span class="changed_added_2_0">
+ A validator that delegates the validation of the local value
+ to the Bean Validation API. The validationGroups attribute
+ serves as a filter that instructs the Bean Validation API which
+ contraints to enforce. If there are any constraint violations
+ reported by Bean Validation, the value is considered invalid.
+
+ </p>]]>
+ </description>
+ <name>validateBean</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.BeanValidatorTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <description>
+ A comma-separated list of validation groups. A validation group
+ is a fully-qualified class name.
+ </description>
+ <name>validationGroups</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ BeanValidator.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.validator.BeanValidator</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description><![CDATA[<p>
+
+ <span class="changed_added_2_0">
+ A validator that uses the pattern attribute to validate the
+ wrapping component. The entire pattern is matched against
+ the String value of the component. If it matches, it's
+ valid.
+
+ </p>]]>
+ </description>
+ <name>validateRegex</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.RegexValidatorTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <description>
+ A regular expression pattern. Remember that, like in
+ all Java strings, backslash must be escaped with another
+ backslash.
+ </description>
+ <name>pattern</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ RegexpValidator.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.validator.RegexValidator</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description><![CDATA[<p>
+
+ <span class="changed_added_2_0">
+ A validator that enforces the presence of a value. It has
+ the same affect as setting the required attribute on a UIInput
+ to true.
+
+ </p>]]>
+ </description>
+ <name>validateRequired</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.RequiredValidatorTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an instance of
+ RequiredValidator.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.validator.RequiredValidator</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Register a named Validator instance on the
+ UIComponent associated with the closest parent
+ UIComponent custom action.
+ </description>
+ <name>validator</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ValidatorTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Validator identifier of the Validator
+ to be created and registered.
+ </description>
+ <name>validatorId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ A ValueExpression that evaluates to an object that implements
+ the javax.faces.validator.Validator interface.
+ </description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.validator.Validator</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Register an ValueChangeListener instance on the UIComponent associated
+ with the closest parent UIComponent custom action.
+ </description>
+ <name>valueChangeListener</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ValueChangeListenerTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>
+ Fully qualified Java class name of a
+ ValueChangeListener to be created and registered.
+ </description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description>
+ Value binding expression that evaluates to an object that
+ implements javax.faces.event.ValueChangeListener.
+ </description>
+ <name>binding</name>
+ <required>false</required>
+ <deferred-value>
+ <type>javax.faces.event.ValueChangeListener</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ Value binding expression that evaluates to an object that
+ implements javax.faces.event.ValueChangeListener.
+ </description>
+ <name>for</name>
+ <required>false</required>
+ <deferred-value>
+ <type>javax.faces.event.ValueChangeListener</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+
+
+ <tag>
+ <description>
+ Create and register a child UIOutput component
+ associated with the closest parent UIComponent
+ custom action, which renders nested body content.
+ </description>
+ <name>verbatim</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.VerbatimTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ Flag indicating that generated markup must
+ be escaped in a manner that is appropriate
+ for the markup language to be rendered.
+ Expressions must evaluate to a boolean.
+ Default value is false.
+ </description>
+ <name>escape</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Boolean
+ </type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+ <description>
+ Container for all JavaServer Faces core and custom
+ component actions used on a page.
+ </description>
+ <name>view</name>
+ <tag-class>com.sun.faces.taglib.jsf_core.ViewTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>
+ Locale to use for localizing this page. Expressions
+ must evaluate to a java.util.Locale or to a String
+ that is converted to a Locale.
+ </description>
+ <name>locale</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Identifier for the RenderKit to use for
+ rendering this page.
+ </description>
+ <name>renderKitId</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+
+ </attribute>
+ <attribute>
+ <description>contentType</description>
+ <name>contentType</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+
+ MethodBinding pointing to a method that takes a
+ javax.faces.event.PhaseEvent and returns void. This method
+ will be called before every phase except for restore view.
+ </description>
+ <name>beforePhase</name>
+ <required>false</required>
+ <deferred-method>
+ <method-signature>void beforePhase(javax.faces.event.PhaseEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ <attribute>
+ <description>
+
+ MethodBinding pointing to a method that takes a
+ javax.faces.event.PhaseEvent and returns void. This method
+ will be called after every phase except for restore view.
+ </description>
+ <name>afterPhase</name>
+ <required>false</required>
+ <deferred-method>
+ <method-signature>void afterPhase(javax.faces.event.PhaseEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ </tag>
+
+ <!-- ================ Added from facelets_jsf_core.tld ==================================== -->
+
+ <tag>
+ <description><![CDATA[
+
+ <p class="changed_added_2_0">Register an AjaxBehavior instance on one or more
+ UIComponents implementing the ClientBehaviorHolder interface. This tag
+ may be nested witin a single component (enabling Ajax for a single component),
+ or it may be "wrapped" around multiple components (enabling Ajax for many components).</p>
+
+ ]]></description>
+ <name>ajax</name>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">A value of "true" indicates the
+ AjaxBehavior should not be rendered. A value of "false" indicates
+ the AjaxBehavior should be rendered. "false" is the default.</p>
+
+ ]]></description>
+ <name>disabled</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">A String identifying the type of event
+ the Ajax action will apply to. If specified, it must be one of the
+ events supported by the component the Ajax behavior is being applied to.
+ For HTML components this would be the set of supported DOM events for the
+ component, plus "action" for Faces ActionSource components and "valueChange"
+ for Faces EditableValueHolder components. If not specified, the default
+ event is determined for the component. The DOM event name is the actual DOM
+ event name (for example: "click") as opposed to (for example: "onclick").</p>
+
+ ]]></description>
+ <name>event</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">Evaluates to Collection<String>. Identifiers of
+ components that will participate in the "execute" portion of the Request
+ Processing Lifecycle. If a literal is specified the identifiers must be space
+ delimited. Any of the keywords "@this", "@form", "@all", "@none" may be specified
+ in the identifier list.</p>
+
+ ]]></description>
+ <name>execute</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">If "true" behavior events generated from this behavior
+ are broadcast during Apply Request Values phase. Otherwise, the events will be
+ broadcast during Invoke Aplications phase</p>
+
+ ]]></description>
+ <name>immediate</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">Method expression referencing a method
+ that will be called when an AjaxBehaviorEvent has been
+ broadcast for the listener.</p>
+
+ ]]></description>
+ <name>listener</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <deferred-method>
+ <method-signature>public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws
+ javax.faces.event.AbortProcessingException
+ </method-signature>
+ </deferred-method>
+
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">The name of the JavaScript function that will handle UI events.</p>
+
+ ]]></description>
+ <name>onevent</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">The name of the JavaScript function that will handle errors.</p>
+
+ ]]></description>
+ <name>oneerror</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+
+ </attribute>
+
+ <attribute>
+ <description><![CDATA[
+ <p class="changed_added_2_0">Evaluates to Collection<String>. Identifiers of
+ components that will participate in the "render" portion of the Request
+ Processing Lifecycle. If a literal is specified the identifiers must be space
+ delimited. Any of the keywords "@this", "@form", "@all", "@none" may be specified
+ in the identifier list.</p>
+
+ ]]></description>
+ <name>render</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description><![CDATA[
+
+ <p class="changed_added_2_0">Allow JSF page authors to
+ install <code>ComponentSystemEventListener</code> instances
+ on a component in a page.</p>
+
+ <div class="changed_added_2_0">
+
+ <p></p>
+
+ </div>
+
+ ]]></description>
+ <name>event</name>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description><![CDATA[
+
+ <p class="changed_added_2_0">Name of the event for which
+ to install a listener. The following table lists the
+ valid values for this attribute, and the corresponding
+ event type for which the listener action is
+ registered.</p>
+
+<table border="1">
+<tr>
+
+<th>value for "<code>name</code>" tag attribute</th>
+
+<th>Type of event sent to listener method
+</th>
+
+</tr>
+
+<tr>
+
+<td>preRenderComponent
+</td>
+
+<td>javax.faces.event.PreRenderComponentEvent
+</td>
+
+</tr>
+
+<tr>
+
+<td>PostAddToView
+</td>
+
+<td>javax.faces.event.PostAddToViewEvent
+</td>
+
+</tr>
+
+<tr>
+
+<td>preValidate
+</td>
+
+<td>javax.faces.event.PreValidateEvent
+</td>
+
+</tr>
+
+<tr>
+
+<td>postValidate
+</td>
+
+<td>javax.faces.event.PostValidateEvent
+</td>
+
+</tr>
+
+</table>
+
+<div class="changed_added_2_0">
+
+<p>In addition to these values, the fully qualified class name of any
+java class that extends
+<code>javax.faces.event.ComponentSystemEvent</code> may be used as the
+value of the "type" attribute.</p>
+
+<p>Also, the <code>@javax.faces.event.NamedEvent</code> annotation may
+be attached to any java class that extends
+<code>javax.faces.event.ComponentSystemEvent</code>. This enables that
+event to be referenced from this attribute, as descibed in the javadocs
+for <code>@NamedEvent</code>.</p>
+
+</div>
+
+
+ ]]></description>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ <attribute>
+ <description>
+ Method expression pointing to a method expression of
+ that will be called when the listener's processEvent
+ method would have been called.
+ </description>
+ <name>listener</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <deferred-method>
+ <method-signature>public void listener(javax.faces.event.ComponentSystemEvent event) throws
+ javax.faces.event.AbortProcessingException
+ </method-signature>
+ </deferred-method>
+
+ </attribute>
+
+ </tag>
+
+</taglib>
diff --git a/etc/tlds/fn.tld b/etc/tlds/fn.tld
new file mode 100644
index 0000000..12d4ca8
--- /dev/null
+++ b/etc/tlds/fn.tld
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+ version="2.0">
+
+ <description>JSTL 1.1 functions library</description>
+ <display-name>JSTL functions</display-name>
+ <tlib-version>1.1</tlib-version>
+ <short-name>fn</short-name>
+ <uri>http://java.sun.com/jsp/jstl/functions</uri>
+
+ <function>
+ <description>
+ Tests if an input string contains the specified substring.
+ </description>
+ <name>contains</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ <c:if test="${fn:contains(name, searchString)}">
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Tests if an input string contains the specified substring in a case insensitive way.
+ </description>
+ <name>containsIgnoreCase</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>boolean containsIgnoreCase(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ <c:if test="${fn:containsIgnoreCase(name, searchString)}">
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Tests if an input string ends with the specified suffix.
+ </description>
+ <name>endsWith</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>boolean endsWith(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ <c:if test="${fn:endsWith(filename, ".txt")}">
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Escapes characters that could be interpreted as XML markup.
+ </description>
+ <name>escapeXml</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String escapeXml(java.lang.String)</function-signature>
+ <example>
+ ${fn:escapeXml(param:info)}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Returns the index withing a string of the first occurrence of a specified substring.
+ </description>
+ <name>indexOf</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>int indexOf(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ ${fn:indexOf(name, "-")}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Joins all elements of an array into a string.
+ </description>
+ <name>join</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String join(java.lang.String[], java.lang.String)</function-signature>
+ <example>
+ ${fn:join(array, ";")}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Returns the number of items in a collection, or the number of characters in a string.
+ </description>
+ <name>length</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>int length(java.lang.Object)</function-signature>
+ <example>
+ You have ${fn:length(shoppingCart.products)} in your shopping cart.
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Returns a string resulting from replacing in an input string all occurrences
+ of a "before" string into an "after" substring.
+ </description>
+ <name>replace</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String replace(java.lang.String, java.lang.String, java.lang.String)</function-signature>
+ <example>
+ ${fn:replace(text, "-", "•")}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Splits a string into an array of substrings.
+ </description>
+ <name>split</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String[] split(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ ${fn:split(customerNames, ";")}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Tests if an input string starts with the specified prefix.
+ </description>
+ <name>startsWith</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>boolean startsWith(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ <c:if test="${fn:startsWith(product.id, "100-")}">
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Returns a subset of a string.
+ </description>
+ <name>substring</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String substring(java.lang.String, int, int)</function-signature>
+ <example>
+ P.O. Box: ${fn:substring(zip, 6, -1)}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Returns a subset of a string following a specific substring.
+ </description>
+ <name>substringAfter</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String substringAfter(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ P.O. Box: ${fn:substringAfter(zip, "-")}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Returns a subset of a string before a specific substring.
+ </description>
+ <name>substringBefore</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String substringBefore(java.lang.String, java.lang.String)</function-signature>
+ <example>
+ Zip (without P.O. Box): ${fn:substringBefore(zip, "-")}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Converts all of the characters of a string to lower case.
+ </description>
+ <name>toLowerCase</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String toLowerCase(java.lang.String)</function-signature>
+ <example>
+ Product name: ${fn.toLowerCase(product.name)}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Converts all of the characters of a string to upper case.
+ </description>
+ <name>toUpperCase</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String toUpperCase(java.lang.String)</function-signature>
+ <example>
+ Product name: ${fn.UpperCase(product.name)}
+ </example>
+ </function>
+
+ <function>
+ <description>
+ Removes white spaces from both ends of a string.
+ </description>
+ <name>trim</name>
+ <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
+ <function-signature>java.lang.String trim(java.lang.String)</function-signature>
+ <example>
+ Name: ${fn.trim(name)}
+ </example>
+ </function>
+
+</taglib>
diff --git a/etc/tlds/h.tld b/etc/tlds/h.tld
new file mode 100644
index 0000000..df725f0
--- /dev/null
+++ b/etc/tlds/h.tld
@@ -0,0 +1,14417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+ xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">
+
+ <!-- ============== Tag Library Description Elements ============= -->
+
+ <description>
+ This tag library contains JavaServer Faces component tags for all
+ UIComponent + HTML RenderKit Renderer combinations defined in the
+ JavaServer Faces Specification.
+ </description>
+ <tlib-version>
+ 1.2
+ </tlib-version>
+ <short-name>
+ h
+ </short-name>
+ <uri>
+ http://java.sun.com/jsf/html
+ </uri>
+
+ <!-- ============== Tag Library Validator ============= -->
+
+ <validator>
+ <validator-class>
+ com.sun.faces.taglib.html_basic.HtmlBasicValidator
+ </validator-class>
+ </validator>
+
+ <!-- ===================== HTML 4.0 basic tags ====================== -->
+
+ <tag>
+ <description>
+ <![CDATA[<p><span
+ class="changed_modified_2_0">Renders an HTML "input"
+ element.</p>
+
+ <p>Decode Behavior</p>
+
+ <ul>
+
+ <p>Obtain the <code>Map</code> from the "requestParameterMap"
+ property of the <code>ExternalContext</code>. If the value in the
+ <code>Map</code> for the value of the "clientId" property of the
+ component is <code>null</code>, create a String by concatenating
+ the value of the "clientId" property of the component with the
+ String ".x" (without the quotes). Create another String in the
+ same manner, but concatenate ".y" (without the quotes). If
+ <code>null</code> is the value in the <code>Map</code> for both
+ Strings, return from <code>decode()</code>. If the value in the
+ <code>Map</code> for the value of the "clientId" property of the
+ component is not <code>null</code>, get the value of the "type"
+ attribute, and convert it to lower case. If the result is equal
+ to the String "reset" (without the quotes), return from
+ <code>decode()</code>. Otherwise, create a
+ <code>javax.faces.event.ActionEvent</code> around the component,
+ and pass it to the <code>queueEvent()</code> method of the
+ component, which must be an instance of
+ <code>UICommand</code>.</p>
+
+ </ul>
+
+
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>Render the clientId of the component as the value of the "name"
+ attribute. Render the current value of the component as the value
+ of the "value" attribute. If "image" attribute is specified render
+ it as the value of the "src" attribute after passing it to the
+ <code>getResourceURL()</code> method of the
+ <code>ViewHandler</code> for this application, and passing the
+ result through the <code>encodeResourceURL()</code> method of the
+ <code>ExternalContext</code>. <span
+ class="changed_added_2_0">Note that calling
+ <code>getResourceURL()</code> will prefix the context-root of the
+ current application if the value of the "src" attribute starts
+ with "/".</span> When handling the "image" attribute, the value must not
+ be escaped. For example, <code>&</code> must not be turned into
+ <code>&amp;</code>. If the "styleClass" attribute is
+ specified, render its value as the value of the "class" attribute.
+ If the user has specified an "onclick" attribute, append that
+ JavaScript to any existing JavaScript before rendering.</p>
+
+ <p class="changed_added_2_0">If the component being rendered by
+ this renderer has any <code>UIParameter</code> children, each one
+ of them must be rendered using the renderer for component-family:
+ "javax.faces.Input" and renderer-type: "javax.faces.Hidden". For
+ discussion, this is called the hiddenRenderer. A component with
+ component-type "javax.faces.Input" must be created for local use
+ in rendering each <code>UIParameter</code> child. The "id"
+ property of the temporary component must be set to the "name" of
+ the <code>UIParameter</code>. The "value" property of the
+ temporary component must be set to the "value" of the
+ <code>UIParameter</code>. For each <code>UIParameter</code>
+ child, the hiddenRenderer must have its
+ <code>encodeBegin()</code>, <code>encodeChildren()</code>, and
+ <code>encodeEnd()</code> methods called, in order, passing the
+ temporary component as the second argument.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ commandButton
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.CommandButtonTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing the application action to invoke
+ when this component is activated by the user. The expression
+ must evaluate to a public method that takes no parameters, and
+ returns an Object (the toString() of which is called to derive
+ the logical outcome) which is passed to the NavigationHandler
+ for this application.]]>
+ </description>
+ <name>
+ action
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ java.lang.Object action()
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing an action listener method that
+ will be notified when this component is activated by the user.
+ The expression must evaluate to a public method that takes an
+ ActionEvent parameter, with a return type of void, <span
+ class="changed_added_2_0">or to a public method that takes no
+ arguments with a return type of void. In the latter case, the
+ method has no way of easily knowing where the event came from,
+ but this can be useful in cases where a notification is needed
+ that "some action happened".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ actionListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void actionListener(javax.faces.event.ActionEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that, if this component is activated by the user,
+ notifications should be delivered to interested listeners and actions
+ immediately (that is, during Apply Request Values phase) rather than
+ waiting until Invoke Application phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Alternate textual description of the
+ element rendered by this component.]]>
+ </description>
+ <name>
+ alt
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+ Absolute or relative URL of the
+ image to be displayed for this
+ button. If specified, this
+ "input" element will be of type
+ "image". Otherwise, it will be
+ of the type specified by the
+ "type" property with a label
+ specified by the "value"
+ property. <span
+ class="changed_added_2_0">Note
+ that if the value of this
+ attribute starts with "/", the
+ rendered value for this
+ attribute will be prefixed with
+ the context-root for this
+ application.</span>
+ </p>]]>
+ </description>
+ <name>
+ image
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Type of button to create. Valid values are "submit", "button",
+ and "reset". If not specified, or not a valid value, the default
+ value is "submit".]]>
+ </description>
+ <name>
+ type
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p><span
+ class="changed_modified_2_0">Render</span> an HTML "a" anchor
+ element that acts like a form submit button when
+ clicked.</p>
+
+ <p>General Behaviour</p>
+
+ <p>Both the encode and decode behavior require the ability to get
+ the id/name for a hidden field, <span
+ class="changed_added_2_0">which may be rendered in markup or which
+ may be programmatically added via client DOM manipulation</span>,
+ whose value is set by the JavaScript form submit. This name must
+ be constructed as follows:</p>
+
+ <ul>
+
+ <li><p>Get the clientId for the form of which this component is a
+ child.</p></li>
+
+ <li><p>Append
+ <code>NamingContainer.SEPARATOR_CHAR</code>.</p></li>
+
+ <li><p>Append a constant string that is the same for all command
+ link components in the tree.</p></li>
+
+ </ul>
+
+ <p>In the following text, this String is called
+ hiddenFieldName.</p>
+
+ <p>Decode Behavior</p>
+
+ <ul>
+
+ <p>Obtain the "clientId" property of the component. Obtain the
+ <code>Map</code> from the "requestParameterMap" property of the
+ <code>ExternalContext</code>. Derive hiddenFieldName as above.
+ Get the entry in the <code>Map</code> under the key that is the
+ hiddenFieldName. If the there is no entry, or the entry is the
+ empty String, or the entry is not equal to the value of the
+ "clientId" property, return immediately. If there is an entry,
+ and its value is equal to the value of the "clientId" property,
+ create a new <code>javax.faces.event.ActionEvent</code> instance
+ around the component and call <code>queueActionEvent()</code> on
+ the component, passing the event.</p>
+
+ </ul>
+
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>If the value of the <code>disabled</code> attribute is
+ <code>true</code>, render a span element. Render all the passthru
+ attributes and the <code>target</code> attribute as pass-through
+ attributes on the span, even though the <code>target</code>
+ attribute will have no effect on a span. Render the current value
+ of the component as the content of the span. Return.</p>
+
+ <p>If the <code>disabled</code> attribute is not present, or its
+ value is <code>false</code>, render an HTML <code>a</code>
+ element. Render "#" as the value of the "href" attribute. Render
+ the current value of the component as the link text if it is
+ specified. Render JavaScript that is functionally equivalent to
+ the following as the value of the "onclick" attribute:</p>
+
+ <p><code>document.forms['CLIENT_ID']['hiddenFieldName'].value='CLIENT_ID';
+ document.forms['CLIENT_ID']['PARAM1_NAME'].value='PARAM1_VALUE';
+ document.forms['CLIENT_ID']['PARAM2_NAME'].value='PARAM2_VALUE';
+ return false;</code></p>
+
+ <p>document.forms['CLIENT_ID'].submit()" where hiddenFieldName is
+ as described above, CLIENT_ID is the clientId of the UICommand
+ component, PARAM*_NAME and PARAM*_VALUE are the names and values,
+ respectively, of any nested UIParameter children. The name and
+ the value must be URLEncoded. If an "onclick" attribute was
+ specified by the user, render this JavaScript in a function,
+ and render the user's JavaScript in a function. Render both functions
+ in a choice function as follows:</p>
+
+ <p><code>var a=function(){#USER_FUNCTION#};
+ var b=function(){#JSF_FUNCTION#};
+ return (a()==false) ? false : b();</code></p>
+ <p>where #USER_FUNCTION# is the user's JavaScript and
+ #JSF_FUNCTION# is the JavaScript rendered by JSF. The choice
+ function should operate such that if the user's JavaScript returns
+ true, then the rendered JavaScript will also execute.</p>
+ <p>If the "styleClass" attribute is specified, render its value as
+ the value of the "class" attribute. Render any non-UIParameter
+ output children as normal inside of the "a" element. These will
+ appear as the link text. Allow the form renderer to output a
+ single "input" element (for the entire page, regardless of how
+ many command link components are in the page) of "type" "hidden"
+ whose "name" is the value of hiddenFieldName, and which must not
+ have a "value" attribute. Multiple occurrences of command link
+ components in the tree should not cause multiple hiddenFieldName
+ hidden fields. Allow the form renderer to output an "input"
+ element of "type" "hidden" for each of the nested UIParameter
+ children, taking the name property (but not the value) from each
+ one in turn. If the "disabled" attribute is specified, do not
+ render the HTML "a" anchor element or its "href" attribute.
+ Instead, render a "span" element. If the "styleClass" attribute
+ is specified, render its value as the value of the "class"
+ attribute on the "span". Render any pass-through attributes on
+ the "span". The content of the span element comes from the value
+ of the component or its children as specified above.</p>
+
+ <p>If the user specified a <code>target</code> attribute, its
+ value must be set using javascript since the <code>onclick</code>
+ handler will prevent the target attribute from being generated.
+ This must be accomplished using JavaScript that is equivalent to
+ the following.</p>
+
+ <p><code>document.forms['CLIENT_ID'].target='TARGET';</code></p>
+
+ <p>Where TARGET is the value of the target attribute on the JSP
+ tag.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ commandLink
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.CommandLinkTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing the application action to invoke
+ when this component is activated by the user. The expression
+ must evaluate to a public method that takes no parameters, and
+ returns an Object (the toString() of which is called to derive
+ the logical outcome) which is passed to the NavigationHandler
+ for this application.]]>
+ </description>
+ <name>
+ action
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ java.lang.Object action()
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing an action listener method that
+ will be notified when this component is activated by the user.
+ The expression must evaluate to a public method that takes an
+ ActionEvent parameter, with a return type of void, <span
+ class="changed_added_2_0">or to a public method that takes no
+ arguments with a return type of void. In the latter case, the
+ method has no way of easily knowing where the event came from,
+ but this can be useful in cases where a notification is needed
+ that "some action happened".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ actionListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void actionListener(javax.faces.event.ActionEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that, if this component is activated by the user,
+ notifications should be delivered to interested listeners and actions
+ immediately (that is, during Apply Request Values phase) rather than
+ waiting until Invoke Application phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The character encoding of the resource designated
+ by this hyperlink.]]>
+ </description>
+ <name>
+ charset
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The position and shape of the hot spot on the screen
+ (for use in client-side image maps).]]>
+ </description>
+ <name>
+ coords
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never
+ receive focus or be included in a subsequent
+ submit.]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The language code of the resource designated
+ by this hyperlink.]]>
+ </description>
+ <name>
+ hreflang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The relationship from the current document
+ to the anchor specified by this hyperlink.
+ The value of this attribute is a space-separated
+ list of link types.]]>
+ </description>
+ <name>
+ rel
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A reverse link from the anchor specified
+ by this hyperlink to the current document.
+ The value of this attribute is a space-separated
+ list of link types.]]>
+ </description>
+ <name>
+ rev
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The shape of the hot spot on the screen
+ (for use in client-side image maps). Valid
+ values are: default (entire region); rect
+ (rectangular region); circle (circular region);
+ and poly (polygonal region).]]>
+ </description>
+ <name>
+ shape
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Name of a frame where the resource
+ retrieved via this hyperlink is to
+ be displayed.]]>
+ </description>
+ <name>
+ target
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The content type of the resource designated
+ by this hyperlink.]]>
+ </description>
+ <name>
+ type
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Renders an HTML "table" element compliant with the HTML 401
+ specification. Render the "caption" facet, if present, inside a
+ "caption" element immediately below the "table" element. If the
+ "captionClass" attribute is specified, render its value as the
+ value of the "class" attribute on the "caption" element. If the
+ "captionStyle" attribute is specified, render its value as the
+ value of the "style" attribute on the "caption" element.</p>
+ <p>Please consult the javadoc for <code>UIData</code> to
+ supplement this specification. If the "styleClass" attribute is
+ specified, render its value as the value of the "class" attribute
+ on the "table" element. Any pass-through attributes are also
+ rendered on the "table" element. </p>
+
+ <p>Column Groups</p>
+
+ <ul>
+
+ <p>If the <code>UIData</code> component has a "colgroups" facet,
+ render its contents. Consistent with the rules of facets in
+ general, this facet must have only one child. In general, this
+ will be a <code>panel group</code> component that will contain
+ <code>colgroup</code> and <code>col</code> elements per the HTML
+ Table specification. Use of column grouping can improve
+ accessibility. This facet must be rendered before the table
+ header and footer.</p>
+
+ </ul>
+
+ <p>Rendering the header</p>
+
+ <ul>
+
+ <p>If the <code>UIData</code> component has a "header" facet, or
+ any of the child <code>UIColumn</code> components has a "header"
+ facet, render a "thead" element. If the <code>UIData</code>
+ component has a "header" facet, encode its contents inside of "tr"
+ and "th" elements, respectively. Output the value of the
+ "headerClass" attribute of the <code>UIData</code> component, if
+ present, as the value of the "class" attribute on the "th".
+ Output the number of child <code>UIColumn</code> components of the
+ <code>UIData</code> component as the value of the "colspan"
+ attribute on the "th". Output "colgroup" as the value of the
+ "scope" attribute on the "th" element. </p>
+
+ <p>If any of the child <code>UIColumn</code> components has a
+ "header" facet render a "tr" element. For each
+ <code>UIColumn</code> that actually has a "header" facet, render
+ it inside of a "th" element. Columns that don't have a "header"
+ facet cause an empty "th" element to be rendered. Output the
+ value of the "headerClass" attribute of the <code>UIColumn</code>
+ component, if present, as the value of the "class" attribute on
+ the "th". If the "headerClass" attribute of the <code>UIColumn</code>
+ component is not present, output the value of the "headerClass"
+ attribute of the <code>UIData</code> component, if present, as
+ the value of the "class" attribute on the "th". Output "col" as
+ the value of the "scope" attribute on the "th" element.
+ </p>
+
+ <p>Close out the "thead" element.</p>
+
+ </ul>
+
+ <p>Rendering the footer</p>
+
+ <ul>
+
+ <p>Follow the same process as for the header, except replace
+ "header" with "footer", "th" with "td", "thead" with "tfoot", and
+ "headerClass" with "footerClass". Do not render any "scope"
+ attribute for the footer.</p>
+
+ </ul>
+
+ <p>Rendering the table body</p>
+
+ <ul>
+
+ <p>Look at the value of the "bodyrows" attribute. If present,
+ this must be a comma separated list of integers. Each entry in
+ this list is the row index of the row before which a "tbody"
+ element should be rendered.</p>
+
+ <p>If there was no "bodyrows" attribute, or it was empty, render a
+ "tbody" element. Keep track of the result of the "rows" property
+ on the <code>UIData</code> component. Keep track of the number of
+ rows we have rendered so far. Iterate through the rows. Set the
+ "rowIndex" property of the <code>UIData</code> component to be
+ correct as we iterate through the rows. Stop rendering children
+ and close out the "tbody" element if the "rowAvailable" property
+ of the <code>UIData</code> returned false. If the current row
+ index is contained in the "bodyrows" attribute, check if a "tbody"
+ start element was rendered that needs to be closed, and if so,
+ close the "tbody" element. Then render a "tbody" element start.
+ Otherwise, do not render a "tbody" element.</p>
+
+ <p>Output a "tr" element. Output the value of the "rowClasses"
+ per the attribute description below. For each
+ <code>UIColumn</code> child, if the column component has a
+ "rowHeader" attribute with a value of "true", output a "th"
+ element with a "scope" attribute with the value of "row".
+ Otherwise, if the column component has no "rowHeader" attribute,
+ or its value is false, output a "td" element. In either case
+ attach the value of the "columnClasses" attribute of the
+ <code>UIData</code> component per the attribute description below.
+ Recursively encode each child of each <code>UIColumn</code> child.
+ Close out the "td" or "th" element. When done with the row, close
+ out the "tr" element. When done with all the rows, close out the
+ "tbody" element.</p>
+
+ </ul>
+
+ <p>When done rendering all the rows, set the "rowIndex" property of
+ the <code>UIData</code> to -1, and close out the "table"
+ element.</p>]]>
+ </description>
+ <name>
+ dataTable
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.DataTableTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Zero-relative row number of the first row to be displayed. If this
+ property is set to zero, rendering will begin with the first row of
+ the underlying data.]]>
+ </description>
+ <name>
+ first
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The number of rows to display, starting with the one identified by the
+ "first" property. If this value is set to zero, all available rows in
+ the underlying data model will be displayed.]]>
+ </description>
+ <name>
+ rows
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Name of a request-scope attribute under which the model data for the
+ row selected by the current value of the "rowIndex" property (i.e.
+ also the current value of the "rowData" property) will be exposed.]]>
+ </description>
+ <name>
+ var
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ false
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Name or code of the background color for this table.]]>
+ </description>
+ <name>
+ bgcolor
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Comma separated list of row indices for which a new
+ "tbody" element should be started (and any
+ previously opened one should be ended).]]>
+ </description>
+ <name>
+ bodyrows
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Width (in pixels) of the border to be drawn
+ around this table.]]>
+ </description>
+ <name>
+ border
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any caption generated for this table.]]>
+ </description>
+ <name>
+ captionClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this caption is rendered.]]>
+ </description>
+ <name>
+ captionStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Definition of how much space the user agent should
+ leave between the border of each cell and its contents.]]>
+ </description>
+ <name>
+ cellpadding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Definition of how much space the user agent should
+ leave between the left side of the table and the
+ leftmost column, the top of the table and the top of
+ the top side of the topmost row, and so on for the
+ right and bottom of the table. It also specifies
+ the amount of space to leave between cells.]]>
+ </description>
+ <name>
+ cellspacing
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Comma-delimited list of CSS style classes that will be applied
+ to the columns of this table. A space separated list of
+ classes may also be specified for any individual column. If
+ the number of elements in this list is less than the number of
+ actual column children of the UIData, no "class"
+ attribute is output for each column greater than the number of
+ elements in the list. If the number of elements in the list
+ is greater than the number of actual column children of the
+ UIData, the elements at the posisiton in the list
+ after the last column are ignored.]]>
+ </description>
+ <name>
+ columnClasses
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any footer generated for this table.]]>
+ </description>
+ <name>
+ footerClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code specifying which sides of the frame surrounding
+ this table will be visible. Valid values are:
+ none (no sides, default value); above (top side only);
+ below (bottom side only); hsides (top and bottom sides
+ only); vsides (right and left sides only); lhs (left
+ hand side only); rhs (right hand side only); box
+ (all four sides); and border (all four sides).]]>
+ </description>
+ <name>
+ frame
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any header generated for this table.]]>
+ </description>
+ <name>
+ headerClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Comma-delimited list of CSS style classes that will be applied
+ to the rows of this table. A space separated list of classes
+ may also be specified for any individual row. Thes styles are
+ applied, in turn, to each row in the table. For example, if
+ the list has two elements, the first style class in the list
+ is applied to the first row, the second to the second row, the
+ first to the third row, the second to the fourth row, etc. In
+ other words, we keep iterating through the list until we reach
+ the end, and then we start at the beginning again.]]>
+ </description>
+ <name>
+ rowClasses
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code specifying which rules will appear between cells
+ within this table. Valid values are: none (no rules,
+ default value); groups (between row groups); rows
+ (between rows only); cols (between columns only); and
+ all (between all rows and columns).]]>
+ </description>
+ <name>
+ rules
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Summary of this table's purpose and structure, for
+ user agents rendering to non-visual media such as
+ speech and Braille.]]>
+ </description>
+ <name>
+ summary
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Width of the entire table, for visual user agents.]]>
+ </description>
+ <name>
+ width
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<span class="changed_modified_2_0">
+ Renders</span> an HTML "form" element.
+
+ <p>Decode Behavior</p>
+
+ <ul>
+
+ <p>Obtain the <code>Map</code> from the "requestParameterMap"
+ property of the <code>ExternalContext</code>. If the map contains
+ an entry for the "clientId" of this <code>UIForm</code> component,
+ call <code>setSubmitted(true)</code> on the form, otherwise call
+ <code>setSubmitted(false)</code> on the form.</p>
+
+ </ul>
+
+
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>The value of the "method" attribute must be "post". The value
+ of the "action" attribute must be the result of passing the view
+ identifier of the current view to the <code>getActionURL()</code>
+ method of the <code>ViewHandler</code> for this application, then
+ passing that String to the <code>encodeActionURL()</code> method
+ on the <code>ExternalContext</code>. The value of the acceptcharset
+ attribute must be rendered as the value of "accept-charset".
+ If the "styleClass" attribute is specified, render its value as the
+ value of the "class" attribute. Render a "name"
+ attribute with a value the same as the "id" attribute as described
+ in "<a href="../../../renderkitdocs/HTML_BASIC/renderkit-summary.html#general_encoding">General Notes on
+ Encoding</a>" regarding the "id" attribute for UIInput
+ components. <p class="changed_added_2_0">Obtain the <code>UIViewRoot view identifier</code> and
+ use it to obtain an <code>action URL</code> by calling <code>ViewHandler.getActionURL</code>.
+ Use the <code>action URL</code> to obtain an <code>encoded action URL</code> by calling
+ <code>ExternalContext.encodeActionURL</code>. Obtain an
+ <code>encoded partial action URL</code> by calling
+ <code>ExternalContext.encodePartialActionURL</code> using <code>action URL</code> as the argument.
+ Compare the result from <code>ExternalContext.encodePartialActionURL</code> with the
+ value from <code>ExternalContext.encodeActionURL()</code>. If they are different,
+ render a hidden field with the name <code>javax.faces.encodedURL</code> and the value
+ of this hidden field as the value from <code>ExternalContext.encodePartialActionURL</code>.</p>
+ Call <code>ViewHandler.writeState()</code>
+ before the the close of the "form" element. Render all the
+ necessary hidden fields for all commandLink instances in the page
+ just before the close of the "form" element.
+ <div class="changed_modified_2_0">
+ Just before rendering the closing <code></form></code> element tag, render
+ any resources that have been targeted for this form:
+ <ul>
+ <li>Obtain a <code>UIViewRoot</code> instance.</li>
+ <li>Obtain a <code>List</code> of component resources targeted for
+ this form with a call to <code>UIViewRoot.getComponentResources()</code>
+ with the <code>String "form"</code> as the argument.</li>
+ <li>Iterate over the returned <code>List</code> of <code>UIComponent</code> instances
+ and call <code>encodeAll</code> on each <code>UIComponent</code> instance.
+ </ul>
+ </div>
+ </p>
+ </ul>
+ </div>]]>
+ </description>
+ <name>
+ form
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.FormTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this form should prepend its id
+ to its descendent's id during the clientId generation process.
+ If this flag is not set, the default value is true.]]>
+ </description>
+ <name>
+ prependId
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[List of content types that a server processing this form
+ will handle correctly]]>
+ </description>
+ <name>
+ accept
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[List of character encodings for input data
+ that are accepted by the server processing
+ this form.]]>
+ </description>
+ <name>
+ acceptcharset
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Content type used to submit the form to the server. If not
+ specified, the default value is "application/x-www-form-urlencoded".]]>
+ </description>
+ <name>
+ enctype
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this form is reset.]]>
+ </description>
+ <name>
+ onreset
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this form is submitted.]]>
+ </description>
+ <name>
+ onsubmit
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Name of a frame where the response
+ retrieved after this form submit is to
+ be displayed.]]>
+ </description>
+ <name>
+ target
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p><span
+ class="changed_modified_2_0">Renders</span> an HTML "img"
+ element. Render the clientId as the value of the "id"
+ attribute.</p>
+
+ <div class="changed_modified_2_0">
+
+ <p>Handling the Value</p>
+
+ <ul>
+
+ <p>If the "name" attribute is present, execute algorithm <a
+ href="javax.faces.Outputjavax.faces.resource.Script.html#ResourceCommonGetResource">Common Algorithm for Obtaining A Resource to Render</a> to obtain a <code>Resource</code> instance. Call
+ <code>Resource.getRequestPath()</code> and output the result as the
+ value of the "src" attribute on the rendered markup.</p>
+
+ <p>Otherwise, if the "url" attribute is present, treat its value as
+ if it was the value of the "value" attribute. Otherwise, if the
+ "value" attribute is present, render the value of the component as
+ the value of the "src" attribute, after passing it to the
+ <code>getResourceURL()</code> method of the <code>ViewHandler</code>
+ for this application, and passing the result through the
+ <code>encodeResourceURL()</code> method of the
+ <code>ExternalContext</code>.</p>
+
+ <p>When handling the "src" attribute,
+ the value must not be escaped. For example, <code>&</code> must not
+ be turned into <code>&amp;</code>. If the "styleClass"
+ attribute is specified, render its value as the value of the "class"
+ attribute.</p>
+
+ </ul>
+
+ </div>]]>
+ </description>
+ <name>
+ graphicImage
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.GraphicImageTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Context-relative URL to retrieve the resource associated with
+ this component. This is an alias for the "value" property.]]>
+ </description>
+ <name>
+ url
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Alternate textual description of the
+ element rendered by this component.]]>
+ </description>
+ <name>
+ alt
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Override for the height of this image.]]>
+ </description>
+ <name>
+ height
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this image is to be used as a server side
+ image map. Such an image must be enclosed within a hyperlink
+ ("a"). A value of false causes no attribute to be rendered,
+ while a value of true causes the attribute to be rendered as
+ ismap="ismap".]]>
+ </description>
+ <name>
+ ismap
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<div class="changed_added_2_0"><p>The <em>libraryName</em> for this resource.</p></div>]]>
+ </description>
+ <name>
+ library
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[URI to a long description of the image
+ represented by this element.]]>
+ </description>
+ <name>
+ longdesc
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<div class="changed_added_2_0"><p>The <em>resourceName</em> for this resource.</p></div>]]>
+ </description>
+ <name>
+ name
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The name of a client side image map (an HTML "map"
+ element) for which this element provides the image.]]>
+ </description>
+ <name>
+ usemap
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Override for the width of this image.]]>
+ </description>
+ <name>
+ width
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Renders an HTML "input" element of type
+ "hidden".</p>
+
+ <p>Decode Behavior</p>
+
+ <ul>
+
+ <p>See the decode description for the <a
+ href="javax.faces.Inputjavax.faces.Text.html#encode">Input
+ Text</a> renderer.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>Render the clientId of the component as the value of the
+ "name" attribute. Render the current value of the component as
+ the value of the "value" attribute.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ inputHidden
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.InputHiddenTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Renders an HTML "input" element of "type" "password".</p>
+
+ <p>Decode Behavior</p>
+
+ <ul>
+
+ <p>See the decode description for the <a
+ href="javax.faces.Inputjavax.faces.Text.html#encode">Input
+ Text</a> renderer.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>
+ Render the clientId of the component as the value of the "name"
+ attribute. Render the current value of the component as the value
+ of the "value" attribute, if and only if the "redisplay" component
+ attribute is the string "true". If the "styleClass" attribute is
+ specified, render its value as the value of the "class"
+ attribute.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ inputSecret
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.InputSecretTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Alternate textual description of the
+ element rendered by this component.]]>
+ </description>
+ <name>
+ alt
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[If the value of this attribute is "off", render "off" as the value
+ of the attribute. This indicates that the browser should
+ disable its autocomplete feature for this component. This is
+ useful for components that perform autocompletion and do not
+ want the browser interfering. If this attribute is not set or the value
+ is "on", render nothing.]]>
+ </description>
+ <name>
+ autocomplete
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The maximum number of characters that may
+ be entered in this field.]]>
+ </description>
+ <name>
+ maxlength
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that any existing value
+ in this field should be rendered when the
+ form is created. Because this is a potential
+ security risk, password values are not
+ displayed by default.]]>
+ </description>
+ <name>
+ redisplay
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The number of characters used to determine
+ the width of this field.]]>
+ </description>
+ <name>
+ size
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Renders an HTML "input"
+ element of "type" "text".</p>
+
+ <p><a name="decode">Decode Behavior</a></p>
+
+ <ul>
+
+ <p>Obtain the <code>Map</code> from the "requestParameterMap"
+ property of the <code>ExternalContext</code>. If the
+ <code>Map</code> contains an entry for the "clientId" of the
+ component, pass the value of the entry to the
+ <code>setSubmittedValue()</code> method of the component, which
+ must be an instance of <code>EditableValueHolder</code>.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p> Render the clientId of the component as
+ the value of the "name" attribute. Render the current value of
+ the component as the value of the "value" attribute. If the
+ "styleClass" attribute is specified, render its value as the value
+ of the "class" attribute.
+ </p>
+
+ </ul>]]>
+ </description>
+ <name>
+ inputText
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.InputTextTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Alternate textual description of the
+ element rendered by this component.]]>
+ </description>
+ <name>
+ alt
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[If the value of this attribute is "off", render "off" as the value
+ of the attribute. This indicates that the browser should
+ disable its autocomplete feature for this component. This is
+ useful for components that perform autocompletion and do not
+ want the browser interfering. If this attribute is not set or the value
+ is "on", render nothing.]]>
+ </description>
+ <name>
+ autocomplete
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The maximum number of characters that may
+ be entered in this field.]]>
+ </description>
+ <name>
+ maxlength
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The number of characters used to determine
+ the width of this field.]]>
+ </description>
+ <name>
+ size
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Renders an HTML "textarea" element.</p>
+
+ <p>Decode Behavior</p>
+
+ <ul>
+
+ <p>See the encode description for the <a
+ href="javax.faces.Inputjavax.faces.Text.html#encode">Input
+ Text</a> renderer.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p> Render the
+ clientId as the value of the "name" attribute. Render the current
+ valu eof the component inside the "textarea"
+ element.</p> </ul>]]>
+ </description>
+ <name>
+ inputTextarea
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.InputTextareaTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The number of columns to be displayed.]]>
+ </description>
+ <name>
+ cols
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The number of rows to be displayed.]]>
+ </description>
+ <name>
+ rows
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Render a single message for a specific component.</p>
+
+ <p>Set-up for Rendering</p>
+
+ <ul>
+
+ <p>Obtain the "summary" and "detail" properties from
+ <code>UIMessage</code> component. If not present, keep the
+ empty string as the value, respectively. Obtain the first
+ <code>FacesMessage</code> to render from the component, using
+ the "for" property of the <code>UIMessage</code>. This will be
+ the only message we render. Obtain the severity style for this
+ message. If the severity of the message is
+ <code>FacesMessage.SEVERITY_INFO</code>, the severity style
+ comes from the value of the "infoStyle" attribute. If the
+ severity of the message is
+ <code>FacesMessage.SEVERITY_WARN</code>, the severity style
+ comes from the value of the "warnStyle" attribute, and so on for
+ each of the severities, <code>INFO, WARN, ERROR</code> and
+ <code>FATAL</code>. The same rules apply for obtaining the
+ severity style class, but instead of "infoStyle, warnStyle", etc
+ use "infoClass, warnClass", etc. Obtain the "style",
+ "styleClass" and "layout" attributes from the
+ <code>UIMessage</code> component. If we have a "style"
+ attribute and a severity style attribute, use the severity style
+ attribute as the value of the "style" attribute. If we have no
+ "style" attribute, but do have a severity style, use the
+ severity style as the value of the "style" attribute. The same
+ precedence rules apply for the style class. Obtain the value of
+ the <code>dir</code> and <code>lang</code> attributes.</p>
+
+ </ul>
+
+ <p>Rendering</p>
+
+ <ul>
+
+ <p>For the message renderer, we only render one row, for the first
+ message. For the messages renderer, we render as many rows as we
+ have messages. If any of the "dir", "lang", "style" or
+ "styleClass" attributes has a non-null value (as determined
+ above), render a "span" element, outputting the value of the
+ "style" attribute as the the value of the "style" attribute, and
+ outputting the value of the "styleClass" attribute as the value of
+ the "class" attribute on the "span" element. Output the "dir" and
+ "lang" attributes as well, if they are present. If the
+ <code>UIMessage</code> has a "tooltip" attribute with the value of
+ "true", and the <code>UIMessage</code> has "showSummary" and
+ "showDetail" properties with the value "true", if we haven't
+ already written out the "span", output the "summary" as the value
+ of the "title" attribute on the "span". If we haven't already
+ written out a "title" attribute, and "showSummary" is true, output
+ the summary. If "showDetail" is true, output the detail. Close
+ out the span if necessary.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ message
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.MessageTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Client identifier of the component for which to display messages.]]>
+ </description>
+ <name>
+ for
+ </name>
+ <required>
+ true
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether the detail portion of displayed messages
+ should be included. Default value is "true".]]>
+ </description>
+ <name>
+ showDetail
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether the summary portion of displayed messages
+ should be included. Default value is "false".]]>
+ </description>
+ <name>
+ showSummary
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "ERROR".]]>
+ </description>
+ <name>
+ errorClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "ERROR".]]>
+ </description>
+ <name>
+ errorStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "FATAL".]]>
+ </description>
+ <name>
+ fatalClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "FATAL".]]>
+ </description>
+ <name>
+ fatalStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "INFO".]]>
+ </description>
+ <name>
+ infoClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "INFO".]]>
+ </description>
+ <name>
+ infoStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether the detail portion of the
+ message should be displayed as a tooltip.]]>
+ </description>
+ <name>
+ tooltip
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "WARN".]]>
+ </description>
+ <name>
+ warnClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "WARN".]]>
+ </description>
+ <name>
+ warnStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p><span class="changed_modified_2_0">The</span> same as for the
+ Message renderer, but output all the messages. <span
+ class="changed_added_2_0">If an "id" attribute has been specified,
+ it must be rendered on the outermost markup corresponding to this
+ component.</span> If the value of the "layout" attribute is
+ "table", render nested "table", "tr", and "td" elements, in that
+ order. If the value of the "layout" attribute is "list", or the
+ "layout" attribute is not specified, render nested "ul", "li"
+ elements, in that order. Output the value of the "style" attribute
+ as the value of the "style" attribute, output the value of the
+ "styleClass" attribute as the value of the "class" attribute, and
+ output the dir and lang attributes. Output these values on the
+ "table" element or the "ul" element. Output the values of the
+ "errorStyle", "fatalStyle", "infoStyle", "warnStyle" attributes as
+ the value of the "style" attribute on either the "tr" element or
+ the "li" element. Output the values of the "errorClass",
+ "fatalClass", "infoClass", "warnClass" attributes as the value of
+ the "class" attribute on either the "tr" element or the "li"
+ element. The component is a <code>UIMessages</code>, and there is
+ no "for" attribute. Therefore, use either <code>null</code> to
+ obtain the messages from the <code>FacesContext</code> or the empty
+ string if the components "globalOnly" property is
+ <code>true</code>. If the layout was "table" close out the table
+ elements, otherwise, close out the list elements.</p>]]>
+ </description>
+ <name>
+ messages
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.MessagesTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Client identifier of the component for which to display messages. This
+ attribute is mutually exclusive with globalOnly and take precedence
+ if used.]]>
+ </description>
+ <name>
+ for
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that only global messages (that is, messages not
+ associated with any client identifier) are to be displayed.
+ Default value is "false".]]>
+ </description>
+ <name>
+ globalOnly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether the detail portion of displayed messages
+ should be included. Default value is "false".]]>
+ </description>
+ <name>
+ showDetail
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether the summary portion of displayed messages
+ should be included. Default value is "true".]]>
+ </description>
+ <name>
+ showSummary
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "ERROR".]]>
+ </description>
+ <name>
+ errorClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "ERROR".]]>
+ </description>
+ <name>
+ errorStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "FATAL".]]>
+ </description>
+ <name>
+ fatalClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "FATAL".]]>
+ </description>
+ <name>
+ fatalStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "INFO".]]>
+ </description>
+ <name>
+ infoClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "INFO".]]>
+ </description>
+ <name>
+ infoStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The type of layout markup to use when rendering
+ error messages. Valid values are "table" (an HTML
+ table) and "list" (an HTML list). If not specified,
+ the default value is "list".]]>
+ </description>
+ <name>
+ layout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether the detail portion of the
+ message should be displayed as a tooltip.]]>
+ </description>
+ <name>
+ tooltip
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to any message
+ with a severity class of "WARN".]]>
+ </description>
+ <name>
+ warnClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to apply to any message
+ with a severity class of "WARN".]]>
+ </description>
+ <name>
+ warnStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Render parameterized text. Obtain the
+ <code>style</code>, <code>styleClass</code>, <code>dir</code>, and
+ <code>lang</code> attributees from this component. If any are
+ present, render a "span" element. Output the
+ <code>styleClass</code> attribute (if present) as the value of the
+ <code>class</code> attribute. Output the <code>style</code>
+ attribute as the value of the <code>style</code> attribute.
+ Output the <code>dir</code> and <code>lang</code> attributes as
+ pass through attributes. Accrue a list of the values of all child
+ <code>UIParameter</code> components of this component. If there
+ are one or more accumulated parameter values, convert the list of
+ parameter values to an <code>Object</code> array, call
+ <code>MessageFormat.format()</code>, passing the
+ <code>value</code> of this component as the first argument, and
+ the array of parameter values as the second argument, and render
+ the result. Otherwise, render the <code>value</code> of this
+ component unmodified.</p>]]>
+ </description>
+ <name>
+ outputFormat
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.OutputFormatTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that characters that are sensitive
+ in HTML and XML markup must be escaped. This flag
+ is set to "true" by default.]]>
+ </description>
+ <name>
+ escape
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[Renders an HTML "label" element. Render the current value
+ of the component as label text if it is specified. If a "for" attribute is
+ specified, find the component specified by the value of the "for"
+ attribute, and render its client id as the value of the "for" attribute.
+ If "styleClass" attribute is specified, render its value as the value
+ of the "class" attribute.]]>
+ </description>
+ <name>
+ outputLabel
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.OutputLabelTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that characters that are sensitive
+ in HTML and XML markup must be escaped. If omitted, this
+ flag is assumed to be "true".]]>
+ </description>
+ <name>
+ escape
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Client identifier of the component for which this element
+ is a label.]]>
+ </description>
+ <name>
+ for
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[Render an HTML "a" anchor element. The value of the
+ component is rendered as the value of the "href" attribute. Any
+ child UIParameter components are appended to the String to be
+ output as the value of the "href" attribute as query parameters
+ before rendering. The entire "href" string must be passed through
+ a call to the <code>encodeResourceURL()</code> method of the
+ <code>ExternalContext</code>. The name of the UIParameter goes on
+ the left hand side, and the value of the UIParameter on the right
+ hand side. The name and the value must be URLEncoded. Each
+ UIParameter instance is separeted by an ampersand, as dictated in
+ the URL spec. If the "styleClass" attribute is specified, render
+ its value as the value of the "class" attribute. If the "id" attribute
+ is specified, follow the same steps as mentioned in the
+ "<a href="../../../renderkitdocs/HTML_BASIC/renderkit-summary.html#general_encoding">General
+ Notes on Encoding</a>" regarding the "id" attribute for UIInput components.
+ If the "disabled" attribute is specified, do not render the HTML "a"
+ anchor element or the "href" element. Instead, render a "span" element.
+ If the "styleClass" attribute is specified, render its value as the value
+ of the "class" attribute on the "span". Render any pass-through attributes
+ on the "span".]]>
+ </description>
+ <name>
+ outputLink
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.OutputLinkTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The character encoding of the resource designated
+ by this hyperlink.]]>
+ </description>
+ <name>
+ charset
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The position and shape of the hot spot on the screen
+ (for use in client-side image maps).]]>
+ </description>
+ <name>
+ coords
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never
+ receive focus or be included in a subsequent
+ submit.]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The language code of the resource designated
+ by this hyperlink.]]>
+ </description>
+ <name>
+ hreflang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The relationship from the current document
+ to the anchor specified by this hyperlink.
+ The value of this attribute is a space-separated
+ list of link types.]]>
+ </description>
+ <name>
+ rel
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A reverse link from the anchor specified
+ by this hyperlink to the current document.
+ The value of this attribute is a space-separated
+ list of link types.]]>
+ </description>
+ <name>
+ rev
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The shape of the hot spot on the screen
+ (for use in client-side image maps). Valid
+ values are: default (entire region); rect
+ (rectangular region); circle (circular region);
+ and poly (polygonal region).]]>
+ </description>
+ <name>
+ shape
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Name of a frame where the resource
+ retrieved via this hyperlink is to
+ be displayed.]]>
+ </description>
+ <name>
+ target
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The content type of the resource designated
+ by this hyperlink.]]>
+ </description>
+ <name>
+ type
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[If the "styleClass", "style", "dir" or "lang"
+ attributes are present, render a "span" element. If the
+ "styleClass" attribute is present, render its value as the value
+ of the "class" attribute. If the "style" attribute is present,
+ pass it thru. If the "escape" attribute is not present, or it is
+ present and its value is "true" all angle brackets should be
+ converted to the ampersand xx semicolon syntax when rendering the
+ value of the "value" attribute as the value of the component. If
+ the "escape" attribute is present and is "false" the value of the
+ component should be rendered as text without escaping.]]>
+ </description>
+ <name>
+ outputText
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.OutputTextTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that characters that are sensitive in HTML and XML markup must be escaped. This flag
+ is set to "true" by default.]]>
+ </description>
+ <name>
+ escape
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[Renders an HTML "table" element, conforming to the
+ rules in the HTML 401 specification. Render the "caption" facet,
+ if present, inside a "caption" element immediately below the "table" element.
+ If the "captionClass" attribute is specified, render its value as the value
+ of the "class" attribute on the "caption" element. If the "captionStyle" attribute
+ is specified, render its value as the value of the "style" attribute
+ on the "caption" element. If the "styleClass" attribute is specified, render
+ its value as the value of the "class" attribute. Render the pass-through
+ attributes in the table below. Render the "header" facet, if present, inside of
+ "thead", "tr", and "th" elements, nested in that order. If the
+ "headerClass" attribute is specifed, render its value as the value
+ of the "class" attribute on the "th" element. Render "colgroup"
+ as the value of the "scope" attribute. Render the value of the
+ "columns" attribute as the value of the "colspan" attribute on the
+ "th" element. Render the "footer" facet if present, using similar
+ logic to the rendering of the "header", but replacing "thead" with
+ "tfoot", "th" with "td", and "headerClass" with "footerClass".
+ Render the children of the <code>UIPanel</code> component inside
+ of a "tbody" element. Render the children based on the value of
+ the "columns" attribute, creating a new row each time a "columns"
+ worth of children have been rendered. For the start of each row,
+ render a "tr" element. Output the value of the "rowClasses" per
+ the attribute description below. For each child, output a "td"
+ element, attaching the value of the "columnClasses" attribute per
+ the attribute description below. Recursively encode each child.
+ Close out the "td" element. When done with the row, close out the
+ "tr" element. If a child has "rendered==false" it is not rendered,
+ and the column counter must not be incremented.]]>
+ </description>
+ <name>
+ panelGrid
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.PanelGridTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Name or code of the background color for this table.]]>
+ </description>
+ <name>
+ bgcolor
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Comma separated list of row indices for which a new
+ "tbody" element should be started (and any
+ previously opened one should be ended).]]>
+ </description>
+ <name>
+ bodyrows
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Width (in pixels) of the border to be drawn
+ around this table.]]>
+ </description>
+ <name>
+ border
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any caption generated for this table.]]>
+ </description>
+ <name>
+ captionClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this caption is rendered.]]>
+ </description>
+ <name>
+ captionStyle
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Definition of how much space the user agent should
+ leave between the border of each cell and its contents.]]>
+ </description>
+ <name>
+ cellpadding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Definition of how much space the user agent should
+ leave between the left side of the table and the
+ leftmost column, the top of the table and the top of
+ the top side of the topmost row, and so on for the
+ right and bottom of the table. It also specifies
+ the amount of space to leave between cells.]]>
+ </description>
+ <name>
+ cellspacing
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Comma-delimited list of CSS style classes that will be applied
+ to the columns of this table. A space separated list of
+ classes may also be specified for any individual column. If
+ the number of elements in this list is less than the number of
+ actual column children of the UIData, no "class"
+ attribute is output for each column greater than the number of
+ elements in the list. If the number of elements in the list
+ is greater than the number of actual column children of the
+ UIData, the elements at the posisiton in the list
+ after the last column are ignored.]]>
+ </description>
+ <name>
+ columnClasses
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The number of columns to render before
+ starting a new row.]]>
+ </description>
+ <name>
+ columns
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any footer generated for this table.]]>
+ </description>
+ <name>
+ footerClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code specifying which sides of the frame surrounding
+ this table will be visible. Valid values are:
+ none (no sides, default value); above (top side only);
+ below (bottom side only); hsides (top and bottom sides
+ only); vsides (right and left sides only); lhs (left
+ hand side only); rhs (right hand side only); box
+ (all four sides); and border (all four sides).]]>
+ </description>
+ <name>
+ frame
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any header generated for this table.]]>
+ </description>
+ <name>
+ headerClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Comma-delimited list of CSS style classes that will be applied
+ to the rows of this table. A space separated list of classes
+ may also be specified for any individual row. Thes styles are
+ applied, in turn, to each row in the table. For example, if
+ the list has two elements, the first style class in the list
+ is applied to the first row, the second to the second row, the
+ first to the third row, the second to the fourth row, etc. In
+ other words, we keep iterating through the list until we reach
+ the end, and then we start at the beginning again.]]>
+ </description>
+ <name>
+ rowClasses
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code specifying which rules will appear between cells
+ within this table. Valid values are: none (no rules,
+ default value); groups (between row groups); rows
+ (between rows only); cols (between columns only); and
+ all (between all rows and columns).]]>
+ </description>
+ <name>
+ rules
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Summary of this table's purpose and structure, for
+ user agents rendering to non-visual media such as
+ speech and Braille.]]>
+ </description>
+ <name>
+ summary
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Width of the entire table, for visual user agents.]]>
+ </description>
+ <name>
+ width
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[Intended for use in situations when only one
+ UIComponent child can be nested, such as in the case of facets.
+ If the "style" or "styleClass" attributes are present, and the "layout"
+ attribute is present with a value of "block", render a "div" element,
+ outputting the value of the "style" attribute as the value of the
+ "style" attribute and the value of the "styleClass" attribute as the
+ value of the "class" attribute. Otherwise, if the "layout" attribute
+ is not present, or the "layout" attribute contains a value other than
+ "block", render a "span" element, outputting the value of the
+ "style" attribute as the value of the "style" attribute, and the value
+ of the "styleClass" attribute as the value of the "class"
+ attribute.]]>
+ </description>
+ <name>
+ panelGroup
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.PanelGroupTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The type of layout markup to use when rendering this group.
+ If the value is "block" the renderer must produce an HTML
+ "div" element. Otherwise HTML "span" element must
+ be produced.]]>
+ </description>
+ <name>
+ layout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" property on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Renders an HTML "input" element of type "checkbox".</p>
+
+ <p>Decode Behavior</p>
+
+ <ul>
+
+ <p>Obtain the <code>Map</code> from the "requestParameterMap"
+ property of the <code>ExternalContext</code>. If there is no
+ entry in the <code>Map</code> for the "clientId" of this
+ component, pass "false" to the <code>setSubmittedValue()</code>
+ method of the component, which must be an instance of
+ <code>EditableValueHolder</code>. If there is an entry, and its
+ value is equal, ignoring case and without quotes, to any of the
+ Strings: "on", "yes" or "true" pass true to the
+ <code>setSubmittedValue()</code> method of the component.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>
+ Render the clientId of the component as the value of the "name"
+ attribute. If the current value of the component is "true",
+ output the "checked" attribute (must be rendered as checked="checked").
+ If the "styleClass" attribute is specified, render its value as the value
+ of the "class" attribute.</p> </ul>]]>
+ </description>
+ <name>
+ selectBooleanCheckbox
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.SelectBooleanCheckboxTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p><span
+ class="changed_modified_2_0">Render</span> an HTML checkbox
+ list.</p>
+
+ <p><a name="decode">Decode Behavior</a></p>
+
+ <ul>
+
+ <p>See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#decodeMany">"Decode
+ Behavior for UISelectMany Components"</a> section.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+ <p>Render a "table" element. If the "styleClass" is specified,
+ render the value of the "styleClass" attribute as the value of the
+ "class" attribute on the "table" element. If the "style", or"border" attributes are specified, pass them thru <span
+ class="changed_added_2_0">and render their values as the "style"
+ and "border" attributes on the "table", respectively.</span> If
+ the "layout" attribute is specified, and its value is
+ "pageDirection", render the children elements vertically,
+ otherwise horizontally, in the table. If any of the children are
+ an instance of SelectItemGroup, render them as a nested table.
+ Each of the children are ultimately rendererd as follows. Render
+ an "input" element of "type" "checkbox" for each child component.
+ Render the "name" attribute on the "input" element with the value
+ of the <code>clientId</code> of the component. Render an "id"
+ attribute on the "input" element. Each "id" value must be unique.
+ If the current SelectItem.isDisabled() returns true, render
+ "disabled" as the value of the "disabled" attribute. Close out
+ the "input" element. Render a "label" element. Render the "for"
+ attribute of the "label" element whose value is the corresponding
+ "input" element's "id" value. Render any "style" as the "class"
+ attribute on the "label" element. <span
+ class="changed_added_2_0">If the current checkbox would be
+ rendered as being checked, and there is a "selectedClass"
+ attribute, append a space, followed by the value of the
+ "selectedClass" attribute to any existing "class" attribute value
+ on the label element. Otherwise, render the value of the
+ "selectedClass" attribute as the value of the "class" attribute on
+ the label element. If the current checkbox would be rendered as
+ being not checked, and there is a "unselectedClass" attribute,
+ append a space, followed by the value of the "unselectedClass"
+ attribute to any existing "class" attribute value on the label
+ element. Otherwise, render the value of the "unselectedClass"
+ attribute as the value of the "class" attribute on the label
+ element.</span> Close out the starting "label" element and render
+ the label value from SelectItem.getLabel(). Close out the "label"
+ element. As an exception to the general rules about how to handle
+ the "id" attribute, render it as an attribute on the outer "table"
+ element, the value of which is the <code>clientId</code> of the
+ component per the rules at the beginning of this specification.
+ The value of the current SelectItem is rendered as the value of
+ the "value" attribute. Coerce the value of the currently rendered
+ child to the type of the parent UISelectMany value following the
+ Expression Language coercion rules, before comparing the values.
+ If the value of the enclosing UISelectMany matches the current
+ value, render "checked" as the value of the "checked" attribute.
+ See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#options">"Rendering
+ the option elements" </a> specification for
+ <code>ListboxRenderer</code> for more detail on how to render the
+ "option" elements in this renderer.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ selectManyCheckbox
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.SelectManyCheckboxTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Width (in pixels) of the border to be drawn
+ around the table containing the options list.]]>
+ </description>
+ <name>
+ border
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0"> Optional
+ attribute that is a literal string that is the fully qualified
+ class name of a concrete class that implements
+ <code>java.util.Collection</code>, or an EL expression that
+ evaluates to either 1. such a String, or 2. the
+ <code>Class</code> object itself. </p>]]>
+ </description>
+ <name>
+ collectionType
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on disabled options.]]>
+ </description>
+ <name>
+ disabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on enabled options.]]>
+ </description>
+ <name>
+ enabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0">
+ Flag indicating that, if this component is activated by the user,
+ The "no selection option", if any, must be hidden.</p>]]>
+ </description>
+ <name>
+ hideNoSelectionOption
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Orientation of the options list to be created.
+ Valid values are "pageDirection" (list is laid
+ out vertically), or "lineDirection" (list is
+ laid out horizontally). If not specified, the
+ default value is "lineDirection".]]>
+ </description>
+ <name>
+ layout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on selected options.]]>
+ </description>
+ <name>
+ selectedClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on unselected options.]]>
+ </description>
+ <name>
+ unselectedClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p><span
+ class="changed_modified_2_0">Render</span> an HTML option
+ list.</p>
+
+ <p>Decode Behavior</p>
+
+ <p>This section documents the decode behavior for all renderers
+ that handle <code>UISelectMany</code> or <code>UISelectOne</code>
+ components.</p>
+
+ <ul>
+
+ <p><a name="decodeMany">Decode Behavior for
+ <code>UISelectMany</code> components</a></p>
+
+ <ul>
+
+ <p>Obtain the <code>Map</code> from the
+ "requestParameterValuesMap" property of the
+ <code>ExternalContext</code>. If the <code>Map</code> contains
+ an entry for the "clientId" of the component, pass the value of
+ the entry, cast to a <code>String []</code>, to the
+ <code>setSubmittedValue()</code> method of the component, which
+ must be an <code>EditableValueHolder</code>. If the
+ <code>Map</code> does not contain an entry, create an empty
+ <code>String</code> array and call
+ <code>setSubmittedValue()</code> with it.</p>
+
+ <p class="changed_modified_2_0">Please check the javadoc for <a
+ href="../../javadocs/javax/faces/component/UISelectMany.html#getConvertedvalue">UISelectMany.getConvertedValue()</a>
+ for additional requirements for renderers that render this kind
+ of component.</p>
+
+ </ul>
+
+ <p><a name="decodeOne">Decode Behavior for
+ <code>UISelectOne</code> components</a></p>
+
+ <ul>
+
+ <p>Obtain the <code>Map</code> from the "requestParameterMap"
+ property of the <code>ExternalContext</code>. If there is a
+ <code>Map</code> entry for the "clientId" property of the
+ component, pass it to the <code>setSubmittedValue()</code> method
+ of the component. <span class="changed_added_2_0">If the
+ <code>Map</code> does not contain an entry, call
+ <code>setSubmittedValue()</code> passing an empty
+ <code>String</code> as the argument.</span> </p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>Render an HTML "select" element. Render the clientId of
+ the component as the value of the "name" attribute. If the "styleClass"
+ attribute is specified, render its value as the value of the "class"
+ attribute on the "select" element. If the component is a
+ <code>UISelectMany</code> instance, render "multiple" as the value of the
+ "multiple" attribute. If the "size" attribute is specified, render its
+ value as the value of the "size" attribute. Otherwise use the number of
+ items as the value of the "size" attribute.</p>
+
+ </ul>
+
+ <p><a name="option">Rendering the "option" elements</a></p>
+
+ <ul>
+
+ <p>The only valid children of this component are
+ <code>UISelectItem</code> or <code>UISelectItems</code>
+ instances. Iterate over the children of this component, and accrue
+ a list of <code>javax.faces.model.SelectItem</code> instances.
+ <span class="changed_added_2_0">If the current child is a
+ <code>SelectItem</code> whose <code>noSelctionProperty</code> is
+ <code>true</code>, <b>and</b> the <code>UISelectOne</code> or
+ <code>UISelectMany</code> parent of this option has one or more
+ selected values that <b>are not</b> the "no selection"
+ <code>SelectItem</code>, <b>and</b> the component has a
+ "hideNoSelectionLabel" attribute whose value is <code>true</code>,
+ then the current option, which is the "no selection" option, must
+ not be rendered.</span> If the current child is a
+ <code>UISelectItem</code> create a <code>SelectItem</code>instance
+ from its <code>itemValue, itemLabel</code> and
+ <code>itemDescription</code> properties, add it to the list. If
+ the current child is a <code>UISelectItems</code> instance, call
+ its <code>getValue()</code> method. If the result is a
+ <code>SelectItem</code> bean, add it to the list. If the result
+ is an array of <code>SelectItem</code> beans, add each one to the
+ list. If the result is a <code>Collection</code> of
+ <code>SelectItem</code> beans, add each one to the list. If the
+ result is a <code>Map</code>, create a <code>SelectItem</code>
+ bean for each entry in the <code>Map</code> using the key as the
+ label, the value as the value, and <code>null</code> as the
+ description. Iterate over the list of <code>SelectItem</code>
+ beans. If the current element is a <code>SelectItemGroup</code>,
+ render an "optgroup" element with a "label" attribute, the value
+ of which is the "label" property from the current element, then
+ call <code>getSelectItems()</code> and render each element as
+ below. If the current element is not a
+ <code>SelectItemGroup</code>, render an "option" element. Follow
+ the conversion rules in the spec to obtain a renderable
+ <code>String</code> from the "value" property of the current
+ element, render that as the value of the "value" atribute. Now it
+ is time to see if the current element is the selected value. Call
+ its <code>getSubmittedValue()</code> method, casting the result to
+ an <code>Object []</code>, otherwise the component must be a
+ <code>UISelectOne</code> instance, call its
+ <code>getSubmittedValue()</code> method and create an <code>Object
+ []</code> around the result. Determine the type of the resultant
+ array if the resultant array is non-null, otherwise the type is
+ <code>String</code>. Coerce the current item value to this type
+ following the Expression Language coercion rules. If the
+ resultant array is non-null, we look in the array for a value
+ that, when we pass the renderable value to its
+ <code>equals()</code> method, it returns <code>true</code>,
+ meaning the current element is selected. If the resultant array
+ is <code>null</code>, if the component is a
+ <code>UISelectMany</code>, call its <code>getValue()</code>
+ method. If the result is a <code>List</code> obtain the values in
+ the list as an array. Otherwise, the component must be a
+ <code>UISelectOne</code> instance. Call its
+ <code>getValue()</code> method, which must be an Object array.
+ Look for an element in the resultant array that, 1. when we pass
+ the renderable value to its <code>equals()</code> method, it
+ returns <code>true</code> , or 2. if the renderable value is null,
+ and there is a null element in the array, also conclude that the
+ current element is selected. Otherwise the current element is not
+ selected. Now, if the current value is selected, write out an
+ HTML boolean property "selected". If the current
+ SelectItem.isDisabled() returns true, render "disabled" as the
+ value of the "disabled" attribute.</p>
+
+ </ul>
+
+ </ul>]]>
+ </description>
+ <name>
+ selectManyListbox
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.SelectManyListboxTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0"> Optional
+ attribute that is a literal string that is the fully qualified
+ class name of a concrete class that implements
+ <code>java.util.Collection</code>, or an EL expression that
+ evaluates to either 1. such a String, or 2. the
+ <code>Class</code> object itself. </p>]]>
+ </description>
+ <name>
+ collectionType
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on disabled options.]]>
+ </description>
+ <name>
+ disabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on enabled options.]]>
+ </description>
+ <name>
+ enabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0">
+ Flag indicating that, if this component is activated by the user,
+ The "no selection option", if any, must be hidden.</p>]]>
+ </description>
+ <name>
+ hideNoSelectionOption
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Number of available options to be shown at all times.
+ If not specified, all available options are shown.]]>
+ </description>
+ <name>
+ size
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p><span
+ class="changed_modified_2_0">Render</span> an HTML option
+ list.</p>
+
+ <p><a name="decode">Decode Behavior</a></p>
+
+ <ul>
+
+ <p>See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#decodeMany">"Decode
+ Behavior for UISelectMany Components"</a> section.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>Render an HTML "select" element. Render the clientId of
+ the component as the value of the "name" attribute. If the "styleClass"
+ attribute is specified, render its value as the value of the "class"
+ attribute on the "select" element. If the component
+ to be rendered is a UISelectMany, render "multiple" as the value of
+ the "multiple" attribute. Render "1" as the value of the "size"
+ attribute. See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#options">"Rendering the option
+ elements" </a> specification for <code>ListboxRenderer</code> for
+ more detail on how to render the "option" elements in this
+ renderer.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ selectManyMenu
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.SelectManyMenuTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0"> Optional
+ attribute that is a literal string that is the fully qualified
+ class name of a concrete class that implements
+ <code>java.util.Collection</code>, or an EL expression that
+ evaluates to either 1. such a String, or 2. the
+ <code>Class</code> object itself. </p>]]>
+ </description>
+ <name>
+ collectionType
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on disabled options.]]>
+ </description>
+ <name>
+ disabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on enabled options.]]>
+ </description>
+ <name>
+ enabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0">
+ Flag indicating that, if this component is activated by the user,
+ The "no selection option", if any, must be hidden.</p>]]>
+ </description>
+ <name>
+ hideNoSelectionOption
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Render an HTML option list.</p>
+
+ <p><a name="decode">Decode Behavior</a></p>
+
+ <ul>
+
+ <p>See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#decodeOne">"Decode
+ Behavior for UISelectOne Components"</a> section.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+ <p>Render an HTML "select" element. Render the clientId of
+ the component as the value of the "name" attribute. If the "styleClass"
+ attribute is specified, render its value as the value of the "class"
+ attribute on the "select" element. If the component
+ to be rendered is a UISelectMany, render "multiple" as the value of
+ the "multiple" attribute. If the "size" attribute is specified,
+ render its value as the value of the "size" attribute. Otherwise
+ use the number of items as the value of the "size" attribute. See
+ the <a href="javax.faces.SelectManyjavax.faces.Listbox.html#options">"Rendering the option
+ elements" </a> specification for <code>ListboxRenderer</code> for
+ more detail on how to render the "option" elements in this
+ renderer.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ selectOneListbox
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.SelectOneListboxTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on disabled options.]]>
+ </description>
+ <name>
+ disabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on enabled options.]]>
+ </description>
+ <name>
+ enabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0">
+ Flag indicating that, if this component is activated by the user,
+ The "no selection option", if any, must be hidden.</p>]]>
+ </description>
+ <name>
+ hideNoSelectionOption
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Number of available options to be shown at all times.
+ If not specified, all available options are shown.]]>
+ </description>
+ <name>
+ size
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Render an HTML option list.</p>
+
+ <p><a name="decode">Decode Behavior</a></p>
+
+ <ul>
+
+ <p>See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#decodeOne">"Decode
+ Behavior for UISelectOne Components"</a> section.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>Render an HTML "select" element. Render the clientId of the
+ component as the value of the "name" attribute. If the
+ "styleClass" attribute is specified, render its value as the value
+ of the "class" attribute on the "select" element. If the component
+ to be rendered is a UISelectMany, render "true" as the value of
+ the "multiple" attribute. Use the number of items as the value of
+ the "size" attribute. See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#options">"Rendering
+ the option elements" </a> specification for
+ <code>ListboxRenderer</code> for more detail on how to render the
+ "option" elements in this renderer.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ selectOneMenu
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.SelectOneMenuTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on disabled options.]]>
+ </description>
+ <name>
+ disabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on enabled options.]]>
+ </description>
+ <name>
+ enabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0">
+ Flag indicating that, if this component is activated by the user,
+ The "no selection option", if any, must be hidden.</p>]]>
+ </description>
+ <name>
+ hideNoSelectionOption
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p><span
+ class="changed_modified_2_0">Render</span> a set of html
+ "input" elements of type "radio".</p>
+
+ <p><a name="decode">Decode Behavior</a></p>
+
+ <ul>
+
+ <p>See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#decodeOne">"Decode
+ Behavior for UISelectOne Components"</a> section.</p>
+
+ </ul>
+
+ <p>Encode Behavior</p>
+
+ <ul>
+
+ <p>Render a "table" element. If the "styleClass" is specified,
+ render the value of the "styleClass" attribute as the value of the
+ "class" attribute on the "table" element. If the "style", "border"
+ attributes are specified, pass them thru <span
+ class="changed_added_2_0">and render their values as the "style"
+ and "border" attributes on the "table", respectively.</span>. If
+ the "layout" attribute is specified, and its value is
+ "pageDirection", render the children elements vertically,
+ otherwise horizontally, in the table. If any of the children are
+ an instance of SelectItemGroup, render them as a nested table.
+ Each of the children are ultimately rendered as follows. Render
+ an "input" element of "type" "radio" for each child component.
+ Render the "name" attribute on the "input" element with the value
+ of the <code>clientId</code> of the component. Render an "id"
+ attribute on the "input" element. Each "id" value must be unique.
+ If the current SelectItem.isDisabled() returns true, render
+ "disabled" as the value of the "disabled" attribute. Close out
+ the "input" element. Render a "label" element. Render the "for"
+ attribute of the "label" element whose value is the corresponding
+ "input" element's "id" value. Render any "style" as the "class"
+ attribute on the "label" element. Close out the starting "label"
+ element and render the label value from SelectItem.getLabel().
+ Close out the "label" element. As an exception to the general
+ rules about how to handle the "id" attribute, render it as an
+ attribute on the outer "table" element, the value of which is the
+ <code>clientId</code> of the component per the rules at the
+ beginning of this specification. Coerce the value of the
+ currently rendered child to the type of the parent UISelectOne
+ value using the Expression Language coercion rules before
+ comparing the values. If the value of the currently rendered
+ child is equal to the value of the parent UISelectOne, render an
+ appropriate HTML boolean value indicating "checked" for the
+ enclosing "input". See the <a
+ href="javax.faces.SelectManyjavax.faces.Listbox.html#options">"Rendering
+ the option elements" </a> specification for
+ <code>ListboxRenderer</code> for more detail on how to render the
+ "option" elements in this renderer.</p>
+
+ </ul>]]>
+ </description>
+ <name>
+ selectOneRadio
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.SelectOneRadioTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ <![CDATA[Converter instance registered with this component.]]>
+ </description>
+ <name>
+ converter
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.convert.Converter
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the converter message, replacing any message
+ that comes from the converter.]]>
+ </description>
+ <name>
+ converterMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The component identifier for this component. This value must be
+ unique within the closest parent component that is a naming
+ container.]]>
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ true
+ </rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component's value must be
+ converted and validated immediately (that is, during
+ Apply Request Values phase), rather than waiting
+ until Process Validations phase.]]>
+ </description>
+ <name>
+ immediate
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit. The default value for this property is true.]]>
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that the user is required to provide a submitted
+ value for this input component.]]>
+ </description>
+ <name>
+ required
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validation message for the "required"
+ facility, if the "required" facility is used.]]>
+ </description>
+ <name>
+ requiredMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[MethodExpression representing a validator method that will be called
+ during Process Validations to perform correctness checks on the
+ value of this component. The expression must evaluate to a public
+ method that takes FacesContext, UIComponent, and Object parameters,
+ with a return type of void.]]>
+ </description>
+ <name>
+ validator
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A ValueExpression enabled attribute that, if present, will be
+ used as the text of the validator message, replacing any
+ message that comes from the validator.]]>
+ </description>
+ <name>
+ validatorMessage
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[The current value of this component.]]>
+ </description>
+ <name>
+ value
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.Object
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p>
+
+ MethodExpression representing a value change listener method
+ that will be notified when a new value has been set for this
+ input component. The expression must evaluate to a public
+ method that takes a <code>ValueChangeEvent</code> parameter,
+ with a return type of void, <span class="changed_added_2_0">or
+ to a public method that takes no arguments with a return type
+ of void. In the latter case, the method has no way of easily
+ knowing what the new value is, but this can be useful in cases
+ where a notification is needed that "this value
+ changed".</span>
+
+ </p>]]>
+ </description>
+ <name>
+ valueChangeListener
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-method>
+ <method-signature>
+ void valueChange(javax.faces.event.ValueChangeEvent)
+ </method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Access key that, when pressed, transfers focus
+ to this element.]]>
+ </description>
+ <name>
+ accesskey
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Width (in pixels) of the border to be drawn
+ around the table containing the options list.]]>
+ </description>
+ <name>
+ border
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ int
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Direction indication for text that does not inherit directionality.
+ Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).]]>
+ </description>
+ <name>
+ dir
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this element must never receive focus or
+ be included in a subsequent submit. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as disabled="disabled".]]>
+ </description>
+ <name>
+ disabled
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on disabled options.]]>
+ </description>
+ <name>
+ disabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style class to apply to the rendered label
+ on enabled options.]]>
+ </description>
+ <name>
+ enabledClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[<p class="changed_modified_2_0">
+ Flag indicating that, if this component is activated by the user,
+ The "no selection option", if any, must be hidden.</p>]]>
+ </description>
+ <name>
+ hideNoSelectionOption
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[A localized user presentable name for this component.]]>
+ </description>
+ <name>
+ label
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Code describing the language used in the generated markup
+ for this component.]]>
+ </description>
+ <name>
+ lang
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Orientation of the options list to be created.
+ Valid values are "pageDirection" (list is laid
+ out vertically), or "lineDirection" (list is
+ laid out horizontally). If not specified, the
+ default value is "lineDirection".]]>
+ </description>
+ <name>
+ layout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus.]]>
+ </description>
+ <name>
+ onblur
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element loses focus
+ and its value has been modified since gaining focus.]]>
+ </description>
+ <name>
+ onchange
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ clicked over this element.]]>
+ </description>
+ <name>
+ onclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ double clicked over this element.]]>
+ </description>
+ <name>
+ ondblclick
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when this element receives focus.]]>
+ </description>
+ <name>
+ onfocus
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onkeydown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ pressed and released over this element.]]>
+ </description>
+ <name>
+ onkeypress
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a key is
+ released over this element.]]>
+ </description>
+ <name>
+ onkeyup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ pressed down over this element.]]>
+ </description>
+ <name>
+ onmousedown
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved within this element.]]>
+ </description>
+ <name>
+ onmousemove
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved away from this element.]]>
+ </description>
+ <name>
+ onmouseout
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ moved onto this element.]]>
+ </description>
+ <name>
+ onmouseover
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when a pointer button is
+ released over this element.]]>
+ </description>
+ <name>
+ onmouseup
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Javascript code executed when text within this
+ element is selected by the user.]]>
+ </description>
+ <name>
+ onselect
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this component will prohibit changes by
+ the user. The element may receive focus unless it has also
+ been disabled. A value of false causes
+ no attribute to be rendered, while a value of true causes the
+ attribute to be rendered as readonly="readonly".]]>
+ </description>
+ <name>
+ readonly
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[CSS style(s) to be applied when this component is rendered.]]>
+ </description>
+ <name>
+ style
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) to be applied when
+ this element is rendered. This value must be passed through
+ as the "class" attribute on generated markup.]]>
+ </description>
+ <name>
+ styleClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Position of this element in the tabbing order
+ for the current document. This value must be
+ an integer between 0 and 32767.]]>
+ </description>
+ <name>
+ tabindex
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Advisory title information about markup elements generated
+ for this component.]]>
+ </description>
+ <name>
+ title
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The ValueExpression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ javax.faces.component.UIComponent
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <description>
+ <![CDATA[<p>Renders a UIComponent that represents a single column of data within a parent <code>UIData</code> component.</p>]]>
+ </description>
+ <name>
+ column
+ </name>
+ <tag-class>
+ com.sun.faces.taglib.html_basic.ColumnTag
+ </tag-class>
+ <body-content>
+ JSP
+ </body-content>
+ <attribute>
+ <description>
+ Flag indicating whether or not this component should be rendered
+ (during Render Response Phase), or processed on any subsequent
+ form submit.
+ </description>
+ <name>
+ rendered
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The value binding expression linking this component to a property in a backing bean
+ </description>
+ <name>
+ binding
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ The component identifier for the associated component
+ </description>
+ <name>
+ id
+ </name>
+ <required>
+ false
+ </required>
+ <rtexprvalue>
+ false
+ </rtexprvalue>
+ <type>
+ java.lang.String
+ </type>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any column footer generated for this table.]]>
+ </description>
+ <name>
+ footerClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Space-separated list of CSS style class(es) that will be
+ applied to any column header generated for this table.]]>
+ </description>
+ <name>
+ headerClass
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ java.lang.String
+ </type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+ <![CDATA[Flag indicating that this column is a row header column and therefore cells in this column should be rendered with "th" instead of "td" and must have the 'scope="row"' attribute.]]>
+ </description>
+ <name>
+ rowHeader
+ </name>
+ <required>
+ false
+ </required>
+ <deferred-value>
+ <type>
+ boolean
+ </type>
+ </deferred-value>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>outputScript</name>
+ <body-content>empty</body-content>
+ <display-name>outputScript</display-name>
+ <tag-class>com.sun.faces.taglib.extensions.OutputScriptTag</tag-class>
+ <description>
+ <![CDATA[
+ This tag, when used in conjuction with Resource EL expressions
+ will generate a <script> with the value of the url attribute
+ being the result of the resource EL expression.
+ ]]>
+ </description>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <name>library</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <name>target</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+ <tag>
+ <name>body</name>
+ <tag-class>com.sun.faces.taglib.extensions.BodyTag</tag-class>
+ <body-content>JSP</body-content>
+ <display-name>body</display-name>
+ <description>body</description>
+ </tag>
+ <tag>
+ <name>head</name>
+ <tag-class>com.sun.faces.taglib.extensions.HeadTag</tag-class>
+ <body-content>JSP</body-content>
+ <display-name>head</display-name>
+ <description>head</description>
+ </tag>
+ <tag>
+ <name>outputStylesheet</name>
+ <tag-class>com.sun.faces.taglib.extensions.OutputStyleTag</tag-class>
+ <body-content>empty</body-content>
+ <display-name>outputSstyle</display-name>
+ <description>
+ <![CDATA[
+ This tag, when used in conjuction with Resource EL expressions
+ will generate a <link> with the value of the url attribute
+ being the resulting href attribute of the resource EL expression.
+ ]]>
+ </description>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <name>library</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <name>target</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+</taglib>
diff --git a/etc/tlds/ui.tld b/etc/tlds/ui.tld
new file mode 100644
index 0000000..58560fe
--- /dev/null
+++ b/etc/tlds/ui.tld
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+ "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+ <tlib-version>1.0</tlib-version>
+ <jsp-version>1.2</jsp-version>
+ <short-name>ui</short-name>
+ <uri>http://java.sun.com/jsf/facelets</uri>
+ <description>
+ </description>
+
+ <tag>
+ <name>component</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>The component tag and the composition tag behave exactly the same, except the component tag will insert a new UIComponent
+ instance into the tree as the root of all the child components/fragments it has.
+ </description>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>A unique id may be provided, otherwise Facelets will automatically assign one under the same logic it uses for all
+ UIComponents.
+ </description>
+ </attribute>
+ <attribute>
+ <name>binding</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>This binding attribute is used the same as with any other UIComponent such that it allows you to reference them as a
+ property of a JavaBean. If that target property did not have a UIComponent instance assigned already, JavaServer Faces will lazily
+ create an instance for you and set it on your JavaBean before continuing with building the tree.
+ </description>
+ </attribute>
+ <attribute>
+ <name>rendered</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>composition</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>
+<![CDATA[
+Defines a composition that optionally uses a template, as outlined in the description of the ui tag library. Multiple compositions can use the same template, thus encapsulating and reusing layout. JSF disregards everything outside of the composition, which lets developers embed compositions in well-formed XHTML pages that can be viewed in an XHTML viewer, such as Dreamweaver or a browser, without including extraneous elements such as head and body.
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:ui="http://java.sun.com/jsf/facelets">
+
+ <body>
+
+ THIS LINE, AND EVERYTHING ABOVE IT IS DISREGARDED BY JSF
+ <ui:composition template="/layout.xhtml">
+
+ <ui:define name="title">#{msgs.contactsWindowTitle}</ui:define>
+ <ui:define name="heading">#{msgs.contactsHeading}</ui:define>
+
+ <ui:define name="content">
+ <ui:include src="contactsTable.xhtml" />
+ </ui:define>
+
+ </ui:composition>
+ THIS LINE, AND EVERYTHING BELOW IT IS DISREGARDED BY JSF
+
+ </body>
+</html>
+
+]]>
+ </description>
+ <attribute>
+ <name>template</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The resolvable URI of the template to use. The content within the composition tag will be used in populating the template
+ specified.
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>debug</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>The debug tag will capture the component tree and variables when it is encoded, storing the data for retrieval later. You
+ may launch the debug window at any time from your browser by pressing 'CTRL' + 'SHIFT' + 'D' (by default). The debug tag doesn't need
+ to be used with the facelet.DEVELOPMENT parameter. The best place to put this tag is in your site's main template where it can be
+ enabled/disabled across your whole application. If your application uses multiple windows, you might want to assign different hot keys
+ to each one.
+ </description>
+ <attribute>
+ <name>hotkey</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The hot key to use in combination with 'CTRL' + 'SHIFT' to launch the debug window. By default, when the debug tag is
+ used, you may launch the debug window with 'CTRL' + 'SHIFT' + 'D'. This value cannot be an EL expression.
+ </description>
+ </attribute>
+ <attribute>
+ <name>rendered</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <description>
+ Controls whether the debug component is rendered. Valid values for this attribute are either the strings "true" or "false" or an EL expression that evaluates to either "true" or "false".
+
+If this attribute's value is "false" or the value is an EL expression that evaluates to "false", the debug component is not rendered in the page, the hotkey attribute is disregarded, and users cannot open the debugging information window with a hotkey.
+
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>decorate</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>The decorate tag acts the same as a composition tag, but it will not trim everything outside of it. This is useful in cases
+ where you have a list of items in a document, which you would like to be decorated or framed. The sum of it all is that you can take
+ any element in the document and decorate it with some external logic as provided by the template.
+ </description>
+ <attribute>
+ <name>template</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The resolvable URI of the template to use. The content within the decorate tag will be used in populating the template
+ specified.
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>define</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>The define tag can be used within tags that allow templating. This includes composition and decorate tags.</description>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The literal name for this definition. This name will match up with a <ui:insert/> tag in a target template.
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>fragment</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>Just like composition has decorate as a non-trimming version of the same behavior, component has fragment. This allows you
+ to logically insert a UIComponent into the tree and possibly bind this fragment to a JavaBean property or Map for management. The
+ fragment tag was also added to Facelets to get around some of the optimizations used in handling text within your document. If you are
+ using components such as <f:panelGrid/>, which renders its children, you may want more control over the building process that
+ Facelets does and using a fragment tag will help guarantee parent/child relationships for you.
+ </description>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>A unique id may be provided, otherwise Facelets will automatically assign one under the same logic it uses for all
+ UIComponents.
+ </description>
+ </attribute>
+ <attribute>
+ <name>binding</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>This binding attribute is used the same as with any other UIComponent such that it allows you to reference them as a
+ property of a JavaBean. If that target property did not have a UIComponent instance assigned already, JavaServer Faces will lazily
+ create an instance for you and set it on your JavaBean before continuing with building the tree.
+ </description>
+ </attribute>
+ <attribute>
+ <name>rendered</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>include</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>The include tag can point at any Facelet which might use the composition tag, component tag, or simply be straight
+ XHTML/XML. It should be noted that the src path does allow relative path names, but they will always be resolved against the original
+ Facelet requested. The include tag can be used in conjunction with multiple <ui:param/> tags to pass EL expressions/values to
+ the target page.
+ </description>
+ <attribute>
+ <name>src</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>A literal or EL expression that specifies the target Facelet that you would like to include into your document.
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>insert</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>The insert tag is used within your templates to declare spots of replacable data.</description>
+ <attribute>
+ <name>name</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The optional name attribute matches the associated <ui:define/> tag in this template's client. If no name is
+ specified, it's expected that the whole template client will be inserted.
+ </description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>param</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description></description>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The name of the variable to pass to the included Facelet.</description>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The literal or EL expression value to assign to the named variable.</description>
+ </attribute>
+ </tag>
+
+ <tag>
+ <name>remove</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>The remove tag does not have any attributes and is used to remove chunks of XML content from a Facelet at compilation time.
+ The remove tag is often used in conjunction with the jsfc feature.
+ </description>
+ </tag>
+
+ <tag>
+ <name>repeat</name>
+ <tag-class></tag-class>
+ <tei-class></tei-class>
+ <body-content>JSP</body-content>
+ <description>
+ <![CDATA[
+ The repeat tag should be used in almost all cases instead of the c:forEach to iterate over content with JSF.
+ The repeat tag is often used in conjunction with the jsfc feature.
+ ]]>
+ </description>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description></description>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The name of a collection of items that this tag iterates over. The collection may be a List, array, java.sql.ResultSet, or an individual java Object. If the collection is null, this tag does nothing.</description>
+ </attribute>
+ <attribute>
+ <name>var</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <description>The literal name of the variable to use while iterating.</description>
+ </attribute>
+
+ </tag>
+
+
+</taglib>
commit 082fce87e388415365a87206f71992c6abc9f533
Author: Partha Aji <paji(a)redhat.com>
Date: Fri Jan 22 16:10:37 2010 -0500
Added entries from modules.conf... more to come on settings
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index 8838dd5..7eda279 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -35,10 +35,25 @@
<resource-configuration configurationFormat="both">
<c:simple-property name="settings/server" displayName="Server" type="string" required="true" activationPolicy="immediate"
- description="The IP address of the cobbler server."/>
+ description="The IP address of the cobbler server."/>
+
+ <c:simple-property name="modules.conf/authentication/module" displayName="Authentication Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that authenticates the allowable users that can log into the cobbler WebUI and Read-Write XMLRPC. Choose one of authn_denyall, authn_configfile, authn_passthru, authn_ldap, authn_spacewalk, authn_testing, or a user supplied authentication scheme."/>
+ <c:simple-property name="modules.conf/authorization/module" displayName="Authorization Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that specifies the operations an authenticated user can do in cobbler. Choose one of authz_allowall, authz_ownership, or a user supplied authentication scheme."/>
+ <c:simple-property name="modules.conf/authorization/module" displayName="Authorization Module" type="string" required="true" activationPolicy="immediate" description="The name of the module that specifies the operations an authenticated user can do in cobbler. Choose one of authz_allowall, authz_ownership, or a user supplied authentication scheme."/>
+ <c:simple-property name="modules.conf/dns/module" displayName="DNS Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DNS management engine if manage_dns is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDns ">
+ <c:property-options>
+ <c:option value="manage_bind"/>
+ <c:option value="manage_dnsmasq"/>
+ </c:property-options>
+ </c:simple-property>
+ <c:simple-property name="modules.conf/dhcp/module" displayName="DHCP Module" type="string" required="true" activationPolicy="immediate" description="Chooses the DHCP management engine if manage_dns is enabled in /etc/cobbler/settings. For more information check https://fedorahosted.org/cobbler/wiki/ManageDhcp ">
+ <c:property-options>
+ <c:option value="manage_isc"/>
+ <c:option value="manage_dnsmasq"/>
+ </c:property-options>
+ </c:simple-property>
+
+
</resource-configuration>
-
</server>
-
-</plugin>
-
+</plugin>
\ No newline at end of file
commit ebb243a3b452f6e505998bb5076e730f6a52bc01
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Fri Jan 22 16:01:29 2010 -0500
use gears for leaf icons
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
index a6b2360..85d9ab4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
@@ -85,7 +85,7 @@
icon="/images/icons/folder_closed_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png"
iconCollapsed="/images/icons/dir_closed.png"
iconExpanded="/images/icons/dir_open.png"
- iconLeaf="/images/icons/#{resourceTreeItem.data.resourceType.category}_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png">
+ iconLeaf="/images/icons/Service_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png">
<a4j:support event="oncontextmenu" reRender="resourceMenu" timeout="5000"
disableDefault="true" status="commonStatus" limitToList="true"
ajaxSingle="true">
commit 8dc43e5e21171cedf00225d65ee42352643900a8
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Fri Jan 22 14:33:11 2010 -0500
put the finishing touches on the selectedRowsCommandButton component; remove pageControls.xhtml from the sample persp war, since its new home is the base persp war
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
index 3344c6e..fb66dca 100644
--- a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
@@ -94,14 +94,12 @@
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
- <!-- Uncomment the below context-param to disable compression of JavaScript files associated with RichFaces
- components in order to debug those script files. -->
- <!--
+ <!-- Temporarily uncomment the below context-param to disable compression of JavaScript files associated with
+ RichFaces components in order to debug those script files. -->
<context-param>
- <param-name>org.richfaces.LoadScriptStrategy</param-name>
- <param-value>DEFAULT</param-value>
+ <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
+ <param-value>false</param-value>
</context-param>
- -->
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
index 3b1383c..5a02b3b 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
@@ -25,7 +25,6 @@ import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
-import org.jboss.seam.international.StatusMessage;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.ResourceCriteria;
@@ -52,16 +51,11 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
private List<Resource> selectedResources;
private Map<Integer, String> resourceUrlMap;
- public BrowseResourcesUIBean() {
- return;
- }
-
@Begin(join = true)
public PagedDataModel<Resource> getDataModel() throws Exception {
if (this.dataModel == null) {
this.dataModel = createDataModel();
}
-
return this.dataModel;
}
@@ -74,11 +68,6 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
}
public void uninventorySelectedResources() throws Exception {
- if (this.selectedResources.isEmpty()) {
- getFacesMessages().add(StatusMessage.Severity.WARN, "You didn't select any Resources.");
- return;
- }
-
RemoteClient remoteClient = getRemoteClient();
Subject subject = getSubject();
@@ -92,7 +81,8 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
}
resourceManager.uninventoryResources(subject, selectedResourceIds);
- // TODO: i18n this bad boy.
+
+ // Add message to tell the user the uninventory was a success.
String pluralizer = (this.selectedResources.size() == 1) ? "" : "s";
getFacesMessages().add("Uninventoried " + this.selectedResources.size() + " Resource" + pluralizer + ".");
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/includes/pageControls.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/includes/pageControls.xhtml
deleted file mode 100644
index 777e30f..0000000
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/includes/pageControls.xhtml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:onf="http://jboss.org/on/function">
-<body>
-
- Usage: The following parameters must be set in the calling page:
-
- dataTableName - Name of the data table to be controlled
- dataModel - Data model of the underlying table being controlled (used for total row count)
- pageControl - Page control value to set when changing the number of rows per page
- pageControlSettingsUIBean (optional, defaults to #{DefaultPageControlSettingsUIBean}") - page control settings
-
- <ui:composition>
-
- <h:panelGroup layout="block" style="float: right; margin-right: 30px">
- <ui:param name="dataScrollerName" value="#{dataTableName}Scroller"/>
- <c:if test="#{empty pageControlSettingsUIBean}">
- <ui:param name="pageControlSettingsUIBean" value="#{DefaultPageControlSettingsUIBean}"/>
- </c:if>
-
- <table>
- <tr>
- <td nowrap="nowrap">
-
- <h:outputText value="Total: #{dataModel.rowCount}"
- style="margin-right: 2em; font-weight: bold; "/>
-
- <h:panelGroup layout="block" rendered="#{dataModel.rowCount gt pageControlSettingsUIBean.minimumPageSize
- and pageControl.pageSize gt 0}">
- <h:outputText value="Items Per Page: #{pageControl.pageSize}"
- style="font-weight: bold; "
- rendered="#{pageControlSettingsUIBean.pageSizeCount le 1}"/>
- <h:panelGroup layout="block" rendered="#{pageControlSettingsUIBean.pageSizeCount gt 1}">
- <h:outputText value="Items Per Page:"
- style="margin-right: 1em; font-weight: bold; "/>
- <h:selectOneListbox id="currentPageSize"
- size="1"
- value="#{pageControl.pageSize}">
- <a4j:support event="onchange"
- status="commonStatus"
- reRender="#{dataTableName}, #{dataScrollerName}"/>
- <f:selectItems value="#{pageControlSettingsUIBean.pageSizeSelectItems}"/>
- </h:selectOneListbox>
- </h:panelGroup>
- </h:panelGroup>
-
- </td>
-
- <td nowrap="nowrap">
-
- <rich:datascroller id="#{dataScrollerName}"
- for="#{dataTableName}"
- status="commonStatus"
- rendered="#{pageControl.pageSize gt 0}"
- selectedStyle="font-weight: bold;"
- inactiveStyle="font-weight: normal;"
- stepControls="show"
- fastControls="hide"
- boundaryControls="hide"
- maxPages="#{pageControlSettingsUIBean.maximumPages}"
- page="#{pageControl.pageNumber}">
- <f:facet name="next">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright.gif"
- style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- <f:facet name="next_disabled">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright_gray.gif"
- style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- <f:facet name="previous">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft.gif" style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- <f:facet name="previous_disabled">
- <h:panelGroup>
- <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft_gray.gif"
- style="padding: 0px 5px 0px 7px;"/>
- </h:panelGroup>
- </f:facet>
- </rich:datascroller>
-
- </td>
- </tr>
- </table>
-
- </h:panelGroup>
-
- <div style="clear: both;"/>
-
- </ui:composition>
-
-</body>
-</html>
-
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index dd14f7b..e9bb529 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -86,8 +86,7 @@
<rich:column colspan="8">
<rhq:selectedRowsCommandButton
value="UNINVENTORY"
- action="#{BrowseResourcesUIBean.uninventorySelectedResources}"
- minimum="2" maximum="3">
+ action="#{BrowseResourcesUIBean.uninventorySelectedResources}">
<a4j:support event="onclick" reRender="resourcesDataTable" />
</rhq:selectedRowsCommandButton>
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
index 335f337..a3883b9 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
@@ -33,7 +33,7 @@ import javax.faces.context.FacesContext;
*/
public class SelectedRowsCommandButtonComponent extends HtmlCommandButton {
private String dataTableId;
- private Integer minimum;
+ private Integer minimum = DEFAULT_MINIMUM;
private Integer maximum;
public static final String COMPONENT_TYPE = "org.rhq.SelectedRowsCommandButton";
@@ -58,17 +58,28 @@ public class SelectedRowsCommandButtonComponent extends HtmlCommandButton {
this.dataTableId = dataTableId;
}
+ @NotNull
public Integer getMinimum() {
if (this.minimum != null) {
return this.minimum;
}
- Integer value = (Integer) getBinding("minimum");
- this.minimum = (value != null) ? value : DEFAULT_MINIMUM;
+ ValueExpression valueExpression = this.getValueExpression("minimum");
+ if (valueExpression != null) {
+ Object value = FacesExpressionUtility.getValue(valueExpression, Object.class);
+ // If the user explicitly specified null, this means there is no minimum. We store this internally as 0.
+ this.minimum = (value == null) ? 0 : minimum;
+ } else {
+ this.minimum = DEFAULT_MINIMUM;
+ }
return this.minimum;
}
public void setMinimum(Integer minimum) {
- this.minimum = minimum;
+ if (minimum != null && minimum < 0) {
+ throw new IllegalArgumentException("value of 'minimum' attribute is not >= 0.");
+ }
+ // If the user explicitly specified null, this means there is no minimum. We store this internally as 0.
+ this.minimum = (minimum == null) ? 0 : minimum;
}
public Integer getMaximum() {
@@ -80,6 +91,9 @@ public class SelectedRowsCommandButtonComponent extends HtmlCommandButton {
}
public void setMaximum(Integer maximum) {
+ if (maximum != null && maximum < 0) {
+ throw new IllegalArgumentException("value of 'maximum' attribute is not >= 0.");
+ }
this.maximum = maximum;
}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java
index 765e6f6..7362431 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java
@@ -136,7 +136,7 @@ public abstract class AbstractButtonRenderer extends AbstractRenderer {
RenderKitUtils.renderPassThruAttributes(writer,
component,
ATTRIBUTES);
- RenderKitUtils.renderXHTMLStyleBooleanAttributes(writer, component);
+ renderBooleanAttributes(writer, component);
String styleClass = (String)
component.getAttributes().get("styleClass");
@@ -153,6 +153,10 @@ public abstract class AbstractButtonRenderer extends AbstractRenderer {
writer.endElement("input");
}
+ protected void renderBooleanAttributes(ResponseWriter writer, UIComponent component) throws IOException {
+ RenderKitUtils.renderXHTMLStyleBooleanAttributes(writer, component);
+ }
+
// --------------------------------------------------------- Private Methods
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java
index e73a089..a5aa3cb 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java
@@ -55,7 +55,20 @@ public class SelectedRowsCommandButtonRenderer extends AbstractButtonRenderer {
UIData data = getTargetUIData(selectedRowsCommandButton);
RowSelectorComponent rowSelector = getRowSelector(data);
String rowSelectorClientId = rowSelector.getClientId(context);
- writer.writeAttribute("target", rowSelectorClientId, null);
+ writer.writeAttribute("target", rowSelectorClientId, null);
+ }
+
+ @Override
+ protected void renderBooleanAttributes(ResponseWriter writer, UIComponent component) throws IOException {
+ SelectedRowsCommandButtonComponent selectedRowsCommandButton = (SelectedRowsCommandButtonComponent) component;
+
+ Integer minimum = selectedRowsCommandButton.getMinimum();
+ // If the minimum is > 0, which is the typical case, render the button as disabled.
+ // *NOTE* We are making the assumption that no rows are selected by default, which
+ // is how the RowSelectorRenderer renders things.
+ if (minimum > 0) {
+ writer.writeAttribute("disabled", true, "disabled");
+ }
}
@NotNull
commit 72b752235e041317bd939532bca48bbcd74bda82
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Fri Jan 22 11:55:25 2010 -0500
add selectedRowsCommandButton component and use it in the browseResources.xhtml page in the sample persp war
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
index 87b477d..3344c6e 100644
--- a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
@@ -93,6 +93,15 @@
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
+
+ <!-- Uncomment the below context-param to disable compression of JavaScript files associated with RichFaces
+ components in order to debug those script files. -->
+ <!--
+ <context-param>
+ <param-name>org.richfaces.LoadScriptStrategy</param-name>
+ <param-value>DEFAULT</param-value>
+ </context-param>
+ -->
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/web.xml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 80e56d1..0000000
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
-
- <display-name>RHQ Sample Perspective Webapp</display-name>
-
- <!--=== Seam ===-->
-
- <listener>
- <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
- </listener>
-
- <!-- From Seam docs: The Seam master filter must be the first filter specified
- in web.xml. This ensures it is run first. -->
- <filter>
- <filter-name>Seam Filter</filter-name>
- <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>Seam Filter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <servlet>
- <servlet-name>Seam Resource Servlet</servlet-name>
- <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Seam Resource Servlet</servlet-name>
- <url-pattern>/seam/resource/*</url-pattern>
- </servlet-mapping>
-
- <!-- flags for debugging during development -->
- <context-param>
- <param-name>com.sun.faces.validateXml</param-name>
- <param-value>false</param-value>
- </context-param>
- <context-param>
- <param-name>com.sun.faces.verifyObjects</param-name>
- <param-value>false</param-value>
- </context-param>
-
- <!--=== JSF spec ===-->
-
- <servlet>
- <servlet-name>Faces Servlet</servlet-name>
- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <!-- serve Facelets pages (*.xhtml) via the JSF servlet -->
- <servlet-mapping>
- <servlet-name>Faces Servlet</servlet-name>
- <url-pattern>*.seam</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>Faces Servlet</servlet-name>
- <url-pattern>*.xhtml</url-pattern>
- </servlet-mapping>
-
- <mime-mapping>
- <extension>jsf</extension>
- <mime-type>text/html</mime-type>
- </mime-mapping>
-
- <!-- the suffix for files containing JSF content (default is ".jsp") -->
- <context-param>
- <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
- <param-value>.xhtml</param-value>
- </context-param>
-
- <!-- only need this if we want jsp's and facelets together, but we don't right now
- <context-param>
- <param-name>facelets.VIEW_MAPPINGS</param-name>
- <param-value>*.xhtml</param-value>
- </context-param>
- -->
-
-
-
-
-
- <!-- see http://www.jroller.com/page/mert?entry=state_saving_method_client_side for an explanation of the below param -->
- <context-param>
- <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
- <param-value>server</param-value>
- </context-param>
-
- <!--=== Facelets ===-->
-
- <!-- enable special debug output for development -->
- <context-param>
- <param-name>facelets.DEVELOPMENT</param-name>
- <param-value>true</param-value>
- </context-param>
-
- <!--=== RichFaces ===-->
-
- <!-- From Seam docs: If RichFaces is used in your project, Seam will install
- the RichFaces Ajax filter for you, making sure to install it before all
- other built-in filters. You don't need to install the RichFaces Ajax
- filter in web.xml yourself. -->
-
- <context-param>
- <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
- <param-value>com.sun.facelets.FaceletViewHandler</param-value>
- </context-param>
-
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
-
-
-</web-app>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index faeefb5..dd14f7b 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -84,10 +84,13 @@
<f:facet name="footer">
<rich:columnGroup>
<rich:column colspan="8">
- <a4j:commandButton value="UNINVENTORY"
- action="#{BrowseResourcesUIBean.uninventorySelectedResources}"
- reRender="resourcesDataTable, resourcesDataTableScroller" />
-
+ <rhq:selectedRowsCommandButton
+ value="UNINVENTORY"
+ action="#{BrowseResourcesUIBean.uninventorySelectedResources}"
+ minimum="2" maximum="3">
+ <a4j:support event="onclick" reRender="resourcesDataTable" />
+ </rhq:selectedRowsCommandButton>
+
<ui:include src="/WEB-INF/includes/pageControls.xhtml">
<ui:param name="dataTableName" value="resourcesDataTable"/>
<ui:param name="dataModel" value="#{BrowseResourcesUIBean.dataModel}"/>
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java b/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
index aa665cd..49dfc32 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
@@ -40,7 +40,7 @@ public class DefaultPageControlSettingsUIBean {
private static final int MINIMUM_PAGE_SIZE = PAGE_SIZES[0];
private static final int DEFAULT_PAGE_SIZE = PAGE_SIZES[0];
- /** Limit to 7 pages until e find a general fix for RHQ-1813. */
+ /** Limit to 7 pages until we find a general fix for RHQ-1813. */
private static final int MAXIMUM_PAGES = 7;
public SelectItem[] getPageSizeSelectItems() {
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
index bf4c36b..a7b1864 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
@@ -39,13 +39,13 @@ import javax.faces.context.FacesContext;
* @author Ian Springer
*/
public class RowSelectorComponent extends UIInput {
- private Mode mode;
-
public static final String COMPONENT_TYPE = "org.rhq.RowSelector";
public static final String COMPONENT_FAMILY = "org.rhq.RowSelector";
private static final Mode DEFAULT_MODE = Mode.multi;
+ private Mode mode;
+
@Override
public String getFamily() {
return COMPONENT_FAMILY;
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
new file mode 100644
index 0000000..335f337
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/SelectedRowsCommandButtonComponent.java
@@ -0,0 +1,109 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.component;
+
+import org.jetbrains.annotations.NotNull;
+import org.rhq.core.gui.util.FacesExpressionUtility;
+
+import javax.el.ValueExpression;
+import javax.faces.component.html.HtmlCommandButton;
+import javax.faces.context.FacesContext;
+
+/**
+ * An HTML component that allows rows in data tables (i.e. h:dataTables or rich:*dataTables) to be selected via either
+ * checkboxes (if in multi-select mode) or via radio buttons (if in single-select mode). TODO
+ *
+ * @author Ian Springer
+ */
+public class SelectedRowsCommandButtonComponent extends HtmlCommandButton {
+ private String dataTableId;
+ private Integer minimum;
+ private Integer maximum;
+
+ public static final String COMPONENT_TYPE = "org.rhq.SelectedRowsCommandButton";
+ public static final String COMPONENT_FAMILY = "org.rhq.SelectedRowsCommandButton";
+
+ private static final Integer DEFAULT_MINIMUM = 1;
+
+ @Override
+ public String getFamily() {
+ return COMPONENT_FAMILY;
+ }
+
+ public String getDataTableId() {
+ if (this.dataTableId != null) {
+ return this.dataTableId;
+ }
+ this.dataTableId = (String) getBinding("dataTableId");
+ return this.dataTableId;
+ }
+
+ public void setDataTableId(String dataTableId) {
+ this.dataTableId = dataTableId;
+ }
+
+ public Integer getMinimum() {
+ if (this.minimum != null) {
+ return this.minimum;
+ }
+ Integer value = (Integer) getBinding("minimum");
+ this.minimum = (value != null) ? value : DEFAULT_MINIMUM;
+ return this.minimum;
+ }
+
+ public void setMinimum(Integer minimum) {
+ this.minimum = minimum;
+ }
+
+ public Integer getMaximum() {
+ if (this.maximum != null) {
+ return this.maximum;
+ }
+ this.maximum = (Integer) getBinding("maximum");
+ return this.maximum;
+ }
+
+ public void setMaximum(Integer maximum) {
+ this.maximum = maximum;
+ }
+
+ @Override
+ public Object saveState(FacesContext context) {
+ Object[] values = new Object[4];
+ values[0] = super.saveState(context);
+ values[1] = this.dataTableId;
+ values[2] = this.minimum;
+ values[3] = this.maximum;
+ return values;
+ }
+
+ @Override
+ public void restoreState(FacesContext context, Object state) {
+ Object[] values = (Object[]) state;
+ super.restoreState(context, values[0]);
+ this.dataTableId = (String) values[1];
+ this.minimum = (Integer) values[2];
+ this.maximum = (Integer) values[3];
+ }
+
+ private Object getBinding(@NotNull String attributeName) {
+ ValueExpression valueExpression = this.getValueExpression(attributeName);
+ return (valueExpression != null) ? FacesExpressionUtility.getValue(valueExpression, Object.class) : null;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java
new file mode 100644
index 0000000..765e6f6
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractButtonRenderer.java
@@ -0,0 +1,231 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common Development
+ * and Distribution License("CDDL") (collectively, the "License"). You
+ * may not use this file except in compliance with the License. You can obtain
+ * a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
+ * or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
+ * language governing permissions and limitations under the License.
+ *
+ * When distributing the software, include this License Header Notice in each
+ * file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
+ * Sun designates this particular file as subject to the "Classpath" exception
+ * as provided by Sun in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License
+ * Header, with the fields enclosed by brackets [] replaced by your own
+ * identifying information: "Portions Copyrighted [year]
+ * [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * If you wish your version of this file to be governed by only the CDDL or
+ * only the GPL Version 2, indicate your decision by adding "[Contributor]
+ * elects to include this software in this distribution under the [CDDL or GPL
+ * Version 2] license." If you don't indicate a single choice of license, a
+ * recipient has the option to distribute your version of this file under
+ * either the CDDL, the GPL Version 2 or to extend the choice of license to
+ * its licensees as provided above. However, if you add GPL Version 2 code
+ * and therefore, elected the GPL Version 2 license, then the option applies
+ * only if the new code is made subject to such option by the copyright
+ * holder.
+ *
+ * ---------------------------------------------------------------------------
+ *
+ * Red Hat, Inc. elects to include this software in this distribution under
+ * the GPL Version 2 license.
+ */
+package org.rhq.core.gui.table.renderer;
+
+import com.sun.faces.renderkit.RenderKitUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.component.UICommand;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.event.ActionEvent;
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * <B>ButtonRenderer</B> is a class that renders the current value of <code>UICommand<code> as a Button.
+ *
+ * NOTE: This class is a lightly modified copy of the <code>com.sun.faces.renderkit.html_basic.ButtonRenderer</code>
+ * class from the JSF RI v1.2_14 jsf-impl.jar.
+ *
+ * @author java.net JSF RI project
+ * @author Ian Springer
+ */
+public abstract class AbstractButtonRenderer extends AbstractRenderer {
+ private static final String[] ATTRIBUTES = new String[] {
+ "accesskey",
+ "alt",
+ "dir",
+ "lang",
+ "onblur",
+ "onchange",
+ "onclick",
+ "ondblclick",
+ "onfocus",
+ "onkeydown",
+ "onkeypress",
+ "onkeyup",
+ "onmousedown",
+ "onmousemove",
+ "onmouseout",
+ "onmouseover",
+ "onmouseup",
+ "onselect",
+ "style",
+ "tabindex",
+ "title",
+ };
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ // ---------------------------------------------------------- Public Methods
+
+
+ @Override
+ public void decode(FacesContext context, UIComponent component) {
+ validateParameters(context, component);
+ if (wasClicked(context, component) && !isReset(component)) {
+ component.queueEvent(new ActionEvent(component));
+ if (log.isDebugEnabled()) {
+ log.debug("This command resulted in form submission - ActionEvent queued. Finished decoding "
+ + component.getClass().getSimpleName() + " component with id " + component.getId() + ".");
+ }
+ }
+ }
+
+ @Override
+ public void encodeBegin(FacesContext context, UIComponent component)
+ throws IOException {
+ validateParameters(context, component);
+
+ // Which button type (SUBMIT, RESET, or BUTTON) should we generate?
+ String type = getButtonType(component);
+
+ ResponseWriter writer = context.getResponseWriter();
+ assert(writer != null);
+
+ String label = "";
+ Object value = ((UICommand) component).getValue();
+ if (value != null) {
+ label = value.toString();
+ }
+ String imageSrc = (String) component.getAttributes().get("image");
+ writer.startElement("input", component);
+ writeIdAttributeIfNecessary(context, writer, component);
+ String clientId = component.getClientId(context);
+ if (imageSrc != null) {
+ writer.writeAttribute("type", "image", "type");
+ writer.writeURIAttribute("src", src(context, imageSrc), "image");
+ writer.writeAttribute("name", clientId, "clientId");
+ } else {
+ writer.writeAttribute("type", type, "type");
+ writer.writeAttribute("name", clientId, "clientId");
+ writer.writeAttribute("value", label, "value");
+ }
+
+ RenderKitUtils.renderPassThruAttributes(writer,
+ component,
+ ATTRIBUTES);
+ RenderKitUtils.renderXHTMLStyleBooleanAttributes(writer, component);
+
+ String styleClass = (String)
+ component.getAttributes().get("styleClass");
+ if (styleClass != null && styleClass.length() > 0) {
+ writer.writeAttribute("class", styleClass, "styleClass");
+ }
+ }
+
+ @Override
+ public void encodeEnd(FacesContext context, UIComponent component)
+ throws IOException {
+ validateParameters(context, component);
+ ResponseWriter writer = context.getResponseWriter();
+ writer.endElement("input");
+ }
+
+ // --------------------------------------------------------- Private Methods
+
+
+ /**
+ * @param context the <code>FacesContext</code> for the current request
+ * @param imageURI the base URI of the image to use for the button
+ * @return the encoded result for the base imageURI
+ */
+ private static String src(FacesContext context, String imageURI) {
+
+ if (imageURI == null) {
+ return "";
+ }
+
+ String u = context.getApplication().getViewHandler()
+ .getResourceURL(context, imageURI);
+ return (context.getExternalContext().encodeResourceURL(u));
+ }
+
+
+ /**
+ * <p>Determine if this component was activated on the client side.</p>
+ *
+ * @param context the <code>FacesContext</code> for the current request
+ * @param component the component of interest
+ * @return <code>true</code> if this component was in fact activated,
+ * otherwise <code>false</code>
+ */
+ private static boolean wasClicked(FacesContext context,
+ UIComponent component) {
+ // Was our command the one that caused this submission?
+ // we don' have to worry about getting the value from request parameter
+ // because we just need to know if this command caused the submission. We
+ // can get the command name by calling currentValue. This way we can
+ // get around the IE bug.
+ String clientId = component.getClientId(context);
+ Map<String, String> requestParameterMap = context.getExternalContext()
+ .getRequestParameterMap();
+ if (requestParameterMap.get(clientId) == null) {
+ StringBuilder builder = new StringBuilder(clientId);
+ String xValue = builder.append(".x").toString();
+ builder.setLength(clientId.length());
+ String yValue = builder.append(".y").toString();
+ return (requestParameterMap.get(xValue) != null
+ && requestParameterMap.get(yValue) != null);
+ }
+ return true;
+ }
+
+ /**
+ * @param component the component of interest
+ * @return <code>true</code> if the button represents a <code>reset</code>
+ * button, otherwise <code>false</code>
+ */
+ private static boolean isReset(UIComponent component) {
+ return ("reset".equals(component.getAttributes().get("type")));
+ }
+
+ /**
+ * <p>If the component's type attribute is null or not equal
+ * to <code>reset</code> or <code>submit</code>, default to
+ * <code>submit</code>.
+ * @param component the component of interest
+ * @return the type for this button
+ */
+ private static String getButtonType(UIComponent component) {
+
+ String type = (String) component.getAttributes().get("type");
+ if (type == null || (!"reset".equals(type) && !"submit".equals(type))) {
+ type = "submit";
+ // This is needed in the decode method
+ component.getAttributes().put("type", type);
+ }
+ return type;
+ }
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
index f962c32..5a852a2 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
@@ -42,6 +42,18 @@ public abstract class AbstractRenderer extends Renderer implements HeaderResourc
private InternetResourceBuilder resourceBuilder;
+ protected void validateParameters(FacesContext context, UIComponent component) {
+ if (context == null) {
+ throw new NullPointerException(MessageUtils.getExceptionMessageString(
+ MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "context"));
+ }
+
+ if (component == null) {
+ throw new NullPointerException(MessageUtils.getExceptionMessageString(
+ MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "component"));
+ }
+ }
+
protected void initializeComponentId(FacesContext context, UIComponent component) {
if (component.getId() == null) {
String id = context.getViewRoot().createUniqueId();
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java
index c5f9d41..85d8ddc 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java
@@ -75,7 +75,6 @@ public class AllRowsSelectorRenderer extends AbstractRenderer {
if (userSpecifiedOnclick != null) {
onclick += "; " + userSpecifiedOnclick;
}
- rowSelector.getAttributes().put("onclick", onclick);
writer.writeAttribute("onclick", onclick, "onclick");
// TODO: Add support for all the other common HTML attributes.
//RenderKitUtils.renderPassThruAttributes(writer, component, ATTRIBUTES);
@@ -124,20 +123,8 @@ public class AllRowsSelectorRenderer extends AbstractRenderer {
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
validateParameters(context, component);
-
ResponseWriter writer = context.getResponseWriter();
- writer.write("</input>");
+ writer.endElement("input");
}
- private void validateParameters(FacesContext context, UIComponent component) {
- if (context == null) {
- throw new NullPointerException(MessageUtils.getExceptionMessageString(
- MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "context"));
- }
-
- if (component == null) {
- throw new NullPointerException(MessageUtils.getExceptionMessageString(
- MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "component"));
- }
- }
}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
index fcfa406..8b44897 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
@@ -18,7 +18,6 @@
*/
package org.rhq.core.gui.table.renderer;
-import com.sun.faces.util.MessageUtils;
import org.ajax4jsf.component.UIDataAdaptor;
import org.ajax4jsf.model.ExtendedDataModel;
import org.ajax4jsf.resource.InternetResource;
@@ -97,7 +96,6 @@ public class RowSelectorRenderer extends AbstractRenderer {
String clientId = component.getClientId(context);
writer.writeAttribute("name", clientId, "clientId");
-
UIData data = getEnclosingData(rowSelector);
Object rowKey = getRowKey(data);
writer.writeAttribute("value", rowKey, null);
@@ -108,8 +106,7 @@ public class RowSelectorRenderer extends AbstractRenderer {
String userSpecifiedOnclick = (String) rowSelector.getAttributes().get("onclick");
if (userSpecifiedOnclick != null) {
onclick += "; " + userSpecifiedOnclick;
- }
- rowSelector.getAttributes().put("onclick", onclick);
+ }
writer.writeAttribute("onclick", onclick, "onclick");
// TODO: Add support for all the other common HTML attributes.
//RenderKitUtils.renderPassThruAttributes(writer, component, ATTRIBUTES);
@@ -126,21 +123,8 @@ public class RowSelectorRenderer extends AbstractRenderer {
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
validateParameters(context, component);
-
ResponseWriter writer = context.getResponseWriter();
- writer.write("</input>");
- }
-
- private void validateParameters(FacesContext context, UIComponent component) {
- if (context == null) {
- throw new NullPointerException(MessageUtils.getExceptionMessageString(
- MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "context"));
- }
-
- if (component == null) {
- throw new NullPointerException(MessageUtils.getExceptionMessageString(
- MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "component"));
- }
+ writer.endElement("input");
}
@NotNull
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java
new file mode 100644
index 0000000..e73a089
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/SelectedRowsCommandButtonRenderer.java
@@ -0,0 +1,93 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.renderer;
+
+import org.jetbrains.annotations.NotNull;
+import org.rhq.core.gui.table.component.RowSelectorComponent;
+import org.rhq.core.gui.table.component.SelectedRowsCommandButtonComponent;
+import org.rhq.core.gui.util.FacesComponentUtility;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIData;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * An HTML renderer for {@link org.rhq.core.gui.table.component.RowSelectorComponent}s (i.e. rhq:rowSelector).
+ *
+ * @author Ian Springer
+ */
+public class SelectedRowsCommandButtonRenderer extends AbstractButtonRenderer {
+ @Override
+ public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
+ super.encodeBegin(context, component);
+
+ SelectedRowsCommandButtonComponent selectedRowsCommandButton = (SelectedRowsCommandButtonComponent) component;
+
+ ResponseWriter writer = context.getResponseWriter();
+
+ Integer minimum = selectedRowsCommandButton.getMinimum();
+ writer.writeAttribute("minimum", minimum, "minimum");
+
+ Integer maximum = selectedRowsCommandButton.getMaximum();
+ if (maximum != null) {
+ writer.writeAttribute("maximum", maximum, "maximum");
+ }
+
+ UIData data = getTargetUIData(selectedRowsCommandButton);
+ RowSelectorComponent rowSelector = getRowSelector(data);
+ String rowSelectorClientId = rowSelector.getClientId(context);
+ writer.writeAttribute("target", rowSelectorClientId, null);
+ }
+
+ @NotNull
+ private RowSelectorComponent getRowSelector(UIData data) {
+ List<RowSelectorComponent> rowSelectors = FacesComponentUtility.getDescendantsOfType(data,
+ RowSelectorComponent.class);
+ if (rowSelectors.isEmpty()) {
+ throw new IllegalStateException("No rowSelector component was found within the target dataTable component " + data + ".");
+ }
+ if (rowSelectors.size() > 1) {
+ throw new IllegalStateException("More than one rowSelector component was found within the target dataTable component " + data + ".");
+ }
+ RowSelectorComponent rowSelector = rowSelectors.get(0);
+ return rowSelector;
+ }
+
+ private UIData getTargetUIData(SelectedRowsCommandButtonComponent selectedRowsCommandButton) {
+ UIData data;
+ String dataTableId = selectedRowsCommandButton.getDataTableId();
+ if (dataTableId != null) {
+ data = (UIData) selectedRowsCommandButton.findComponent(dataTableId);
+ if (data == null) {
+ throw new IllegalStateException("UIData component (i.e. h:dataTable or rich:*dataTable) with id '" + dataTableId + "' not found within naming scope of component "
+ + selectedRowsCommandButton + ". The allRowsSelector component must either be within a UIData component or must specify the id of a UIData component within its naming scope via the 'dataTableId' attribute.");
+ }
+ } else {
+ data = FacesComponentUtility.getAncestorOfType(selectedRowsCommandButton, UIData.class);
+ if (data == null) {
+ throw new IllegalStateException("Enclosing UIData component (i.e. h:dataTable or rich:*dataTable) not found for component "
+ + selectedRowsCommandButton + ". The allRowsSelector component must either be within a UIData component or must specify the id of a UIData component within its naming scope via the 'dataTableId' attribute.");
+ }
+ }
+ return data;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/resources/META-INF/faces-config.xml b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
index e97c2e5..71369dd 100644
--- a/modules/core/gui/src/main/resources/META-INF/faces-config.xml
+++ b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
@@ -23,6 +23,15 @@
</component-extension>
</component>
+ <component>
+ <component-type>org.rhq.SelectedRowsCommandButton</component-type>
+ <component-class>org.rhq.core.gui.table.component.SelectedRowsCommandButtonComponent</component-class>
+ <component-extension>
+ <component-family>org.rhq.SelectedRowsCommandButton</component-family>
+ <renderer-type>org.rhq.SelectedRowsCommandButton</renderer-type>
+ </component-extension>
+ </component>
+
<render-kit>
<renderer>
@@ -40,6 +49,14 @@
<renderer-class>org.rhq.core.gui.table.renderer.AllRowsSelectorRenderer</renderer-class>
</renderer>
+ <renderer>
+ <description>renders a button, that is disabled if the specified minimum and/or maximum selected rows
+ are not satisfied for an associated data table</description>
+ <component-family>org.rhq.SelectedRowsCommandButton</component-family>
+ <renderer-type>org.rhq.SelectedRowsCommandButton</renderer-type>
+ <renderer-class>org.rhq.core.gui.table.renderer.SelectedRowsCommandButtonRenderer</renderer-class>
+ </renderer>
+
</render-kit>
</faces-config>
diff --git a/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
index f20f68e..3b162d2 100644
--- a/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
+++ b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
@@ -24,4 +24,12 @@
</component>
</tag>
+ <tag>
+ <tag-name>selectedRowsCommandButton</tag-name>
+ <component>
+ <component-type>org.rhq.SelectedRowsCommandButton</component-type>
+ <renderer-type>org.rhq.SelectedRowsCommandButton</renderer-type>
+ </component>
+ </tag>
+
</facelet-taglib>
diff --git a/modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js b/modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js
index 01702ea..1f6bae8 100644
--- a/modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js
+++ b/modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js
@@ -1,24 +1,17 @@
/**
- * @param thisObj the calling AllSelect object instance use to determine whether
+ * @param selectAllCheckbox the calling AllSelect object instance use to determine whether
* or select or deselect all of the objects with the name selectName
- * @param selectName name of the dom instances that should be checked / unchecked
+ * @param selectCheckboxName name of the dom instances that should be checked / unchecked
*/
-function selectAll(thisObj, selectName) {
- var selects = document.getElementsByName(selectName);
- var i;
- var select;
- for (i = 0; i < selects.length; i++) {
- select = selects.item(i);
- if (select.disabled) {
- continue;
- }
- if (thisObj.checked) {
- select.checked = true;
- } else {
- select.checked = false;
+function selectAll(selectAllCheckbox, selectCheckboxName) {
+ var selectedCheckboxes = document.getElementsByName(selectCheckboxName);
+ for (var i = 0; i < selectedCheckboxes.length; i++) {
+ var selectedCheckbox = selectedCheckboxes.item(i);
+ if (!selectedCheckbox.disabled) {
+ selectedCheckbox.checked = selectAllCheckbox.checked;
}
}
- updateButtons(selectName);
+ updateButtons(selectCheckboxName);
}
/**
@@ -31,30 +24,34 @@ function selectAll(thisObj, selectName) {
*/
// TODO: Make this robust enough to properly maintain CSS style when the button
// is disabled (ips, 08/31/07).
-function updateButtons(targetName) {
- var count = countSelected(targetName);
- var buttons = document.getElementsByTagName("input");
- var i;
- var button;
- for (i = 0; i < buttons.length; i++) {
- button = buttons.item(i);
- if (button.getAttribute("target") != null
- && button.getAttribute("target") == targetName) {
- var low = button.getAttribute("low");
- var high = button.getAttribute("high");
- if (high != null) {
- if (low <= count && count <= high) {
- button.disabled = false;
- } else {
- button.disabled = true;
- }
- } else {
- if (low <= count) {
- button.disabled = false;
- } else {
- button.disabled = true;
- }
- }
+function updateButtons(rowSelectorCheckboxName) {
+ var selectedCheckboxCount = countSelectedCheckboxes(rowSelectorCheckboxName);
+ var inputs = document.getElementsByTagName("input");
+ for (var i = 0; i < inputs.length; i++) {
+ var input = inputs.item(i);
+ // TODO: Check if the input's type is submit, image, or reset.
+ var target = input.getAttribute("target");
+ if (target == rowSelectorCheckboxName) {
+ var min = input.getAttribute("minimum");
+ var max = input.getAttribute("maximum");
+ input.disabled = (min && selectedCheckboxCount < min) ||
+ (max && selectedCheckboxCount > max);
+ }
+ }
+}
+
+/**
+ * Returns the number of checkboxes with the given name that are currently selected
+ *
+ * @param checkboxName name of the dom instances that should be counted for selections
+ */
+function countSelectedCheckboxes(checkboxName) {
+ var total = 0;
+ var selectedCheckBoxes = document.getElementsByName(checkboxName);
+ for (var i = 0; i < selectedCheckBoxes.length; i++) {
+ if (selectedCheckBoxes.item(i).checked) {
+ total += 1;
}
}
+ return (total);
}
commit c263de20f6b7713967ddef569c0b6b1addbb92fd
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Thu Jan 21 18:36:14 2010 -0500
hook JavaScript into rowSelector and allRowsSelector components to complete them
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
index 42d659c..f962c32 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
@@ -1,6 +1,26 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.core.gui.table.renderer;
import com.sun.faces.util.MessageUtils;
+import org.ajax4jsf.renderkit.HeaderResourceProducer2;
+import org.ajax4jsf.renderkit.ProducerContext;
import org.ajax4jsf.resource.InternetResource;
import org.ajax4jsf.resource.InternetResourceBuilder;
import org.apache.commons.logging.Log;
@@ -17,7 +37,7 @@ import java.io.IOException;
/**
*
*/
-public abstract class AbstractRenderer extends Renderer {
+public abstract class AbstractRenderer extends Renderer implements HeaderResourceProducer2 {
private final Log log = LogFactory.getLog(this.getClass());
private InternetResourceBuilder resourceBuilder;
@@ -45,6 +65,45 @@ public abstract class AbstractRenderer extends Renderer {
}
}
+ /**
+ * Hook method to return array of script resources to store in head.
+ */
+ protected InternetResource[] getScripts() {
+ return null;
+ }
+
+ /**
+ * Hook method to return array of styles resources to store in head.
+ */
+ protected InternetResource[] getStyles() {
+ return null;
+ }
+
+ /**
+ * @param context
+ * @param component
+ * @param resources
+ * @throws IOException
+ */
+ protected void encodeResourcesArray(FacesContext context,
+ UIComponent component, InternetResource[] resources)
+ throws IOException {
+ if (resources != null) {
+ for (InternetResource resource : resources) {
+ resource.encode(context, component);
+ }
+ }
+ }
+
+ public void encodeToHead(FacesContext context, UIComponent component, ProducerContext pc) throws IOException {
+ if (pc.isProcessScripts()) {
+ encodeResourcesArray(context, component, getScripts());
+ }
+ if (pc.isProcessStyles()) {
+ encodeResourcesArray(context, component, getStyles());
+ }
+ }
+
/**
* Base stub method for produce internet resource ( image, script ... )
* since resources must be implemented in "lightweight" pattern, it instances
@@ -64,4 +123,6 @@ public abstract class AbstractRenderer extends Renderer {
}
return this.resourceBuilder;
}
+
+
}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
index 956d9d4..fcfa406 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
@@ -21,6 +21,7 @@ package org.rhq.core.gui.table.renderer;
import com.sun.faces.util.MessageUtils;
import org.ajax4jsf.component.UIDataAdaptor;
import org.ajax4jsf.model.ExtendedDataModel;
+import org.ajax4jsf.resource.InternetResource;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.gui.table.component.RowSelectorComponent;
import org.rhq.core.gui.util.FacesComponentUtility;
@@ -46,6 +47,10 @@ import java.util.Set;
* @author Ian Springer
*/
public class RowSelectorRenderer extends AbstractRenderer {
+ private static final String TABLE_SCRIPT = "/org/rhq/core/gui/table/renderer/js/table.js";
+
+ private InternetResource[] scripts; // Could this be made static?
+
@Override
@SuppressWarnings("unchecked")
public void decode(FacesContext context, UIComponent component) {
@@ -234,4 +239,16 @@ public class RowSelectorRenderer extends AbstractRenderer {
}
return data;
}
+
+ /* (non-Javadoc)
+ * @see org.ajax4jsf.renderkit.HeaderResourcesRendererBase#getScripts()
+ */
+ protected InternetResource[] getScripts() {
+ synchronized (this) {
+ if (scripts == null) {
+ scripts = new InternetResource[] { getResource(TABLE_SCRIPT) };
+ }
+ }
+ return scripts;
+ }
}
diff --git a/modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js b/modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js
new file mode 100644
index 0000000..01702ea
--- /dev/null
+++ b/modules/core/gui/src/main/resources/org/rhq/core/gui/table/renderer/js/table.js
@@ -0,0 +1,60 @@
+/**
+ * @param thisObj the calling AllSelect object instance use to determine whether
+ * or select or deselect all of the objects with the name selectName
+ * @param selectName name of the dom instances that should be checked / unchecked
+ */
+function selectAll(thisObj, selectName) {
+ var selects = document.getElementsByName(selectName);
+ var i;
+ var select;
+ for (i = 0; i < selects.length; i++) {
+ select = selects.item(i);
+ if (select.disabled) {
+ continue;
+ }
+ if (thisObj.checked) {
+ select.checked = true;
+ } else {
+ select.checked = false;
+ }
+ }
+ updateButtons(selectName);
+}
+
+/**
+ * This method will be called either:
+ * 1) directly as a result of checking or unchecking a single Select component, or
+ * 2) as the final task of the selectAll method
+ *
+ * @param selectName name of the dom instances that are checked or unchecked which will determine
+ * whether or not the conditional buttons on the page should be enabled / disabled
+ */
+// TODO: Make this robust enough to properly maintain CSS style when the button
+// is disabled (ips, 08/31/07).
+function updateButtons(targetName) {
+ var count = countSelected(targetName);
+ var buttons = document.getElementsByTagName("input");
+ var i;
+ var button;
+ for (i = 0; i < buttons.length; i++) {
+ button = buttons.item(i);
+ if (button.getAttribute("target") != null
+ && button.getAttribute("target") == targetName) {
+ var low = button.getAttribute("low");
+ var high = button.getAttribute("high");
+ if (high != null) {
+ if (low <= count && count <= high) {
+ button.disabled = false;
+ } else {
+ button.disabled = true;
+ }
+ } else {
+ if (low <= count) {
+ button.disabled = false;
+ } else {
+ button.disabled = true;
+ }
+ }
+ }
+ }
+}
commit 0f3aa934904882db6cf4953b02f4853e19a4fe84
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 22 11:01:22 2010 -0500
Add linkbacks for the browse resource table's resources.
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
index f41c766..3b1383c 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
@@ -18,11 +18,15 @@
*/
package org.rhq.sample.perspective;
+import java.util.List;
+import java.util.Map;
+
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.international.StatusMessage;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.Resource;
@@ -32,10 +36,10 @@ import org.rhq.core.gui.model.PagedDataModel;
import org.rhq.core.gui.model.PagedDataProvider;
import org.rhq.enterprise.client.RemoteClient;
import org.rhq.enterprise.server.perspective.AbstractPagedDataPerspectiveUIBean;
+import org.rhq.enterprise.server.perspective.PerspectiveManagerRemote;
+import org.rhq.enterprise.server.perspective.PerspectiveTarget;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
-import java.util.List;
-
/**
* A Seam component that utilizes the RHQ remote API to obtain a paged list of all inventoried Resources.
*
@@ -46,6 +50,7 @@ import java.util.List;
public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
private PagedDataModel<Resource> dataModel;
private List<Resource> selectedResources;
+ private Map<Integer, String> resourceUrlMap;
public BrowseResourcesUIBean() {
return;
@@ -56,6 +61,7 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
if (this.dataModel == null) {
this.dataModel = createDataModel();
}
+
return this.dataModel;
}
@@ -124,7 +130,33 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
public PageList<Resource> getDataPage(PageControl pageControl) {
ResourceCriteria resourceCriteria = new ResourceCriteria();
resourceCriteria.setPageControl(pageControl);
- return this.resourceManager.findResourcesByCriteria(this.subject, resourceCriteria);
+ PageList<Resource> resources = this.resourceManager.findResourcesByCriteria(this.subject, resourceCriteria);
+ setLinkBackUrls(resources);
+ return resources;
+ }
+ }
+
+ private void setLinkBackUrls(List<Resource> resources) {
+ int[] ids = new int[resources.size()];
+ for (int i = 0, size = resources.size(); (i < size); ++i) {
+ ids[i] = resources.get(i).getId();
+ }
+
+ try {
+ RemoteClient remoteClient = getRemoteClient();
+ Subject subject = getSubject();
+ PerspectiveManagerRemote perspectiveManager = remoteClient.getPerspectiveManagerRemote();
+ this.resourceUrlMap = perspectiveManager.getTargetUrls(subject, PerspectiveTarget.RESOURCE, ids, false,
+ false);
+ } catch (Exception e) {
+ // for the demo, just dump a stack in this unlikely case
+ e.printStackTrace();
}
}
+
+ public String getResourceUrl(int resourceId) {
+ String url = this.resourceUrlMap.get(resourceId);
+ return url;
+ }
+
}
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index 8dd995f..faeefb5 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -61,7 +61,10 @@
<f:facet name="header">
<h:outputLabel for="id" value="Id" />
</f:facet>
- <h:outputText id="id" value="#{resource.id}" />
+
+ <h:outputLink value="#{BrowseResourcesUIBean.getResourceUrl(resource.id)}" target="_top">
+ <h:outputText id="id" value="#{resource.id}" />
+ </h:outputLink>
</rich:column>
<rich:column sortBy="#{r.name}" width="240">
commit d49deda60f86bdb7e34ecb60e8aae6d81fd0ce9b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 22 11:00:49 2010 -0500
Remove unnecessary conf files from sample perspective that are now gotten
from the base overlay. And add a few comments to the overlay versions.
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml
index 84517f8..f584c01 100644
--- a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml
@@ -4,16 +4,25 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
- <!-- /rhq/common/menu/menu.xhtml -->
+ <!-- If your perspective application utilizes JSF managed beans then copy
+ this file to your application and add declarations as needed.
+
<managed-bean>
- <managed-bean-name>PerspectivesMenuUIBean</managed-bean-name>
- <managed-bean-class>org.rhq.enterprise.gui.perspectives.PerspectivesMenuUIBean</managed-bean-class>
+ <managed-bean-name>MyBeanName</managed-bean-name>
+ <managed-bean-class>my.package.MyBeanName</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
+
+ -->
+
+ <!-- If youe perspective application utilizes JSF navigation rules then copy
+ this file to your application and add rules as needed.
-<!--
<navigation-rule>
<from-tree-id></from-tree-id>
<navigation-case></navigation-case>
- </navigation-rule> -->
+ </navigation-rule>
+
+ -->
+
</faces-config>
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml
index 352ffac..d4b66f4 100644
--- a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml
@@ -4,6 +4,10 @@
"-//JBoss//DTD Web Application 4.2//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
+<!-- This is just a sample as needed by the Sample Perspective. Copy this file to your
+ application and modify the loader as needed.
+ -->
+
<jboss-web>
<class-loading>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/faces-config.xml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/faces-config.xml
deleted file mode 100644
index 84517f8..0000000
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/faces-config.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-
-<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
-
- <!-- /rhq/common/menu/menu.xhtml -->
- <managed-bean>
- <managed-bean-name>PerspectivesMenuUIBean</managed-bean-name>
- <managed-bean-class>org.rhq.enterprise.gui.perspectives.PerspectivesMenuUIBean</managed-bean-class>
- <managed-bean-scope>session</managed-bean-scope>
- </managed-bean>
-
-<!--
- <navigation-rule>
- <from-tree-id></from-tree-id>
- <navigation-case></navigation-case>
- </navigation-rule> -->
-</faces-config>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/jboss-web.xml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/jboss-web.xml
deleted file mode 100644
index 352ffac..0000000
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/jboss-web.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE jboss-web PUBLIC
- "-//JBoss//DTD Web Application 4.2//EN"
- "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
-
-<jboss-web>
-
- <class-loading>
- <loader-repository>
- org.rhq:loader=sample-perspective
- <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
- </loader-repository>
- </class-loading>
-
-</jboss-web>
commit eabe3028bb991ee634585d343485fd2117833b50
Merge: ab9efc5... 1651706...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 22 09:42:08 2010 -0500
Merge branch 'linux-config' into linux-config-dev
commit ab9efc5d603d4374ae19d88e0206df344c0d9e8a
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 22 09:41:58 2010 -0500
Some changes to content activators (under construction)
diff --git a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
index f6cfc00..d58b739 100644
--- a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
+++ b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
@@ -661,29 +661,7 @@
<!-- Global Content Activators
-->
- <xs:complexType
- name="ContentProviderActivatorType">
- <xs:annotation>
- <xs:documentation>The specified Content Provider Type must be installed in order to activate the extension.
- </xs:documentation>
- </xs:annotation>
- <xs:complexContent>
- <xs:extension
- base="perspective:ActivatorType">
- <xs:attribute
- name="name"
- type="xs:string"
- use="required">
- <xs:annotation>
- <xs:documentation>The required Content Provider Type's internal name.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-<!-- Under Construction
-
<xs:complexType
name="ContentProviderActivatorType">
<xs:annotation>
@@ -705,12 +683,10 @@
</xs:complexContent>
</xs:complexType>
- -->
-
<!-- Contextual Content Activators
Under Construction
-
+-->
<xs:complexType
name="ContentActivatorType">
<xs:annotation>
@@ -719,7 +695,7 @@
</xs:annotation>
<xs:complexContent>
<xs:extension
- base="perspective:ActivatorType">
+ base="perspective:CommonActivatorsType">
<xs:attribute
name="providerType"
type="xs:string"
@@ -764,7 +740,6 @@
</xs:complexContent>
</xs:complexType>
--->
<!-- =========================================== Helper Types =============================================
-->
commit 16517064f128a674e034d3c1cdcf54d0053d8d79
Merge: 770ed08... 397efa0...
Author: Partha Aji <paji(a)redhat.com>
Date: Fri Jan 22 02:22:46 2010 -0500
Fixed merge conflicts
diff --cc .classpath
index eb5b9e2,8b3c7cf..c0b4b1e
--- a/.classpath
+++ b/.classpath
@@@ -108,10 -107,8 +108,11 @@@
<classpathentry kind="src" path="modules/plugins/platform/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/hosts/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/hosts/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/cobbler/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/cobbler/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/virt/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/virt/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/kickstart/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/snmptrapd/src/main/java"/>
commit 770ed088cd8e05d1ba8d66f98e8545c83aafed46
Author: Partha Aji <paji(a)redhat.com>
Date: Fri Jan 22 02:18:29 2010 -0500
Got the Merge Raw-Structured working..for Cobbler Component
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index e7f60b2..0a0b322 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -19,6 +19,7 @@
package org.rhq.plugins.cobbler;
import java.io.File;
+import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.Set;
@@ -32,7 +33,6 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.measurement.AvailabilityType;
-import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
@@ -58,10 +58,6 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
return super.getAvailability();
}
- public void updateResourceConfiguration(ConfigurationUpdateReport report) {
- super.updateResourceConfiguration(report);
- }
-
public Set<RawConfiguration> loadRawConfigurations() {
try {
Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
@@ -89,12 +85,13 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
- private Augeas createAugeas(String lens, byte[] contents) {
+ private Augeas createAugeas(String lens, byte[] binary) {
try {
Augeas aug = new Augeas(getAugeasRootPath(), AUGEAS_LOAD_PATH, Augeas.NO_MODL_AUTOLOAD);
File fl = File.createTempFile("_rhq", null);
+ String contents = normalizeToUnix(binary);
//write the 'to' file to disk
- FileUtils.writeByteArrayToFile(fl, contents);
+ FileUtils.writeStringToFile(fl, contents);
aug.set("/augeas/load/CobblerTransform/lens", lens);
aug.set("/augeas/load/CobblerTransform/incl", fl.getAbsolutePath());
aug.load();
@@ -116,7 +113,7 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
//apply structured changes
if (SETTINGS_PATH.equals(to.getPath())) {
String server = from.getSimpleValue("settings/server", "");
- aug.set("/files" + file + "/settings/server", server);
+ aug.set("/files" + file + "/server", server);
}
aug.save();
@@ -138,7 +135,7 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
lens = "CobblerSettings.lns";
Augeas aug = createAugeas(lens, from.getContents());
String file = aug.get("/augeas/load/CobblerTransform/incl");
- to.put(new PropertySimple("settings/server", aug.get("/files" + file + "/settings/server")));
+ to.put(new PropertySimple("settings/server", aug.get("/files" + file + "/server")));
aug.close();
}
} catch (Exception e) {
@@ -149,7 +146,8 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
public void persistRawConfiguration(RawConfiguration rawConfiguration) {
try {
- FileUtils.writeByteArrayToFile(new File(rawConfiguration.getPath()), rawConfiguration.getContents());
+ File f = new File(rawConfiguration.getPath());
+ FileUtils.writeStringToFile(f, normalizeToUnix(rawConfiguration.getContents()));
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -170,4 +168,9 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
public void validateStructuredConfiguration(Configuration configuration) {
// TODO Auto-generated method stub
}
+
+ private String normalizeToUnix(byte[] contents) throws UnsupportedEncodingException {
+ String s = new String(contents, "UTF8");
+ return s.replaceAll("\r\n", "\n");
+ }
}
commit f15bdd1b235c139b44b2f620540e49827ca2d757
Merge: ffe6e9b... 3dcb9ef...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Thu Jan 21 17:39:37 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit ffe6e9b74aa6a1969b9bfcc56da87cd3ae90afa5
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Thu Jan 21 17:38:21 2010 -0500
fix NPE that occurs when sorting table when no rows have been selected
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
index aa07305..956d9d4 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
@@ -151,6 +151,9 @@ public class RowSelectorRenderer extends AbstractRenderer {
return selectedDataObjects;
}
+ /*
+ * Returns an immutable Set containing the String representations of the selected row keys.
+ */
@NotNull
private Set<String> getSelectedRowKeys(FacesContext context, UIData data, RowSelectorComponent rowSelector) {
Map<String, Object> requestMap = context.getExternalContext().getRequestMap();
@@ -161,8 +164,13 @@ public class RowSelectorRenderer extends AbstractRenderer {
Map<String, String[]> requestParamMap = context.getExternalContext().getRequestParameterValuesMap();
String requestParamName = rowSelector.getClientId(context);
String[] selectedRowKeyArray = requestParamMap.get(requestParamName);
- selectedRowKeys = new HashSet<String>(selectedRowKeyArray.length);
- Collections.addAll(selectedRowKeys, selectedRowKeyArray);
+ if (selectedRowKeyArray != null) {
+ selectedRowKeys = new HashSet<String>(selectedRowKeyArray.length);
+ Collections.addAll(selectedRowKeys, selectedRowKeyArray);
+ selectedRowKeys = Collections.unmodifiableSet(selectedRowKeys);
+ } else {
+ selectedRowKeys = Collections.emptySet();
+ }
}
return selectedRowKeys;
}
commit 3dcb9efc828e15f5184d65b25c85d95712753f95
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 21 15:48:03 2010 -0500
css/xhtml changes for resource links in left hand nav
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
index d9a8046..91c28c8 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
@@ -2243,6 +2243,13 @@ ul.radio-group .unspecified {
font-size: 11px;
}
+.resourceLink {
+ color: #000;
+ font-weight: normal;
+ font-family: tahoma, verdana, sans-serif;
+ font-size: 11px;
+}
+
.availLinkUp {
color: black;
font-weight: normal;
@@ -2315,3 +2322,8 @@ ul.radio-group .unspecified {
.dr-menu-item {
z-index: 50;
}
+
+.rich-tree-node-highlighted {
+ text-decoration: none;
+ color: #000;
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
index 4232ef4..a6b2360 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
@@ -69,7 +69,7 @@
</a4j:support>
<h:outputText value="#{resourceTreeItem} "
- styleClass="availLink#{resourceTreeItem.data.availability == 0 ? 'Down' : (resourceTreeItem.data.availability == 1 ? 'Up' : 'Mixed')}"/>
+ styleClass="resourceLink"/>
</rich:treeNode>
<rich:treeNode type="LockedResource"
@@ -78,7 +78,7 @@
iconExpanded="/images/icons/dir_open.png"
iconLeaf="/images/icn_tree_Lock.png">
<h:outputText value="#{resourceTreeItem}"
- styleClass="availLink#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'Down' : 'Up'}"/>
+ styleClass="resourceLink"/>
</rich:treeNode>
<!-- Tree Node supporting context menu -->
<rich:treeNode type="Resource"
@@ -100,7 +100,7 @@
</rich:componentControl>
</a4j:support>
<h:outputText value="#{resourceTreeItem}"
- styleClass="availLink#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'Down' : 'Up'}"/>
+ styleClass="resourceLink"/>
</rich:treeNode>
</rich:tree>
commit b95d7a2aaa08962f52441238b68be9fcdadf161d
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 21 14:14:00 2010 -0500
quick change to closed icon collapse
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png
index 95b9f62..c968e71 100644
Binary files a/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png and b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png differ
commit 83085eab6ff8d87b574e40f5f573b0149c1103fc
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Thu Jan 21 13:41:56 2010 -0500
oops, this module should not have a dep on the core-gui jar
diff --git a/modules/enterprise/remoting/client-api/pom.xml b/modules/enterprise/remoting/client-api/pom.xml
index caa557f..25a3820 100644
--- a/modules/enterprise/remoting/client-api/pom.xml
+++ b/modules/enterprise/remoting/client-api/pom.xml
@@ -168,12 +168,6 @@
</dependency>
<dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>rhq-core-gui</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
<groupId>jboss</groupId>
<artifactId>jboss-remoting</artifactId>
</dependency>
commit 9f9b601e6875cc391470f3df4e9e49ecd019f4b6
Merge: 2f60d0b... b5419f2...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Thu Jan 21 13:39:19 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 2f60d0b187066793725557761e896a326d1d4845
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Thu Jan 21 13:38:59 2010 -0500
add allRowsSelector component and update browseResources.xhtml page in sample persp war to make use of it
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index c5e0e49..8dd995f 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -52,7 +52,7 @@
<rich:column width="20">
<f:facet name="header">
- <!-- TODO -->
+ <rhq:allRowsSelector/>
</f:facet>
<rhq:rowSelector mode="multi" value="#{BrowseResourcesUIBean.selectedResources}"/>
</rich:column>
diff --git a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index 28da3b9..f5bc862 100644
--- a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -58,10 +58,10 @@
placement="after" />
</menu-item>
- <!-- Add Sample menu-item to Core Menu -->
+ <!-- Add Sample Perspective menu-item to Core Menu -->
<menu-item
name="sample"
- displayName="Sample">
+ displayName="Sample Perspective">
<position
name="help"
placement="after" />
@@ -93,6 +93,15 @@
</menu-item>
<menu-item
name="sample.child4"
+ displayName="Browse Resources"
+ application="sample"
+ url="browseResources.seam">
+ <position
+ name="sample.child3"
+ placement="after" />
+ </menu-item>
+ <menu-item
+ name="sample.child4"
displayName="Create EJB3 Admin User"
application="sample"
url="wizard.seam">
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/AllRowsSelectorComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/AllRowsSelectorComponent.java
new file mode 100644
index 0000000..d62383e
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/AllRowsSelectorComponent.java
@@ -0,0 +1,85 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.component;
+
+import org.rhq.core.gui.util.FacesExpressionUtility;
+
+import javax.el.ValueExpression;
+import javax.faces.component.UIInput;
+import javax.faces.context.FacesContext;
+
+/**
+ * An HTML component that allows rows in rich:*dataTables to be selected via either checkboxes (if in multi-select mode)
+ * or via radio buttons (if in single-select mode).
+ *
+ * NOTE: It is preferred to use the disabled attribute of this component instead of the rendered attribute. This will
+ * provide consistency to the rendered table such as regardless of what items appear in the table, the check-able
+ * column will always be rendered with a consistent width.
+ *
+ * @author Ian Springer
+ */
+public class AllRowsSelectorComponent extends UIInput {
+ private String dataTableId;
+
+ public static final String COMPONENT_TYPE = "org.rhq.AllRowsSelector";
+ public static final String COMPONENT_FAMILY = "org.rhq.AllRowsSelector";
+
+ @Override
+ public String getFamily() {
+ return COMPONENT_FAMILY;
+ }
+
+ public String getDataTableId() {
+ if (this.dataTableId != null) {
+ return this.dataTableId;
+ }
+ this.dataTableId = (String) getBinding("dataTableId");
+ return this.dataTableId;
+ }
+
+ public void setDataTableId(String dataTableId) {
+ this.dataTableId = dataTableId;
+ }
+
+ @Override
+ public Object saveState(FacesContext context) {
+ Object[] values = new Object[2];
+ values[0] = super.saveState(context);
+ values[1] = this.dataTableId;
+ return values;
+ }
+
+ @Override
+ public void restoreState(FacesContext context, Object state) {
+ Object[] values = (Object[]) state;
+ super.restoreState(context, values[0]);
+ this.dataTableId = (String) values[1];
+ }
+
+ public Object getBinding(String attr) {
+ if (attr == null) {
+ throw new NullPointerException("passed attribute is null");
+ }
+
+ ValueExpression valueExpression = this.getValueExpression(attr);
+ Object attribValue = (valueExpression != null) ? FacesExpressionUtility.getValue(valueExpression, Object.class)
+ : null;
+ return attribValue;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
index 51f3a6b..bf4c36b 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
@@ -18,15 +18,19 @@
*/
package org.rhq.core.gui.table.component;
+import org.ajax4jsf.component.UIDataAdaptor;
+import org.rhq.core.gui.util.FacesComponentUtility;
import org.rhq.core.gui.util.FacesExpressionUtility;
import javax.el.ValueExpression;
+import javax.faces.component.NamingContainer;
+import javax.faces.component.UIData;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
/**
- * An HTML component that allows rows in rich:*dataTables to be selected via either checkboxes (if in multi-select mode)
- * or via radio buttons (if in single-select mode).
+ * An HTML component that allows rows in data tables (i.e. h:dataTables or rich:*dataTables) to be selected via either
+ * checkboxes (if in multi-select mode) or via radio buttons (if in single-select mode).
*
* NOTE: It is preferred to use the disabled attribute of this component instead of the rendered attribute. This will
* provide consistency to the rendered table such as regardless of what items appear in the table, the check-able
@@ -51,10 +55,8 @@ public class RowSelectorComponent extends UIInput {
if (this.mode != null) {
return this.mode;
}
-
Mode mode = (Mode) getBinding("mode");
this.mode = (mode != null) ? mode : DEFAULT_MODE;
-
return this.mode;
}
@@ -70,6 +72,47 @@ public class RowSelectorComponent extends UIInput {
return super.getValue();
}
+ /**
+ * By default, getClientId() would return something like
+ * "myForm:myDataTable:10001:myRowSelector", where "myForm:myDataTable:10001" is the client id of our enclosing
+ * data table, and "10001" is the index of the current row. For each row, we want ourselves to be rendered as a
+ * HTML checkbox with the *same* "name" attribute as the checkboxes for the other rows, so it is easier to
+ * obtain the set of checkboxes via JavaScript. Since the client id is used as the checkbox "name" attribute, we
+ * need to make sure to return a client id that does not include the rowIndex
+ * (e.g. "myForm:myDataTable:myRowSelector". Isn't JSF fun?
+ *
+ * @param context the JSF context
+ * @return our client id
+ */
+ @Override
+ public String getClientId(FacesContext context) {
+ // Get our enclosing data table.
+ UIData data = FacesComponentUtility.getAncestorOfType(this, UIData.class);
+
+ String baseClientId;
+ if (data instanceof UIDataAdaptor) {
+ // It's a RichFaces data table, which conveniently provides a public method that returns its base client id.
+ UIDataAdaptor dataAdaptor = (UIDataAdaptor) data;
+ baseClientId = dataAdaptor.getBaseClientId(context);
+ } else {
+ // It's not a RichFaces data table.
+ int originalRowIndex = data.getRowIndex();
+ // Temporarily set its row index to -1 to force it to return a client id for itself that doesn't include the
+ // row index.
+ data.setRowIndex(-1);
+ baseClientId = data.getClientId(context);
+ data.setRowIndex(originalRowIndex);
+ }
+
+ // Now append our id.
+ String id = getId();
+ if (id == null) {
+ id = context.getViewRoot().createUniqueId();
+ setId(id);
+ }
+ return baseClientId + NamingContainer.SEPARATOR_CHAR + id;
+ }
+
@Override
public Object saveState(FacesContext context) {
Object[] values = new Object[2];
@@ -91,6 +134,7 @@ public class RowSelectorComponent extends UIInput {
}
ValueExpression valueExpression = this.getValueExpression(attr);
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
Object attribValue = (valueExpression != null) ? FacesExpressionUtility.getValue(valueExpression, Object.class)
: null;
return attribValue;
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
new file mode 100644
index 0000000..42d659c
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AbstractRenderer.java
@@ -0,0 +1,67 @@
+package org.rhq.core.gui.table.renderer;
+
+import com.sun.faces.util.MessageUtils;
+import org.ajax4jsf.resource.InternetResource;
+import org.ajax4jsf.resource.InternetResourceBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
+import java.io.IOException;
+
+/**
+ *
+ */
+public abstract class AbstractRenderer extends Renderer {
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ private InternetResourceBuilder resourceBuilder;
+
+ protected void initializeComponentId(FacesContext context, UIComponent component) {
+ if (component.getId() == null) {
+ String id = context.getViewRoot().createUniqueId();
+ component.setId(id);
+ }
+ }
+
+ protected void writeIdAttributeIfNecessary(FacesContext context,
+ ResponseWriter writer,
+ UIComponent component) {
+ initializeComponentId(context, component);
+ if (!component.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX)) {
+ try {
+ writer.writeAttribute("id", component.getClientId(context), "id");
+ } catch (IOException e) {
+ String message = MessageUtils.getExceptionMessageString
+ (MessageUtils.CANT_WRITE_ID_ATTRIBUTE_ERROR_MESSAGE_ID,
+ e.getMessage());
+ log.warn(message);
+ }
+ }
+ }
+
+ /**
+ * Base stub method for produce internet resource ( image, script ... )
+ * since resources must be implemented in "lightweight" pattern, it instances
+ * put in internal map to caching.
+ * @param resourceURI - relative ( to renderer class ) uri to resource in jar or
+ * key for generate ( in Java2D , for example ).
+ * @return - resource instance for this uri.
+ * @throws org.ajax4jsf.resource.ResourceNotFoundException - if reqested resource not instantiated.
+ */
+ protected InternetResource getResource(String resourceURI ) throws FacesException {
+ return getResourceBuilder().createResource(this,resourceURI);
+ }
+
+ private InternetResourceBuilder getResourceBuilder(){
+ if (this.resourceBuilder == null) {
+ this.resourceBuilder = InternetResourceBuilder.getInstance();
+ }
+ return this.resourceBuilder;
+ }
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java
new file mode 100644
index 0000000..c5f9d41
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/AllRowsSelectorRenderer.java
@@ -0,0 +1,143 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.renderer;
+
+import com.sun.faces.util.MessageUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.rhq.core.gui.table.component.AllRowsSelectorComponent;
+import org.rhq.core.gui.table.component.RowSelectorComponent;
+import org.rhq.core.gui.util.FacesComponentUtility;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIData;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * An HTML renderer for {@link org.rhq.core.gui.table.component.AllRowsSelectorComponent}s (i.e. rhq:allRowsSelector).
+ *
+ * @author Ian Springer
+ */
+public class AllRowsSelectorRenderer extends AbstractRenderer {
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @Override
+ public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
+ validateParameters(context, component);
+
+ AllRowsSelectorComponent allRowsSelector = (AllRowsSelectorComponent) component;
+
+ UIData data = getTargetUIData(allRowsSelector);
+ RowSelectorComponent rowSelector = getRowSelector(data);
+ if (rowSelector.getMode() != RowSelectorComponent.Mode.multi) {
+ log.error("An allRowsSelector component was specified for dataTable component " + data
+ + ", which has a rowSelector with mode 'single', "
+ + "but allRowsSelector components can only be used with rowSelectors with mode 'multi'. "
+ + "The allRowSelector will not be rendered.");
+ allRowsSelector.setRendered(false);
+ return;
+ }
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.startElement("input", component);
+
+ writeIdAttributeIfNecessary(context, writer, component);
+
+ String type = "checkbox";
+ writer.writeAttribute("type", type, "type");
+
+ String clientId = component.getClientId(context);
+ writer.writeAttribute("name", clientId, "clientId");
+
+ // TODO: Write 'checked' attribute to allow checkbox to be selected by default? Probably overkill.
+
+ String onclick = "selectAll(this, '" + rowSelector.getClientId(context) + "')";
+ String userSpecifiedOnclick = (String) rowSelector.getAttributes().get("onclick");
+ if (userSpecifiedOnclick != null) {
+ onclick += "; " + userSpecifiedOnclick;
+ }
+ rowSelector.getAttributes().put("onclick", onclick);
+ writer.writeAttribute("onclick", onclick, "onclick");
+ // TODO: Add support for all the other common HTML attributes.
+ //RenderKitUtils.renderPassThruAttributes(writer, component, ATTRIBUTES);
+
+ Boolean disabled = (Boolean) rowSelector.getAttributes().get("disabled");
+ if (disabled != null && disabled) {
+ writer.writeAttribute("disabled", "disabled", "disabled");
+ }
+ //RenderKitUtils.renderXHTMLStyleBooleanAttributes(writer, component);
+
+ writer.endElement("input");
+ }
+
+ private RowSelectorComponent getRowSelector(UIData data) {
+ List<RowSelectorComponent> rowSelectors = FacesComponentUtility.getDescendantsOfType(data,
+ RowSelectorComponent.class);
+ if (rowSelectors.isEmpty()) {
+ throw new IllegalStateException("No rowSelector component was found within the target dataTable component " + data + ".");
+ }
+ if (rowSelectors.size() > 1) {
+ throw new IllegalStateException("More than one rowSelector component was found within the target dataTable component " + data + ".");
+ }
+ RowSelectorComponent rowSelector = rowSelectors.get(0);
+ return rowSelector;
+ }
+
+ private UIData getTargetUIData(AllRowsSelectorComponent allRowsSelector) {
+ UIData data;
+ String dataTableId = allRowsSelector.getDataTableId();
+ if (dataTableId != null) {
+ data = (UIData) allRowsSelector.findComponent(dataTableId);
+ if (data == null) {
+ throw new IllegalStateException("UIData component (i.e. h:dataTable or rich:*dataTable) with id '" + dataTableId + "' not found within naming scope of component "
+ + allRowsSelector + ". The allRowsSelector component must either be within a UIData component or must specify the id of a UIData component within its naming scope via the 'dataTableId' attribute.");
+ }
+ } else {
+ data = FacesComponentUtility.getAncestorOfType(allRowsSelector, UIData.class);
+ if (data == null) {
+ throw new IllegalStateException("Enclosing UIData component (i.e. h:dataTable or rich:*dataTable) not found for component "
+ + allRowsSelector + ". The allRowsSelector component must either be within a UIData component or must specify the id of a UIData component within its naming scope via the 'dataTableId' attribute.");
+ }
+ }
+ return data;
+ }
+
+ @Override
+ public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
+ validateParameters(context, component);
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.write("</input>");
+ }
+
+ private void validateParameters(FacesContext context, UIComponent component) {
+ if (context == null) {
+ throw new NullPointerException(MessageUtils.getExceptionMessageString(
+ MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "context"));
+ }
+
+ if (component == null) {
+ throw new NullPointerException(MessageUtils.getExceptionMessageString(
+ MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "component"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
index 525821c..aa07305 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
@@ -21,31 +21,31 @@ package org.rhq.core.gui.table.renderer;
import com.sun.faces.util.MessageUtils;
import org.ajax4jsf.component.UIDataAdaptor;
import org.ajax4jsf.model.ExtendedDataModel;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
import org.rhq.core.gui.table.component.RowSelectorComponent;
+import org.rhq.core.gui.util.FacesComponentUtility;
import javax.faces.component.UIComponent;
-import javax.faces.component.UIViewRoot;
+import javax.faces.component.UIData;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.Converter;
import javax.faces.model.DataModel;
-import javax.faces.render.Renderer;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* An HTML renderer for {@link RowSelectorComponent}s (i.e. rhq:rowSelector).
*
* @author Ian Springer
*/
-public class RowSelectorRenderer extends Renderer {
- private final Log log = LogFactory.getLog(this.getClass());
-
+public class RowSelectorRenderer extends AbstractRenderer {
@Override
@SuppressWarnings("unchecked")
public void decode(FacesContext context, UIComponent component) {
@@ -53,27 +53,24 @@ public class RowSelectorRenderer extends Renderer {
RowSelectorComponent rowSelector = (RowSelectorComponent) component;
- UIDataAdaptor dataAdaptor = getEnclosingDataAdaptor(rowSelector);
+ UIData data = getEnclosingData(rowSelector);
+
+ // We store the List of selected data objects in a request context attribute and add to it as the data table's
+ // rows are iterated during the updateModelValues phase. If the row is selected, we add the corresponding
+ // data object to the List.
+ List selectedDataObjects = getSelectedRowDataObjects(context, data);
- List selectedDataObjects = getSelectedDataObjects(context, dataAdaptor);
-
// Always set the submitted value, so that, even if no rows were selected, the setter on the managed bean will
// still be passed an empty List, rather than null.
rowSelector.setSubmittedValue(selectedDataObjects);
- Map<String, String> requestParamMap = context.getExternalContext().getRequestParameterMap();
- String requestParamName = rowSelector.getClientId(context);
- String selectedRowKey = requestParamMap.get(requestParamName);
+ Set<String> selectedRowKeys = getSelectedRowKeys(context, data, rowSelector);
- if (selectedRowKey != null) {
- Object rowKey = dataAdaptor.getRowKey();
- Converter rowKeyConverter = dataAdaptor.getRowKeyConverter();
- String rowKeyString = (rowKeyConverter != null) ? rowKeyConverter.getAsString(context, component, rowKey) :
- String.valueOf(rowKey);
- if (selectedRowKey.equals(rowKeyString)) {
- Object rowData = dataAdaptor.getRowData();
- selectedDataObjects.add(rowData);
- }
+ String rowKeyString = getRowKeyAsString(context, component, data);
+ if (selectedRowKeys.contains(rowKeyString)) {
+ // The current row is selected - add the row's data object to our List.
+ Object rowData = data.getRowData();
+ selectedDataObjects.add(rowData);
}
}
@@ -81,7 +78,7 @@ public class RowSelectorRenderer extends Renderer {
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
validateParameters(context, component);
- RowSelectorComponent rowSelector = (RowSelectorComponent) component;
+ RowSelectorComponent rowSelector = (RowSelectorComponent) component;
ResponseWriter writer = context.getResponseWriter();
writer.startElement("input", component);
@@ -95,8 +92,9 @@ public class RowSelectorRenderer extends Renderer {
String clientId = component.getClientId(context);
writer.writeAttribute("name", clientId, "clientId");
- UIDataAdaptor dataAdaptor = getEnclosingDataAdaptor(rowSelector);
- Object rowKey = getRowKey(dataAdaptor);
+
+ UIData data = getEnclosingData(rowSelector);
+ Object rowKey = getRowKey(data);
writer.writeAttribute("value", rowKey, null);
// TODO: Write 'checked' attribute to allow checkbox to be selected by default? Probably overkill.
@@ -107,6 +105,7 @@ public class RowSelectorRenderer extends Renderer {
onclick += "; " + userSpecifiedOnclick;
}
rowSelector.getAttributes().put("onclick", onclick);
+ writer.writeAttribute("onclick", onclick, "onclick");
// TODO: Add support for all the other common HTML attributes.
//RenderKitUtils.renderPassThruAttributes(writer, component, ATTRIBUTES);
@@ -139,29 +138,61 @@ public class RowSelectorRenderer extends Renderer {
}
}
- private List getSelectedDataObjects(FacesContext context, UIDataAdaptor dataAdaptor) {
+ @NotNull
+ private List getSelectedRowDataObjects(FacesContext context, UIData data) {
Map<String, Object> requestMap = context.getExternalContext().getRequestMap();
- String selectedDataObjectsRequestAttributeName = dataAdaptor.getId() + ":" + "selectedDataObjects";
- List selectedDataObjects = (List) requestMap.get(selectedDataObjectsRequestAttributeName);
+ initializeComponentId(context, data);
+ String selectedRowDataObjectsRequestAttributeName = data.getId() + ":" + "selectedRowDataObjects";
+ List selectedDataObjects = (List) requestMap.get(selectedRowDataObjectsRequestAttributeName);
if (selectedDataObjects == null) {
selectedDataObjects = new ArrayList();
- requestMap.put(selectedDataObjectsRequestAttributeName, selectedDataObjects);
+ requestMap.put(selectedRowDataObjectsRequestAttributeName, selectedDataObjects);
}
return selectedDataObjects;
}
- private Object getRowKey(UIDataAdaptor dataAdaptor) {
+ @NotNull
+ private Set<String> getSelectedRowKeys(FacesContext context, UIData data, RowSelectorComponent rowSelector) {
+ Map<String, Object> requestMap = context.getExternalContext().getRequestMap();
+ initializeComponentId(context, data);
+ String selectedRowKeysRequestAttributeName = data.getId() + ":" + "selectedRowKeys";
+ Set<String> selectedRowKeys = (Set<String>) requestMap.get(selectedRowKeysRequestAttributeName);
+ if (selectedRowKeys == null) {
+ Map<String, String[]> requestParamMap = context.getExternalContext().getRequestParameterValuesMap();
+ String requestParamName = rowSelector.getClientId(context);
+ String[] selectedRowKeyArray = requestParamMap.get(requestParamName);
+ selectedRowKeys = new HashSet<String>(selectedRowKeyArray.length);
+ Collections.addAll(selectedRowKeys, selectedRowKeyArray);
+ }
+ return selectedRowKeys;
+ }
+
+ private Object getRowKey(UIData data) {
Object rowKey;
- DataModel dataModel = (DataModel) dataAdaptor.getAttributes().get("dataModel");
- if (dataModel instanceof ExtendedDataModel) {
+ DataModel dataModel = (DataModel) data.getAttributes().get("dataModel");
+ if (data instanceof UIDataAdaptor && dataModel instanceof ExtendedDataModel) {
+ UIDataAdaptor dataAdaptor = (UIDataAdaptor) data;
rowKey = dataAdaptor.getRowKey();
} else {
- Object rowData = dataAdaptor.getRowData();
+ Object rowData = data.getRowData();
rowKey = getPrimaryKey(rowData);
}
return rowKey;
}
+ private String getRowKeyAsString(FacesContext context, UIComponent component, UIData data) {
+ String rowKeyString;
+ Object rowKey = getRowKey(data);
+ if (data instanceof UIDataAdaptor) {
+ UIDataAdaptor dataAdaptor = (UIDataAdaptor) data;
+ Converter rowKeyConverter = dataAdaptor.getRowKeyConverter();
+ rowKeyString = rowKeyConverter.getAsString(context, component, rowKey);
+ } else {
+ rowKeyString = String.valueOf(rowKey);
+ }
+ return rowKeyString;
+ }
+
/**
* Return the specified row data object's primary key. Pretty much all RHQ domain objects use an Integer field named
* 'id' as the primary key.
@@ -186,44 +217,13 @@ public class RowSelectorRenderer extends Renderer {
}
}
- private UIDataAdaptor getEnclosingDataAdaptor(UIComponent component) {
- UIComponent current = component;
- while ((current = current.getParent()) != null) {
- if (current instanceof UIDataAdaptor) {
- return (UIDataAdaptor) current;
- }
- }
- throw new IllegalStateException("Enclosing UIDataAdaptor component (i.e. rich:*dataTable) not found for component "
- + component + ".");
- }
-
- /**
- * @param component the component of interest
- *
- * @return true if this renderer should render an id attribute.
- */
- protected boolean shouldWriteIdAttribute(UIComponent component) {
- String id;
- return (null != (id = component.getId()) &&
- !id.startsWith(UIViewRoot.UNIQUE_ID_PREFIX));
-
- }
-
- protected String writeIdAttributeIfNecessary(FacesContext context,
- ResponseWriter writer,
- UIComponent component) {
- String id = null;
- if (shouldWriteIdAttribute(component)) {
- try {
- writer.writeAttribute("id", id = component.getClientId(context),
- "id");
- } catch (IOException e) {
- String message = MessageUtils.getExceptionMessageString
- (MessageUtils.CANT_WRITE_ID_ATTRIBUTE_ERROR_MESSAGE_ID,
- e.getMessage());
- log.warn(message);
- }
+ @NotNull
+ private UIData getEnclosingData(UIComponent component) {
+ UIData data = FacesComponentUtility.getAncestorOfType(component, UIData.class);
+ if (data == null) {
+ throw new IllegalStateException("Enclosing UIData component (i.e. h:dataTable or rich:*dataTable) not found for component "
+ + component + ".");
}
- return id;
+ return data;
}
}
diff --git a/modules/core/gui/src/main/resources/META-INF/faces-config.xml b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
index 9a0011c..e97c2e5 100644
--- a/modules/core/gui/src/main/resources/META-INF/faces-config.xml
+++ b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
@@ -14,6 +14,15 @@
</component-extension>
</component>
+ <component>
+ <component-type>org.rhq.AllRowsSelector</component-type>
+ <component-class>org.rhq.core.gui.table.component.AllRowsSelectorComponent</component-class>
+ <component-extension>
+ <component-family>org.rhq.AllRowsSelector</component-family>
+ <renderer-type>org.rhq.AllRowsSelector</renderer-type>
+ </component-extension>
+ </component>
+
<render-kit>
<renderer>
@@ -24,6 +33,13 @@
<renderer-class>org.rhq.core.gui.table.renderer.RowSelectorRenderer</renderer-class>
</renderer>
+ <renderer>
+ <description>renders a checkbox, which the user can select in order to select all rows in a data table</description>
+ <component-family>org.rhq.AllRowsSelector</component-family>
+ <renderer-type>org.rhq.AllRowsSelector</renderer-type>
+ <renderer-class>org.rhq.core.gui.table.renderer.AllRowsSelectorRenderer</renderer-class>
+ </renderer>
+
</render-kit>
</faces-config>
diff --git a/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
index 818f507..f20f68e 100644
--- a/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
+++ b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
@@ -16,4 +16,12 @@
</component>
</tag>
+ <tag>
+ <tag-name>allRowsSelector</tag-name>
+ <component>
+ <component-type>org.rhq.AllRowsSelector</component-type>
+ <renderer-type>org.rhq.AllRowsSelector</renderer-type>
+ </component>
+ </tag>
+
</facelet-taglib>
commit b5419f213728c9877f94517c524223a78a95a401
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 21 11:33:19 2010 -0500
new tree visuals for resource types. suitcase->closed folder up/down
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_down_16.png b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_down_16.png
new file mode 100644
index 0000000..a3b1d69
Binary files /dev/null and b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_down_16.png differ
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_up_16.png b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_up_16.png
new file mode 100644
index 0000000..0d26558
Binary files /dev/null and b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/folder_closed_up_16.png differ
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
index 8cdfcc1..4232ef4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
@@ -82,7 +82,7 @@
</rich:treeNode>
<!-- Tree Node supporting context menu -->
<rich:treeNode type="Resource"
- icon="/images/icons/#{resourceTreeItem.data.resourceType.category}_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png"
+ icon="/images/icons/folder_closed_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png"
iconCollapsed="/images/icons/dir_closed.png"
iconExpanded="/images/icons/dir_open.png"
iconLeaf="/images/icons/#{resourceTreeItem.data.resourceType.category}_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png">
commit bbbfec0b9e0e9c4185f04b83e590fac96a139222
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Jan 21 09:53:12 2010 -0500
update the richfaces-api jar to 3.3.2.SR1 as the other rf jars are already
updated to that version.
diff --git a/.classpath b/.classpath
index b875b50..eb5b9e2 100644
--- a/.classpath
+++ b/.classpath
@@ -186,7 +186,7 @@
<classpathentry exported="true" kind="var" path="M2_REPO/org/opensymphony/quartz/quartz/1.6.5/quartz-1.6.5.jar" sourcepath="/M2_REPO/org/opensymphony/quartz/quartz/1.6.5/quartz-1.6.5-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/javax/mail/mail/1.3.1/mail-1.3.1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-api/3.3.0.GA/richfaces-api-3.3.0.GA.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-api/3.1.3.GA/richfaces-api-3.1.3.GA-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-api/3.3.2.SR1/richfaces-api-3.3.2.SR1.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-api/3.1.3.GA/richfaces-api-3.1.3.GA-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-impl/3.3.2.SR1/richfaces-impl-3.3.2.SR1.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-impl/3.3.0.GA/richfaces-impl-3.3.0.GA-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/ui/richfaces-ui/3.3.2.SR1/richfaces-ui-3.3.2.SR1.jar" sourcepath="/M2_REPO/org/richfaces/ui/richfaces-ui/3.3.0.GA/richfaces-ui-3.3.0.GA-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/postgresql/postgresql/8.4-701.jdbc3/postgresql-8.4-701.jdbc3.jar"/>
commit b31dab9b17dd9ec2d1c3ffd85fe1db0dc72b3346
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 23:30:15 2010 -0500
Fixed up some build conflicts in eclipse based on cmd line mvn build.
May also need to up richfaces-api to 3.3.2.SR1 but it didn't seem critical
just yet.
diff --git a/.classpath b/.classpath
index e0a51b9..b875b50 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="modules/common/jboss-as/src/main/java"/>
+ <classpathentry kind="src" path="etc/modules/base-perspective-war/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/jboss-software/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/jboss-software/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/remoting/client-api/src/main/java"/>
@@ -106,12 +107,10 @@
<classpathentry kind="src" path="modules/plugins/hudson/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/platform/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/hosts/src/main/java"/>
- <classpathentry kind="src" path="modules/plugins/hosts/src/test/java"/>
- <classpathentry kind="src" path="modules/plugins/raw-config-test/src/main/java"/>
- <classpathentry kind="src" path="modules/plugins/raw-config-test/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/hosts/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/cobbler/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/cobbler/src/test/java"/>
- <classpathentry kind="src" path="modules/plugins/virt/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/virt/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/virt/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/test/java"/>
@@ -188,8 +187,8 @@
<classpathentry exported="true" kind="var" path="M2_REPO/javax/mail/mail/1.3.1/mail-1.3.1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-api/3.3.0.GA/richfaces-api-3.3.0.GA.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-api/3.1.3.GA/richfaces-api-3.1.3.GA-sources.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-impl/3.3.0.GA/richfaces-impl-3.3.0.GA.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-impl/3.3.0.GA/richfaces-impl-3.3.0.GA-sources.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/ui/richfaces-ui/3.3.0.GA/richfaces-ui-3.3.0.GA.jar" sourcepath="/M2_REPO/org/richfaces/ui/richfaces-ui/3.3.0.GA/richfaces-ui-3.3.0.GA-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-impl/3.3.2.SR1/richfaces-impl-3.3.2.SR1.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-impl/3.3.0.GA/richfaces-impl-3.3.0.GA-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/ui/richfaces-ui/3.3.2.SR1/richfaces-ui-3.3.2.SR1.jar" sourcepath="/M2_REPO/org/richfaces/ui/richfaces-ui/3.3.0.GA/richfaces-ui-3.3.0.GA-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/postgresql/postgresql/8.4-701.jdbc3/postgresql-8.4-701.jdbc3.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/jboss/jboss-cache/1.4.1.SP9/jboss-cache-1.4.1.SP9.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/hyperic/sigar/1.6.3.82/sigar-1.6.3.82.jar" sourcepath="/M2_REPO/org/hyperic/sigar/1.6.3.82/sigar-1.6.3.82-sources.jar"/>
commit 4f90cbdcd6f2336bcd5067c668f03a45e2fc9c3e
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 23:26:51 2010 -0500
Added what seems to be a dependency on core gui.
diff --git a/etc/modules/base-perspective-war/pom.xml b/etc/modules/base-perspective-war/pom.xml
index 6eea28d..b525142 100644
--- a/etc/modules/base-perspective-war/pom.xml
+++ b/etc/modules/base-perspective-war/pom.xml
@@ -30,6 +30,7 @@
<seam.version>2.1.0.SP1</seam.version>
<jboss-el.version>1.0_02.CR5</jboss-el.version>
<richfaces.version>3.3.2.SR1</richfaces.version>
+ <rhq.version>1.4.0-SNAPSHOT</rhq.version>
</properties>
<dependencyManagement>
@@ -106,6 +107,12 @@
<version>${jsf.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-gui</artifactId>
+ <version>${rhq.version}</version>
+ </dependency>
+
</dependencies>
</dependencyManagement>
@@ -174,6 +181,11 @@
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-gui</artifactId>
+ </dependency>
+
</dependencies>
<build>
commit 6d50fbf75dc42e04e528bfa0e893c64858340a4c
Merge: def90fb... ba028df...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 23:26:08 2010 -0500
Merge branch 'linux-config' into linux-config-dev
Conflicts:
etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
diff --cc etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
index ea85ecf,328ae74..0e63ad2
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
@@@ -1,7 -1,23 +1,25 @@@
+ /*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.sample.perspective;
+import java.util.Map;
+
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@@@ -16,8 -32,7 +34,9 @@@ import org.rhq.core.domain.util.PageLis
import org.rhq.enterprise.client.RemoteClient;
import org.rhq.enterprise.server.auth.SubjectManagerRemote;
import org.rhq.enterprise.server.authz.RoleManagerRemote;
+ import org.rhq.enterprise.server.perspective.AbstractPerspectiveUIBean;
+import org.rhq.enterprise.server.perspective.PerspectiveManagerRemote;
+import org.rhq.enterprise.server.perspective.PerspectiveTarget;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerRemote;
commit def90fb51d27ed6a5d457a64b6f7528ae7f36752
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 16:42:13 2010 -0500
Updated the wizard example to make use of linkback urls in the final
wizard page.
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
index 65aeed2..ea85ecf 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
@@ -1,5 +1,7 @@
package org.rhq.sample.perspective;
+import java.util.Map;
+
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@@ -14,6 +16,8 @@ import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.client.RemoteClient;
import org.rhq.enterprise.server.auth.SubjectManagerRemote;
import org.rhq.enterprise.server.authz.RoleManagerRemote;
+import org.rhq.enterprise.server.perspective.PerspectiveManagerRemote;
+import org.rhq.enterprise.server.perspective.PerspectiveTarget;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerRemote;
@@ -122,6 +126,7 @@ public class WizardBean extends AbstractPerspectiveUIBean {
private boolean enableLogin = true;
private PageList<Resource> resources;
+ private Map<Integer, String> resourceUrlMap;
//// STEP N:
@@ -145,6 +150,7 @@ public class WizardBean extends AbstractPerspectiveUIBean {
switch (this.currentStep) {
case One: //create Group for visibility
+
ResourceGroup rg = new ResourceGroup(groupName);
rg.setDescription(groupDescription);
rg.setLocation(groupLocation);
@@ -225,11 +231,17 @@ public class WizardBean extends AbstractPerspectiveUIBean {
this.resources = resourceManager.findResourcesByCriteria(subject, criteria);
int[] resourceIds = new int[resources.size()];
+
for (int i = 0; i < resources.size(); i++) {
- resourceIds[i] = resources.get(i).getId();
+ int id = resources.get(i).getId();
+ resourceIds[i] = id;
}
groupManager.addResourcesToGroup(subject, this.resourceGroup.getId(), resourceIds);
+ PerspectiveManagerRemote perspectiveManager = remoteClient.getPerspectiveManagerRemote();
+ this.resourceUrlMap = perspectiveManager.getTargetUrls(subject, PerspectiveTarget.RESOURCE, resourceIds,
+ false, false);
+
RoleManagerRemote roleManager = remoteClient.getRoleManagerRemote();
this.role = roleManager.createRole(subject, this.role);
@@ -610,4 +622,30 @@ public class WizardBean extends AbstractPerspectiveUIBean {
public PageList<Resource> getResources() {
return resources;
}
+
+ public String getResourceUrl(int resourceId) {
+ String url = this.resourceUrlMap.get(resourceId);
+ return url;
+ }
+
+ public String getGroupsUrl() throws Exception {
+ PerspectiveManagerRemote perspectiveManager = getRemoteClient().getPerspectiveManagerRemote();
+ String url = perspectiveManager.getMenuItemUrl(getSubject(),
+ ((Group.valueOf(this.groupType) == Group.Mixed) ? "groups.mixedGroups" : "groups.compatibleGroups"), false,
+ false);
+ return url;
+ }
+
+ public String getRolesUrl() throws Exception {
+ PerspectiveManagerRemote perspectiveManager = getRemoteClient().getPerspectiveManagerRemote();
+ String url = perspectiveManager.getMenuItemUrl(getSubject(), "administration.security.roles", false, false);
+ return url;
+ }
+
+ public String getUsersUrl() throws Exception {
+ PerspectiveManagerRemote perspectiveManager = getRemoteClient().getPerspectiveManagerRemote();
+ String url = perspectiveManager.getMenuItemUrl(getSubject(), "administration.security.users", false, false);
+ return url;
+ }
+
}
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml
index 966de8e..cc736a9 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/wizard.xhtml
@@ -1,416 +1,489 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:s="http://jboss.com/products/seam/taglib"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.org/rich">
+<html
+ xmlns="http://www.w3.org/1999/xhtml"
+ xml:lang="en"
+ lang="en"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
<ui:remove>
- <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
+ <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
including an xml prolog causes IE6 to go into the undesirable "quirks mode".
(see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
</ui:remove>
- <head>
- <title>
- EJB Administrator Wizard
- </title>
- </head>
+<head>
+<title>EJB Administrator Wizard</title>
+</head>
- <body bgcolor="#FAFFCC">
+<body bgcolor="#FAFFCC">
- <f:view contentType="text/html; charset=UTF-8">
+<f:view contentType="text/html; charset=UTF-8">
- <table cellpadding="2">
- <tr>
- <td width="200" height="650" style="vertical-align:top;">
- <rich:panel style="width:200px;background-color:#FAFFCC;height:650px">
- <f:facet name="header">Steps:</f:facet>
- <table style="border-style: solid;">
- <!-- <table border="1" style="border-top-style: solid; border-top-width:1px;">-->
- <tr>
- <td>
- <rich:spacer height="50"/>
- </td>
- </tr>
- <c:forEach var="step"
- items="#{WizardBean.allSteps}">
- <tr><td><rich:spacer height="1"/></td></tr>
- <c:choose>
- <c:when test="#{WizardBean.currentStep eq step}">
- <tr bgcolor="#D5DBBD">
- <td style="border-style: solid;">
- <b style="font-size: 20px">Step: #{step}</b></td>
- </tr>
- </c:when>
- <c:otherwise>
- <tr>
- <td style="border-style: solid;">
- <b style="font-size: 20px">Step: #{step}</b></td>
- </tr>
- </c:otherwise>
- </c:choose>
- </c:forEach>
- <tr><td><rich:spacer height="50"/></td></tr>
- </table>
- </rich:panel>
- </td>
- <td style="overflow-y: auto;vertical-align:top;" width="600" height="650">
- <h:form id="submit" action="null">
+ <table cellpadding="2">
+ <tr>
+ <td
+ width="200"
+ height="650"
+ style="vertical-align: top;"><rich:panel style="width:200px;background-color:#FAFFCC;height:650px">
+ <f:facet name="header">Steps:</f:facet>
+ <table style="border-style: solid;">
+ <!-- <table border="1" style="border-top-style: solid; border-top-width:1px;">-->
+ <tr>
+ <td><rich:spacer height="50" /></td>
+ </tr>
+ <c:forEach
+ var="step"
+ items="#{WizardBean.allSteps}">
+ <tr>
+ <td><rich:spacer height="1" /></td>
+ </tr>
+ <c:choose>
+ <c:when test="#{WizardBean.currentStep eq step}">
+ <tr bgcolor="#D5DBBD">
+ <td style="border-style: solid;"><b style="font-size: 20px">Step: #{step}</b></td>
+ </tr>
+ </c:when>
+ <c:otherwise>
+ <tr>
+ <td style="border-style: solid;"><b style="font-size: 20px">Step: #{step}</b></td>
+ </tr>
+ </c:otherwise>
+ </c:choose>
+ </c:forEach>
+ <tr>
+ <td><rich:spacer height="50" /></td>
+ </tr>
+ </table>
+ </rich:panel></td>
+ <td
+ style="overflow-y: auto; vertical-align: top;"
+ width="600"
+ height="650"><h:form
+ id="submit"
+ action="null">
- <h:outputText id="title" valueRef="#{WizardBean.title}"></h:outputText>
+ <h:outputText
+ id="title"
+ valueRef="#{WizardBean.title}"></h:outputText>
- <ui:remove>Display welcome to wizard and ask first questions.</ui:remove>
- <ui:remove>In c:choose, define c:when statements for each step.</ui:remove>
+ <ui:remove>Display welcome to wizard and ask first questions.</ui:remove>
+ <ui:remove>In c:choose, define c:when statements for each step.</ui:remove>
- <rich:panel style="width:600px;background-color:#FAFFCC;height:650px">
- <f:facet name="header">The EJB Administrator Account Wizard:</f:facet>
-
- <c:choose>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'One'}">
- <h:outputText id="message2">The wizard will walk you through creation
- of a EJB Administrator user account with associated groups and roles.<br/></h:outputText>
- <rich:spacer height="100"/>
- (to group RHQ EJB resources) <br/>
- <table>
- <tr>
- <th>New Group</th>
- <th>Values</th>
- </tr>
- <tr>
- <td>* Name:</td>
- <td>
- <h:inputText id="groupName" value="#{WizardBean.groupName}" required="true">
- <f:validateLength minimum="1" maximum="100"/>
- </h:inputText>
- </td>
- </tr>
- <tr>
- <td>Description:</td>
- <td>
- <h:inputText id="groupDescription"
- value="#{WizardBean.groupDescription}"></h:inputText>
- </td>
- </tr>
- <tr>
- <td>Location:</td>
- <td>
- <h:inputText id="location" value="#{WizardBean.groupLocation}"></h:inputText>
- </td>
- </tr>
- <tr>
- <td>Type:</td>
- <td>
- <h:selectOneMenu id="groupType" value="#{WizardBean.groupType}">
- <f:selectItem id="Mixed" itemLabel="Mixed" itemValue="Mixed"/>
- <f:selectItem id="Compatible" itemLabel="Compatible"
- itemValue="Compatible"/>
- </h:selectOneMenu>
- </td>
- </tr>
- <tr>
- <td>Make group recursive:</td>
- <td>
- <h:selectBooleanCheckbox id="isRecursive" value="#{WizardBean.recursive}"/>
- </td>
- </tr>
- </table>
- <br/>
- <h:message for="groupName" errorStyle="color:blue"/>
- </c:when>
+ <rich:panel style="width:600px;background-color:#FAFFCC;height:650px">
+ <f:facet name="header">The EJB Administrator Account Wizard:</f:facet>
+
+ <c:choose>
+ <ui:remove>------------------------------------------------------------------</ui:remove>
+ <c:when test="${WizardBean.currentStep == 'One'}">
+ <h:outputText id="message2">The wizard will walk you through creation
+ of a EJB Administrator user account with associated groups and roles.<br />
+ </h:outputText>
+ <rich:spacer height="100" />
+ (to group RHQ EJB resources) <br />
+ <table>
+ <tr>
+ <th>New Group</th>
+ <th>Values</th>
+ </tr>
+ <tr>
+ <td>* Name:</td>
+ <td><h:inputText
+ id="groupName"
+ value="#{WizardBean.groupName}"
+ required="true">
+ <f:validateLength
+ minimum="1"
+ maximum="100" />
+ </h:inputText></td>
+ </tr>
+ <tr>
+ <td>Description:</td>
+ <td><h:inputText
+ id="groupDescription"
+ value="#{WizardBean.groupDescription}"></h:inputText></td>
+ </tr>
+ <tr>
+ <td>Location:</td>
+ <td><h:inputText
+ id="location"
+ value="#{WizardBean.groupLocation}"></h:inputText></td>
+ </tr>
+ <tr>
+ <td>Type:</td>
+ <td><h:selectOneMenu
+ id="groupType"
+ value="#{WizardBean.groupType}">
+ <f:selectItem
+ id="Mixed"
+ itemLabel="Mixed"
+ itemValue="Mixed" />
+ <f:selectItem
+ id="Compatible"
+ itemLabel="Compatible"
+ itemValue="Compatible" />
+ </h:selectOneMenu></td>
+ </tr>
+ <tr>
+ <td>Make group recursive:</td>
+ <td><h:selectBooleanCheckbox
+ id="isRecursive"
+ value="#{WizardBean.recursive}" /></td>
+ </tr>
+ </table>
+ <br />
+ <h:message
+ for="groupName"
+ errorStyle="color:blue" />
+ </c:when>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'Two'}">
- <h:outputText id="message">Role Configuration:<br/></h:outputText>
- <rich:spacer height="100"/>
+ <ui:remove>------------------------------------------------------------------</ui:remove>
+ <c:when test="${WizardBean.currentStep == 'Two'}">
+ <h:outputText id="message">Role Configuration:<br />
+ </h:outputText>
+ <rich:spacer height="100" />
(Role defines permissions for RHQ EJB3 resources)
<table>
- <tr>
- <th>New Role</th>
- <th>Values</th>
- </tr>
- <tr>
- <td>* Name:</td>
- <td>
- <h:inputText id="roleName" value="#{WizardBean.roleName}" required="true">
- <f:validateLength maximum="100"/>
- </h:inputText>
- </td>
- </tr>
- <tr>
- <td>Description:</td>
- <td>
- <h:inputText id="roleDescription" value="#{WizardBean.roleDescription}">
- <f:validateLength maximum="100"/>
- </h:inputText>
- </td>
- </tr>
- <tr>
- <td><b>Manage Security:</b></td>
- <td>
- <h:selectBooleanCheckbox id="manageSecurity"
- value="#{WizardBean.manageSecurityEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Manage Inventory:</b></td>
- <td>
- <h:selectBooleanCheckbox id="manageInventory"
- value="#{WizardBean.manageInventoryEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Manage RHQ Settings:</b></td>
- <td>
- <h:selectBooleanCheckbox id="manageRhqServerSettings"
- value="#{WizardBean.administerRhqServerSettingsEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Modify :</b></td>
- <td>
- <h:selectBooleanCheckbox id="modifyEnabled"
- value="#{WizardBean.modifyEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Delete :</b></td>
- <td>
- <h:selectBooleanCheckbox id="deleteEnabled"
- value="#{WizardBean.deleteEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Create Children:</b></td>
- <td>
- <h:selectBooleanCheckbox id="createChildEnabled"
- value="#{WizardBean.createChildrenEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Alert:</b></td>
- <td>
- <h:selectBooleanCheckbox id="alertEnabled" value="#{WizardBean.alertEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Measure:</b></td>
- <td>
- <h:selectBooleanCheckbox id="measureEnabled"
- value="#{WizardBean.measureEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Content:</b></td>
- <td>
- <h:selectBooleanCheckbox id="contentEnabled"
- value="#{WizardBean.contentEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Control:</b></td>
- <td>
- <h:selectBooleanCheckbox id="controlEnabled"
- value="#{WizardBean.controlEnabled}"/>
- </td>
- </tr>
- <tr>
- <td><b>Configure:</b></td>
- <td>
- <h:selectBooleanCheckbox id="configureEnabled"
- value="#{WizardBean.configureEnabled}"/>
- </td>
- </tr>
+ <tr>
+ <th>New Role</th>
+ <th>Values</th>
+ </tr>
+ <tr>
+ <td>* Name:</td>
+ <td><h:inputText
+ id="roleName"
+ value="#{WizardBean.roleName}"
+ required="true">
+ <f:validateLength maximum="100" />
+ </h:inputText></td>
+ </tr>
+ <tr>
+ <td>Description:</td>
+ <td><h:inputText
+ id="roleDescription"
+ value="#{WizardBean.roleDescription}">
+ <f:validateLength maximum="100" />
+ </h:inputText></td>
+ </tr>
+ <tr>
+ <td><b>Manage Security:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="manageSecurity"
+ value="#{WizardBean.manageSecurityEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Manage Inventory:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="manageInventory"
+ value="#{WizardBean.manageInventoryEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Manage RHQ Settings:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="manageRhqServerSettings"
+ value="#{WizardBean.administerRhqServerSettingsEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Modify :</b></td>
+ <td><h:selectBooleanCheckbox
+ id="modifyEnabled"
+ value="#{WizardBean.modifyEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Delete :</b></td>
+ <td><h:selectBooleanCheckbox
+ id="deleteEnabled"
+ value="#{WizardBean.deleteEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Create Children:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="createChildEnabled"
+ value="#{WizardBean.createChildrenEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Alert:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="alertEnabled"
+ value="#{WizardBean.alertEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Measure:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="measureEnabled"
+ value="#{WizardBean.measureEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Content:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="contentEnabled"
+ value="#{WizardBean.contentEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Control:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="controlEnabled"
+ value="#{WizardBean.controlEnabled}" /></td>
+ </tr>
+ <tr>
+ <td><b>Configure:</b></td>
+ <td><h:selectBooleanCheckbox
+ id="configureEnabled"
+ value="#{WizardBean.configureEnabled}" /></td>
+ </tr>
- </table>
- <br/>
- <h:message for="roleName" errorStyle="color:blue"/>
- </c:when>
+ </table>
+ <br />
+ <h:message
+ for="roleName"
+ errorStyle="color:blue" />
+ </c:when>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'Three'}">
- <h:outputText id="message"><b>New User Account Details</b><br/></h:outputText>
- <h:outputText id="message2">The following actions will occur:<br/></h:outputText>
- <rich:spacer height="100"/>
- (new User account details) <br/>
- <table>
- <tr>
- <th>New User</th>
- <th>Values</th>
- </tr>
- <tr>
- <td>* First Name:</td>
- <td>
- <h:inputText id="firstName" value="#{WizardBean.firstName}" required="true">
- <f:validateLength minimum="1"/>
- </h:inputText>
- </td>
- </tr>
- <tr>
- <td>Last Name:</td>
- <td>
- <h:inputText id="lastName" value="#{WizardBean.lastName}"></h:inputText>
- </td>
- </tr>
- <tr>
- <td>* User Name:</td>
- <td>
- <h:inputText id="newUserName" value="#{WizardBean.newUserName}">
- <f:validateLength minimum="6"/>
- </h:inputText>
- </td>
- </tr>
- <tr>
- <td>* Enter New Password:</td>
- <td>
- <h:inputSecret id="password" value="#{WizardBean.password}" required="true">
- <f:validateLength minimum="3" maximum="16"/>
- </h:inputSecret>
- </td>
- </tr>
- <tr>
- <td>* Confirm New Password:</td>
- <td>
- <h:inputSecret id="password2" value="#{WizardBean.password2}" required="true">
- <f:validateLength minimum="3" maximum="16"/>
- </h:inputSecret>
- </td>
- </tr>
- <tr>
- <td>Phone:</td>
- <td>
- <h:inputText id="phone" value="#{WizardBean.phone}"></h:inputText>
- </td>
- </tr>
- <tr>
- <td>Email:</td>
- <td>
- <h:inputText id="email" value="#{WizardBean.email}"></h:inputText>
- </td>
- </tr>
- <tr>
- <td>Department:</td>
- <td>
- <h:inputText id="department" value="#{WizardBean.department}"></h:inputText>
- </td>
- </tr>
+ <ui:remove>------------------------------------------------------------------</ui:remove>
+ <c:when test="${WizardBean.currentStep == 'Three'}">
+ <h:outputText id="message">
+ <b>New User Account Details</b>
+ <br />
+ </h:outputText>
+ <h:outputText id="message2">The following actions will occur:<br />
+ </h:outputText>
+ <rich:spacer height="100" />
+ (new User account details) <br />
+ <table>
+ <tr>
+ <th>New User</th>
+ <th>Values</th>
+ </tr>
+ <tr>
+ <td>* First Name:</td>
+ <td><h:inputText
+ id="firstName"
+ value="#{WizardBean.firstName}"
+ required="true">
+ <f:validateLength minimum="1" />
+ </h:inputText></td>
+ </tr>
+ <tr>
+ <td>Last Name:</td>
+ <td><h:inputText
+ id="lastName"
+ value="#{WizardBean.lastName}"></h:inputText></td>
+ </tr>
+ <tr>
+ <td>* User Name:</td>
+ <td><h:inputText
+ id="newUserName"
+ value="#{WizardBean.newUserName}">
+ <f:validateLength minimum="6" />
+ </h:inputText></td>
+ </tr>
+ <tr>
+ <td>* Enter New Password:</td>
+ <td><h:inputSecret
+ id="password"
+ value="#{WizardBean.password}"
+ required="true">
+ <f:validateLength
+ minimum="3"
+ maximum="16" />
+ </h:inputSecret></td>
+ </tr>
+ <tr>
+ <td>* Confirm New Password:</td>
+ <td><h:inputSecret
+ id="password2"
+ value="#{WizardBean.password2}"
+ required="true">
+ <f:validateLength
+ minimum="3"
+ maximum="16" />
+ </h:inputSecret></td>
+ </tr>
+ <tr>
+ <td>Phone:</td>
+ <td><h:inputText
+ id="phone"
+ value="#{WizardBean.phone}"></h:inputText></td>
+ </tr>
+ <tr>
+ <td>Email:</td>
+ <td><h:inputText
+ id="email"
+ value="#{WizardBean.email}"></h:inputText></td>
+ </tr>
+ <tr>
+ <td>Department:</td>
+ <td><h:inputText
+ id="department"
+ value="#{WizardBean.department}"></h:inputText></td>
+ </tr>
- <tr>
- <td>Enable this account:</td>
- <td>
- <h:selectBooleanCheckbox id="isEnableLogin" value="#{WizardBean.enableLogin}"/>
- </td>
- </tr>
- </table>
-
- <br/>
- <h:message for="firstName" errorStyle="color:blue"/><br/>
- <h:message for="newUserName" errorStyle="color:blue"/><br/>
- <h:message for="password" errorStyle="color:blue"/><br/>
- <h:message for="password2" errorStyle="color:blue"/><br/>
- <br/>
- </c:when>
+ <tr>
+ <td>Enable this account:</td>
+ <td><h:selectBooleanCheckbox
+ id="isEnableLogin"
+ value="#{WizardBean.enableLogin}" /></td>
+ </tr>
+ </table>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:when test="${WizardBean.currentStep == 'Confirm'}">
- <h:outputText id="message">You're almost done.<br/></h:outputText>
- <h:outputText id="message2">The following will occur when click 'Next':<br/></h:outputText>
- <rich:spacer height="50"/>
- <h:outputText>1) A new Group, '<b>#{WizardBean.groupName}</b>' will be created to group RHQ EJB3
- resources.<br/></h:outputText>
- <h:outputText>2) A new Role, '<b>#{WizardBean.roleName}</b>' will be created defining resource
- access rights.<br/></h:outputText>
- <h:outputText>3) The user '<b>#{WizardBean.newUserName}</b>' will be created with attached role and
- group from steps 1 and 2.<br/></h:outputText>
- <br/>
- <h:outputText >Hit the 'Cancel' button below if you would like to abort this operation.
- </h:outputText><br/>
- </c:when>
+ <br />
+ <h:message
+ for="firstName"
+ errorStyle="color:blue" />
+ <br />
+ <h:message
+ for="newUserName"
+ errorStyle="color:blue" />
+ <br />
+ <h:message
+ for="password"
+ errorStyle="color:blue" />
+ <br />
+ <h:message
+ for="password2"
+ errorStyle="color:blue" />
+ <br />
+ <br />
+ </c:when>
- <c:when test="${WizardBean.currentStep == 'Complete'}">
- <rich:panel style="width:500px">
- <f:facet name="header">Sucess</f:facet>
+ <ui:remove>------------------------------------------------------------------</ui:remove>
+ <c:when test="${WizardBean.currentStep == 'Confirm'}">
+ <h:outputText id="message">You're almost done.<br />
+ </h:outputText>
+ <h:outputText id="message2">The following will occur when click 'Next':<br />
+ </h:outputText>
+ <rich:spacer height="50" />
+ <h:outputText>1) A new Group, '<b>#{WizardBean.groupName}</b>' will be created to group RHQ EJB3
+ resources.<br />
+ </h:outputText>
+ <h:outputText>2) A new Role, '<b>#{WizardBean.roleName}</b>' will be created defining resource
+ access rights.<br />
+ </h:outputText>
+ <h:outputText>3) The user '<b>#{WizardBean.newUserName}</b>' will be created with attached role and
+ group from steps 1 and 2.<br />
+ </h:outputText>
+ <br />
+ <h:outputText>Hit the 'Cancel' button below if you would like to abort this operation.
+ </h:outputText>
+ <br />
+ </c:when>
+
+ <c:when test="${WizardBean.currentStep == 'Complete'}">
+ <rich:panel style="width:500px">
+ <f:facet name="header">Success</f:facet>
The user '<b>#{WizardBean.newUserName}</b>' has been successfully
created, activated and associated with new role '<b>#{WizardBean.roleName}'</b> and new group
'<b>#{WizardBean.groupName}</b>'. This user has permissions for all EJB3
Session beans in inventory, displayed below.
- </rich:panel>
+ <br />
+ <h:outputLink value="#{WizardBean.usersUrl}" target="_top">
+ <h:outputText value="Go To Users" />
+ </h:outputLink>
+ <br />
+ <h:outputLink value="#{WizardBean.rolesUrl}" target="_top">
+ <h:outputText value="Go To Roles" />
+ </h:outputLink>
+ <br />
+ <h:outputLink value="#{WizardBean.groupsUrl}" target="_top">
+ <h:outputText value="Go To Groups" />
+ </h:outputLink>
+ </rich:panel>
+
+ <rich:spacer height="50" />
+
+ <rich:dataTable
+ onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
+ cellpadding="0"
+ cellspacing="0"
+ rows="15"
+ width="500"
+ border="0"
+ var="resource"
+ value="#{WizardBean.resources}">
- <rich:spacer height="50"/>
+ <rich:column sortBy="#{resource.id}">
+ <f:facet name="header">
+ <h:outputText value="Id" />
+ </f:facet>
- <rich:dataTable
- onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
- cellpadding="0" cellspacing="0" rows="15"
- width="500" border="0" var="resource" value="#{WizardBean.resources}">
+ <h:outputLink value="#{WizardBean.getResourceUrl(resource.id)}" target="_top">
+ <h:outputText value="#{resource.id}" />
+ </h:outputLink>
+ </rich:column>
- <rich:column sortBy="#{resource.id}">
- <f:facet name="header">
- <h:outputText value="Id" />
- </f:facet>
- <h:outputText value="#{resource.id}" />
- </rich:column>
+ <rich:column sortBy="#{resource.name}">
+ <f:facet name="header">
+ <h:outputText value="Name" />
+ </f:facet>
+ <h:outputText value="#{resource.name}" />
+ </rich:column>
- <rich:column sortBy="#{resource.name}">
- <f:facet name="header">
- <h:outputText value="Name" />
- </f:facet>
- <h:outputText value="#{resource.name}" />
- </rich:column>
+ <rich:column sortBy="#{resource.description}">
+ <f:facet name="header">
+ <h:outputText value="Description" />
+ </f:facet>
+ <h:outputText value="#{resource.description}" />
+ </rich:column>
- <rich:column sortBy="#{resource.description}">
- <f:facet name="header">
- <h:outputText value="Description" />
- </f:facet>
- <h:outputText value="#{resource.description}" />
- </rich:column>
+ <f:facet name="footer">
+ <rich:datascroller selectedStyle="font-weight:bold" />
+ </f:facet>
+ </rich:dataTable>
+ </c:when>
- <f:facet name="footer">
- <rich:datascroller selectedStyle="font-weight:bold"/>
- </f:facet>
- </rich:dataTable>
- </c:when>
+ <ui:remove>------------------------------------------------------------------</ui:remove>
+ <c:otherwise>
+ <b>NO CONDIDTIONS MATCHED: Contact system administrator.</b>
+ </c:otherwise>
+ </c:choose>
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <c:otherwise>
- <b>NO CONDIDTIONS MATCHED: Contact system administrator.</b>
- </c:otherwise>
- </c:choose>
+ <ui:remove>------------------------------------------------------------------</ui:remove>
+ <br />
+ <br />
+ <h:commandButton
+ id="cancel"
+ value="Cancel"
+ rendered="#{WizardBean.currentStep != 'Complete'}"
+ disabled="#{WizardBean.currentStep eq WizardBean.end}"
+ immediate="true"
+ action="#{WizardBean.cancel}">
+ </h:commandButton>
+ <rich:spacer width="100" />
- <ui:remove>------------------------------------------------------------------</ui:remove>
- <br/><br/>
- <h:commandButton id="cancel" value="Cancel" rendered="#{WizardBean.currentStep != 'Complete'}"
- disabled="#{WizardBean.currentStep eq WizardBean.end}" immediate="true"
- action="#{WizardBean.cancel}">
- </h:commandButton>
- <rich:spacer width="100"/>
-
- <h:commandButton id="previous" value="Back"
- disabled="#{WizardBean.currentStep eq WizardBean.start or WizardBean.currentStep == 'Complete'}"
- rendered="#{WizardBean.currentStep != 'Complete'}" immediate="true"
- action="#{WizardBean.processReverse}">
- </h:commandButton>
- <h:commandButton id="next" value="Next" rendered="#{WizardBean.currentStep != 'Complete'}"
- disabled="#{WizardBean.currentStep eq WizardBean.end}"
- action="#{WizardBean.processActions}">
- </h:commandButton>
+ <h:commandButton
+ id="previous"
+ value="Back"
+ disabled="#{WizardBean.currentStep eq WizardBean.start or WizardBean.currentStep == 'Complete'}"
+ rendered="#{WizardBean.currentStep != 'Complete'}"
+ immediate="true"
+ action="#{WizardBean.processReverse}">
+ </h:commandButton>
+ <h:commandButton
+ id="next"
+ value="Next"
+ rendered="#{WizardBean.currentStep != 'Complete'}"
+ disabled="#{WizardBean.currentStep eq WizardBean.end}"
+ action="#{WizardBean.processActions}">
+ </h:commandButton>
- <br/><br/>
- <h:outputText rendered="#{WizardBean.currentStep != 'Confirm' and WizardBean.currentStep != 'Complete' }">
+ <br />
+ <br />
+ <h:outputText rendered="#{WizardBean.currentStep != 'Confirm' and WizardBean.currentStep != 'Complete' }">
* Required field</h:outputText>
- </rich:panel>
- </h:form>
- </td>
- </tr>
- </table>
- </f:view>
+ </rich:panel>
+ </h:form></td>
+ </tr>
+ </table>
+</f:view>
- </body>
+</body>
</html>
commit 7c0a2f7a20c8b75e410715fcb2ef9f86263e5fe1
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 16:41:33 2010 -0500
trivial spelling fix
diff --git a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index 28da3b9..9d25bfb 100644
--- a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -18,7 +18,7 @@
name="sample"
baseUrl="/rhq-sample-perspective/" />
- <!-- replace the coreMenu log with a new one -->
+ <!-- replace the coreMenu logo with a new one -->
<menu-item
action="remove"
name="logo"
commit 805228407da5d41bf367c4b5a103996fcd903539
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 16:41:06 2010 -0500
Add PerspectiveManagerRemote for use by Remote Clients (i.e. perspectives).
diff --git a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
index c4c8aed..e003d7c 100644
--- a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
+++ b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
@@ -28,7 +28,6 @@ import org.jboss.remoting.security.SSLSocketBuilder;
import org.jboss.remoting.transport.http.ssl.HTTPSClientInvoker;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.enterprise.client.RemoteClientProxy;
import org.rhq.enterprise.communications.util.SecurityUtil;
import org.rhq.enterprise.server.alert.AlertDefinitionManagerRemote;
import org.rhq.enterprise.server.alert.AlertManagerRemote;
@@ -46,6 +45,7 @@ import org.rhq.enterprise.server.measurement.MeasurementDataManagerRemote;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerRemote;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerRemote;
import org.rhq.enterprise.server.operation.OperationManagerRemote;
+import org.rhq.enterprise.server.perspective.PerspectiveManagerRemote;
import org.rhq.enterprise.server.report.DataAccessManagerRemote;
import org.rhq.enterprise.server.resource.ResourceFactoryManagerRemote;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
@@ -82,6 +82,7 @@ public class RemoteClient {
MeasurementDefinitionManager(MeasurementDefinitionManagerRemote.class), //
MeasurementScheduleManager(MeasurementScheduleManagerRemote.class), //
OperationManager(OperationManagerRemote.class), //
+ PerspectiveManager(PerspectiveManagerRemote.class), //
ResourceManager(ResourceManagerRemote.class), //
ResourceFactoryManager(ResourceFactoryManagerRemote.class), //
ResourceGroupManager(ResourceGroupManagerRemote.class), //
@@ -368,6 +369,10 @@ public class RemoteClient {
return RemoteClientProxy.getProcessor(this, Manager.OperationManager);
}
+ public PerspectiveManagerRemote getPerspectiveManagerRemote() {
+ return RemoteClientProxy.getProcessor(this, Manager.PerspectiveManager);
+ }
+
public ResourceManagerRemote getResourceManagerRemote() {
return RemoteClientProxy.getProcessor(this, Manager.ResourceManager);
}
commit 7c5742ca0d6b9f36af9a8e0a961cb6cb96825b08
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 16:39:59 2010 -0500
Added a bunch of support for linking back from a perspective page to a
Core GUI page.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
index 30f5918..5a7bf55 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerBean.java
@@ -32,8 +32,10 @@ import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.cloud.Server;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.cloud.instance.ServerManagerLocal;
import org.rhq.enterprise.server.perspective.activator.Activator;
import org.rhq.enterprise.server.perspective.activator.context.ActivationContext;
import org.rhq.enterprise.server.perspective.activator.context.ActivationContextScope;
@@ -49,13 +51,18 @@ import org.rhq.enterprise.server.plugin.pc.perspective.metadata.PerspectivePlugi
*/
public class PerspectiveManagerBean implements PerspectiveManagerLocal, PerspectiveManagerRemote {
- private final Log log = LogFactory.getLog(PerspectiveManagerBean.class);
-
// Map of sessionId to cached menu entry. The cached menu is re-used for the same sessionId.
// This should more appropriately use Subject as the key, but since Subject equality is
// based on username, it's not quite appropriate.
// The cache is cleaned anytime there is a new entry.
- static final private Map<Integer, CacheEntry> CACHE = new HashMap<Integer, CacheEntry>();
+ static private final Map<Integer, CacheEntry> CACHE = new HashMap<Integer, CacheEntry>();
+
+ static private Server server = null;
+
+ private final Log log = LogFactory.getLog(PerspectiveManagerBean.class);
+
+ @EJB
+ private ServerManagerLocal serverManager;
@EJB
private SubjectManagerLocal subjectManager;
@@ -150,8 +157,7 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
Integer sessionId = subject.getSessionId();
CacheEntry cacheEntry = CACHE.get(sessionId);
long metadataLastModifiedTime = getPluginMetadataManager().getLastModifiedTime();
- if (cacheEntry == null ||
- cacheEntry.getMetadataLastModifiedTime() < metadataLastModifiedTime) {
+ if (cacheEntry == null || cacheEntry.getMetadataLastModifiedTime() < metadataLastModifiedTime) {
// Take this opportunity to clean expired sessions from the cache.
cleanCache();
@@ -252,4 +258,176 @@ public class PerspectiveManagerBean implements PerspectiveManagerLocal, Perspect
}
}
+ /* (non-Javadoc)
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getMenuUrl(org.rhq.core.domain.auth.Subject, java.lang.String)
+ */
+ @Override
+ public String getMenuItemUrl(Subject subject, String menuItemName, boolean makeExplicit, boolean makeSecure) {
+ if (null == menuItemName) {
+ throw new IllegalArgumentException("Invalid menuItemName: null ");
+ }
+
+ String result = null;
+
+ try {
+ result = getMenuItemUrlByName(menuItemName, getMenu(subject));
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Invalid menuItemName: " + menuItemName, e);
+ }
+
+ return (null == result) ? result : makeUrl(result, makeExplicit, makeSecure);
+ }
+
+ private String getMenuItemUrlByName(String menuItemName, List<MenuItem> menuItems) {
+ if (null == menuItems) {
+ return null;
+ }
+
+ String result = null;
+
+ for (MenuItem menuItem : menuItems) {
+ String url = menuItem.getUrl();
+ if (null != url && menuItemName.equals(menuItem.getName())) {
+ result = url;
+ break;
+ } else {
+ result = getMenuItemUrlByName(menuItemName, menuItem.getChildren());
+ if (null != result) {
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getResourceTabUrl(org.rhq.core.domain.auth.Subject, java.lang.String)
+ */
+ @Override
+ public String getResourceTabUrl(Subject subject, String tabName, int resourceId, boolean makeExplicit,
+ boolean makeSecure) {
+ if (null == tabName) {
+ throw new IllegalArgumentException("Invalid tabName: null ");
+ }
+
+ String result = null;
+
+ try {
+ result = getResourceTabUrlByName(tabName, this.getPluginMetadataManager().getResourceTabs());
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Invalid tabName: " + tabName, e);
+ }
+
+ return (null == result) ? result : makeUrl(result, makeExplicit, makeSecure);
+ }
+
+ private String getResourceTabUrlByName(String tabName, List<Tab> tabs) {
+ if (null == tabs) {
+ return null;
+ }
+
+ String result = null;
+
+ for (Tab tab : tabs) {
+ String url = tab.getUrl();
+ if (null != url && tabName.equals(tab.getName())) {
+ result = url;
+ break;
+ } else {
+ result = getResourceTabUrlByName(tabName, tab.getChildren());
+ if (null != result) {
+ break;
+ }
+ }
+ }
+
+ return result;
+
+ }
+
+ /*
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getRootUrl(org.rhq.core.domain.auth.Subject)
+ */
+ @Override
+ public String getRootUrl(Subject subject, boolean makeExplicit, boolean makeSecure) {
+ return makeUrl("/", makeExplicit, makeSecure);
+ }
+
+ /*
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getTargetUrl(org.rhq.core.domain.auth.Subject, org.rhq.enterprise.server.perspective.PerspectiveTarget, int, boolean, boolean)
+ */
+ @Override
+ public String getTargetUrl(Subject subject, PerspectiveTarget target, int targetId, boolean makeExplicit,
+ boolean makeSecure) {
+
+ return makeUrl(target.getTargetUrl(targetId), makeExplicit, makeSecure);
+ }
+
+ /*
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getTargetUrls(org.rhq.core.domain.auth.Subject, org.rhq.enterprise.server.perspective.PerspectiveTarget, int[], boolean, boolean)
+ */
+ @Override
+ public Map<Integer, String> getTargetUrls(Subject subject, PerspectiveTarget target, int[] targetIds,
+ boolean makeExplicit, boolean makeSecure) {
+
+ Map<Integer, String> result = new HashMap<Integer, String>(targetIds.length);
+
+ for (int targetId : targetIds) {
+ result.put(targetId, makeUrl(target.getTargetUrl(targetId), makeExplicit, makeSecure));
+ }
+
+ return result;
+ }
+
+ /*
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getResourceTargetUrl(org.rhq.core.domain.auth.Subject, int, org.rhq.enterprise.server.perspective.PerspectiveTarget, int, boolean, boolean)
+ */
+ @Override
+ public String getResourceTargetUrl(Subject subject, int resourceId, PerspectiveTarget target, int targetId,
+ boolean makeExplicit, boolean makeSecure) {
+
+ return makeUrl(target.getResourceTargetUrl(resourceId, targetId), makeExplicit, makeSecure);
+ }
+
+ /*
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getResourceTargetUrls(org.rhq.core.domain.auth.Subject, int, org.rhq.enterprise.server.perspective.PerspectiveTarget, int[], boolean, boolean)
+ */
+ @Override
+ public Map<Integer, String> getResourceTargetUrls(Subject subject, int resourceId, PerspectiveTarget target,
+ int[] targetIds, boolean makeExplicit, boolean makeSecure) {
+
+ Map<Integer, String> result = new HashMap<Integer, String>(targetIds.length);
+
+ for (int targetId : targetIds) {
+ result.put(targetId, makeUrl(target.getResourceTargetUrl(resourceId, targetId), makeExplicit, makeSecure));
+ }
+
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.rhq.enterprise.server.perspective.PerspectiveManagerLocal#getTemplateTargetUrl(org.rhq.core.domain.auth.Subject, int, org.rhq.enterprise.server.perspective.PerspectiveTarget, int, boolean, boolean)
+ */
+ @Override
+ public String getTemplateTargetUrl(Subject subject, int resourceId, PerspectiveTarget target, int targetId,
+ boolean makeExplicit, boolean makeSecure) {
+
+ return makeUrl(target.getTemplateTargetUrl(resourceId, targetId), makeExplicit, makeSecure);
+ }
+
+ private String makeUrl(String url, boolean makeExplicit, boolean makeSecure) {
+ if (null == url || !makeExplicit || url.startsWith("http")) {
+ return url;
+ }
+
+ if (null == server) {
+ server = serverManager.getServer();
+ }
+
+ String protocol = (makeSecure) ? "https://" : "http://";
+ int port = (makeSecure) ? server.getSecurePort() : server.getPort();
+ String result = protocol + server.getAddress() + ":" + port + url;
+ return result;
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java
index b0da6c8..009d258 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerLocal.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.perspective;
import java.util.List;
+import java.util.Map;
import javax.ejb.Local;
@@ -56,4 +57,54 @@ public interface PerspectiveManagerLocal {
* @return the target url
*/
public String getUrlViaKey(int key) throws PerspectiveException;
+
+ // ****************************************
+ // The following shared with the Remote API
+ // ****************************************
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getRootUrl()}
+ */
+ String getRootUrl(Subject subject, boolean makeExplicit, boolean makeSecure);
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getMenuUrl( Subject )}
+ */
+ String getMenuItemUrl(Subject subject, String menuItemName, boolean makeExplicit, boolean makeSecure);
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getResourceUrl( Subject, String )}
+ */
+ String getResourceTabUrl(Subject subject, String tabName, int resourceId, boolean makeExplicit, boolean makeSecure);
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getTargetUrl(Subject, PerspectiveTarget, int, boolean, boolean)}
+ */
+ String getTargetUrl(Subject subject, PerspectiveTarget target, int targetId, boolean makeExplicit,
+ boolean makeSecure);
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getTargetUrls(Subject, PerspectiveTarget, int[], boolean, boolean)}
+ */
+ Map<Integer, String> getTargetUrls(Subject subject, PerspectiveTarget target, int[] targetIds,
+ boolean makeExplicit, boolean makeSecure);
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getResourceTargetUrl(Subject, int, PerspectiveTarget, int, boolean, boolean)}
+ */
+ String getResourceTargetUrl(Subject subject, int resourceId, PerspectiveTarget target, int targetId,
+ boolean makeExplicit, boolean makeSecure);
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getResourceTargetUrls(Subject, int, PerspectiveTarget, int[], boolean, boolean)}
+ */
+ Map<Integer, String> getResourceTargetUrls(Subject subject, int resourceId, PerspectiveTarget target,
+ int[] targetIds, boolean makeExplicit, boolean makeSecure);
+
+ /**
+ * #see {@link PerspectiveManagerRemote#getTemplateTargetUrl(Subject, int, PerspectiveTarget, int, boolean, boolean)}
+ */
+ String getTemplateTargetUrl(Subject subject, int resourceId, PerspectiveTarget target, int targetId,
+ boolean makeExplicit, boolean makeSecure);
+
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerRemote.java
index a187a5f..c035702 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveManagerRemote.java
@@ -18,10 +18,171 @@
*/
package org.rhq.enterprise.server.perspective;
+import java.util.Map;
+
+import javax.ejb.Remote;
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.server.system.ServerVersion;
+
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
-@WebService
+@WebService(targetNamespace = ServerVersion.namespace)
+@Remote
public interface PerspectiveManagerRemote {
+
+ /**
+ * Get the CoreUI context root. This can be used to assemble a url not otherwise obtainable via the API.
+ * This should be used with care as hardcoded paths may break in future releases of the core UI.
+ *
+ * @param subject
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return the Core GUI root url in the format "protocol://host:port/"
+ */
+ @WebMethod
+ String getRootUrl( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
+ /**
+ * This method does not ensure the specified subject can actually access the requested url.
+ * @param subject
+ * @param menuItemName The name of the menuItem extension point
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return The url for specified extension point. May return null if the extension does not specify a url
+ * @throws IllegalArgumentException if the extension point does not exist.
+ */
+ @WebMethod
+ String getMenuItemUrl( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "menuItemName") String menuItemName, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
+ /**
+ * This method does not ensure the specified subject can actually access the requested url.
+ * @param subject
+ * @param tabName The name of the resource tab extension point
+ * @param resourceId The resource id to be incorporated into the url. This method does not check the validity
+ * of the resourceId.
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return The url for specified extension point. May return null if the extension does not specify a url
+ * @throws IllegalArgumentException if the extension point does not exist.
+ */
+ @WebMethod
+ String getResourceTabUrl( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "tabName") String tabName, //
+ @WebParam(name = "resourceId") int resourceId, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
+ /**
+ * This method does not ensure the specified subject can actually access the requested url.
+ *
+ * @param subject
+ * @param target The target of the navigation link. for example, a role.
+ * @param targetId The id of the specified target. for example, a roleId
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return The url for specified target.
+ */
+ @WebMethod
+ String getTargetUrl( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "target") PerspectiveTarget target, //
+ @WebParam(name = "targetId") int targetId, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
+ /**
+ * When requesting the same target url for several targets this is a more efficient call than calling
+ * getTargetUrl() repeatedly. For example, if generating links to a list of resources.
+ *
+ * This method does not ensure the specified subject can actually access the requested urls.
+ *
+ * @param subject
+ * @param target The target of the navigation link. for example, a role.
+ * @param targetId The id of the specified target. for example, a roleId
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return A Map of targetId to url mappings.
+ */
+ @WebMethod
+ Map<Integer, String> getTargetUrls( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "target") PerspectiveTarget target, //
+ @WebParam(name = "targetIds") int[] targetIds, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
+ /**
+ * This method does not ensure the specified subject can actually access the requested url.
+ *
+ * @param subject
+ * @param resourceId The resource id of the specified target. for example, the resource on which an alert is exists
+ * @param target The target of the navigation link. for example, an alert.
+ * @param targetId The id of the specified target. for example, an alertId
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return The url for specified target.
+ */
+ @WebMethod
+ String getResourceTargetUrl( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "resourceId") int resourceId, //
+ @WebParam(name = "target") PerspectiveTarget target, //
+ @WebParam(name = "targetId") int targetId, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
+ /**
+ * When requesting the same target url for several resource targets this is a more efficient call than calling
+ * getResourceTargetUrl() repeatedly. For example, if generating links to a list of a resource's alerts.
+ *
+ * Same This method does not ensure the specified subject can actually access the requested urls.
+ *
+ * @param subject
+ * @param resourceId The resource id of the specified target. for example, the resource on which an alert is exists
+ * @param target The target of the navigation link. for example, an alert.
+ * @param targetId The id of the specified target. for example, an alertId
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return A Map of targetId to url mappings.
+ */
+ @WebMethod
+ Map<Integer, String> getResourceTargetUrls( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "resourceId") int resourceId, //
+ @WebParam(name = "target") PerspectiveTarget target, //
+ @WebParam(name = "targetIds") int[] targetIds, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
+ /**
+ * This method does not ensure the specified subject can actually access the requested url.
+ * @param subject
+ * @param resourceTypeId The resourceType id of the specified target. for example, the type for an alert template
+ * @param target The target of the navigation link. for example, an alert template
+ * @param targetId The id of the specified target. for example, an alert template definition Id
+ * @param makeExplicit If true ensure "protocol://host:port" prefix. Set true for remotely deployed perspectives.
+ * @param makeSecure If true use the secure protocol and port. Ignored if makeExplicit=false or not supported.
+ * @return The url for specified target.
+ */
+ @WebMethod
+ String getTemplateTargetUrl( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "resourceId") int resourceId, //
+ @WebParam(name = "target") PerspectiveTarget target, //
+ @WebParam(name = "targetId") int targetId, //
+ @WebParam(name = "makeExplicit") boolean makeExplicit, //
+ @WebParam(name = "makeSecure") boolean makeSecure);
+
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveTarget.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveTarget.java
new file mode 100644
index 0000000..3bf4596
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/PerspectiveTarget.java
@@ -0,0 +1,108 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.perspective;
+
+/**
+ * @author jshaughnessy
+ */
+public enum PerspectiveTarget {
+ AGENT("/rhq/ha/viewAgent.xhtml?mode=view&agentId="), //
+ ALERT("/alerts/Alerts.do?mode=viewAlert&a=", true, false), //
+ ALERT_DEFINITION("/alerts/Config.do?mode=viewRoles&ad=", true, false), //
+ ALERT_TEMPLATE("/alerts/Config.do?mode=viewRoles&ad=", false, true), //
+ CONTENT_PROVIDER("/rhq/content/contentProvider.xhtml?mode=view&id="), //
+ GROUP_COMPATIBLE("/rhq/group/monitor/graphs.xhtml?category=COMPATIBLE&groupId="), //
+ GROUP_DEFINITION("/rhq/definition/group/view.xhtml?groupDefinitionId="), //
+ GROUP_MIXED("/rhq/group/inventory/view.xhtml?category=MIXED&groupId="), //
+ METRIC_TEMPLATE("/admin/platform/monitor/Config.do?mode=configure&id=", false, true), //
+ REPO("/rhq/content/repo.xhtml?mode=view&id="), //
+ RESOURCE("/rhq/resource/summary/overview.xhtml?id="), //
+ ROLE("/admin/role/RoleAdmin.do?mode=view&r="), //
+ SERVER("/rhq/ha/viewServer.xhtml?mode=view&serverId="), //
+ USER("/admin/user/UserAdmin.do?mode=view&u=");
+
+ private final String baseUrl;
+ private final boolean isResourceTarget;
+ private final boolean isTemplateTarget;
+
+ PerspectiveTarget(String baseUrl) {
+ this(baseUrl, false, false);
+ }
+
+ private PerspectiveTarget(String baseUrl, boolean isResourceTarget, boolean isTemplateTarget) {
+ this.baseUrl = baseUrl;
+ this.isResourceTarget = isResourceTarget;
+ this.isTemplateTarget = isTemplateTarget;
+ }
+
+ /**
+ * @param targetId The target id. For example, the group id.
+ * @return The url path for the target.
+ * @throws IllegalArgumentException If the PerspectiveTarget is resource qualified (requires a resource id).
+ */
+ public String getTargetUrl(int targetId) {
+ if (this.isResourceTarget || this.isTemplateTarget) {
+ throw new IllegalArgumentException(
+ "This PerspectiveTarget requires resource or resource type information, use appropriate getter: "
+ + this);
+ }
+
+ return this.baseUrl + targetId;
+ }
+
+ /**
+ * @param resourceId The target's resource. For example, the resource on which the alert fired.
+ * @param targetId The resource target. For example, the alert for the specified resource.
+ * @return The url path for the resource qualified target.
+ * @throws IllegalArgumentException If the PerspectiveTarget is not resource qualified.
+ */
+ public String getResourceTargetUrl(int resourceId, int targetId) {
+ if (!this.isResourceTarget) {
+ throw new IllegalArgumentException(
+ "This is not a resource qualified PerspectiveTarget. Use appropriate getter: " + this);
+ }
+
+ return this.baseUrl + targetId + "&id=" + resourceId;
+ }
+
+ /**
+ * @param resourceTypeId The target's resource type. For example, the resource type for the alert template.
+ * @param targetId The target. For example, the alert definition for the alert template.
+ * @return The url path for the template target.
+ * @throws IllegalArgumentException If the PerspectiveTarget is not a template target.
+ */
+ public String getTemplateTargetUrl(int resourceTypeId, int targetId) {
+ if (!this.isTemplateTarget) {
+ throw new IllegalArgumentException("This is not a template PerspectiveTarget. Use appropriate getter: "
+ + this);
+ }
+
+ return this.baseUrl + targetId + "&type=" + resourceTypeId;
+ }
+
+ public boolean isResourceTarget() {
+ return isResourceTarget;
+ }
+
+ public boolean isTemplateTarget() {
+ return isTemplateTarget;
+ }
+
+}
commit 4e28a11c70eafed2d39a387a23a7ca736b30827d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 20 16:39:02 2010 -0500
Fixed some doco. Added some content activation stuff but it's not at all
cooked. Just some idea placeholders, not used.
diff --git a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
index c84594e..f6cfc00 100644
--- a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
+++ b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
@@ -441,16 +441,14 @@
<xs:complexType
name="ResourceActivatorsType">
<xs:annotation>
- <xs:documentation>If any of the activator conditions evaluate to true then the resource activator is active. In
- other words, there is an implicit OR operation applied. For AND logic it is typical to declare several
- "activators" elements in the declaring element. In addition to the activators common to global and resource
- level activators, several additional resource level activators can be specified. These are evaluated against
- the resource in context. Facet Activators ensure the specified facet is implemented by the resource type of
- the resource in context. Resource-permission activators ensure the user has the specified permission on the
- resource in context. Trait Activators ensure that the specified trait value satisfies the specified pattern
- for the resource in context. Resource-type Activators can be used if the extension is active for one or more
- different resource types. In this situation resource-permission and trait activators can be set in a
- fine-grained way, differing for each resource type, if necessary.
+ <xs:documentation>A set of activators that must evaluate to true for the resource-level extension to be active.
+ In addition to the activators common to global and resource-level activatation, several more can be
+ evaluated against the the resource in context. Facet Activators ensure the specified facet is implemented by
+ the resource type of the resource in context. Resource-permission activators ensure the user has the
+ specified permission on the resource in context. Trait Activators ensure that the specified trait value
+ satisfies the specified pattern for the resource in context. Resource-type Activators can be used if the
+ extension is active for one or more different resource types. In this situation resource-permission and
+ trait activators can be set in a fine-grained way, differing for each resource type, if necessary.
</xs:documentation>
</xs:annotation>
<xs:complexContent>
@@ -533,8 +531,6 @@
</xs:complexContent>
</xs:complexType>
- <!-- Subject Activators
--->
<xs:complexType
name="GlobalPermissionActivatorType">
<xs:annotation>
@@ -590,6 +586,8 @@
</xs:complexContent>
</xs:complexType>
+ <!-- Resource Activators
+-->
<xs:complexType
name="FacetActivatorType">
<xs:annotation>
@@ -661,6 +659,113 @@
</xs:complexContent>
</xs:complexType>
+ <!-- Global Content Activators
+-->
+ <xs:complexType
+ name="ContentProviderActivatorType">
+ <xs:annotation>
+ <xs:documentation>The specified Content Provider Type must be installed in order to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="name"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The required Content Provider Type's internal name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+<!-- Under Construction
+
+ <xs:complexType
+ name="ContentProviderActivatorType">
+ <xs:annotation>
+ <xs:documentation>The specified Content Provider Type must be installed in order to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="name"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The required Content Provider Type's internal name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ -->
+
+ <!-- Contextual Content Activators
+
+ Under Construction
+
+ <xs:complexType
+ name="ContentActivatorType">
+ <xs:annotation>
+ <xs:documentation>The content context must satisfy the following conditions to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="providerType"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The in-context content provider's type. The internal name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="provider"
+ type="xs:string"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The in-context content provider. The name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="product"
+ type="xs:string"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The in-context content provider's product. The name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="repo"
+ type="xs:string"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The in-context repo. The name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="package-type"
+ type="xs:string"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The in-context package's type. The internal name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+-->
+
<!-- =========================================== Helper Types =============================================
-->
@@ -707,6 +812,7 @@
</xs:complexContent>
</xs:complexType>
+
<xs:complexType
name="PositionType">
<xs:annotation>
commit ba028df6631877b0ad9ba89b2443e51823aa8830
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Wed Jan 20 11:46:14 2010 -0500
updates left hand tree expanders graphics
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png
new file mode 100644
index 0000000..95b9f62
Binary files /dev/null and b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_closed.png differ
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_open.png b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_open.png
new file mode 100644
index 0000000..5dbfb8b
Binary files /dev/null and b/modules/enterprise/gui/portal-war/src/main/webapp/images/icons/dir_open.png differ
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
index 6a52e7a..8cdfcc1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
@@ -50,6 +50,8 @@
nodes="#{resourceTreeItem.children}" />
<rich:treeNode type="AutoGroupComposite"
+ iconCollapsed="/images/icons/dir_closed.png"
+ iconExpanded="/images/icons/dir_open.png"
iconLeaf="/images/icons/#{resourceTreeItem.data.resourceType == null? 'Subcategory' : 'Auto_group'}_16.png"
icon="/images/icons/#{resourceTreeItem.data.resourceType == null? 'Subcategory' : 'Auto_group'}_16.png">
@@ -72,6 +74,8 @@
<rich:treeNode type="LockedResource"
icon="/images/icn_tree_Lock.png"
+ iconCollapsed="/images/icons/dir_closed.png"
+ iconExpanded="/images/icons/dir_open.png"
iconLeaf="/images/icn_tree_Lock.png">
<h:outputText value="#{resourceTreeItem}"
styleClass="availLink#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'Down' : 'Up'}"/>
@@ -79,6 +83,8 @@
<!-- Tree Node supporting context menu -->
<rich:treeNode type="Resource"
icon="/images/icons/#{resourceTreeItem.data.resourceType.category}_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png"
+ iconCollapsed="/images/icons/dir_closed.png"
+ iconExpanded="/images/icons/dir_open.png"
iconLeaf="/images/icons/#{resourceTreeItem.data.resourceType.category}_#{resourceTreeItem.data.currentAvailability.availabilityType == 'DOWN' ? 'down' : 'up'}_16.png">
<a4j:support event="oncontextmenu" reRender="resourceMenu" timeout="5000"
disableDefault="true" status="commonStatus" limitToList="true"
commit 79fc273ca9f6fe34aeaf5c0c621f99312db4f936
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Wed Jan 20 10:03:32 2010 -0500
fix minor typo bug
diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/LinuxDistroInfo.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/LinuxDistroInfo.java
index c8bf9d5..3622079 100644
--- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/LinuxDistroInfo.java
+++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/LinuxDistroInfo.java
@@ -140,7 +140,7 @@ public class LinuxDistroInfo {
}
if (this.version == null) {
- this.name = DEFAULT_VERSION;
+ this.version = DEFAULT_VERSION;
}
// Finally, append the release codename if we were able to ascertain it.
commit e5da7626e8440b172764764ec54c88dd1d568777
Merge: d269ce6... 7b527a5...
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 20 09:39:06 2010 -0500
Fixed merge conflicts
commit d269ce60c3aed9973dd02e75b34db0cbd080517f
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 20 09:34:47 2010 -0500
Added code to merge between raw and structured ..
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
index eecf935..2f500b6 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
@@ -78,7 +78,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
private static final boolean IS_WINDOWS = (File.separatorChar == '\\');
public static final String DEFAULT_AUGEAS_ROOT_PATH = (IS_WINDOWS) ? "C:/" : "/";
- private static final String AUGEAS_LOAD_PATH = "/usr/share/augeas/lenses";
+ protected static final String AUGEAS_LOAD_PATH = "/usr/share/augeas/lenses";
private final Log log = LogFactory.getLog(this.getClass());
@@ -90,6 +90,10 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
private AugeasNode resourceConfigRootNode;
private String augeasRootPath;
+ protected String getAugeasRootPath() {
+ return augeasRootPath;
+ }
+
public void start(ResourceContext<T> resourceContext) throws InvalidPluginConfigurationException, Exception {
this.resourceContext = resourceContext;
this.resourceDescription = this.resourceContext.getResourceType() + " Resource with key ["
@@ -146,13 +150,13 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
}
protected void updateStructuredConfiguration(Configuration config) throws Exception {
- abortIfAugeasNotAvailable();
+ abortIfAugeasNotAvailable();
// Load the config files from disk and build a tree representation of them in memory.
loadConfigurationFiles(this.augeas);
ConfigurationDefinition resourceConfigDef = this.resourceContext.getResourceType()
- .getResourceConfigurationDefinition();
+ .getResourceConfigurationDefinition();
Collection<PropertyDefinition> propDefs = resourceConfigDef.getPropertyDefinitions().values();
for (PropertyDefinition propDef : propDefs) {
@@ -334,9 +338,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
}
}
- private Augeas createAugeas() {
- Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
-
+ protected Augeas createAugeas() {
Augeas augeas;
try {
augeas = new Augeas(this.augeasRootPath, AUGEAS_LOAD_PATH, Augeas.NO_MODL_AUTOLOAD);
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index 18e93c6..e7f60b2 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -29,6 +29,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
@@ -88,13 +89,62 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
+ private Augeas createAugeas(String lens, byte[] contents) {
+ try {
+ Augeas aug = new Augeas(getAugeasRootPath(), AUGEAS_LOAD_PATH, Augeas.NO_MODL_AUTOLOAD);
+ File fl = File.createTempFile("_rhq", null);
+ //write the 'to' file to disk
+ FileUtils.writeByteArrayToFile(fl, contents);
+ aug.set("/augeas/load/CobblerTransform/lens", lens);
+ aug.set("/augeas/load/CobblerTransform/incl", fl.getAbsolutePath());
+ aug.load();
+ return aug;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
public RawConfiguration mergeRawConfiguration(Configuration from, RawConfiguration to) {
- // TODO Auto-generated method stub
- return null;
+ try {
+ String lens = "CobblerModules.lns";
+ if (SETTINGS_PATH.equals(to.getPath())) {
+ lens = "CobblerSettings.lns";
+ }
+ Augeas aug = createAugeas(lens, to.getContents());
+ String file = aug.get("/augeas/load/CobblerTransform/incl");
+ //apply structured changes
+ if (SETTINGS_PATH.equals(to.getPath())) {
+ String server = from.getSimpleValue("settings/server", "");
+ aug.set("/files" + file + "/settings/server", server);
+ }
+ aug.save();
+
+ //FInally create a new configuration
+ RawConfiguration config = new RawConfiguration();
+ config.setPath(to.getPath());
+ config.setContents(FileUtils.readFileToByteArray(new File(file)));
+ aug.close();
+ return config;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
}
public void mergeStructuredConfiguration(RawConfiguration from, Configuration to) {
- // TODO Auto-generated method stub
+ try {
+ String lens = "CobblerModules.lns";
+ if (SETTINGS_PATH.equals(from.getPath())) {
+ lens = "CobblerSettings.lns";
+ Augeas aug = createAugeas(lens, from.getContents());
+ String file = aug.get("/augeas/load/CobblerTransform/incl");
+ to.put(new PropertySimple("settings/server", aug.get("/files" + file + "/settings/server")));
+ aug.close();
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
}
public void persistRawConfiguration(RawConfiguration rawConfiguration) {
@@ -107,7 +157,7 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
public void persistStructuredConfiguration(Configuration configuration) {
try {
- updateStructuredConfiguration(configuration);
+ updateStructuredConfiguration(configuration);
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -120,5 +170,4 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
public void validateStructuredConfiguration(Configuration configuration) {
// TODO Auto-generated method stub
}
-
}
commit 763b5961b147f3a91e5ad0481621870d13cf1617
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Wed Jan 20 06:40:04 2010 -0500
remove tree node imagery (connector lines)
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
index 35b0dce..6a52e7a 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
@@ -43,6 +43,7 @@
changeExpandListener="#{ResourceTreeStateAdvisor.changeExpandListener}"
nodeSelectListener="#{ResourceTreeStateAdvisor.nodeSelectListener}"
ajaxSubmitSelection="true"
+ showConnectingLines="false"
nodeFace="#{treeNode.data.class.simpleName}">
<rich:recursiveTreeNodesAdaptor roots="#{ResourceTreeModelUIBean.roots}"
var="resourceTreeItem"
commit d55244b8ede28cf10feb1e82be09a9b913701ee4
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 19 23:37:44 2010 -0500
tld files + README with instructions for configuring IntelliJ to use them for auto-completion when editing xhtml files
diff --git a/etc/tlds/README.txt b/etc/tlds/README.txt
new file mode 100644
index 0000000..42bf3fc
--- /dev/null
+++ b/etc/tlds/README.txt
@@ -0,0 +1,26 @@
+IntelliJ IDEA Users
+-------------------
+To get auto-completion working for the JSTL Core, Seam, Ajax4JSF, and RichFaces tag libraries when editing XHTML files in IntelliJ, do the following:
+
+1) Select File > Settings > Project Settings > Resources from the menu.
+
+2) Add the following external resources (where RHQ is the root directory of the RHQ source code):
+
+ URI Location
+ -------------------------------------------------------------
+ http://java.sun.com/jstl/core RHQ/etc/tlds/c.tld
+ http://jboss.com/products/seam/taglib RHQ/etc/tlds/s.tld
+ http://richfaces.org/a4j RHQ/etc/tlds/a4j.tld
+ https://ajax4jsf.dev.java.net/ajax RHQ/etc/tlds/a4j.tld
+ http://richfaces.org/rich RHQ/etc/tlds/rich.tld
+ http://richfaces.ajax4jsf.org/rich RHQ/etc/tlds/rich.tld
+
+3) While you're adding external resources, you may want to also add mappings for the various RHQ schemas to enable auto-completion when editing XML documents using those schemas, e.g.:
+
+ URI Location
+ -------------------------------------------------------------
+ urn:xmlns:rhq-configuration RHQ/modules/core/client-api/src/main/resources/rhq-configuration.xsd
+ urn:xmlns:rhq-plugin RHQ/modules/core/client-api/src/main/resources/rhq-plugin.xsd
+
+Happy auto-completing!
+
diff --git a/etc/tlds/a4j.tld b/etc/tlds/a4j.tld
new file mode 100644
index 0000000..fd1d9c7
--- /dev/null
+++ b/etc/tlds/a4j.tld
@@ -0,0 +1,3882 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+ xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">
+
+ <display-name>Ajax4jsf ( Legacy URL )</display-name>
+<tlib-version>3.3.2</tlib-version>
+ <short-name>ajax</short-name>
+ <uri>https://ajax4jsf.dev.java.net/ajax</uri>
+
+<tag>
+ <description>A combination of the functionality of two JSF tags,
+ &lt;f:actionListener&gt;; and &lt;f:param&gt;. At the
+ render phase, it's decoded by parent component
+ (&lt;h:commandLink&gt;; or like) as usual.
+ &lt;br /&gt;
+ At the process request phase, if the parent component
+ performs an action event, update the value specified in
+ the "assignTo" attribute as its value.
+ &lt;br /&gt;
+ If a converter attribute is specified, use it to encode
+ and decode the value to a string stored in the html
+ parameter.
+ &lt;br /&gt;</description>
+ <name>actionparam</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.ActionParam</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>A method binding that refers to a method with this signature: void methodName(ActionEvent)</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>EL expression for updatable bean property. This property
+ will be updated if the parent command component performs
+ an actionEvent.</description>
+ <name>assignTo</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of a converter to be used or a reference to a
+ converter.</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A name of this parameter</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If set to true, the value will not enclosed within
+ single quotes and there will be no escaping of
+ characters. This allows the use of the value as
+ JavaScript code for calculating value on the
+ client-side. This doesn't work with non-AJAX components.</description>
+ <name>noEscape</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An initial value or a value binding</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>
+ This works the same as ActionListener or ValueChangeListener, but for an AJAX container. Add the specified class
+ as a listener for AjaxEvent (sent in case of an AJAX request
+ for this container).
+ </description>
+
+ <name>ajaxListener</name>
+
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxListenerTag</tag-class>
+
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description> Fully qualified Java class name of an AjaxListener to be created and registered.</description>
+ <name>type</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+<tag>
+ <description>Renders an HTML "input" element.
+ &lt;br /&gt;
+ During Decoding: Obtains the Map from the
+ "requestParameterMap" property of the ExternalContext. If
+ the value in the Map for the value of the "clientId"
+ property of the component is not null, create a
+ javax.faces.event.ActionEvent around the component, and pass
+ it to the queueEvent() method of the component. If the
+ request is Ajax-performed, add its target IDs of the
+ reRender property to the rendered areas list of the nesting
+ AjaxContainer.
+ &lt;br /&gt;
+ During Encoding: Builds an AJAX.Submit JavaScript call for
+ the "onclick" event. Renders the clientId of the component
+ as the value of the "name" attribute. Renders the current
+ value of the component as the value of the "value"
+ attribute. If the "styleClass" attribute is specified,
+ render its value as the value of the "class" attribute.
+ Renders child components inside the HTML "input" element.</description>
+ <display-name>Ajax CommandButton</display-name>
+ <name>commandButton</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxCommandButton</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Alternate textual description of the element rendered by this component.</description>
+ <name>alt</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", disable this component on page.</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now.</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Absolute or relative URL of the image to be displayed for this button. If specified, this "input" element will be of type "image". Otherwise, it will be of the type specified by the "type" property with a label specified by the "value" property.</description>
+ <name>image</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute tells the user agent the initial width of the control. The width is given in pixels except when type attribute has the value "text" or "password". In that case, its value refers to the (integer) number of characters</description>
+ <name>size</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Timeout ( in ms ) for request.</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies a type of control to create. The possible values are "submit", "reset", "image" and "button". The default value for this attribute is "submit"</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Renders an HTML "a" anchor element that acts like a form
+ submit button when clicked.
+ &lt;br /&gt;
+ During Decoding: Obtains the Map from the
+ "requestParameterMap" property of the ExternalContext. If
+ this Map contains non null value for the "clientId" key,
+ creates a javax.faces.event.ActionEvent around the component
+ and passes it to the queueEvent() method of the component.
+ If the request is Ajax-performed, adds its target IDs from
+ the reRender property to the rendered areas list of the
+ nesting AjaxContainer.
+ &lt;br /&gt;
+ element for decoding as described above with the parameters
+ of the component. (PARAM_NAME and PARAM_VALUE are the names
+ and values, respectively, of any nested UIParameter
+ children.) The name and the value must be URLEncoded. If the
+ "styleClass" attribute is specified, render its value as the
+ value of the "class" attribute. Render any non-UIParameter
+ children as normal inside of the "a" element. These will
+ appear as the link text.</description>
+ <display-name>Ajax commandLink</display-name>
+ <name>commandLink</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxCommandLink</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The character encoding of a resource designated by this hyperlink</description>
+ <name>charset</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute specifies shape and it position on the screen.
+ Possible values: "rect: left-x, top-y, right-x, bottom-y", "circle: center-x, center-y, radius", "poly: x1, y1, x2, y2, ..., xN, yN".
+ Notes:
+ a) when giving the radius value in percents, user agents should calculate the final radius value in pixels based on the associated object's width and height;
+ b) the radius value should be smaller than center-x and center-y values;
+ c) for a polygon, the first and last coordinate pairs should have same x and y to close the shape (x1=xN; y1=yN)
+ (when these coordinates are different, user agents should infer an additional pair to close a polygon).
+ Coordinates are relative to the top left corner of an object. All values are lengths. All values are comma separated.</description>
+ <name>coords</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disables the component on page. Boolean.</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Base language of a resource specified with the href attribute; hreflang may only be used with href</description>
+ <name>hreflang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus either when pointing a device or tabbing navigation. The attribute may be used with the same elements as onfocus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The relationship from the current document to the anchor specified by this hyperlink. The value of this attribute is a space-separated list of link types</description>
+ <name>rel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A reverse link from the anchor specified by this hyperlink to the current document. The value of this attribute is a space-separated list of link types</description>
+ <name>rev</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the shape of a region. The possible values are "default", "rect", "circle" and "poly".</description>
+ <name>shape</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the name of a frame where a document is to be opened.
+
+ By assigning a name to a frame via the name attribute, authors can refer to it as the "target" of links defined by other elements</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Timeout ( in ms ) for request.</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The content type of the resource designated by this hyperlink</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Ajax-related version of html form. Main difference with original component - all hidden fields,
+ necessary to command links alwais rendered, not depended of rendering links on initial page.</description>
+ <display-name>Ajax-related version of html form</display-name>
+ <name>form</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.FormTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute specifies a comma-separated list of content types that a server processing this form will handle correctly. User agents may use this information to filter out non-conforming files when prompting you to select files to be sent to the server (cf. the INPUT element when type="file")</description>
+ <name>accept</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the list of character encodings for input data that is accepted by the server processing this form. The value is a space- and/or comma-delimited list of charset values. The client must interpret this list as an exclusive-or list, i.e., the server is able to accept any single character encoding per entity received.
+
+ The default value for this attribute is the reserved string "UNKNOWN". User agents may interpret this value as the character encoding that was used to transmit the document containing this FORM element</description>
+ <name>acceptCharset</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", it becomes possible to set AJAX submission way for any components inside .</description>
+ <name>ajaxSubmit</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the content type used to submit the form to the server (when the value of method is "post"). The default value for this attribute is "application/x-www-form-urlencoded". The value "multipart/form-data" should be used in combination with the INPUT element, type="file"</description>
+ <name>enctype</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>iterationState</description>
+ <name>iterationState</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a form is reset. It is only applied to the FORM element</description>
+ <name>onreset</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a form is submitted. It is only applied to the FORM element</description>
+ <name>onsubmit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The flag indicating whether or not this form should prepend its id to its descendent id during the clientId generation process. If this flag is not set, the default value is "true".</description>
+ <name>prependId</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the name of a frame where a document is to be opened.
+
+ By assigning a name to a frame via the name attribute, authors can refer to it as the "target" of links defined by other elements</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Timeout ( in ms ) for request.</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Ajax-related version of html commandLink. Single difference with original component - all hidden fields,
+ necessary to command links alwais rendered, not depended of rendering links on initial page.</description>
+ <display-name>Ajax-related version of html command link</display-name>
+ <name>htmlCommandLink</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.HtmlCommandLinkTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The character encoding of a resource designated by this hyperlink</description>
+ <name>charset</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute specifies shape and it position on the screen.
+ Possible values: "rect: left-x, top-y, right-x, bottom-y", "circle: center-x, center-y, radius", "poly: x1, y1, x2, y2, ..., xN, yN".
+ Notes:
+ a) when giving the radius value in percents, user agents should calculate the final radius value in pixels based on the associated object's width and height;
+ b) the radius value should be smaller than center-x and center-y values;
+ c) for a polygon, the first and last coordinate pairs should have same x and y to close the shape (x1=xN; y1=yN)
+ (when these coordinates are different, user agents should infer an additional pair to close a polygon).
+ Coordinates are relative to the top left corner of an object. All values are lengths. All values are comma separated.</description>
+ <name>coords</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When set for a form control, this boolean attribute disables the control for your input.</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Base language of a resource specified with the href attribute; hreflang may only be used with href</description>
+ <name>hreflang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus either when pointing a device or tabbing navigation. The attribute may be used with the same elements as onfocus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The relationship from the current document to the anchor specified by this hyperlink. The value of this attribute is a space-separated list of link types</description>
+ <name>rel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A reverse link from the anchor specified by this hyperlink to the current document. The value of this attribute is a space-separated list of link types</description>
+ <name>rev</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the shape of a region. The possible values are "default", "rect", "circle" and "poly".</description>
+ <name>shape</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the name of a frame where a document is to be opened.
+
+ By assigning a name to a frame via the name attribute, authors can refer to it as the "target" of links defined by other elements</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The content type of the resource designated by this hyperlink</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>include content of external view. Navigation cases in included file change only viewId of included page,
+ and don't perform navigation in root view.</description>
+ <display-name>include content of external view</display-name>
+ <name>include</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.HtmlIncludeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Defines, whether the content of this component must be
+ (or not) included in AJAX response created by parent
+ AJAX Container, even if it is not forced by reRender
+ list of ajax action. Ignored if component marked to output by some Ajax action component.
+ Default value is "true".</description>
+ <name>ajaxRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Flag for mark all child components to non-transient. If
+ true, all children components will be set to non-transient state
+ and keep in saved components tree. For output in self-renderer
+ region all content ( By default, all content in &lt;f:verbatim&gt;
+ tags and non-jsf elements in facelets, marked as transient -
+ since, self-rendered ajax regions don't plain output for ajax
+ processing ).</description>
+ <name>keepTransient</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML layout for generated markup. Possible values: "block"
+ for generating an HTML &lt;div&gt; element, "inline" for
+ generating an HTML &lt;span&gt; element, and "none" for generating
+ no HTML element. There is a minor exception for the "none" case
+ where a child element has the property "rendered" set to "false".
+ In this case, we create an empty &lt;span&gt; element with same ID
+ as the child element to use as a placeholder for later
+ processing. Default value is &quot;inline&quot;</description>
+ <name>layout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies the view id of a page that is included.</description>
+ <name>viewId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <display-name>Ajax Function</display-name>
+ <name>jsFunction</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxFunction</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of generated JavaScript function definition</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>
+ This tag get bean by EL expression '#{'+name+'}' and store bean instance in component tree. After restoring view state, bean is putted to request-scope attributes with name.
+ Since, every view will be use own instance of bean for expressions '#{name....}'
+ </description>
+ <name>keepAlive</name>
+
+ <tag-class>org.ajax4jsf.taglib.html.jsp.KeepAliveTag</tag-class>
+
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description> name of bean for EL-expressions.</description>
+ <name>beanName</name>
+ <required>true</required>
+ </attribute>
+
+ <attribute>
+ <description> if true, bean value restored in ajax requests only.</description>
+ <name>ajaxOnly</name>
+ <required>false</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ </tag>
+<tag>
+ <description>Load a resource bundle localized for the Locale of the current view, and expose it (as a Map)
+ in the request attributes of the current request.
+ In difference of original f:loadBundle tag, stored in components tree and activate on ajax/non ajax responses</description>
+ <display-name>Ajax-compatible version of f:loadBundle</display-name>
+ <name>loadBundle</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.LoadBundle</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Base name of the resource bundle to be loaded.</description>
+ <name>basename</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of a request scope attribute under which the
+ resource bundle will be exposed as a Map.</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>loadScript</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.LoadScriptTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>name of JavaScript resource to load.</description>
+ <name>src</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>loadStyle</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.LoadStyleTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>This attribute defines the device to which it is necessary to apply style registration.
+ The possible values are "all", "screen" (by default), "print", "projection", "projection", "braille" and "speech".</description>
+ <name>media</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the context relative path to the style sheet file.</description>
+ <name>src</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Encode javaScript to open popup window with client-side Log information.</description>
+ <display-name>pop-up window with request log</display-name>
+ <name>log</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.LogTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Height of pop-up. Default value is "600".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Keyboard key for activate ( in combination with
+ CTRL+SHIFT ) log window. Default value is "L"</description>
+ <name>hotkey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Log level. The possible values are
+ "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "ALL".
+ Component sets level 'ALL' by default.</description>
+ <name>level</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of pop-up window. Default value is "LogWindow"</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Renders log as pop-up window or as div element on the page. Default value is "true".</description>
+ <name>popup</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Width of pop-up. Default value is "800".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Class for create any link-type elements to user-generated resources :
+ images, sounds, video, active objects, applets etc.
+ Method specified in "CreateContent" attribute will put the data from Data Bean specified
+ in "value" attribute to the OutputStream. Important: Data Bean specified in "value" must implement Serializable.</description>
+ <display-name>Link to user-generated resource</display-name>
+ <name>mediaOutput</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.MediaOutputTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the position of an IMG, OBJECT, or APPLET with respect to its context.
+ The possible values are "bottom", "middle", "top", "left" and "right". The default value is "middle".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies a space-separated list of URIs</description>
+ <name>archive</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the width of an IMG or OBJECT border, in pixels. The default value for this attribute depends on the user agent</description>
+ <name>border</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute is a flag that defines the caching strategy. If 'cacheable' is set to false, the response will not be cached. If it is set to true, it will be cached and the serialized value of 'value' attribute plays the role of a cache key.</description>
+ <name>cacheable</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The character encoding of a resource designated by this hyperlink</description>
+ <name>charset</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>identifies an implementation</description>
+ <name>classid</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>base URI for classid, data, archive</description>
+ <name>codebase</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines content type for code</description>
+ <name>codetype</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of a converter to be used or a reference to a
+ converter.</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute specifies shape and it position on the screen.
+ Possible values: "rect: left-x, top-y, right-x, bottom-y", "circle: center-x, center-y, radius", "poly: x1, y1, x2, y2, ..., xN, yN".
+ Notes:
+ a) when giving the radius value in percents, user agents should calculate the final radius value in pixels based on the associated object's width and height;
+ b) the radius value should be smaller than center-x and center-y values;
+ c) for a polygon, the first and last coordinate pairs should have same x and y to close the shape (x1=xN; y1=yN)
+ (when these coordinates are different, user agents should infer an additional pair to close a polygon).
+ Coordinates are relative to the top left corner of an object. All values are lengths. All values are comma separated.</description>
+ <name>coords</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Method call expression to send generated resource to OutputStream. It must have two parameter with a type of java.io.OutputStream
+ and java.lang.Object ( deserialized value of data attribute )</description>
+ <name>createContent</name>
+ <deferred-method>
+ <method-signature>void createContent(java.io.OutputStream,java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Attribute references to the method that will be used for content creating. The method accepts two parameters. The first parameter has an OutputStream type. It is a reference to the steam that should be used for output. The second parameter is a reference to a 'value' attribute of the component.</description>
+ <name>createContentExpression</name>
+ <deferred-method>
+ <method-signature>void createContentExpression(java.io.OutputStream,java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>declare but don't instantiate flag</description>
+ <name>declare</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of html element for resource link - may be &lt;a&gt; &lt;img&gt; &lt;object&gt; &lt;applet&gt; &lt;script&gt; or &lt;link&gt;</description>
+ <name>element</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute allows to manage caching and defines the period after which a resource is reloaded.</description>
+ <name>expires</name>
+ <deferred-value>
+ <type>java.util.Date</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Base language of a resource specified with the href attribute; hreflang may only be used with href</description>
+ <name>hreflang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the amount of white space to be inserted to the left and right of an IMG, APPLET, or OBJECT. The default value is not specified, but is generally a small, non-zero length</description>
+ <name>hspace</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>use server-side image map</description>
+ <name>ismap</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute allows to manage caching. A browser can send request with the header "If-Modified-Since" for necessity of object reloading. If time of modification is earlier, then the framework doesn't call generation and return code 304.</description>
+ <name>lastModified</name>
+ <deferred-value>
+ <type>java.util.Date</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Geterated content mime-type for append to response
+ header ( 'image/jpeg' etc )</description>
+ <name>mimeType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus either when pointing a device or tabbing navigation. The attribute may be used with the same elements as onfocus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The relationship from the current document to the anchor specified by this hyperlink. The value of this attribute is a space-separated list of link types</description>
+ <name>rel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A reverse link from the anchor specified by this hyperlink to the current document. The value of this attribute is a space-separated list of link types</description>
+ <name>rev</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", a session for an object generation is restored.</description>
+ <name>session</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the shape of a region. The possible values are "default", "rect", "circle" and "poly".</description>
+ <name>shape</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>message to show while loading</description>
+ <name>standby</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the name of a frame where a document is to be opened.
+
+ By assigning a name to a frame via the name attribute, authors can refer to it as the "target" of links defined by other elements</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The content type of the resource designated by this hyperlink</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of attribute for resource-link attribute ( 'href' for &lt;a&gt;, 'src' for &lt;img&gt; or &lt;script&gt;, etc)</description>
+ <name>uriAttribute</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies an image as a client-side image-map</description>
+ <name>usemap</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Data value calculated at render time and stored in URI (also as part of cache Key ),
+ at generation time passed to send method. Can be used for update cache at change of generating
+ conditions, and for creating beans as "Lightweight" pattern components (request scope).
+ IMPORTANT: Since serialized data stored in URI, avoid using big objects.</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the amount of white space to be inserted above and below an IMG, APPLET, or OBJECT. The default value is not specified, but is generally a small, non-zero length</description>
+ <name>vspace</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Creates an AJAX-enabled part of the page. For a normal request,
+ render a &amp;lt;span&amp;gt; or &amp;lt;div&amp;gt; HTML element
+ depending on the value of the "layout" attribute, "inline" or "block".
+ (The "id" attribute will be the value of the clientId property.) For an
+ AJAX request, the content of this element is included in the response if
+ the value of the property, "ajaxRendered", is set to true.</description>
+ <display-name>Ajax OutputPanel</display-name>
+ <name>outputPanel</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxOutputPanel</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Defines, whether the content of this component must be
+ (or not) included in AJAX response created by parent
+ AJAX Container, even if it is not forced by reRender
+ list of ajax action. Ignored if component marked to output by some Ajax action component.
+ Default value is "false".</description>
+ <name>ajaxRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Flag to mark all child components to non-transient. If
+ true, all children components will be set to non-transient state
+ and keep in saved components tree. For output in self-renderer
+ region all content ( By default, all content in &lt;f:verbatim&gt;
+ tags and non-jsf elements in facelets, marked as transient -
+ since, self-rendered ajax regions don't plain output for ajax
+ processing ). Default value is &quot;true&quot;</description>
+ <name>keepTransient</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML layout for generated markup. Possible values: "block"
+ for generating an HTML &lt;div&gt; element, "inline" for
+ generating an HTML &lt;span&gt; element, and "none" for generating
+ no HTML element. There is a minor exception for the "none" case
+ where a child element has the property "rendered" set to "false".
+ In this case, we create an empty &lt;span&gt; element with same ID
+ as the child element to use as a placeholder for later
+ processing. Default value is &quot;inline&quot;</description>
+ <name>layout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>This component renders a full HTML page structure. It must
+ be the first (and only) child for the view root (JSP
+ &lt;f:view&gt; tag). No HTML code can be outside of this
+ component. It also has support for processing child
+ components in AJAX requests, just like &lt;a4j:region&gt;.
+ For a normal request, it will render the results of a
+ &lt;script&gt; element with a client-side library at the
+ page's &lt;head&gt;. If this component includes a "head"
+ facet, the facet's content will also be rendered at the
+ &lt;head&gt; element. For an AJAX request, only affected
+ components in the full document structure will be rendered.
+
+ Here's an example of using it in JSP (jspx version):
+ &lt;jsp:root xmlns:.... &lt;f:view&gt;
+ &lt;a4j:page&gt;&lt;f:facet name="head"&gt; ...
+ &lt;/f:facet&gt; &lt;!-- page content here --&gt;
+ &lt;/a4j:page&gt; &lt;/f:view&gt;&lt;/jsp:root&gt;</description>
+ <display-name>Ajax Page</display-name>
+ <name>page</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxPage</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodExpression representing an action listener method that will be notified when this component is activated by the ajax Request and handle it. The expression must evaluate to a public method that takes an AjaxEvent parameter, with a return type of void</description>
+ <name>ajaxListener</name>
+ <deferred-method>
+ <method-signature>void ajaxListener(org.ajax4jsf.event.AjaxEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set custom mime content type to response</description>
+ <name>contentType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Page layout format ( html, xhtml, html-transitional, html-3.2 ) for encoding DOCTYPE, namespace and Content-Type definitions</description>
+ <name>format</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Flag indicating that, if this component is activated by ajaxrequest, notifications should be delivered to interested listeners and actions immediately (that is, during Apply Request Values phase) rather than waiting until Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set html element default namespace</description>
+ <name>namespace</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before a page is loaded</description>
+ <name>onload</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a page is unloaded</description>
+ <name>onunload</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>String for output as a page title.</description>
+ <name>pageTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if "true", self-render subtree at InvokeApplication ( or Decode, if immediate property set to true ) phase</description>
+ <name>selfRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Periodically perform AJAX request to server, to simulate
+ 'poll' data.</description>
+ <display-name>Ajax Poll</display-name>
+ <name>poll</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxPollTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables/disables polling. Default value is "true".</description>
+ <name>enabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Interval (in ms) for call poll requests. Default value is "1000"ms (1 second).</description>
+ <name>interval</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before an ajax request is submitted</description>
+ <name>onsubmit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Timeout (in ms) for request</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>portlet</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.Portlet</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Periodically perform AJAX request to server, to simulate
+ 'push' data.</description>
+ <display-name>Ajax Push</display-name>
+ <name>push</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxPushTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables/disables pushing. Default value is "true".</description>
+ <name>enabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an PushEventListener with return type void.
+ User bean must register this listener and send EventObject to this listener on ready.</description>
+ <name>eventProducer</name>
+ <deferred-method>
+ <method-signature>void eventProducer(java.util.EventListener)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Interval (in ms) for call push requests. Default value is "1000"ms (1 second).</description>
+ <name>interval</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Timeout (in ms) for request</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;a4j:queue&gt; tag.</description>
+ <name>queue</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.QueueTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", disables this component on page.</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows you to ignore an Ajax response produced by a request if the newest 'similar' request is in the queue already.
+ ignoreDupResponses="true" does not cancel the request while it is processed on the server, but just allows avoiding unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies to name for the named queue.</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called whenever a JavaScript error occurs</description>
+ <name>onerror</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is removed from the queue</description>
+ <name>onrequestdequeue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the request is added to the queue</description>
+ <name>onrequestqueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a size is exceeded</description>
+ <name>onsizeexceeded</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before an ajax request is submitted</description>
+ <name>onsubmit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms) the request will be waiting in the queue before it is ready to be sent.</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the number of requests allowed in the queue at one time.</description>
+ <name>size</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the strategies of the queue's behavior if the number of the requests waiting in the queue is exceeded.
+ There are four strategies: dropNext (by default), dropNew, fireNext , fireNew.</description>
+ <name>sizeExceededBehavior</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Waiting time for response on a particular request. If no response is received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>This tag defines a part of the JSF Tree that is to be decoded on the
+ server side during AJAX request processing</description>
+ <display-name>Ajax Region</display-name>
+ <name>region</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxRegion</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodExpression representing an action listener method that will be notified when this component is activated by the ajax Request and handle it. The expression must evaluate to a public method that takes an AjaxEvent parameter, with a return type of void</description>
+ <name>ajaxListener</name>
+ <deferred-method>
+ <method-signature>void ajaxListener(org.ajax4jsf.event.AjaxEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Flag indicating that, if this component is activated by ajaxrequest, notifications should be delivered to interested listeners and actions immediately (that is, during Apply Request Values phase) rather than waiting until Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Excludes all the components from the outside of the region from updating on the page on Renderer Response phase.
+ Default value is "false".</description>
+ <name>renderRegionOnly</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if "true", self-render subtree at InvokeApplication ( or Decode, if immediate property set to true ) phase</description>
+ <name>selfRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <display-name>Ajax-enabled repeater</display-name>
+ <name>repeat</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxRepeat</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request.</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition.</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope.</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on the client side.</description>
+ <name>stateVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The current value for this component.</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Renders area for indicating Ajax request status on the
+ client-side.
+ &lt;br /&gt;
+ During Encoding: Creates two "span" elements with id created
+ as clientId of this component or of target AJAX region
+ (pointed to by the "for" property) with appended
+ ":status.start" and ":status:stop" strings.
+ &lt;br /&gt;
+ "start" span has "display:none" style (hidden). Inside this
+ span, renders the value of the startText/stopText properties
+ or, if they exist, the content of "start" and "stop" facets.
+ &lt;br /&gt;
+ On performing an AJAX request, the client-side script
+ changes the visibility of the "start" span and hides "stop".
+ After all requests for this indicator are completed,
+ restores "stop" and hide "start" start[style,styleClass] and
+ stop[style,styleClass] are rendered for spans as style and
+ class atributes, respectivetly.
+ &lt;br /&gt;
+ During Encoding: Creates two "span" or "div"(depending on
+ 'layout' attribute) elements with id created as clientId of
+ this component or of target AJAX region (pointed to by the
+ "for" property) with appended ":status.start" and
+ ":status:stop" strings. "start" element has "display:none"
+ style (hidden). Inside this element, renders the value of
+ the startText/stopText properties or, if they exist, the
+ content of "start" and "stop" facets. On performing an AJAX
+ request, the client-side script changes the visibility of
+ the "start" element and hides "stop". After all requests for
+ this indicator are completed, restores "stop" and hide
+ "start"
+ &lt;br /&gt;
+ start[style,styleClass] and stop[style,styleClass] are
+ rendered for spans as style and class atributes,
+ respectivetly.</description>
+ <name>status</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxStatus</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of the AjaxContainer component whose status is
+ indicated (in the format of a
+ javax.faces.UIComopnent.findComponent() call).</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If true, render the ID of the component in HTML code
+ without JSF modifications.</description>
+ <name>forceId</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Define visual layout of panel, can be "block" or
+ "inline".</description>
+ <name>layout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called at the start
+ of the request</description>
+ <name>onstart</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the request is finished</description>
+ <name>onstop</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the element displayed when a request is in progress</description>
+ <name>startStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the element displayed when a request is in progress</description>
+ <name>startStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Text to display on starting request.</description>
+ <name>startText</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the element displayed on a request completion</description>
+ <name>stopStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the element displayed on a request completion</description>
+ <name>stopStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Text for display on request complete.</description>
+ <name>stopText</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Adds the AJAX functionality for those UIComponent-based
+ component that have properties for JavaScript events.
+
+ During Decoding: If a request is Ajax-performed, obtains the
+ Map from the "requestParameterMap" property of the
+ ExternalContext. If this Map contains non null value for the
+ "clientId" key, creates a javax.faces.event.ActionEvent
+ around the component, passes it to the queueEvent() method
+ of the component, and then appends it's reRender components
+ IDs to a list of rendered areas.
+
+ During Encoding. Doesn't encode as a component. Instead, it
+ adds ValueBinding for a property of the parent component
+ with the name as a value of its "event" property. As a
+ result, when rendered, the parent component builds
+ JavaScript code for submitting an AJAX request on this
+ event.
+
+ If the component has child UIParameter components, appends
+ it's name/value as additional request parameters.
+
+ If a parent component is an instance of UIInput and the
+ ajaxType property is "input", submits the value of the input
+ field, also. In this case, you can submit a single input
+ field outside of UIForm.</description>
+ <display-name>Ajax Support</display-name>
+ <name>support</name>
+ <tag-class>org.ajax4jsf.taglib.html.jsp.AjaxSupport</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disables default action for target event ( append "return false;" to JavaScript ). Default value is &quot;false&quot;</description>
+ <name>disableDefault</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", disable this component on page.</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of JavaScript event property ( onclick, onchange,
+ etc.) of parent component, for which we will build AJAX
+ submission code</description>
+ <name>event</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before an ajax request is submitted</description>
+ <name>onsubmit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Timeout (in ms) for request</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+</taglib>
\ No newline at end of file
diff --git a/etc/tlds/c.tld b/etc/tlds/c.tld
new file mode 100644
index 0000000..8c447f5
--- /dev/null
+++ b/etc/tlds/c.tld
@@ -0,0 +1,572 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<taglib xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+ version="2.1">
+
+ <description>JSTL 1.1 core library</description>
+ <display-name>JSTL core</display-name>
+ <tlib-version>1.1</tlib-version>
+ <short-name>c</short-name>
+ <uri>http://java.sun.com/jsp/jstl/core</uri>
+
+ <validator>
+ <description>
+ Provides core validation features for JSTL tags.
+ </description>
+ <validator-class>
+ org.apache.taglibs.standard.tlv.JstlCoreTLV
+ </validator-class>
+ </validator>
+
+ <tag>
+ <description>
+ Catches any Throwable that occurs in its body and optionally
+ exposes it.
+ </description>
+ <name>catch</name>
+ <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+exception thrown from a nested action. The type of the
+scoped variable is the type of the exception thrown.
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Simple conditional tag that establishes a context for
+ mutually exclusive conditional operations, marked by
+ <when> and <otherwise>
+ </description>
+ <name>choose</name>
+ <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
+ <body-content>JSP</body-content>
+ </tag>
+
+ <tag>
+ <description>
+ Simple conditional tag, which evalutes its body if the
+ supplied condition is true and optionally exposes a Boolean
+ scripting variable representing the evaluation of this condition
+ </description>
+ <name>if</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+The test condition that determines whether or
+not the body content should be processed.
+ </description>
+ <name>test</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>boolean</type>
+ </attribute>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+resulting value of the test condition. The type
+of the scoped variable is Boolean.
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Scope for var.
+ </description>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Retrieves an absolute or relative URL and exposes its contents
+ to either the page, a String in 'var', or a Reader in 'varReader'.
+ </description>
+ <name>import</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.ImportTag</tag-class>
+ <tei-class>org.apache.taglibs.standard.tei.ImportTEI</tei-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+The URL of the resource to import.
+ </description>
+ <name>url</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+resource's content. The type of the scoped
+variable is String.
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Scope for var.
+ </description>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+resource's content. The type of the scoped
+variable is Reader.
+ </description>
+ <name>varReader</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the context when accessing a relative
+URL resource that belongs to a foreign
+context.
+ </description>
+ <name>context</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Character encoding of the content at the input
+resource.
+ </description>
+ <name>charEncoding</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ The basic iteration tag, accepting many different
+ collection types and supporting subsetting and other
+ functionality
+ </description>
+ <name>forEach</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
+ <tei-class>org.apache.taglibs.standard.tei.ForEachTEI</tei-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+Collection of items to iterate over.
+ </description>
+ <name>items</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.Object</type>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+If items specified:
+Iteration begins at the item located at the
+specified index. First item of the collection has
+index 0.
+If items not specified:
+Iteration begins with index set at the value
+specified.
+ </description>
+ <name>begin</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>int</type>
+ </attribute>
+ <attribute>
+ <description>
+If items specified:
+Iteration ends at the item located at the
+specified index (inclusive).
+If items not specified:
+Iteration ends when index reaches the value
+specified.
+ </description>
+ <name>end</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>int</type>
+ </attribute>
+ <attribute>
+ <description>
+Iteration will only process every step items of
+the collection, starting with the first one.
+ </description>
+ <name>step</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>int</type>
+ </attribute>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+current item of the iteration. This scoped
+variable has nested visibility. Its type depends
+on the object of the underlying collection.
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+status of the iteration. Object exported is of type
+javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested
+visibility.
+ </description>
+ <name>varStatus</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Iterates over tokens, separated by the supplied delimeters
+ </description>
+ <name>forTokens</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.ForTokensTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+String of tokens to iterate over.
+ </description>
+ <name>items</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+The set of delimiters (the characters that
+separate the tokens in the string).
+ </description>
+ <name>delims</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>
+Iteration begins at the token located at the
+specified index. First token has index 0.
+ </description>
+ <name>begin</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>int</type>
+ </attribute>
+ <attribute>
+ <description>
+Iteration ends at the token located at the
+specified index (inclusive).
+ </description>
+ <name>end</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>int</type>
+ </attribute>
+ <attribute>
+ <description>
+Iteration will only process every step tokens
+of the string, starting with the first one.
+ </description>
+ <name>step</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>int</type>
+ </attribute>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+current item of the iteration. This scoped
+variable has nested visibility.
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+status of the iteration. Object exported is of
+type
+javax.servlet.jsp.jstl.core.LoopTag
+Status. This scoped variable has nested
+visibility.
+ </description>
+ <name>varStatus</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Like <%= ... >, but for expressions.
+ </description>
+ <name>out</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.OutTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+Expression to be evaluated.
+ </description>
+ <name>value</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Default value if the resulting value is null.
+ </description>
+ <name>default</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Determines whether characters <,>,&,'," in the
+resulting string should be converted to their
+corresponding character entity codes. Default value is
+true.
+ </description>
+ <name>escapeXml</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ </tag>
+
+
+ <tag>
+ <description>
+ Subtag of <choose> that follows <when> tags
+ and runs only if all of the prior conditions evaluated to
+ 'false'
+ </description>
+ <name>otherwise</name>
+ <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
+ <body-content>JSP</body-content>
+ </tag>
+
+ <tag>
+ <description>
+ Adds a parameter to a containing 'import' tag's URL.
+ </description>
+ <name>param</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.ParamTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+Name of the query string parameter.
+ </description>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Value of the parameter.
+ </description>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Redirects to a new URL.
+ </description>
+ <name>redirect</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.RedirectTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+The URL of the resource to redirect to.
+ </description>
+ <name>url</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the context when redirecting to a relative URL
+resource that belongs to a foreign context.
+ </description>
+ <name>context</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Removes a scoped variable (from a particular scope, if specified).
+ </description>
+ <name>remove</name>
+ <tag-class>org.apache.taglibs.standard.tag.common.core.RemoveTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <description>
+Name of the scoped variable to be removed.
+ </description>
+ <name>var</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Scope for var.
+ </description>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Sets the result of an expression evaluation in a 'scope'
+ </description>
+ <name>set</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.SetTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+Name of the exported scoped variable to hold the value
+specified in the action. The type of the scoped variable is
+whatever type the value expression evaluates to.
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Expression to be evaluated.
+ </description>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>
+Target object whose property will be set. Must evaluate to
+a JavaBeans object with setter property property, or to a
+java.util.Map object.
+ </description>
+ <name>target</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the property to be set in the target object.
+ </description>
+ <name>property</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Scope for var.
+ </description>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Creates a URL with optional query parameters.
+ </description>
+ <name>url</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.UrlTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+Name of the exported scoped variable for the
+processed url. The type of the scoped variable is
+String.
+ </description>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Scope for var.
+ </description>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+URL to be processed.
+ </description>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <description>
+Name of the context when specifying a relative URL
+resource that belongs to a foreign context.
+ </description>
+ <name>context</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ </tag>
+
+ <tag>
+ <description>
+ Subtag of <choose> that includes its body if its
+ condition evalutes to 'true'
+ </description>
+ <name>when</name>
+ <tag-class>org.apache.taglibs.standard.tag.rt.core.WhenTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <description>
+The test condition that determines whether or not the
+body content should be processed.
+ </description>
+ <name>test</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>boolean</type>
+ </attribute>
+ </tag>
+
+</taglib>
diff --git a/etc/tlds/rich.tld b/etc/tlds/rich.tld
new file mode 100644
index 0000000..6685ed3
--- /dev/null
+++ b/etc/tlds/rich.tld
@@ -0,0 +1,19301 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+ xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">
+
+ <display-name>RichFaces</display-name>
+<tlib-version>3.3.2</tlib-version>
+ <short-name>rich</short-name>
+ <uri>http://richfaces.org/rich</uri>
+
+<tag>
+ <description>The &lt;rich:ajaxValidator&gt; is a component designed to provide ajax validation inside for JSF inputs.</description>
+ <name>ajaxValidator</name>
+ <tag-class>org.richfaces.taglib.AjaxValidatorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodExpression representing an action listener method that will be notified when this component is activated by the ajax Request and handle it. The expression must evaluate to a public method that takes an AjaxEvent parameter, with a return type of void. Default value is "null"</description>
+ <name>ajaxListener</name>
+ <deferred-method>
+ <method-signature>void ajaxListener(org.ajax4jsf.event.AjaxEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disables default action for target event ( append "return false;" to JavaScript ). Default value is "false"</description>
+ <name>disableDefault</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of JavaScript event property ( onclick, onchange, etc.) of parent component by
+ which validation will be triggered. Default value is "onblur"</description>
+ <name>event</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before an ajax request is submitted</description>
+ <name>onsubmit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute defines JavaBean Validation 'groups' feature (JSR-303). It is ignored if Hibernate Validator is used.</description>
+ <name>profiles</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Summary message for a validation errors.</description>
+ <name>summary</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Validate Input by the Bean/Hibernate validator annotations</description>
+ <name>beanValidator</name>
+ <tag-class>org.richfaces.taglib.BeanValidatorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>A ValueExpression that evaluates to an instance of
+ FacesBeanValidator.</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>org.richfaces.validator.FacesBeanValidator</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute defines JavaBean Validation 'groups' feature (JSR-303). It is ignored if Hibernate Validator is used.</description>
+ <name>profiles</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Summary message for a validation errors.</description>
+ <name>summary</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:calendar&gt; component is a UI control used for creating graphical monthly calendar on a page.</description>
+ <name>calendar</name>
+ <tag-class>org.richfaces.taglib.CalendarTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>boolean attribute which provides possibility to limit JSF tree processing(decoding, conversion/validation, value applying) to the component which send the request only.
+ Default value is "true"</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute is responsible for behaviour of dates
+ from the previous and next months which are displayed in the current month. Valid values
+ are "inactive" (Default) dates inactive and
+ gray colored, "scroll" boundaries work as
+ month scrolling controls, and "select"
+ boundaries work in the same way as "scroll"
+ but with the date clicked selection. Default value is "inactive".</description>
+ <name>boundaryDatesMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component popup button</description>
+ <name>buttonClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines icon for the popup button element. The attribute
+ is ignored if the "buttonLabel" is set</description>
+ <name>buttonIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines disabled icon for the popup button element. The
+ attribute is ignored if the "buttonLabel" is set</description>
+ <name>buttonIconDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines label for the popup button element. If the
+ attribute is set "buttonIcon" and "buttonIconDisabled"
+ are ignored</description>
+ <name>buttonLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>attribute to set fixed cells height</description>
+ <name>cellHeight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>attribute to set fixed cells width</description>
+ <name>cellWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines current date</description>
+ <name>currentDate</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodExpression representing an action listener method
+ that will be notified after date selection</description>
+ <name>currentDateChangeListener</name>
+ <deferred-method>
+ <method-signature>void currentDateChangeListener(org.richfaces.event.CurrentDateChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Used to provide data for calendar elements. If data is
+ not provided, all Data Model related functions are
+ disabled</description>
+ <name>dataModel</name>
+ <deferred-value>
+ <type>org.richfaces.model.CalendarDataModel</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines date pattern. Default value is "MMM d, yyyy".</description>
+ <name>datePattern</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Should be binded to some JS function that will provide style classes
+ for special sets of days highlighting</description>
+ <name>dayStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines time that will be used:
+ 1) to set time when the value is empty
+ 2) to set time when date changes and flag "resetTimeOnDateSelect" is true. Default value is "getDefaultValueOfDefaultTime()"</description>
+ <name>defaultTime</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines direction of the calendar popup ("top-left",
+ "top-right", "bottom-left", "bottom-right" (Default), "auto"). Default value is "bottom-right".</description>
+ <name>direction</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", rendered is disabled. In
+ "popup" mode both controls are disabled. Default value is "false".</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" calendar input will be editable and
+ it will be possible to change the date manualy. If
+ "false" value for this attribute makes a text
+ field "read-only", so the value can be changed
+ only from a handle. Default value is "false".</description>
+ <name>enableManualInput</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France. Default value is "getDefaultFirstWeekDay()". Possible values should be integers from 0 to 6, 0 corresponds to Sunday</description>
+ <name>firstWeekDay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the horizontal offset between button and calendar
+ element conjunction point. Default value is "0".</description>
+ <name>horizontalOffset</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component input field</description>
+ <name>inputClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the size of an input field. Similar to the "size" attribute of &lt;h:inputText/&gt;</description>
+ <name>inputSize</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component input field</description>
+ <name>inputStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Should be binded to some JS function that returns day state</description>
+ <name>isDayEnabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set the corner of the button for the popup to be
+ connected with (top-left, top-right, bottom-left
+ (Default), bottom-right, auto). Default value is "bottom-left".</description>
+ <name>jointPoint</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Used for locale definition. Default value is "getDefaultLocale()".</description>
+ <name>locale</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Gets what the minimal days required in the first week of the year
+ are; e.g., if the first week is defined as one that contains the first
+ day of the first month of a year, this method returns 1. If the
+ minimal days required must be a full week, this method returns 7. Default value is "getDefaultMinDaysInFirstWeek()".</description>
+ <name>minDaysInFirstWeek</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Valid values: ajax or client. Default value is "client".</description>
+ <name>mode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute that allows to customize names of the months.
+ Should accept list with the month names</description>
+ <name>monthLabels</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute that allows to customize short names of the
+ months. Should accept list with the month names</description>
+ <name>monthLabelsShort</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the date or time is changed and applied to input</description>
+ <name>onchanged</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the calendar popup is closed</description>
+ <name>oncollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the current month or year is changed</description>
+ <name>oncurrentdateselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the current month or year is changed</description>
+ <name>oncurrentdateselected</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the date cell</description>
+ <name>ondatemouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the date cell</description>
+ <name>ondatemouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some date cell is selected</description>
+ <name>ondateselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after some date cell is selected</description>
+ <name>ondateselected</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the calendar popup is opened</description>
+ <name>onexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field loses the focus</description>
+ <name>oninputblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field value is changed manually</description>
+ <name>oninputchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field is clicked</description>
+ <name>oninputclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field gets the focus</description>
+ <name>oninputfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down in the input field</description>
+ <name>oninputkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released in the input field</description>
+ <name>oninputkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released in the input field</description>
+ <name>oninputkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the input field</description>
+ <name>oninputmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the input field</description>
+ <name>oninputmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field value is selected</description>
+ <name>oninputselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before new time is selected</description>
+ <name>ontimeselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after time is selected</description>
+ <name>ontimeselected</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", the calendar will be rendered initially
+ as hidden with additional elements for calling as popup. Default value is "true".</description>
+ <name>popup</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Define the initial range of date which will be loaded to
+ client from dataModel under rendering. Default value is "getDefaultPreloadBegin(getCurrentDateOrDefault())".</description>
+ <name>preloadDateRangeBegin</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the last range of date which will be loaded to
+ client from dataModel under rendering. Default value is "getDefaultPreloadEnd(getCurrentDateOrDefault())".</description>
+ <name>preloadDateRangeEnd</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true". Date and time are not selectable. In
+ "popup" mode input is disabled and button is enabled. Default value is "false".</description>
+ <name>readonly</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If value is true then calendar should change time to defaultTime for newly-selected dates. Default value is "false"</description>
+ <name>resetTimeOnDateSelect</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If false ApplyButton should not be shown. Default value is "false".</description>
+ <name>showApplyButton</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If false Calendar's footer should not be shown. Default value is "true".</description>
+ <name>showFooter</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If false Calendar's header should not be shown. Default value is "true".</description>
+ <name>showHeader</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>"false" value for this attribute makes text
+ field invisible. It works only if popupMode="true"
+ If showInput is "true" - input field will
+ be shown. Default value is "true".</description>
+ <name>showInput</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If false this bar should not be shown. Default value is "true".</description>
+ <name>showWeekDaysBar</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If false this bar should not be shown. Default value is "true".</description>
+ <name>showWeeksBar</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Used for current date calculations. Default value is "getDefaultTimeZone()".</description>
+ <name>timeZone</name>
+ <deferred-value>
+ <type>java.util.TimeZone</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute defines the mode for "today" control. Possible values are "scroll", "select", "hidden". Default value is "select".</description>
+ <name>todayControlMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Sets the vertical offset between button and calendar
+ element conjunction point. Default value is "0".</description>
+ <name>verticalOffset</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of the day names displays on the days bar in the
+ following way "Sun, Mon, Tue, Wed, "</description>
+ <name>weekDayLabels</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute that allows to customize short names of the
+ weeks. Should accept list with the weeks names.</description>
+ <name>weekDayLabelsShort</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute is similar to the standard HTML attribute and
+ can specify window placement relative to the content. Default value is "3".</description>
+ <name>zindex</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <name>changeExpandListener</name>
+ <tag-class>org.richfaces.taglib.ChangeExpandListenerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+ a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>org.richfaces.changeExpandListener</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The fully qualified Java class name for the listener</description>
+ <name>type</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>colorPicker</name>
+ <tag-class>org.richfaces.taglib.ColorPickerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a color mode for the component input. Possible values are hex, rgb.</description>
+ <name>colorMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines whether the component will be rendered flat.</description>
+ <name>flat</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>inputSize is used to set the size of the edit box</description>
+ <name>inputSize</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the component widget is opened</description>
+ <name>onbeforeshow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the component widget is hidden</description>
+ <name>onhide</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the color is selected</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component widget is displayed</description>
+ <name>onshow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the event that triggers the colorPicker.
+ Default value is "onclick".</description>
+ <name>showEvent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:column&gt; component for row rendering for a UIData component.</description>
+ <name>column</name>
+ <tag-class>org.richfaces.taglib.ColumnTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if "true" next column begins from the first row</description>
+ <name>breakBefore</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML colspan attribute</description>
+ <name>colspan</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines value binding to the comparator that is used to compare the values</description>
+ <name>comparator</name>
+ <deferred-value>
+ <type>java.util.Comparator</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines iterable object property which is used when filtering performed.</description>
+ <name>filterBy</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Event for filter input that forces the filtration (default value is "onchange")</description>
+ <name>filterEvent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines a bean property which is used for filtering of a column</description>
+ <name>filterExpression</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute is defined with method binding. This method accepts on Object parameter and return boolean value</description>
+ <name>filterMethod</name>
+ <deferred-method>
+ <method-signature>boolean filterMethod(java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Defines current filtering value</description>
+ <name>filterValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any footer generated for this component</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any header generated for this component</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Column label for drag indicator. Usable only for extendedDataTable component</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML rowspan attribute</description>
+ <name>rowspan</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Manages if the header of the column is clickable, icons rendered and sorting is fired after click on the header. You need to define this attribute inside &lt;rich:dataTable&gt; component.
+ Default value is "true"</description>
+ <name>selfSorted</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a bean property which is used for sorting of a column. This attribute used with &lt;rich:dataTable&gt;</description>
+ <name>sortBy</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a bean property which is used for sorting of a column and used only with &lt;rich:scrollableDataTable&gt;.</description>
+ <name>sortExpression</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines sort icon. The value for the attribute is context related.</description>
+ <name>sortIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines sort icon for ascending order. The value for the attribute is context related.</description>
+ <name>sortIconAscending</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines sort icon for descending order. The value for the attribute is context related.</description>
+ <name>sortIconDescending</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>SortOrder is an enumeration of the possible sort orderings. Default value is "UNSORTED"</description>
+ <name>sortOrder</name>
+ <deferred-value>
+ <type>org.richfaces.model.Ordering</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Boolean attribute. If "true" it's possible to sort the column content after click on the header.
+ Default value is "true"</description>
+ <name>sortable</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute is used to define whether the component is visible or not. The default value is "true".</description>
+ <name>visible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines width of column.</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:columnGroup&gt; component combines columns in one row to organize complex subparts of a table.</description>
+ <name>columnGroup</name>
+ <tag-class>org.richfaces.taglib.ColumnGroupTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute.
+ If there are more class names than columns, the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:columns&gt; is a component that allows to create a dynamic set of columns from your model.</description>
+ <name>columns</name>
+ <tag-class>org.richfaces.taglib.ColumnsTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Contains the first iteration item</description>
+ <name>begin</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if "true" next column begins from the first row</description>
+ <name>breakBefore</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML colspan attribute</description>
+ <name>colspan</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Number of columns to be rendered</description>
+ <name>columns</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines value binding to the comparator that is used to compare the values</description>
+ <name>comparator</name>
+ <deferred-value>
+ <type>java.util.Comparator</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Contains the last iteration item</description>
+ <name>end</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines iterable object property which is used when filtering performed.</description>
+ <name>filterBy</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Event for filter input that forces the filtration (default value is "onchange")</description>
+ <name>filterEvent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines a bean property which is used for filtering of a column</description>
+ <name>filterExpression</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute is defined with method binding. This method accepts on Object parameter and return boolean value</description>
+ <name>filterMethod</name>
+ <deferred-method>
+ <method-signature>boolean filterMethod(java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Defines current filtering value</description>
+ <name>filterValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any footer generated for this component</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any header generated for this component</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The current counter</description>
+ <name>index</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Column label for drag indicator. Usable only for extendedDataTable component</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines if component should be rendered. Default value is "true".</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML rowspan attribute</description>
+ <name>rowspan</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Manages if the header of the column is clickable, icons rendered and sorting is fired after click on the header. You need to define this attribute inside &lt;rich:dataTable&gt; component.
+ Default value is "true"</description>
+ <name>selfSorted</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a bean property which is used for sorting of a column. This attribute used with &lt;rich:dataTable&gt;</description>
+ <name>sortBy</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a bean property which is used for sorting of a column and used only with &lt;rich:scrollableDataTable&gt;.</description>
+ <name>sortExpression</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines sort icon. The value for the attribute is context related.</description>
+ <name>sortIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines sort icon for ascending order. The value for the attribute is context related.</description>
+ <name>sortIconAscending</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines sort icon for descending order. The value for the attribute is context related.</description>
+ <name>sortIconDescending</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>SortOrder is an enumeration of the possible sort orderings. Default value is "UNSORTED"</description>
+ <name>sortOrder</name>
+ <deferred-value>
+ <type>org.richfaces.model.Ordering</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Boolean attribute. If "true" it's possible to sort the column content after click on the header.
+ Default value is "true"</description>
+ <name>sortable</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current variable</description>
+ <name>var</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute is used to define whether the component is visible or not. The default value is "true".</description>
+ <name>visible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines width of column.</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:comboBox&gt; is a component, that provides editable combo box element on a page.</description>
+ <name>comboBox</name>
+ <tag-class>org.richfaces.taglib.ComboBoxTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component button</description>
+ <name>buttonClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component button disabled</description>
+ <name>buttonDisabledClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component button disabled</description>
+ <name>buttonDisabledStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines icon for the button element</description>
+ <name>buttonIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines disabled icon for the button element</description>
+ <name>buttonIconDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines inactive icon for the button element</description>
+ <name>buttonIconInactive</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component inactive button</description>
+ <name>buttonInactiveClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component inactive button</description>
+ <name>buttonInactiveStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component button</description>
+ <name>buttonStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines default label for the input field element</description>
+ <name>defaultLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the first value from the suggested in input field. Default value is "false".</description>
+ <name>directInputSuggestions</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When set for a form control, this boolean attribute disables the control for your input</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables keyboard input, if "false" keyboard input will be locked. Default value is "true"</description>
+ <name>enableManualInput</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the appearance of values in the list. Default value is "true".</description>
+ <name>filterNewValues</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay between losing focus and pop-up list closing. Default value is "0".</description>
+ <name>hideDelay</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component input field</description>
+ <name>inputClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component input field disabled</description>
+ <name>inputDisabledClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component input field disabled</description>
+ <name>inputDisabledStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component inactive input field</description>
+ <name>inputInactiveClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component inactive input field</description>
+ <name>inputInactiveStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component input field</description>
+ <name>inputStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component items</description>
+ <name>itemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component selected item</description>
+ <name>itemSelectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component popup list</description>
+ <name>listClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines height of file pop-up list. Default value is "200px".</description>
+ <name>listHeight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component popup list</description>
+ <name>listStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width of file popup list</description>
+ <name>listWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The clientside script method to be called when the list is called</description>
+ <name>onlistcall</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The clientside script method to be called when the list is closed</description>
+ <name>onlistclose</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some text is selected in the text field. This attribute can be used with the INPUT and TEXTAREA elements.</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines if the first value from suggested is selected in pop-up list. Default value is "true".</description>
+ <name>selectFirstOnUpdate</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay between event and pop-up list showing. Default value is "0".</description>
+ <name>showDelay</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the suggestion collection</description>
+ <name>suggestionValues</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Width of the component. Default value is "150".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:componentControl&gt; allows to call JavaScript API functions on components after some defined events.</description>
+ <name>componentControl</name>
+ <tag-class>org.richfaces.taglib.ComponentControlTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Defines the page loading phase when componentControl is attached to another component. Default value is "onavailable"</description>
+ <name>attachTiming</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Client identifier of the component or id of the existing DOM element that is a source
+ for given event. If attachTo is defined, the event is attached on the client according
+ to the attachTiming attribute.
+ If attachTo is not defined, the event is attached on the server to the closest in the
+ component tree parent component.</description>
+ <name>attachTo</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disable default action for target event. If the attribute is not set, it's made "true" by default if the event oncontextmenu is used and false in all other cases. if the attribute set, its value is used.</description>
+ <name>disableDefault</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The Event that is used to trigger the operation on the target component</description>
+ <name>event</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Client identifier of the target component.</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The optional name of the function that might be used to trigger the operation on the target component</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The function of JavaScript API that will be invoked. The API method
+ is attached to the 'component' property of the root DOM element that represents
+ the target component. The function has two parameters - event and params. See: 'params'
+ attribute for details.</description>
+ <name>operation</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The set of parameters passed to the function of Javascript API that will be invoked.
+ The JSON syntax is used to define the parameters, but without open and closed curve
+ bracket.
+ As an alternative, the set of f:param can be used to define the parameters passed to the
+ API function. If both way are used to define the parameters, both set are concatenated.
+ if names are equals, the f:param has a priority.</description>
+ <name>params</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:contextMenu&gt; component is used for creating multileveled context menus that are activated after a user defines an event ( "onmouseover" , "onclick" , etc.) on any element on the page.</description>
+ <name>contextMenu</name>
+ <tag-class>org.richfaces.taglib.ContextMenuTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Defines the timing when the menu is attached to the target element. Possible values "onload", "immediate", "onavailable" (default). Default value is "onavailable".</description>
+ <name>attachTiming</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Client identifier of the component or id of the existing DOM element that is a source
+ for a given event. If attachTo is defined, the event is attached on the client according
+ to the AttachTiming attribute.
+ If both attached and attachTo attributes are defined, and attribute attached has value
+ 'false', it is considered to have higher priority.</description>
+ <name>attachTo</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If the value of the "attached" attribute is true, the component is attached to the component,
+ specified in the "attachTo" attribute or to the parent component,
+ if "attachTo" is not defined. Default value is "true".</description>
+ <name>attached</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Forbids default handling for adjusted event. Default value "false".</description>
+ <name>disableDefaultMenu</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component disabled item</description>
+ <name>disabledItemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component disabled item</description>
+ <name>disabledItemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines an event on the parent element to display the menu. Default value is "oncontextmenu".</description>
+ <name>event</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay between losing focus and menu closing. Default value is "800".</description>
+ <name>hideDelay</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component item</description>
+ <name>itemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component item</description>
+ <name>itemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the menu is collapsed</description>
+ <name>oncollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the menu is expanded</description>
+ <name>onexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some context menu group is activated</description>
+ <name>ongroupactivate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some item is selected</description>
+ <name>onitemselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set minimal width for the all of the lists that will appear</description>
+ <name>popupWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component selected item</description>
+ <name>selectItemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component selected item</description>
+ <name>selectItemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay between event and menu showing. Default value is "50".</description>
+ <name>showDelay</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the submission mode for all menu items of the menu except
+ those where this attribute redefined. Possible value are "ajax","server", "none". Default value is "server".</description>
+ <name>submitMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dataDefinitionList&gt; component for definition lists rendering that allows choosing data from a model and obtains built-in support of Ajax updates.</description>
+ <name>dataDefinitionList</name>
+ <tag-class>org.richfaces.taglib.DataDefinitionListTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute. If there are more class names than columns,
+ the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>RowKey is a representation of an identifier for a specific data row</description>
+ <name>rowKey</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a RowKey object.</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A slider-based action component used for filtering table data.</description>
+ <name>dataFilterSlider</name>
+ <tag-class>org.richfaces.taglib.DataFilterSliderTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An error message to use in client-side validation events</description>
+ <name>clientErrorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A slider end point</description>
+ <name>endRange</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component input field. The value of the "manualInput" attribute must
+ be "true".</description>
+ <name>fieldStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A getter of an object member required to compare a slider value to. This is a
+ value that is used in results filtering</description>
+ <name>filterBy</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The component using UIData (datatable id)</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This is a string which is used in a value attribute of the datatable. It is used for resetting
+ the datatable back to the original list provided by a backing bean</description>
+ <name>forValRef</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component handle</description>
+ <name>handleStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Current handle value</description>
+ <name>handleValue</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Amount to which a handle on each slide/move should be incremented</description>
+ <name>increment</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>False value for this attribute makes text field "read-only" and "hidden".
+ Hence, the value can be changed only from a handle.
+ Default value is "true"</description>
+ <name>manualInput</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>DEPRECATED (use submitOnSlide). If the slider value is changed, the form is submitted. Default value is "true".</description>
+ <name>onSlideSubmit</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component input field value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called whenever a
+ JavaScript error occurs</description>
+ <name>onerror</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down in the component input field</description>
+ <name>oninputkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released in the component input field</description>
+ <name>oninputkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released in the component input field</description>
+ <name>oninputkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a slider handle is moved</description>
+ <name>onslide</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the background div element wrapping a full range</description>
+ <name>rangeStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after changing of slider control position</description>
+ <name>sliderListener</name>
+ <deferred-method>
+ <method-signature>void sliderListener(org.richfaces.event.DataFilterSliderEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A slider begin point</description>
+ <name>startRange</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies if the component will store a UIData object (your table rows) in session</description>
+ <name>storeResults</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the container surrounding the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If the slider value is changed, the form is submitted. Default value is "true".</description>
+ <name>submitOnSlide</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component track</description>
+ <name>trackStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It shows or hides a trailer following a handle</description>
+ <name>trailer</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the trailer following the component handle</description>
+ <name>trailerStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Width of the slider control. Default value is "200px".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dataGrid&gt; component to render data as a grid that allows choosing data from a model and obtains built-in support of Ajax updates.</description>
+ <name>dataGrid</name>
+ <tag-class>org.richfaces.taglib.DataGridTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the position of the table with respect to the document.
+ The possible values are "left", "center" and "right". The default value is "left".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute sets the background color for the document body or table cells.
+
+ This attribute sets the background color of the canvas for the document body (the BODY element) or for tables (the TABLE, TR, TH, and TD elements). Additional attributes for specifying text color can be used with the BODY element.
+
+ This attribute has been deprecated in favor of style sheets for specifying background color information</description>
+ <name>bgcolor</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attributes specifies the width of the frame around a component. Default value is "0".</description>
+ <name>border</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component caption</description>
+ <name>captionClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component caption</description>
+ <name>captionStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the amount of space between the border of the cell and its contents. Default value is "0".</description>
+ <name>cellpadding</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the amount of space between the border of the cell and its contents.
+ The attribute also specifies the amount of space to leave between cells. Default value is "0".</description>
+ <name>cellspacing</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute. If there are more class names than columns,
+ the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Number of columns</description>
+ <name>columns</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Number of elements in grid</description>
+ <name>elements</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component footer</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which sides of the frame surrounding a table will be visible. Possible values: "void", "above", "below", "hsides", "lhs", "rhs", "vsides", "box" and "border".
+ The default value is "void".</description>
+ <name>frame</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is clicked</description>
+ <name>onRowClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is double-clicked</description>
+ <name>onRowDblClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the row</description>
+ <name>onRowMouseDown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the row</description>
+ <name>onRowMouseMove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the row</description>
+ <name>onRowMouseOut</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the row</description>
+ <name>onRowMouseOver</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over the row</description>
+ <name>onRowMouseUp</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>RowKey is a representation of an identifier for a specific data row</description>
+ <name>rowKey</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Request scoped variable for client access to rowKey</description>
+ <name>rowKeyVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent. Possible values:
+
+ * none: No rules. This is the default value.
+ * groups: Rules will appear between row groups (see THEAD, TFOOT, and TBODY) and column groups (see COLGROUP and COL) only.
+ * rows: Rules will appear between rows only.
+ * cols: Rules will appear between columns only.
+ * all: Rules will appear between all rows and columns</description>
+ <name>rules</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on the client side</description>
+ <name>stateVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute provides a summary of the table's purpose and structure for user agents rendering to non-visual media such as speech and Braille</description>
+ <name>summary</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the desired width of the entire table and is intended for visual user agents. When the value is percentage value, the value is relative to the user agent's available horizontal space. In the absence of any width specification, table width is determined by the user agent</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dataList&gt; component for unordered lists rendering that allows choosing data from a model and obtains built-in support of Ajax updates.</description>
+ <name>dataList</name>
+ <tag-class>org.richfaces.taglib.DataListTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>RowKey is a representation of an identifier for a specific data row</description>
+ <name>rowKey</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on the client side</description>
+ <name>stateVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML DL type attribute</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dataOrderedList&gt; component for ordered lists rendering that allows choosing data from a model and obtains built-in support of Ajax updates.</description>
+ <name>dataOrderedList</name>
+ <tag-class>org.richfaces.taglib.DataOrderedListTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>RowKey is a representation of an identifier for a specific data row</description>
+ <name>rowKey</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a RowKey object.</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML OL type attribute</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dataTable&gt; component for tables rendering that allows choosing data from a model and obtains built-in support of Ajax updates.</description>
+ <name>dataTable</name>
+ <tag-class>org.richfaces.taglib.DataTableTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the position of the table with respect to the document.
+ The possible values are "left", "center" and "right". The default value is "left".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute sets the background color for the document body or table cells.
+
+ This attribute sets the background color of the canvas for the document body (the BODY element) or for tables (the TABLE, TR, TH, and TD elements). Additional attributes for specifying text color can be used with the BODY element.
+
+ This attribute has been deprecated in favor of style sheets for specifying background color information</description>
+ <name>bgcolor</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attributes specifies the width of the frame around a component. Default value is "0".</description>
+ <name>border</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component caption</description>
+ <name>captionClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component caption</description>
+ <name>captionStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the amount of space between the border of the cell and its contents. Default value is "0".</description>
+ <name>cellpadding</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the amount of space between the border of the cell and its contents. The attribute also specifies the amount of space to leave between cells. Default value is "0".</description>
+ <name>cellspacing</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute. If there are more class names than columns,
+ the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies the number of columns</description>
+ <name>columns</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Comma-separated list of width attribute for every column.
+ Specifies a default width for each column in the table.
+ In addition to the standard pixel, percentage, and relative values,
+ this attribute allows the special form "0*" (zero asterisk) which
+ means that the width of the each column in the group should be the minimum width necessary
+ to hold the column's contents. This implies that a column's entire contents must be known before its width may be correctly computed. Authors should be aware that specifying "0*" will prevent visual user agents from rendering a table incrementally</description>
+ <name>columnsWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component footer</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which sides of the frame surrounding a table will be visible. Possible values: "void", "above", "below", "hsides", "lhs", "rhs", "vsides", "box" and "border".
+ The default value is "void".</description>
+ <name>frame</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is clicked</description>
+ <name>onRowClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a right mouse button is clicked over the row.
+ Returning false prevents default browser context menu from being displayed.</description>
+ <name>onRowContextMenu</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is double-clicked</description>
+ <name>onRowDblClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the row</description>
+ <name>onRowMouseDown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the row</description>
+ <name>onRowMouseMove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the row</description>
+ <name>onRowMouseOut</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the row</description>
+ <name>onRowMouseOver</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over the row</description>
+ <name>onRowMouseUp</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a RowKey object.</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent. Possible values:
+
+ * none: No rules. This is the default value.
+ * groups: Rules will appear between row groups (see THEAD, TFOOT, and TBODY) and column groups (see COLGROUP and COL) only.
+ * rows: Rules will appear between rows only.
+ * cols: Rules will appear between columns only.
+ * all: Rules will appear between all rows and columns</description>
+ <name>rules</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines mode of sorting. Possible values are 'single' for sorting of one column and 'multi' for some.</description>
+ <name>sortMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a set of columns ids in the sorting order</description>
+ <name>sortPriority</name>
+ <deferred-value>
+ <type>java.util.Collection</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on the client side</description>
+ <name>stateVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the desired width of the entire table and is intended for visual user agents. When the value is percentage value, the value is relative to the user agent's available horizontal space. In the absence of any width specification, table width is determined by the user agent</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:datascroller&gt; component is designed for providing the functionality of tables scrolling using Ajax requests.</description>
+ <name>datascroller</name>
+ <tag-class>org.richfaces.taglib.DatascrollerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Boolean attribute which provides possibility to limit JSF tree processing(decoding, conversion/validation, value applying) to the component which send the request only.
+ Default value is "true"</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the table with relatively to the document.
+ Possible values are "left","center","right ". Default value is "center".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute specifies the visibility of boundaryControls.
+ Possible values are: "show" (controls are always visible ). "hide" (controls are hidden.
+ "auto" (unnecessary controls are hidden). Default value is "show".</description>
+ <name>boundaryControls</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute specifies the visibility of fastControls.
+ Possible values are: "show" (controls are always visible ). "hide" (controls are hidden.
+ "auto" (unnecessary controls are hidden). Default value is "show".</description>
+ <name>fastControls</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute indicates pages quantity to switch onto when fast scrolling is used. Default value is "0".</description>
+ <name>fastStep</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of the table component whose data is scrollled</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Current handle value</description>
+ <name>handleValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now. Default value is "true".</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted and validated immediately (that is, during Apply Request Values phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the scroller inactive cells</description>
+ <name>inactiveStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the scroller inactive cells</description>
+ <name>inactiveStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute to control whether last page of datascroller shows "rows" number of items or just the rest. Possible values are "full" and "short". Default value is "short".</description>
+ <name>lastPageMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Maximum quantity of pages. Default value is "10".</description>
+ <name>maxPages</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a page is changed</description>
+ <name>onpagechange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If page &gt;= 1 then it's a page number to show</description>
+ <name>page</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of variable in request scope containing index of active page</description>
+ <name>pageIndexVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of variable in request scope containing number of pages</description>
+ <name>pagesVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If renderIfSinglePage is "true" then datascroller is displayed on condition that the data hold on one page. Default value is "true".</description>
+ <name>renderIfSinglePage</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after scrolling</description>
+ <name>scrollerListener</name>
+ <deferred-method>
+ <method-signature>void scrollerListener(org.richfaces.event.DataScrollerEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the scroller selected cell</description>
+ <name>selectedStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the scroller selected cell</description>
+ <name>selectedStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute specifies the visibility of stepControls.
+ Possible values are: "show" (controls are always visible ). "hide" (controls are hidden.
+ "auto" (unnecessary controls are hidden). Default value is "show".</description>
+ <name>stepControls</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the wrapper table element of the component</description>
+ <name>tableStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the wrapper table element of the component</description>
+ <name>tableStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A component is used for parameters transmission in Drag and Drop operations. It's also used for dragIndicator elements definition with transmitting some values for rendering in it.</description>
+ <name>dndParam</name>
+ <tag-class>org.richfaces.taglib.DndParamTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A name of this parameter</description>
+ <name>name</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute defines parameter functionality. Possible values are "drag", "drop" and "default". Default value is "default".</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>It's a component appearing under a mouse cursor during Drag'n'Drop operation and containing information on dragged element and elements.</description>
+ <name>dragIndicator</name>
+ <tag-class>org.richfaces.taglib.DragIndicatorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the indicator which are applied when a drop is accepted</description>
+ <name>acceptClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the indicator which are applied when a drop is rejected</description>
+ <name>rejectClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <name>dragListener</name>
+ <tag-class>org.richfaces.taglib.DragListenerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+ a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The fully qualified Java class name for the listener</description>
+ <name>type</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dragSupport&gt; component defines a subtree of the component tree as draggable for drag-and-drop operations. Within such a "drag zone", you can click the mouse button on an item and drag it to any component that supports drop operations (a "drop zone"). It encodes all the necessary JavaScript for supporting drag-and-drop operations.</description>
+ <name>dragSupport</name>
+ <tag-class>org.richfaces.taglib.DragSupportTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disable default action for target event (append "return false;" to JavaScript)</description>
+ <name>disableDefault</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of a component that is used as drag pointer during the drag operation</description>
+ <name>dragIndicator</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after drag operation</description>
+ <name>dragListener</name>
+ <deferred-method>
+ <method-signature>void dragListener(org.richfaces.event.DragEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A drag zone type that is used for zone definition, which elements can be accepted by a drop zone</description>
+ <name>dragType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Data to be sent to a drop zone after a drop event</description>
+ <name>dragValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates then you can grab and drag an object</description>
+ <name>grabCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>list of comma separated cursors that indicates then the you has grabbed something</description>
+ <name>grabbingCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the dragging operation is finished</description>
+ <name>ondragend</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the dragging operation is started</description>
+ <name>ondragstart</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the draggable object is moved away from the drop zone</description>
+ <name>ondropout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the draggable object is over the drop zone</description>
+ <name>ondropover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dropDownMenu&gt; component is used for creating multilevel drop-down menus.</description>
+ <name>dropDownMenu</name>
+ <tag-class>org.richfaces.taglib.DropDownMenuTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines direction of the popup list to appear.
+ Possible values are "top-right", "top-right", "top-left", "bottom-right", "bottom-left", "auto".
+ Default value is "auto".</description>
+ <name>direction</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute 'disabled' provides possibility to make the whole menu disabled if its value equals to "true". Default value is "false"</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component disabled item</description>
+ <name>disabledItemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component disabled item</description>
+ <name>disabledItemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component label when it is disabled</description>
+ <name>disabledLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the event on the representation element that triggers
+ the menu's appearance.</description>
+ <name>event</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay between losing focus and menu closing. Default value is "800".</description>
+ <name>hideDelay</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the horizontal offset between popup list and label element. Default value is "0".
+ conjunction point</description>
+ <name>horizontalOffset</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component item</description>
+ <name>itemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component item</description>
+ <name>itemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the corner of the label for the pop-up to be connected with.
+ Possible values are "tr", "tl", "bl", "br", "bottom-left", "auto".
+ Default value is "auto".
+ "tr" stands for top-right.</description>
+ <name>jointPoint</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component label</description>
+ <name>labelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a menu is collapsed</description>
+ <name>oncollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a menu is expanded</description>
+ <name>onexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some menu group is activated</description>
+ <name>ongroupactivate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a menu item is selected</description>
+ <name>onitemselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the menu</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the menu</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the menu</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets minimal width for all lists that will appear.</description>
+ <name>popupWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component selected item</description>
+ <name>selectItemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component selected item</description>
+ <name>selectItemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component label when it is selected</description>
+ <name>selectedLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay between event and menu showing. Default value is "50".</description>
+ <name>showDelay</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the submission mode for all menu items of the menu except
+ ones where this attribute redefined.
+ Possible values are "ajax","server","none". Default value is "sever".</description>
+ <name>submitMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines representation text for Label used for menu calls.</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the vertical offset between popup list and label element. Default value is "0".
+ conjunction point</description>
+ <name>verticalOffset</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <name>dropListener</name>
+ <tag-class>org.richfaces.taglib.DropListenerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+ a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The fully qualified Java class name for the listener</description>
+ <name>type</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:dropSupport&gt; component transforms a parent component into a target zone for drag-and-drop operations. When a draggable element is moved and dropped onto the area of the parent component, Ajax request processing for this event is started.</description>
+ <name>dropSupport</name>
+ <tag-class>org.richfaces.taglib.DropSupportTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>List of comma separated cursors that indicates when acceptable draggable over dropzone</description>
+ <name>acceptCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A list of drag zones types, which elements are accepted by a drop zone</description>
+ <name>acceptedTypes</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Mapping between drop types and acceptable cursors</description>
+ <name>cursorTypeMapping</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disable default action for target event (append "return false;" to JavaScript)</description>
+ <name>disableDefault</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after drop operation.</description>
+ <name>dropListener</name>
+ <deferred-method>
+ <method-signature>void dropListener(org.richfaces.event.DropEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Data to be processed after a drop event</description>
+ <name>dropValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a draggable object enters the zone</description>
+ <name>ondragenter</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after a draggable object leaves the zone</description>
+ <name>ondragexit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a draggable object is dropped into the available zone</description>
+ <name>ondrop</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a draggable object is dropped into any zone</description>
+ <name>ondropend</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates when rejectable draggable over dropzone</description>
+ <name>rejectCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute associates a type of dragable zone (dragType) with &lt;rich:dndParam&gt; defined for &lt;rich:dropSupport&gt; for passing parameter value to &lt;rich:dragIndicator&gt;. It uses JSON format: (drag_type: parameter_name).</description>
+ <name>typeMapping</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>editor</name>
+ <tag-class>org.richfaces.taglib.EditorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Attribute enables to get the Editor area to resize to the boundaries of the contents.</description>
+ <name>autoResize</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines configuration properties file name</description>
+ <name>configuration</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines property file name witch contains descriptors of custom plugins</description>
+ <name>customPlugins</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines how dialogs/popups should be opened. Default value is "modal"</description>
+ <name>dialogType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines height of component.</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>${prop.xmlEncodedDescription}</description>
+ <name>inputElementType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines Editor language</description>
+ <name>language</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the editor content is modified by TinyMCE</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the initialization of the editor instances is finished</description>
+ <name>oninit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the editor content is extracted/saved</description>
+ <name>onsave</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the editor instances get rendered</description>
+ <name>onsetup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines Editor plugins</description>
+ <name>plugins</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines Editor is readonly</description>
+ <name>readonly</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines Editor skin</description>
+ <name>skin</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>In visual mode the attribute works the same way as "tab_focus" TinyMCE's property the attribute enables
+ you to specify an element ID to focus, when the TAB key is pressed .
+ You can also use the special ":prev" and ":next" values that will then place the focus on
+ an input element placed before/after the TinyMCE instance in the DOM.
+ While in "source" mode the attribute works like standard HTML tabindex attribute.</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines Editor theme</description>
+ <name>theme</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines if model value should be converted to Seam Text. Default value is "false"</description>
+ <name>useSeamText</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Attribute defines if tinyMCE WYSIWYG should be disabled. Default value is "visual"</description>
+ <name>viewMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines width of component.</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:effect&gt; utilizes a set of effects provided by the scriptaculous JavaScript library. It allows to attach effects to JSF components and html tags.</description>
+ <name>effect</name>
+ <tag-class>org.richfaces.taglib.EffectTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disable default action for target event ( append "return false;" to JavaScript ). Default value is "false".</description>
+ <name>disableDefault</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Event on the component or html tag the effect is attached to</description>
+ <name>event</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Id of the target component.</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Generated JavaScript name.</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Parameters passed to the effect function.
+ Example params="{duration:0.2,from:1.0,to:0.1}"</description>
+ <name>params</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The id of the element the effect apply to. Might be component id
+ or client id of jsf component or html tag. If targetId is not defined
+ the value of the attribute 'for' or the 'targetId' option effect
+ play its role</description>
+ <name>targetId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the type of effect. Possible values: "Fade", "Blind", "Opacity".</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:extendedDataTable&gt; component is used for
+ tables extending standard component &lt;rich:dataTable&gt; .</description>
+ <name>extendedDataTable</name>
+ <tag-class>org.richfaces.taglib.ExtendedDataTableTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component active row</description>
+ <name>activeClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Request scope attribute under which the activeRowKey will
+ be accessible</description>
+ <name>activeRowKey</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute defines row keys that are updated after an
+ AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the position of the table with respect to the document.
+ The possible values are "left", "center" and "right". The default value is "left".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute sets the background color for the document body or table cells.
+
+ This attribute sets the background color of the canvas for the document body (the BODY element) or for tables (the TABLE, TR, TH, and TD elements). Additional attributes for specifying text color can be used with the BODY element.
+
+ This attribute has been deprecated in favor of style sheets for specifying background color information</description>
+ <name>bgcolor</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attributes specifies the width of the frame around a
+ component. Default value is "0"</description>
+ <name>border</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component caption</description>
+ <name>captionClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component caption</description>
+ <name>captionStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the amount of space between the
+ border of the cell and its contents. Default value is "0"</description>
+ <name>cellpadding</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The cellspacing attribute specifies the space between cells. Default value is "0"</description>
+ <name>cellspacing</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute. If there are more class names than columns,
+ the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or
+ redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If set to true, table header context menu will be enabled</description>
+ <name>enableContextMenu</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component footer</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which sides of the frame surrounding a table will be visible. Possible values: "void", "above", "below", "hsides", "lhs", "rhs", "vsides", "box" and "border".
+ The default value is "void".</description>
+ <name>frame</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines an id of column which the data is grouped by.</description>
+ <name>groupingColumn</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a height of the component. Default value is "500px"</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines label to be displayed in case there are no data rows.</description>
+ <name>noDataLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is clicked</description>
+ <name>onRowClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is double-clicked</description>
+ <name>onRowDblClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the row</description>
+ <name>onRowMouseDown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the row</description>
+ <name>onRowMouseMove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the row</description>
+ <name>onRowMouseOut</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the rows</description>
+ <name>onRowMouseOver</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is released over the row</description>
+ <name>onRowMouseUp</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a selected row is changed</description>
+ <name>onselectionchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request
+ scope</description>
+ <name>rowKeyVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent. Possible values:
+
+ * none: No rules. This is the default value.
+ * groups: Rules will appear between row groups (see THEAD, TFOOT, and TBODY) and column groups (see COLGROUP and COL) only.
+ * rows: Rules will appear between rows only.
+ * cols: Rules will appear between columns only.
+ * all: Rules will appear between all rows and columns</description>
+ <name>rules</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component rows selected</description>
+ <name>selectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Value binding representing selected rows</description>
+ <name>selection</name>
+ <deferred-value>
+ <type>org.richfaces.model.selection.Selection</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Single row can be selected. multi:
+ Multiple rows can be selected. none: no rows can be
+ selected. Default value is "single"</description>
+ <name>selectionMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines mode of sorting. Possible values are 'single'
+ for sorting of one column and 'multi' for some.</description>
+ <name>sortMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a set of column ids in the order the columns
+ could be set</description>
+ <name>sortPriority</name>
+ <deferred-value>
+ <type>java.util.Collection</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on
+ the client side</description>
+ <name>stateVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ValueBinding pointing at a property of a String to hold
+ table state</description>
+ <name>tableState</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the desired width of the entire table and is intended for visual user agents. When the value is percentage value, the value is relative to the user agent's available horizontal space. In the absence of any width specification, table width is determined by the user agent</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Renders a file upload control.
+
+The following configuration options for ajax4jsf filter may be configured in web.xml:
+
+* createTempFiles - if this option is set to true, uploaded files are streamed to a temporary file instead of in memory.
+* maxRequestSize - the maximum size of a file upload request, in bytes.
+
+Here's an example:
+
+&lt;filter&gt;
+ &lt;display-name&gt;Ajax4jsf Filter&lt;/display-name&gt;
+ &lt;filter-name&gt;ajax4jsf&lt;/filter-name&gt;
+ &lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
+ &lt;init-param&gt;
+ &lt;param-name&gt;createTempFiles&lt;/param-name&gt;
+ &lt;param-value&gt;false&lt;/param-value&gt;
+ &lt;/init-param&gt;
+ &lt;init-param&gt;
+ &lt;param-name&gt;maxRequestSize&lt;/param-name&gt;
+ &lt;param-value&gt;20000000&lt;/param-value&gt;
+ &lt;/init-param&gt;
+ &lt;/filter&gt;</description>
+ <name>fileUpload</name>
+ <tag-class>org.richfaces.taglib.FileUploadTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Files types allowed to upload</description>
+ <name>acceptedTypes</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Add' button</description>
+ <name>addButtonClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Add' button disabled</description>
+ <name>addButtonClassDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for an add button</description>
+ <name>addControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Boolean attribute which provides possibility to limit JSF tree processing(decoding, conversion/validation, value applying) to the component which send the request only.
+ Default value is "false"</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute which allow the component to use the flash module that provides file upload functionality [false, true, auto]. Default value is "false"</description>
+ <name>allowFlash</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>For a user agents that cannot display images, forms, or applets, this attribute specifies alternate text. The language of the alternate text is specified by the lang attribute</description>
+ <name>alt</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If this attribute is "true" files will be immediately removed from list after upload completed.
+ Default value is "false".</description>
+ <name>autoclear</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a cancel control</description>
+ <name>cancelEntryControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Clean' button</description>
+ <name>cleanButtonClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Clean' button disabled</description>
+ <name>cleanButtonClassDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a clearAll button</description>
+ <name>clearAllControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a clear control</description>
+ <name>clearControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute 'disabled' provides a possibility to make the whole component disabled if its value equals to "true".
+ Default value is "false".</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a done label</description>
+ <name>doneLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the file entries</description>
+ <name>fileEntryClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the file entries disabled</description>
+ <name>fileEntryClassDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the controls of the file entries</description>
+ <name>fileEntryControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the disabled controls of the file entries</description>
+ <name>fileEntryControlClassDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodExpression representing an action listener method
+ that will be notified after file uploaded.</description>
+ <name>fileUploadListener</name>
+ <deferred-method>
+ <method-signature>void fileUploadListener(org.richfaces.event.UploadEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If this attribute is true files will be immediately uploaded after they have been added in list.
+ Default value is "false".</description>
+ <name>immediateUpload</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines height of file list. Default value is "210px".</description>
+ <name>listHeight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width of file list. Default value is "400px".</description>
+ <name>listWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Used for locale definition</description>
+ <name>locale</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines max files count allowed for upload (optional). Default value is "1".</description>
+ <name>maxFilesQuantity</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines if component should allow to add files that were already in list. Default value is "false".</description>
+ <name>noDuplicate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before a file is added</description>
+ <name>onadd</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a file entry is cleared</description>
+ <name>onclear</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a file uploading is interrupted according to any errors</description>
+ <name>onerror</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a file is uploaded to the server</description>
+ <name>onfileuploadcomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some text is selected in the text field. This attribute can be used with the INPUT and TEXTAREA elements.</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a file uploading is rejected by the file size overflow</description>
+ <name>onsizerejected</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a file type is rejected according to the file types allowed</description>
+ <name>ontyperejected</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a file uploading is started</description>
+ <name>onupload</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a file uploading is cancelled</description>
+ <name>onuploadcanceled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when uploading of all files from the list is completed</description>
+ <name>onuploadcomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a progress label</description>
+ <name>progressLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a size error label</description>
+ <name>sizeErrorLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Cancel' button</description>
+ <name>stopButtonClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Cancel' button disabled</description>
+ <name>stopButtonClassDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a stop button</description>
+ <name>stopControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a stop control</description>
+ <name>stopEntryControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a transfer error label</description>
+ <name>transferErrorLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Upload' button</description>
+ <name>uploadButtonClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component 'Upload' button disabled</description>
+ <name>uploadButtonClassDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for an upload button</description>
+ <name>uploadControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Collection of files uploaded</description>
+ <name>uploadData</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the upload list</description>
+ <name>uploadListClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the upload list disabled</description>
+ <name>uploadListClassDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>It presents the google map in JSF applications</description>
+ <name>gmap</name>
+ <tag-class>org.richfaces.taglib.GmapTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables continuous smooth zooming for selected browsers. Default value is "false".</description>
+ <name>enableContinuousZoom</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables zooming in by a double click. Default value is "false".</description>
+ <name>enableDoubleClickZoom</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables a map dragging with the mouse. Default value is "true".</description>
+ <name>enableDragging</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables Info Window. Default value is "true".</description>
+ <name>enableInfoWindow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Google Map key. A single Map API key is valid for a single "directory" on your web server. Default value is "internal".</description>
+ <name>gmapKey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The JavaScript variable that is used to access the Google Map API. If you have
+ more than one Google Map components on the same page, use individual
+ key for each of them. The default variable name is "map" (without quotes).</description>
+ <name>gmapVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Initial latitude coordinate in degrees, as a number between -90 and +90. Default value is "37.9721046".</description>
+ <name>lat</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Initial longitude coordinate in degrees, as a number between -180 and +180. Default value is "-122.0424842834".</description>
+ <name>lng</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Used for locale definition. Default value is "getDefaultLocale()".</description>
+ <name>locale</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Initial map type. The possible values are "G_NORMAL_MAP", "G_SATELLITE_MAP",
+ "G_HYBRID_MAP". Default value is "G_SATELLITE_MAP".</description>
+ <name>mapType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the Google Map object is initiated</description>
+ <name>oninit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Shows the GLarge control. Default value is "true".</description>
+ <name>showGLargeMapControl</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Shows the Type switch control. Default value is "true".</description>
+ <name>showGMapTypeControl</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It shows the scale control. Default value is "true".</description>
+ <name>showGScaleControl</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The warning message that appears if a browser is not compatible with Google Map.
+ Default value is "Your browser does not support Google Maps".</description>
+ <name>warningMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Initial zoom level as a number between 1 and 18. Default value is "17".</description>
+ <name>zoom</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:graphValidator&gt; component allows to register Hibernate Validators for multiple input components.</description>
+ <display-name>Bean validation @ and @validation support</display-name>
+ <name>graphValidator</name>
+ <tag-class>org.richfaces.taglib.html.jsp.GraphValidator</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>This attribute defines JavaBean Validation 'groups' feature (JSR-303). It is ignored if Hibernate Validator is used.</description>
+ <name>profiles</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Summary message for a validation errors.</description>
+ <name>summary</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>JSF Validator type, that implements GraphValidator interface.This validator is used for the Graph and input fields validation.</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component.</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:hotKey&gt; component allows to register hot keys for the page or particular elements and to define client-side processing functions for these keys.</description>
+ <name>hotKey</name>
+ <tag-class>org.richfaces.taglib.HotKeyTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the hotkey handling of events generated by child components nested into the parent component to which the &lt;rich:hotKey&gt; is attached.</description>
+ <name>checkParent</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disables the hotkeys activated on input elements when the value of this attribute is "true".</description>
+ <name>disableInInput</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the types of the inputs not to be influenced with hotKey component. Possible values: buttons, texts and all (default). By default it is empty and this means ALL the types.</description>
+ <name>disableInInputTypes</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the JavaScript function name which is called on hotkey activation</description>
+ <name>handler</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Defines the hotkey itself</description>
+ <name>key</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a selector for query</description>
+ <name>selector</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the time when the hotkey is registered. Possible values are "immediate" (by default), "onload", and "onregistercall".
+ Default value is "immediate"</description>
+ <name>timing</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the type of a keyboard event (onkeyup, onkeypress, etc.)</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:inplaceInput&gt; is an input component used for displaying and editing data inputted.</description>
+ <name>inplaceInput</name>
+ <tag-class>org.richfaces.taglib.InplaceInputTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines custom cancel icon</description>
+ <name>cancelControlIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component in the changed state</description>
+ <name>changedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component hovered in the changed state</description>
+ <name>changedHoverClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component controls</description>
+ <name>controlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component control hovered</description>
+ <name>controlHoverClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component control pressed</description>
+ <name>controlPressedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Positions the controls horizontally. Possible values are "left", "center", "right". Default value is "right".</description>
+ <name>controlsHorizontalPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Positions the controls vertically. Possible values are "bottom","center" and "top". Default value is "center"</description>
+ <name>controlsVerticalPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute is used to display text while value is undefined</description>
+ <name>defaultLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component in the edit state</description>
+ <name>editClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Provides an option to assign an JavaScript action that initiates the change of the state. Default value is "onclick".</description>
+ <name>editEvent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets width of the input field</description>
+ <name>inputWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines how the component is displayed in the layout. Possible values are "block", "inline". Default value is "inline".</description>
+ <name>layout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the maximum width of the input field. Default value is "500px".</description>
+ <name>maxInputWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies the maximum number of digits that could be entered into the input field.
+ The maximum number is unlimited by default.</description>
+ <name>maxlength</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the minimum width of the input field. Default value is "40px".</description>
+ <name>minInputWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component edit state is activated</description>
+ <name>oneditactivated</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the component edit state is activated</description>
+ <name>oneditactivation</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field is clicked</description>
+ <name>oninputclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field is double-clicked</description>
+ <name>oninputdblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down in the input field</description>
+ <name>oninputkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released in the input field</description>
+ <name>oninputkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released in the input field</description>
+ <name>oninputkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down in the input field</description>
+ <name>oninputmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the input field</description>
+ <name>oninputmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the input field</description>
+ <name>oninputmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the input field</description>
+ <name>oninputmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released in the input field</description>
+ <name>oninputmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some text is selected in the input field</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component view state is activated</description>
+ <name>onviewactivated</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the component view state is activated</description>
+ <name>onviewactivation</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines custom save icon</description>
+ <name>saveControlIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Makes the input field select when switched to edit state. Default value is "false"</description>
+ <name>selectOnEdit</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serves to display "save" and "cancel" controls. Default value is "false".</description>
+ <name>showControls</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serves to define the tabbing order</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component in the view state</description>
+ <name>viewClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component hovered in the view state</description>
+ <name>viewHoverClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:inplaceSelect&gt; is used for creation select
+ based inputs: it shows the value as text in one state and enables
+ editing the value, providing a list of options in another state.</description>
+ <name>inplaceSelect</name>
+ <tag-class>org.richfaces.taglib.InplaceSelectTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines custom cancel icon</description>
+ <name>cancelControlIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component in the changed state</description>
+ <name>changedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component controls</description>
+ <name>controlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component control hovered</description>
+ <name>controlHoverClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component control pressed</description>
+ <name>controlPressClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute positions the controls
+ horizontally. Possible values are
+ "right","center","left".
+ Default value is "right".</description>
+ <name>controlsHorizontalPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute positions the controls
+ vertically. Possible values are
+ "bottom","center" and "top". Default value is "center"</description>
+ <name>controlsVerticalPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute is used to display text while
+ value is undefined</description>
+ <name>defaultLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component in the edit state</description>
+ <name>editClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides an option to assign an
+ JavaScript action that initiates the change of the
+ state. Default value is
+ "onclick".</description>
+ <name>editEvent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines how the component is displayed in the
+ layout. Possible values are
+ "block",
+ "inline". Default value is
+ "inline".</description>
+ <name>layout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute defines the height of option
+ list. Default value is "200px".</description>
+ <name>listHeight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute defines the width of option list.
+ Default value is "200px".</description>
+ <name>listWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the maximum width of the select element.
+ Default value is "200px".</description>
+ <name>maxSelectWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the minimum width of the select element.
+ Default value is "100px".</description>
+ <name>minSelectWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component edit state is activated</description>
+ <name>oneditactivated</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the component edit state is activated</description>
+ <name>oneditactivation</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component input field loses the focus</description>
+ <name>oninputblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field is clicked</description>
+ <name>oninputclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the input field is double-clicked</description>
+ <name>oninputdblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component input field gets the focus</description>
+ <name>oninputfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down in the input field</description>
+ <name>oninputkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released in the input field</description>
+ <name>oninputkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released in the input field</description>
+ <name>oninputkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down in the input field</description>
+ <name>oninputmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the input field</description>
+ <name>oninputmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the input field</description>
+ <name>oninputmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the input field</description>
+ <name>oninputmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released in the input field</description>
+ <name>oninputmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some text is selected in the input field</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component view state is activated. onviewactivated fires request only if the value is changed</description>
+ <name>onviewactivated</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the component view state is activated</description>
+ <name>onviewactivation</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute opens the list once edit
+ activated. Default value is
+ "true".</description>
+ <name>openOnEdit</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines custom save icon</description>
+ <name>saveControlIcon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets width of the select element</description>
+ <name>selectWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute serves to display
+ "save" and
+ "cancel" controls. Default value
+ is "false".</description>
+ <name>showControls</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", shows the SelectItem labels in the InplaceSelect pull-down list, but displays the value in the field in view mode once an item is selected.
+ Default value is "false"</description>
+ <name>showValueInView</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute serves to define the tabbing
+ order</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component in the view state</description>
+ <name>viewClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component hovered in the view state</description>
+ <name>viewHoverClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A component that lets selecting a number from a numeric region. It is a horizontal
+ aligned scroll-like control with its own input field (optional) present. The keyboard input in a
+ field is possible (optional. Also it is possible to see the current value in the tool tip above a
+ dragged handle control.</description>
+ <name>inputNumberSlider</name>
+ <tag-class>org.richfaces.taglib.InputNumberSliderTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component bar element</description>
+ <name>barClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component bar element</description>
+ <name>barStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>an error message to use in client-side validation events</description>
+ <name>clientErrorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the decrease arrow element</description>
+ <name>decreaseClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the decrease arrow element selected</description>
+ <name>decreaseSelectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the decrease arrow element</description>
+ <name>decreaseStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay in pressed increase/decrease arrows in miliseconds. Default value is "200".</description>
+ <name>delay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When set for a form control, this boolean attribute disables the control for your input</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If set to "false" this attribute makes the text field "read-only", so the value can be
+ changed only from a handle. Default value is "true".</description>
+ <name>enableManualInput</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the handle element</description>
+ <name>handleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the handle element selected</description>
+ <name>handleSelectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The height of a slider control. Default value is "20px", for orientation="vertical" value is "20px"</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the increase arrow element</description>
+ <name>increaseClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the increase arrow element selected</description>
+ <name>increaseSelectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the increase arrow element</description>
+ <name>increaseStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component input field</description>
+ <name>inputClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "right", the InputText Box would be rendered on the right side of the ruler. If "left", the InputText Box would be rendered on the left side of the ruler. If "top", the InputText Box would be rendered on the top of the ruler. If "bottom", the InputText Box would be rendered on the bottom of the ruler.</description>
+ <name>inputPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Similar to the "Size" attribute of h:inputText. Default value is "3".</description>
+ <name>inputSize</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component input field</description>
+ <name>inputStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute to set an "end" value. Default value is "100"</description>
+ <name>maxValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies the maximum number of digits that could be entered into the input field.
+ The maximum number is unlimited by default.
+ If entered value exceeds the value specified in "maxValue" attribute than the slider takes a maximum value position.</description>
+ <name>maxlength</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute to set the "start" value. Default value is "0".</description>
+ <name>minValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a non-number value or a number value that is out of the range is input</description>
+ <name>onerror</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component input field is clicked</description>
+ <name>oninputclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component input field is double-clicked</description>
+ <name>oninputdblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down in the input field</description>
+ <name>oninputkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released in the input field</description>
+ <name>oninputkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released in the input field</description>
+ <name>oninputkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down in the input field</description>
+ <name>oninputmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the input field</description>
+ <name>oninputmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the input field</description>
+ <name>oninputmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the input field</description>
+ <name>oninputmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released in the input field</description>
+ <name>oninputmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some text is selected in the text field. This attribute can be used with the INPUT and TEXTAREA elements.</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a slider handle is moved</description>
+ <name>onslide</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute can have the values "vertical" and "horizontal" to define in which direction the slider should be moveable.</description>
+ <name>orientation</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>False value for this attribute makes increase/decrease arrows invisible. Default value is "false".</description>
+ <name>showArrows</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If the min/max values are shown on the right/left borders of a control. Default value is "true".</description>
+ <name>showBoundaryValues</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>False value for this attribute makes text a field invisible. Default value is "true".</description>
+ <name>showInput</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true"the current value is shown in the tooltip when a handle control is in a
+ "dragged" state. Default value is "true".</description>
+ <name>showToolTip</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Parameter that determines a step between the nearest values while using a handle. Default value is "1".</description>
+ <name>step</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the tool tip element of the handle</description>
+ <name>tipClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the tool tip element of the handle</description>
+ <name>tipStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The width of a slider control. Default value is "200px", for orientation="vertical" value is "200px"</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Spinner component - A single line input field that lets the user select a number using the controls near the
+ text field. User can change value using Up/Down keyboard keys. The keyboard Input in field if it isn't
+ locked by manualInput attribute is possible. After arrow controls pressed - cursor can be
+ moved in any way without loosing draged state.</description>
+ <name>inputNumberSpinner</name>
+ <tag-class>org.richfaces.taglib.InputNumberSpinnerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An error message to use in client-side validation events</description>
+ <name>clientErrorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" after the current value reaches the border value it is reversed to another border value
+ after next increasing/decreasing. In other case possibilities of next increasing (or decreasing) will be locked. Default value is " true ".</description>
+ <name>cycled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disable browser's auto completion. Default value is "false"</description>
+ <name>disableBrowserAutoComplete</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When set for a form control, this boolean attribute disables the control for your input</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if "false" your's input to the text field using keyboard will be locked. Default value is "true"</description>
+ <name>enableManualInput</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component input field</description>
+ <name>inputClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute specifies the initial length of input in characters. Default value is "10".</description>
+ <name>inputSize</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component input field</description>
+ <name>inputStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Maximum value. Default value is "100".</description>
+ <name>maxValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Minimum value. Default value is "0".</description>
+ <name>minValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element value is changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Down' button is clicked</description>
+ <name>ondownclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called whenever a JavaScript error occurs</description>
+ <name>onerror</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component input field is clicked</description>
+ <name>oninputclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component input field is double-clicked</description>
+ <name>oninputdblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down in the input field</description>
+ <name>oninputkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released in the input field</description>
+ <name>oninputkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released in the input field</description>
+ <name>oninputkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down in the input field</description>
+ <name>oninputmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the input field</description>
+ <name>oninputmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the input field</description>
+ <name>oninputmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the input field</description>
+ <name>oninputmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released in the input field</description>
+ <name>oninputmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some text is selected in the text field. This attribute can be used with the INPUT and TEXTAREA elements.</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Up' button is clicked</description>
+ <name>onupclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Parameter that determines the step between nearest values while using controls. Default value is "1"</description>
+ <name>step</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:insert&gt; component is used for highlighting, source code inserting and, optionally, format the file from the application context into the page.</description>
+ <name>insert</name>
+ <tag-class>org.richfaces.ui.taglib.InsertTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the String, inserted with this component. This attribute is alternative to "src" attribute.</description>
+ <name>content</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines encoding for inserted content</description>
+ <name>encoding</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the alternative content that will be shown in case
+component cannot read the resource defined with 'src' attribute. If "errorContent" attribute is not defined,
+the component shown the actual error message in the place where the content is expected</description>
+ <name>errorContent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a type of code</description>
+ <name>highlight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the path to the file with source code</description>
+ <name>src</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:jQuery&gt; allows to apply styles and behaviour to DOM objects.</description>
+ <name>jQuery</name>
+ <tag-class>org.richfaces.taglib.JQueryTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The name of a function that will be generated to execute a query. The "name" attribute is required
+ if "timing" attribute equals to "onJScall"</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The query string that is executed for a given selector.</description>
+ <name>query</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Selector for query. The "selector" attribute uses defined by w3c
+ consortium syntax for CSS rule selector with some jQuery extensions.</description>
+ <name>selector</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute that defines when to perform the query. The possible values are "immediate","onload" and "onJScall".
+ "immediate" performs the query right away. "onload" adds the task to the
+ time when a document is loaded (the DOM tree is created). "onJScall" allows to invoke the
+ query by Javascipt function name defined with "name" attribute. The default value is
+ "immediate".</description>
+ <name>timing</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>layout</name>
+ <tag-class>org.richfaces.taglib.LayoutTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>layoutPanel</name>
+ <tag-class>org.richfaces.taglib.LayoutPanelTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Positions the component relative to the &lt;rich:layout/&gt; component. Possible values are top, left, right, center, bottom.</description>
+ <name>position</name>
+ <required>true</required>
+ <deferred-value>
+ <type>org.richfaces.component.LayoutPosition</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the width of the layout area</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:listShuttle&gt; component is used for moving chosen items from one list into another with their optional reordering there.</description>
+ <name>listShuttle</name>
+ <tag-class>org.richfaces.taglib.ListShuttleTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Stores active item</description>
+ <name>activeItem</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines row keys that are updated after an Ajax request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Bottom' button</description>
+ <name>bottomControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a bottom control</description>
+ <name>bottomControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for the last button</description>
+ <name>bottomTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute.
+ If there are more class names than columns, the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines type of a control: button or none. Default value is "button".</description>
+ <name>controlsType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Customizes vertically a position of move/copy and order controls relatively to lists. Default value is "middle"</description>
+ <name>controlsVerticalAlign</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Copy all' button</description>
+ <name>copyAllControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Copy all" control</description>
+ <name>copyAllControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for "Copy all" button</description>
+ <name>copyAllTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Copy' button</description>
+ <name>copyControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Copy" control</description>
+ <name>copyControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for a "Copy" button</description>
+ <name>copyTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component disabled controls</description>
+ <name>disabledControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Down' button</description>
+ <name>downControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a down control</description>
+ <name>downControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for bottom button</description>
+ <name>downTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Copy All' and 'Remove All' controls aren't displayed. Default value is "true".</description>
+ <name>fastMoveControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Top' and 'Bottom' controls aren't displayed. Default value is "true".</description>
+ <name>fastOrderControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component lists</description>
+ <name>listClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines height of the list. Default value is "140".</description>
+ <name>listsHeight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Copy' and 'Remove' controls aren't displayed. Default value is "true".</description>
+ <name>moveControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Bottom' button is clicked</description>
+ <name>onbottomclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Copy All' button is clicked</description>
+ <name>oncopyallclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Copy' button is clicked</description>
+ <name>oncopyclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Down' button is clicked</description>
+ <name>ondownclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the list is changed</description>
+ <name>onlistchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the list is changed</description>
+ <name>onlistchanged</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the component</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the component</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the component</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the list order is changed</description>
+ <name>onorderchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the list order is changed</description>
+ <name>onorderchanged</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Remove All' button is clicked</description>
+ <name>onremoveallclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Remove' button is clicked</description>
+ <name>onremoveclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Top' button is clicked</description>
+ <name>ontopclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Up' button is clicked</description>
+ <name>onupclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Up' and 'Down' controls aren't displayed. Default value is "true".</description>
+ <name>orderControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Remove all' button</description>
+ <name>removeAllControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Remove all" control</description>
+ <name>removeAllControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for "Remove all" button</description>
+ <name>removeAllTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Remove' button</description>
+ <name>removeControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Remove" control</description>
+ <name>removeControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for a "Remove" button</description>
+ <name>removeTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute.
+ If there are more class names than rows, the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Shows a label for a button. Default value is "true".</description>
+ <name>showButtonLabels</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines source list caption representation text</description>
+ <name>sourceCaptionLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width of a source list. Default value is "140".</description>
+ <name>sourceListWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the case when source value is being validated.
+ If the value is "true", there should be at least one item in the source list</description>
+ <name>sourceRequired</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Manages selection in a source list from the server side</description>
+ <name>sourceSelection</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a List or Array of items to be shown in a source list</description>
+ <name>sourceValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", dragging between lists realized by click</description>
+ <name>switchByClick</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", items can be moved between the lists by double-clicking on them. Default value is "true".</description>
+ <name>switchByDblClick</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines target list caption representation text</description>
+ <name>targetCaptionLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width of a target list. Default value is "140".</description>
+ <name>targetListWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the case when target value is being validated.
+ If the value is "true", there should be at least one item in the target list</description>
+ <name>targetRequired</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Manages selection in a target list from the server side</description>
+ <name>targetSelection</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a List or Array of items to be shown in a target list</description>
+ <name>targetValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Top' button</description>
+ <name>topControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Top" control</description>
+ <name>topControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for the first button</description>
+ <name>topTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the 'Up' button</description>
+ <name>upControlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for an "Up" control</description>
+ <name>upControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for top button</description>
+ <name>upTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Defines a list on the page</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:menuGroup&gt; component is used to define an expandable group of items inside a pop-up list or another group.</description>
+ <name>menuGroup</name>
+ <tag-class>org.richfaces.taglib.MenuGroupTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines direction of the popup sublist to appear
+ ("right", "left", "auto"(Default), "left-down", "left-up", "right-down", "right-up")</description>
+ <name>direction</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" sets state of the item to disabled state. Default value is "false".</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the event on the representation element that
+ triggers the menu's appearance. Default value is "onmouseover".</description>
+ <name>event</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the enabled item
+ state</description>
+ <name>icon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component icon element</description>
+ <name>iconClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled item
+ state</description>
+ <name>iconDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the folder icon to be displayed for the enabled
+ item state</description>
+ <name>iconFolder</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the folder icon to be displayed for the enabled
+ item state</description>
+ <name>iconFolderDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component icon element</description>
+ <name>iconStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component label element</description>
+ <name>labelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a group is
+ closed</description>
+ <name>onclose</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the menu group</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the menu group</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the menu group</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a group is
+ opened</description>
+ <name>onopen</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component selected items</description>
+ <name>selectClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component selected items</description>
+ <name>selectStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay between event and menu showing. Default value is "300".</description>
+ <name>showDelay</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines representation text for menuItem</description>
+ <name>value</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:menuItem&gt; component is used for the definition of a single item inside a pop-up list.</description>
+ <name>menuItem</name>
+ <tag-class>org.richfaces.taglib.MenuItemTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" sets state of the item to disabled state. Default value is "false".</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the enabled item
+ state</description>
+ <name>icon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component icon element</description>
+ <name>iconClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled item state.</description>
+ <name>iconDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component icon element</description>
+ <name>iconStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component label element</description>
+ <name>labelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when
+ a menu item is selected</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the selected item</description>
+ <name>selectClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the selected item</description>
+ <name>selectStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the submission mode. Possible values are "ajax", "server", "none". Default value is "server".</description>
+ <name>submitMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of a frame where the resource retrieved via this
+ hyperlink is to be displayed</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A horizontal separator to use in the menu.</description>
+ <name>menuSeparator</name>
+ <tag-class>org.richfaces.taglib.MenuSeparatorTag</tag-class>
+ <body-content>empty</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:message&gt; component is used for rendering a single message for a specific component.</description>
+ <name>message</name>
+ <tag-class>org.richfaces.taglib.RichMessageTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Define, must be (or not) content of this component will be included in AJAX response created by parent AJAX Container, even if not forced by reRender list of ajax action.
+ Ignored if component marked to output by some Ajax action component. The default value is "true".</description>
+ <name>ajaxRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message with a severity class of "ERROR"</description>
+ <name>errorClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message label with a severity class of "ERROR"</description>
+ <name>errorLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message marker with a severity class of "ERROR"</description>
+ <name>errorMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message with a severity class of "FATAL"</description>
+ <name>fatalClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message label with a severity class of "FATAL"</description>
+ <name>fatalLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message marker with a severity class of "FATAL"</description>
+ <name>fatalMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Client identifier of the component for which to display messages</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message with a severity class of "INFO"</description>
+ <name>infoClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message label with a severity class of "INFO"</description>
+ <name>infoLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message marker with a severity class of "INFO"</description>
+ <name>infoMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message label</description>
+ <name>labelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a comma-separated list of messages categories to display. Default value is "ALL".</description>
+ <name>level</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message marker</description>
+ <name>markerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the message marker</description>
+ <name>markerStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a minimum level of messages categories to display.</description>
+ <name>minLevel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Flag indicating whether detailed information of a displayed messages should be included. Default value is "true".</description>
+ <name>showDetail</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Flag indicating whether the summary portion of displayed messages should be included. Default value is "false".</description>
+ <name>showSummary</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Flag indicating whether the detail portion of the message should be displayed as a tooltip. Default value is "false".</description>
+ <name>tooltip</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message with a severity class of "WARN"</description>
+ <name>warnClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message label with a severity class of "WARN"</description>
+ <name>warnLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the message marker with a severity class ofS "WARN"</description>
+ <name>warnMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:messages&gt; component is similar to &lt;rich:message&gt; component but used for rendering all messages for the components.</description>
+ <name>messages</name>
+ <tag-class>org.richfaces.taglib.RichMessagesTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Define, must be (or not) content of this component will be included in AJAX response created by parent AJAX Container, even if not forced by reRender list of ajax action.
+ Ignored if component marked to output by some Ajax action component. The default value is "true".</description>
+ <name>ajaxRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages with a severity class of "ERROR"</description>
+ <name>errorClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages labels with a severity class of "ERROR"</description>
+ <name>errorLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages marker with a severity class of "ERROR"</description>
+ <name>errorMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages with a severity class of "FATAL"</description>
+ <name>fatalClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages labels with a severity class of "FATAL"</description>
+ <name>fatalLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages markers with a severity class of "FATAL"</description>
+ <name>fatalMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Client identifier of the component for which to display messages</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Flag indicating that only global messages (that is, messages not associated with any client identifier) are to be displayed. Default value is "false"</description>
+ <name>globalOnly</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages with a severity class of "INFO"</description>
+ <name>infoClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages labels with a severity class of "INFO"</description>
+ <name>infoLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages markers with a severity class of "INFO"</description>
+ <name>infoMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages labels</description>
+ <name>labelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The type of layout markup to use when rendering error messages. Possible values are "table" (an HTML table), "list" (an HTML list) and iterator. If not specified, the default value is "list".</description>
+ <name>layout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a comma-separated list of messages categories to display. Default value is "ALL".</description>
+ <name>level</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages markers</description>
+ <name>markerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the messages markers</description>
+ <name>markerStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a minimum level of messages categories to display.</description>
+ <name>minLevel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Flag indicating whether the detailed information of displayed messages should be included. Default value is "false"</description>
+ <name>showDetail</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Flag indicating whether the summary portion of displayed
+ messages should be included. Default value is "true"</description>
+ <name>showSummary</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML 'class' attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Flag indicating whether the detail portion of the message should be displayed as a tooltip. Default value is "false".</description>
+ <name>tooltip</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages with a severity class of "WARN"</description>
+ <name>warnClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages labels with a severity class of "WARN"</description>
+ <name>warnLabelClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the messages markers with a severity class of "WARN"</description>
+ <name>warnMarkerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:modalPanel&gt; component implements a modal dialog window.
+ All operations in the main application window are locked out while this window is active. Opening and closing the window is done through client JavaScript code.</description>
+ <name>modalPanel</name>
+ <tag-class>org.richfaces.taglib.ModalPanelTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>If "true" modalPanel should be autosizeable. Default value is "false".</description>
+ <name>autosized</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component controls</description>
+ <name>controlsClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the DOM element, which stacking context will assimilate the modalPanel. Possible values: "body", "form", "parent". Default value is "body".</description>
+ <name>domElementAttachment</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines height of component. Default value is "300".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "true" modalPanel should save state after submission. Default value is "false".</description>
+ <name>keepVisualState</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines X position of component left-top corner. Default value is "auto".</description>
+ <name>left</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines min height of component. Default value is "10". If the value is less then 10, a "IllegalArgumentException" exception is thrown.</description>
+ <name>minHeight</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines min width of component. Default value is "10". If the value is less then 10, a "IllegalArgumentException" exception is thrown.</description>
+ <name>minWidth</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" there is possibility to move component. Default value is "true".</description>
+ <name>moveable</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the modal panel is hidden</description>
+ <name>onbeforehide</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the modal panel is opened</description>
+ <name>onbeforeshow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the modal panel is hidden</description>
+ <name>onhide</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a left mouse button is clicked outside the modal panel</description>
+ <name>onmaskclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a right mouse button is clicked outside the modal panel</description>
+ <name>onmaskcontextmenu</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a left mouse button is double-clicked outside the modal panel</description>
+ <name>onmaskdblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down outside the modal panel</description>
+ <name>onmaskmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved outside the modal panel</description>
+ <name>onmaskmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the modal panel</description>
+ <name>onmaskmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the modal panel</description>
+ <name>onmaskmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released outside the modal panel</description>
+ <name>onmaskmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the modal panel is moved</description>
+ <name>onmove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the modal panel is resized</description>
+ <name>onresize</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the modal panel is displayed</description>
+ <name>onshow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" modalPanel creates iframe to overlap embed objects like PDF on a page. Default value is "false".</description>
+ <name>overlapEmbedObjects</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" there is possibility to change component size. Default value is "true".</description>
+ <name>resizeable</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Pop-up shadow depth for suggestion content</description>
+ <name>shadowDepth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML CSS class attribute of element for pop-up suggestion content</description>
+ <name>shadowOpacity</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" value for this attribute makes a modal panel opened as default. Default value is "false"</description>
+ <name>showWhenRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines Y position of component left-top corner. Default value is "auto".</description>
+ <name>top</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>How to handle HTML SELECT-based controls in IE 6? - "disable" - default,
+ handle as usual, use disabled="true" to hide SELECT controls - "hide" - use
+ visibility="hidden" to hide SELECT controls</description>
+ <name>tridentIVEngineSelectBehavior</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines whether to trim or not elements inside modalPanel. Default value is "true"</description>
+ <name>trimOverlayedElements</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines options that were specified on the client side</description>
+ <name>visualOptions</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines width of component. Default value is "200".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute is similar to the standard HTML attribute and can specify window. Default value is "100".
+ placement relative to the content</description>
+ <name>zindex</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <name>nodeSelectListener</name>
+ <tag-class>org.richfaces.taglib.NodeSelectListenerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+ a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>org.richfaces.nodeSelectListener</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The fully qualified Java class name for the listener</description>
+ <name>type</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:orderingList&gt; is a component for ordering items in a list. This component provides possibilities to reorder a list and sort it on the client side.</description>
+ <name>orderingList</name>
+ <tag-class>org.richfaces.taglib.OrderingListTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Stores active item</description>
+ <name>activeItem</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines row keys that are updated after an Ajax request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a 'Bottom' control</description>
+ <name>bottomControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for last button</description>
+ <name>bottomTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines caption representation text</description>
+ <name>captionLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute.
+ If there are more class names than columns, the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Controls horizontal rendering. Possible values:
+ "left" - controls should be rendered to the left side of a list.
+ "right"- controls should be rendered to the right side of a list. Default value is "right".</description>
+ <name>controlsHorizontalAlign</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines type of a control: button or none. Default value is "button".</description>
+ <name>controlsType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Controls vertical rendering. Possible values:
+ "top" - controls should be rendered aligned to top side of a list.
+ "bottom" - controls should be rendered aligned to bottom side of a list.
+ "middle" - controls should be rendered centered relatively to a list. Default value is "middle"</description>
+ <name>controlsVerticalAlign</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a 'Down' control</description>
+ <name>downControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for bottom button</description>
+ <name>downTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Top' and 'Bottom' controls aren't displayed. Default value is "true".</description>
+ <name>fastOrderControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines height of a list. Default value is "140".</description>
+ <name>listHeight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width of a list. Default value is "140".</description>
+ <name>listWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Bottom' button is clicked</description>
+ <name>onbottomclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Down' button is clicked</description>
+ <name>ondownclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the list header is clicked</description>
+ <name>onheaderclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the component</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the component</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the component</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the list order is changed</description>
+ <name>onorderchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the list order is changed</description>
+ <name>onorderchanged</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Top' button is clicked</description>
+ <name>ontopclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the 'Up' button is clicked</description>
+ <name>onupclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Up' and 'Down' controls aren't displayed. Default value is "true".</description>
+ <name>orderControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute.
+ If there are more class names than rows, the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining rows in the list</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Collection which stores a set of selected items</description>
+ <name>selection</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", shows a label for a button. Default value is "true"</description>
+ <name>showButtonLabels</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a 'Top' control</description>
+ <name>topControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for first button</description>
+ <name>topTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a 'Up' control</description>
+ <name>upControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for top button</description>
+ <name>upTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a List or Array of items to be shown in a list</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Defines a list on the page</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description/>
+ <name>page</name>
+ <tag-class>org.richfaces.taglib.PageTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the body part of the page</description>
+ <name>bodyClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set custom mime content type to response</description>
+ <name>contentType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component footer</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Page layout format ( html, xhtml, html-transitional, html-3.2 ) for encoding DOCTYPE, namespace and Content-Type definitions</description>
+ <name>markupType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set html element default namespace</description>
+ <name>namespace</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the right mouse button is clicked over the component</description>
+ <name>oncontextmenu</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before a page is loaded</description>
+ <name>onload</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a page is unloaded</description>
+ <name>onunload</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>String for output as a page title.</description>
+ <name>pageTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component side panel</description>
+ <name>sidebarClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the position of the side panel. Possible values are "left", "right". Default value is "left".</description>
+ <name>sidebarPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width for the side panel. Default value is "160".</description>
+ <name>sidebarWidth</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies the way of the component rendering</description>
+ <name>theme</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the width of the page</description>
+ <name>width</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Create an image by paint in a managed bean, same as paint (Graphics g) in SWING components.
+ It can be used as a cacheable or non-cacheable resource. With a cache support, a key is created in URI
+ with a mix of size (width/height), paint method, format and data attributes.</description>
+ <name>paint2D</name>
+ <tag-class>org.richfaces.taglib.Paint2DTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Deprecated. This attribute specifies the position of an IMG, OBJECT, or APPLET with respect to its context.
+ The possible values are "bottom", "middle", "top", "left" and "right". The default value is "middle".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>For compability with XHTML 1.1 standart</description>
+ <name>alt</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Background color of painted image. Default value is 'transparent' which means no background fill.
+ Hex colors can be used, as well as common color names.
+ Invalid values are treated as transparent.
+ Note, that JPEG format doesn't support transparency, and transparent background is painted black.
+ Also note, that several browsers (e.g. IE6) do not support PNG transparency. Default value is &quot;transparent&quot;</description>
+ <name>bgcolor</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the width of an IMG or OBJECT border, in pixels. The default value for this attribute depends on the user agent</description>
+ <name>border</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Supported (or not) client/server caching for generated images.
+ Caching on client supported by properly sending and processing of HTTP headers (Last-Modified, Expires, If-Modified-Since, etc.)
+ Server-side caching is supported by application-scope object cache.
+ For build of cache key use "value" attribute, serialized to URI</description>
+ <name>cacheable</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Value calculated at render time and stored in Image URI (as part of cache Key),
+ at paint time passed to a paint method. It can be used for updating cache at change of image generating
+ conditions, and for creating paint beans as "Lightweight" pattern components (request scope).
+ IMPORTANT: Since serialized data stored in URI, avoid using big objects</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>format Name of format for sending a generated image. It currently supports "jpeg" (24 bit, default), "gif" (8 bit with transparency), "png" (32 bit with transparency)</description>
+ <name>format</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Height in pixels of image (for paint canvas and HTML attribute). Default value is "10".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the amount of white space to be inserted to the left and right of an IMG, APPLET, or OBJECT. The default value is not specified, but is generally a small, non-zero length</description>
+ <name>hspace</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The method calls expression to paint Image on prepared Buffered image. It must have two parameters with a type of java.awt.Graphics2D (graphics to paint) and Object (restored from URI "data" property).
+ For painting used 32-bit RGBA color model (for 8-bit images used Diffusion filtration before sending)</description>
+ <name>paint</name>
+ <deferred-method>
+ <method-signature>void paint(java.awt.Graphics2D,java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the amount of white space to be inserted above and below an IMG, APPLET, or OBJECT. The default value is not specified, but is generally a small, non-zero length</description>
+ <name>vspace</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Width in pixels of image (for paint canvas and HTML attribute). Default value is "10".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A skinnable panel that is rendered as a bordered rectangle. The header is
+ added using a facet with the attribute, name="header".</description>
+ <name>panel</name>
+ <tag-class>org.richfaces.taglib.PanelTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component content</description>
+ <name>bodyClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Label text appears on a panel header</description>
+ <name>header</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A component with categories sliding up and down to reveal and hide items under selected
+ categories (as used in Microsoft Outlook).</description>
+ <name>panelBar</name>
+ <tag-class>org.richfaces.taglib.PanelBarTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component content</description>
+ <name>contentClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component content</description>
+ <name>contentStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the header of the active component item</description>
+ <name>headerClassActive</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component header</description>
+ <name>headerStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the header of the active component item</description>
+ <name>headerStyleActive</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The height of the slide panel. Might be defined as pixels or as percentage.
+ Default value is "100%".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a panel bar is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a panel bar item is changed</description>
+ <name>onitemchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after a panel bar item has been changed</description>
+ <name>onitemchanged</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the component</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the component</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the component</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribure defines name of selected item</description>
+ <name>selectedPanel</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The width of the slide panel. Might be defined as pixels or as percentage.
+ Default value is "100%".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A child component of a slide panel component</description>
+ <name>panelBarItem</name>
+ <tag-class>org.richfaces.taglib.PanelBarItemTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component content</description>
+ <name>contentClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component content</description>
+ <name>contentStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the header of the active item</description>
+ <name>headerClassActive</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component header</description>
+ <name>headerStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the header of the active item</description>
+ <name>headerStyleActive</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Label text appears on a panel item header. Default value is "auto generated label"</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines item name. Default value is "getId()".</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a panel bar item is opened</description>
+ <name>onenter</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a panel bar item is leaved</description>
+ <name>onleave</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Defines the menu on the page and the set of the child elements properties in
+ layout.</description>
+ <name>panelMenu</name>
+ <tag-class>org.richfaces.taglib.PanelMenuTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If true sets state of the item to disabled state. Default value is "false".</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component disabled groups</description>
+ <name>disabledGroupClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component disabled groups</description>
+ <name>disabledGroupStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component disabled items</description>
+ <name>disabledItemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component disabled items</description>
+ <name>disabledItemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the event on the representation element that triggers the
+ submenu's expand/collapse. Default value is "onclick".</description>
+ <name>event</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set the submission mode for all panel menu groups after expand/collapse
+ except ones where this attribute redefined. Possible values are "ajax", "server", "none".
+ Default value is "none".</description>
+ <name>expandMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Whether only one panel menu node on top level can be opened at a time. If
+ the value of this attribute is true, the previously opened node on the top level is
+ closed. If the value is false, the node is left opened. Default value is "false".</description>
+ <name>expandSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any component group except top groups</description>
+ <name>groupClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to any component group except top groups</description>
+ <name>groupStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component hovered group</description>
+ <name>hoveredGroupClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component hovered group</description>
+ <name>hoveredGroupStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component hovered item</description>
+ <name>hoveredItemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component hovered item</description>
+ <name>hoveredItemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the collapsed Group state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconCollapsedGroup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the collapsed top group state.\
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconCollapsedTopGroup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled group state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconDisabledGroup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconDisabledItem</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the expanded Group state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconExpandedGroup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the expanded top group state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconExpandedTopGroup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Position of the icon for the group icon. Possible values are "left","right","none". Default value is "left".</description>
+ <name>iconGroupPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Position of the icon for the top group icon. Possible values are "left","right","none". Default value is "left".</description>
+ <name>iconGroupTopPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the enabled item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconItem</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Position of the icon for the item icon. Possible values are "left","right","none". Default value is "left".</description>
+ <name>iconItemPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Position of the icon for the top item icon.
+ Possible values are "left","right","none". Default value is "left".</description>
+ <name>iconItemTopPosition</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled top Group state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconTopDisableGroup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled top item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconTopDisabledItem</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the enabled top item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconTopItem</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any component item except top items</description>
+ <name>itemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component item except top items</description>
+ <name>itemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set the submission mode for all panel menu items on the panel menu except
+ ones where this attribute redefined. Possible values are "ajax", "server", "server". Default value is "server".</description>
+ <name>mode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer button is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some group is closed</description>
+ <name>ongroupcollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when some group is activated</description>
+ <name>ongroupexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a panel menu item is hovered</description>
+ <name>onitemhover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the component</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the component</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the component</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>contain the name or the clientId of any of the item or group, the child
+ defined in this attribute should be highlighted on PanelMenu rendering</description>
+ <name>selectedChild</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component top groups</description>
+ <name>topGroupClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component top groups</description>
+ <name>topGroupStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component top items</description>
+ <name>topItemClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component top items</description>
+ <name>topItemStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Set minimal width for the menu. Default value is "100%".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Defines expandable group of items inside the panel menu or other group.</description>
+ <name>panelMenuGroup</name>
+ <tag-class>org.richfaces.taglib.PanelMenuGroupTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute specifies the horizontal alignment of its element with respect to the surrounding context. The possible values are "left", "center", "right" and "justify".
+ The default depends on the base text direction. For left to right text, the default is align="left", while for right to left text, the default is align="right".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>For a user agents that cannot display images, forms, or applets, this attribute specifies alternate text. The language of the alternate text is specified by the lang attribute</description>
+ <name>alt</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When set for a form control, this boolean attribute disables the control for your input</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the group disabled items</description>
+ <name>disabledClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the group disabled items</description>
+ <name>disabledStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set the submission mode for all panel menu groups after expand/collapse
+ except ones where this attribute redefined. Possible value are "ajax", "server", "none". Default value is "none".</description>
+ <name>expandMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If true group will be displayed expanded initially. Default value is "false".</description>
+ <name>expanded</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the group hovered item</description>
+ <name>hoverClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the group hovered item</description>
+ <name>hoverStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the group icon element</description>
+ <name>iconClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the collapsed item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconCollapsed</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled item state.</description>
+ <name>iconDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the expanded item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconExpanded</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the group icon element</description>
+ <name>iconStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Displayed node's text</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pane menu group is closed</description>
+ <name>oncollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pane menu group is opened</description>
+ <name>onexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Target frame for action to execute.</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Defines single Item inside popup list.</description>
+ <name>panelMenuItem</name>
+ <tag-class>org.richfaces.taglib.PanelMenuItemTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If true sets state of the item to disabled state. Default value is "false".</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the disabled item</description>
+ <name>disabledClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the disabled item</description>
+ <name>disabledStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the hovered item</description>
+ <name>hoverClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the hovered item</description>
+ <name>hoverStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon or the default one name to be displayed for the enabled
+ item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>icon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the item icon element</description>
+ <name>iconClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Path to the icon to be displayed for the disabled item state.
+ You can also use predefined icons, setting the attribute to one of these possible values: "triangle", "triangleUp", "triangleDown", "disc", "chevron", "chevronUp", "chevronDown", "grid".
+ Default value is "grid".</description>
+ <name>iconDisabled</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the item icon element</description>
+ <name>iconStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines representation text for menuItem.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set the submission mode.
+
+ Possible values are "ajax", "server", "none". Default value is "none".</description>
+ <name>mode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>'selectedChild' attribute of PanelMenu refers to group/item with the same
+ name. Default value is "getId()".</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Target frame for action to execute.</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:pickList&gt; component is used for moving selected item(s) from one list into another.</description>
+ <name>pickList</name>
+ <tag-class>org.richfaces.taglib.PickListTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component controls</description>
+ <name>controlClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Copy all" control</description>
+ <name>copyAllControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for a "Copy all" button</description>
+ <name>copyAllTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", the 'Copy All' control will not be displayed. Even if this value is "true", the 'Copy All' control will not be displayed if the "fastMoveControlsVisible" attribute is "false". Default value is "true".</description>
+ <name>copyAllVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Copy" control</description>
+ <name>copyControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for a "Copy" button</description>
+ <name>copyTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", the 'Copy' control will not be displayed. Even if this value is "true", the 'Copy' control will not be displayed if the "moveControlsVisible" attribute is "false". Default value is "true".</description>
+ <name>copyVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", disable this component on page.</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component disabled controls</description>
+ <name>disabledStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component disabled controls</description>
+ <name>disabledStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component enabled controls</description>
+ <name>enabledStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component enabled controls</description>
+ <name>enabledStyleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Copy All' and 'Remove All' controls aren't displayed. Even if this value is "true", the 'Copy All' and 'Remove All' controls will not be displayed if the "copyAllVisible" and "removeAllVisible" attribute values are "false". Default value is "true".</description>
+ <name>fastMoveControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component lists</description>
+ <name>listClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines height of the list. Default value is "140px"</description>
+ <name>listsHeight</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Customizes vertically a position of move/copy controls relatively to lists. Default value is "center".</description>
+ <name>moveControlsVerticalAlign</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", 'Copy' and 'Remove' controls aren't displayed. Even if this value is "true", the 'Copy' and 'Remove' controls will not be displayed if the "copyVisible" and "removeVisible" attribute values are "false". Default value is "true".</description>
+ <name>moveControlsVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the component gets the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the list is changed</description>
+ <name>onlistchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the list is changed</description>
+ <name>onlistchanged</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Remove all" control</description>
+ <name>removeAllControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for a "Remove" all button</description>
+ <name>removeAllTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", the 'Remove All' control will not be displayed. Even if this value is "true", the 'Remove All' control will not be displayed if the "fastMoveControlsVisible" attribute is "false". Default value is "true".</description>
+ <name>removeAllVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a label for a "Remove" control</description>
+ <name>removeControlLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: alt for a "Remove" button</description>
+ <name>removeTitle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", the 'Remove' control will not be displayed. Even if this value is "true", the 'Remove' control will not be displayed if the "moveControlsVisible" attribute is "false". Default value is "true".</description>
+ <name>removeVisible</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Shows a label for a button. Default value is "true"</description>
+ <name>showButtonsLabel</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width of a source list. Default value is "140px"</description>
+ <name>sourceListWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", items can be moved between the lists by clicking on them. Default value is "false".</description>
+ <name>switchByClick</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", items can be moved between the lists by double-clicking on them. Default value is "true".</description>
+ <name>switchByDblClick</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines width of a target list. Default value is "140px"</description>
+ <name>targetListWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:progressBar&gt; component is designed for displaying a progress bar which shows the current status of the process.</description>
+ <name>progressBar</name>
+ <tag-class>org.richfaces.taglib.ProgressBarTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component progress line rendering</description>
+ <name>completeClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Enables/disables polling. Default value is "true".</description>
+ <name>enabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the progress bar complete state</description>
+ <name>finishClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the progress bar initial state</description>
+ <name>initialClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Interval (in ms) for call poll requests. Default value
+ 1000 ms (1 sec)</description>
+ <name>interval</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines a simple label instead of rendering children component</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Max value, after which complete state should be rendered. Default value is "100".</description>
+ <name>maxValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Min value when initial state should be rendered. Default value is "0".</description>
+ <name>minValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attributes defines AJAX or CLIENT modes for component. Possible values are "ajax", "client". Default value is "ajax".</description>
+ <name>mode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before an ajax request is submitted</description>
+ <name>onsubmit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Parameters for macrosubstitution in the label</description>
+ <name>parameters</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>DEPRECATED. Provides access to value of the component on the client</description>
+ <name>progressVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Set of componets to rerender after completion</description>
+ <name>reRenderAfterComplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the remained part of the progress bar</description>
+ <name>remainClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the current value of the progress</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:recursiveTreeNodesAdaptor&gt; is an extension of a &lt;rich:treeNodesAdaptor&gt; component that provides the possibility to define data models and process nodes recursively.</description>
+ <name>recursiveTreeNodesAdaptor</name>
+ <tag-class>org.richfaces.taglib.RecursiveTreeNodesAdaptorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>This boolean expression is used to define which elements of both collections are processed. Default value is "true".</description>
+ <name>included</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This boolean expression is used to define which elements are processed. Default value is "true".</description>
+ <name>includedNode</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This boolean expression is used to define which elements are processed applying to "roots" collection. Default value is "true".</description>
+ <name>includedRoot</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines collection to use at the other (non-top) levels of iteration</description>
+ <name>nodes</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute is used to control a recursion order. Possible values are "first", "last", "[id of adaptor]" ("first" and "last" are reserved values). When "[id of the adaptor]" is set it means that recursion occurs after these adaptor component nodes are processed. The default value is "last"</description>
+ <name>recursionOrder</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines collection to use at the top of iteration</description>
+ <name>roots</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the current collection element will be used when iterating</description>
+ <name>var</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:scrollableDataTable&gt; component is used for the table-like component creation.
+ The component just adds the set of additional features described below in comparison with the standard table.</description>
+ <name>scrollableDataTable</name>
+ <tag-class>org.richfaces.taglib.ScrollableDataTableTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component active row</description>
+ <name>activeClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Request scope attribute under which the activeRowKey will be accessible</description>
+ <name>activeRowKey</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute. If there are more class names than columns,
+ the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any footer generated for this component</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines the number of the fixed columns from the left side that will not be scrolled via horizontal scroll.
+ Default value is "0".</description>
+ <name>frozenColCount</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any header generated for this component</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines a height of the component. Default value is "500px".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" data will be hidden during scrolling. Can be used for increase performance.
+ Default value is "false".</description>
+ <name>hideWhenScrolling</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is clicked</description>
+ <name>onRowClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is double-clicked</description>
+ <name>onRowDblClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the row</description>
+ <name>onRowMouseDown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over the row</description>
+ <name>onRowMouseUp</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client side script method to be called when a selected row is changed</description>
+ <name>onselectionchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of JavaScript variable corresponding to component</description>
+ <name>scriptVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component rows selected</description>
+ <name>selectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Value binding representing selected rows</description>
+ <name>selection</name>
+ <deferred-value>
+ <type>org.richfaces.model.selection.Selection</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines selection behaviour, provides an enumeration of the possible selection modes. Default value is "multi"</description>
+ <name>selectionMode</name>
+ <deferred-value>
+ <type>org.richfaces.model.SelectionMode</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines mode of sorting. Possible values are 'single' for sorting of one column and 'multi' for some.</description>
+ <name>sortMode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ValueBinding pointing at a property of a class to manage rows sorting</description>
+ <name>sortOrder</name>
+ <deferred-value>
+ <type>org.richfaces.model.SortOrder</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on the client side</description>
+ <name>stateVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Defines a width of the component. Default value is "700px".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A horizontal line to use as a separator in a layout.
+ The line type can be customized with the lineType parameter.</description>
+ <name>separator</name>
+ <tag-class>org.richfaces.taglib.SeparatorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute specifies a position of the separator according to the document. The possible values are "left", "center" and "right". Default value is "left".</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The separator height. Default value is "6px".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A line type. The possible values are
+ "beveled", "dotted", "dashed", "double", "solid" and "none".
+ Default value is "beveled"</description>
+ <name>lineType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: An advisory title for this element. Often displayed as a tooltip</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The separator width that can be defined in pixels or in percents. Default value is "100%".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Wrapper component with named facets. Every facet will be shown after activation
+ corresponding toggleControl(the other will be hidden).</description>
+ <name>simpleTogglePanel</name>
+ <tag-class>org.richfaces.taglib.SimpleTogglePanelTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the panel content</description>
+ <name>bodyClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the panel header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Height of a simple toggle panel content area might be defined as pixels or in percents.
+ By default height is not defined</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Marker to be rendered on a panel header</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before a panel is collapsed</description>
+ <name>oncollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before a panel is expanded</description>
+ <name>onexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A "false" value for this attribute makes the panel closed by default. Default value is "true".</description>
+ <name>opened</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Panels switch mode: "client", "server"(default), "ajax"</description>
+ <name>switchType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Width of a simple toggle panel might be defined as pixels or in percents.
+ By default width is not defined</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A spacer to use in layout. It is rendered as a transparent image. The size is set up
+ with width and height attributes. By default it is displayed as an inline element (i.e. word spacer).
+ By using style='display:block' can be used as a line spacer.</description>
+ <name>spacer</name>
+ <tag-class>org.richfaces.taglib.SpacerTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The height of the spacer defined in pixels. Default value is "1px".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: An advisory title for this element. Often used by the user agent as a tooltip</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The width of the spacer defined in pixels. Default value is "1px".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:subTable&gt; component is used for inserting subtables into tables with opportunity to choose data from a model and built-in Ajax updates support.</description>
+ <name>subTable</name>
+ <tag-class>org.richfaces.taglib.SubTableTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the columns of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular column in the order they follow in the attribute. If you have less class names than columns,
+ the class will be applied to every n-fold column where n is the order in which the class is listed in the attribute. If there are more class names than columns,
+ the overflow ones are ignored.</description>
+ <name>columnClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any footer generated for this component</description>
+ <name>footerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to any header generated for this component</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is clicked</description>
+ <name>onRowClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the row is double-clicked</description>
+ <name>onRowDblClick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the row</description>
+ <name>onRowMouseDown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the row</description>
+ <name>onRowMouseMove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the row</description>
+ <name>onRowMouseOut</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the row</description>
+ <name>onRowMouseOver</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over the row</description>
+ <name>onRowMouseUp</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows of the table. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute. If there are more class names than rows,
+ the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A number of rows to display, or zero for all remaining
+ rows in the table</description>
+ <name>rows</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on the client side</description>
+ <name>stateVar</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>This element adds "on-keypress" suggestions capabilites to any input text component (like &lt;h:inputText&gt;).
+ It creates a pop-up window for a input field component pointed to by the "for" attribute.
+ For an ordinary request, render a hidden HTML &lt;div&gt; element and the necessary JavaScript code.
+ When input to the target field exceeds the "minChars" property (default is 1), perform an AJAX request with
+ the value current entered. If the AJAX request is detected and the request parameters map contains the client ID of this component,
+ call a method defined by suggestionAction, and use it to return a value as data for render table, same as &lt;h:dataTable&gt;.
+ In this case, the component then works the same as an ordinary dataTable. The rendered table is inserted in the pop-up area and is used for suggestion prompts
+ for input element. If a user clicks on such a table row, its text (or value defined by fetchValue) is inserted as the value of the input field.</description>
+ <name>suggestionbox</name>
+ <tag-class>org.richfaces.taglib.SuggestionBoxTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Boolean attribute which provides possibility to limit JSF tree processing(decoding, conversion/validation, value applying) to the component which send the request only.
+ Default value is "true"</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Deprecated. This attribute sets the background color for the document body or table cells.
+
+ This attribute sets the background color of the canvas for the document body (the BODY element) or for tables (the TABLE, TR, TH, and TD elements). Additional attributes for specifying text color can be used with the BODY element.
+
+ This attribute has been deprecated in favor of style sheets for specifying background color information</description>
+ <name>bgcolor</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attributes specifies the width (in pixels only) of the frame around a table</description>
+ <name>border</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the amount of space between the
+ border of the cell and its contents. If the value of
+ this attribute is a pixel length, all four margins
+ should be this distance from the contents. If the value
+ of the attribute is percentage length, the top and
+ bottom margins should be equally separated from the
+ content based on percentage of the available vertical
+ space, and the left and right margins should be equally
+ separated from the content based on percentage of the
+ available horizontal space</description>
+ <name>cellpadding</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies how much space the user agent
+ should leave between the table and the column on all
+ four sides. The attribute also specifies the amount of
+ space to leave between cells</description>
+ <name>cellspacing</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the suggestion entry elements (table rows)</description>
+ <name>entryClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A value to set in the target input element on a choice
+ suggestion that isn't shown in the suggestion table. It
+ can be used for descriptive output comments or
+ suggestions. If not set, all text in the suggestion row
+ is set as a value</description>
+ <name>fetchValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A zero-relative row number of the first row to display</description>
+ <name>first</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id (or full path of id's) of target components, for which this element must provide support.
+ If a target component inside of the same &lt;code&gt;NamingContainer&lt;/code&gt; (UIForm, UIData in base implementations), can be simple value of the "id" attribute.
+ For other cases must include id's of &lt;code&gt;NamingContainer&lt;/code&gt; components, separated by ':'. For search from the root of components, must be started with ':'.</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which sides of the frame surrounding a table will be visible. Possible values: "void", "above", "below", "hsides", "lhs", "rhs", "vsides", "box" and "border".
+ The default value is "void".</description>
+ <name>frame</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay (in seconds) before activating the suggestion
+ pop-up. Default value is 400ms</description>
+ <name>frequency</name>
+ <deferred-value>
+ <type>double</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Height of the pop-up window in pixels. Default value is "200".</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted and validated immediately (that is, during Apply Request Values phase), rather than waiting until a Process Validations phase.</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Minimal number of chars in input to activate suggestion
+ pop-up</description>
+ <name>minChars</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>"nothingLabel" is inserted to popup list if the autocomplete returns empty list.
+ It isn't selectable and list is closed as always after click on it and nothing is put to input.</description>
+ <name>nothingLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the list of suggested objects is changed</description>
+ <name>onobjectchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the
+ value of the target element is updated</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before an ajax event is submitted</description>
+ <name>onsubmit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name the HTTP request parameter with the value of input
+ element token. If not set, it be will sent as an input
+ element name. In this case, input will perform
+ validation and update the value. Default value is "inputvalue".</description>
+ <name>param</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the content of the pop-up suggestion element</description>
+ <name>popupClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the content of the pop-up suggestion element</description>
+ <name>popupStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the rows. If the CSS class names are comma-separated,
+ each class will be assigned to a particular row in the order they follow in the attribute. If you have less class names than rows,
+ the class will be applied to every n-fold row where n is the order in which the class is listed in the attribute.
+ If there are more class names than rows, the overflow ones are ignored.</description>
+ <name>rowClasses</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies which rules will appear between cells within a table. The rendering of rules is user agent dependent. Possible values:
+
+ * none: No rules. This is the default value.
+ * groups: Rules will appear between row groups (see THEAD, TFOOT, and TBODY) and column groups (see COLGROUP and COL) only.
+ * rows: Rules will appear between rows only.
+ * cols: Rules will appear between columns only.
+ * all: Rules will appear between all rows and columns</description>
+ <name>rules</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the cells of the selected suggestion entry (table cells)</description>
+ <name>selectValueClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the selected suggestion entry (table rows)</description>
+ <name>selectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", forces active Ajax region render response
+ directly from stored components tree, bypasses page
+ processing. Can be used for increase performance. Also,
+ must be set to 'true' inside iteration components, such
+ as dataTable.</description>
+ <name>selfRendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Pop-up shadow depth for suggestion content</description>
+ <name>shadowDepth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines shadow opacity for suggestion content</description>
+ <name>shadowOpacity</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Method calls an expression to get a collection of suggestion data on request. It must have one parameter with a type of Object with content of input component and must return any type allowed for &lt;h:datatable&gt;</description>
+ <name>suggestionAction</name>
+ <deferred-method>
+ <method-signature>java.lang.Object suggestionAction(java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>This attribute provides a summary of the table's purpose and structure for user agents rendering to non-visual media such as speech and Braille</description>
+ <name>summary</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The list (or single value) of symbols which can be used
+ for division chosen of suggestion pop-up values in a
+ target element. After input of a symbol from the list
+ suggestion pop-up it is caused again</description>
+ <name>tokens</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if true, a suggested object list will be created and will be updated every time when an input value is changed. Default value is "false".</description>
+ <name>usingSuggestObjects</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the
+ current row will be used when iterating</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Width of the pop-up window in pixels. Default value is "200".</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute is similar to the standard HTML attribute and can specify window placement relative to the content. Default value is "200".</description>
+ <name>zindex</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A tab section within a tab panel</description>
+ <name>tab</name>
+ <tag-class>org.richfaces.taglib.TabTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disables a tab in a tab panel</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Text for the actual "tab" in a tab section</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Length for the actual "tab" in a tab section defined in pixels. If it is not defined, the
+ length is calculated basing on a tab label text length</description>
+ <name>labelWidth</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines tab name. Default value is "getId()".</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a tab label is clicked</description>
+ <name>onlabelclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a tab label is double-clicked</description>
+ <name>onlabeldblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down together with the pointer hovered over a tab label</description>
+ <name>onlabelkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released together with the pointer hovered over a tab label</description>
+ <name>onlabelkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released together with the pointer hovered over a tab label</description>
+ <name>onlabelkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over a tab label</description>
+ <name>onlabelmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within a tab label</description>
+ <name>onlabelmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over a tab label</description>
+ <name>onlabelmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the tab is switched</description>
+ <name>ontabenter</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the tab is left</description>
+ <name>ontableave</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Tabs switch mode. Possible values are "client", "server", "ajax", "page".</description>
+ <name>switchType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: An advisory title for this element. Often displayed as a tooltip</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A tab panel displaying tabs for grouping content of a panel.</description>
+ <name>tabPanel</name>
+ <tag-class>org.richfaces.taglib.TabPanelTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component active tab</description>
+ <name>activeTabClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the panel content</description>
+ <name>contentClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the panel content</description>
+ <name>contentStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component disabled tab</description>
+ <name>disabledTabClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets tab headers alignment. It can be "left" or "right".
+ Default value is "left".</description>
+ <name>headerAlignment</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the panel header</description>
+ <name>headerClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets tab headers spacing. It should be a valid size unit expression. Default value is "1px".</description>
+ <name>headerSpacing</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Height of a tab panel defined in pixels or in percents</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component inactive (but not disabled) tabs</description>
+ <name>inactiveTabClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before a tab is changed</description>
+ <name>ontabchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute which defines text of validation message to show, if a required field is missing</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines name of selected tab</description>
+ <name>selectedTab</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Tabs switch mode: "client", "server"(default), "ajax"</description>
+ <name>switchType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component tabs</description>
+ <name>tabClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Width of a tab panel defined in pixels or in percents.
+ The default value is 100%</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A link type control for switching betwen togglePanel's facets. The Target Panel is specified with the "for" attribute. It can be located even inside or outside the togglePanel.
+ As the result of switching between facets, the previous facet is hidden and the next is shown.</description>
+ <name>toggleControl</name>
+ <tag-class>org.richfaces.taglib.ToggleControlTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Access key that, when pressed, transfers focus to this
+ element</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Boolean attribute which provides possibility to limit JSF tree processing(decoding, conversion/validation, value applying) to the component which send the request only. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase skip updates
+ of model beans an force render response. Can be used for
+ validate components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Possible values are "LTR" (left-to-right)
+ and "RTL" (right-to-left).</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before
+ complete other from same event. Can be used to reduce
+ number of requests of frequently events (key press,
+ mouse move, etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>String, which contains id (in the format of a UIComponent.findComponent() call) of the target Toggle Panel.</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated
+ markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", updates on client side ONLY elements from this
+ 'reRender' property. if "false" (default) updates all
+ rendered by ajax region components</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element loses the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element gets the
+ focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released over the element</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released over
+ the element</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over the element</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component.
+ Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of
+ Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Contains one of the facets names where target togglePanel is switched to</description>
+ <name>switchToState</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Position of this element in the tabbing order for the
+ current document. This value must be an integer between
+ 0 and 32767</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements
+ generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Initial value to set when rendered for the first time</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A wrapper component with named facets. Every facet is shown after activation corresponding toggleControl(the other is hidden).</description>
+ <name>togglePanel</name>
+ <tag-class>org.richfaces.taglib.TogglePanelTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the converter message,
+ replacing any message that comes from the converter</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>It contains a name of the first active facet</description>
+ <name>initialState</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A localized user presentable name for this component.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Names of the facets in the switching order. If
+ ToggleControl doesn't contain information about a next facet to
+ be shown it is switched corresponding to this
+ attribute</description>
+ <name>stateOrder</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Facets switch mode: "client", "server"(default), "ajax".</description>
+ <name>switchType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A ValueExpression enabled attribute that, if present,
+ will be used as the text of the validator message,
+ replacing any message that comes from the validator</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The initial value to set when rendered for the first time.
+ It contains information about an active facet</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A horizontal bar with items on it.
+ If you want to use it as a standard top tool bar, point to each item with a ch:menu "for" attribute
+ to link the appropriate drop-down menu with the item id on a tool bar.
+ "toolBar" accepts any JSF components as children. They appear from left to right
+ in the definition order. The children are separated from each other basing on the value of the
+ "itemSeparator" attribute. If you want to put the items along the right side for a menu bar,
+ you can use the "toolBarGroup" component as a wrapper and define the "location" attribute
+ there. The items inside the group can have their own separator. See the "toolBarGroup" component description for details.</description>
+ <name>toolBar</name>
+ <tag-class>org.richfaces.taglib.ToolBarTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the tool bar content</description>
+ <name>contentClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the tool bar content</description>
+ <name>contentStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A height of a bar in pixels. If a height is not defined,
+ a bar height depends of the "headerFontSize" skin parameter.</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A separator between items on a bar. Possible values
+ are "none", "line", "square", "disc" and "grid". Default value is "none".</description>
+ <name>itemSeparator</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when an item is clicked</description>
+ <name>onitemclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when an item is double-clicked</description>
+ <name>onitemdblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over an item</description>
+ <name>onitemkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released over an item</description>
+ <name>onitemkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released over an item</description>
+ <name>onitemkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over an item</description>
+ <name>onitemmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within an item</description>
+ <name>onitemmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from an item</description>
+ <name>onitemmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto an item</description>
+ <name>onitemmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over an item</description>
+ <name>onitemmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the tool bar separators</description>
+ <name>separatorClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A width of a bar that can be defined in pixels or as percentage. Default value is &quot;100%&quot;.</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>A group of items inside a tool bar. The group item
+ is separated basing on the "itemSeparator" attribute. Location of a group
+ on a tool bar is set up with the "location" attribute.</description>
+ <name>toolBarGroup</name>
+ <tag-class>org.richfaces.taglib.ToolBarGroupTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A separator for the items in a group. Possible
+ values are "none", "line", "square", "disc" and "grid" Default value is "none".</description>
+ <name>itemSeparator</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A location of a group on a tool bar. Possible values are "left" and "right". Default value is "left".</description>
+ <name>location</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when an item is clicked</description>
+ <name>onitemclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when an item is double-clicked</description>
+ <name>onitemdblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over an item</description>
+ <name>onitemkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed and released over an item</description>
+ <name>onitemkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released over an item</description>
+ <name>onitemkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over an item</description>
+ <name>onitemmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within an item</description>
+ <name>onitemmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from an item</description>
+ <name>onitemmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto an item</description>
+ <name>onitemmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released over an item</description>
+ <name>onitemmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the tool bar group separators</description>
+ <name>separatorClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>Defines tooltip for parent component.</description>
+ <name>toolTip</name>
+ <tag-class>org.richfaces.taglib.ToolTipTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>boolean attribute which provides possibility to limit JSF tree processing(decoding, conversion/validation, value applying) to the component which sends the request only.
+ Default value is "true"</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If the value of the "attached" attribute is "true", a component is attached to the parent component;
+ if "false", component does not listen to activating browser events, but could be activated externally. Default value is "true"</description>
+ <name>attached</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines direction of the popup list to appear.
+ Possible values are "top-right", "top-left", "bottom-right", "bottom-left", "auto".
+ Default value is "bottom-right"</description>
+ <name>direction</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If false the components is rendered on the client but JavaScript for calling disabled. Default value is "false"</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>DEPRECATED. Use showEvent instead. Default value is "mouseover"</description>
+ <name>event</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true" tooltip should follow the mouse while it moves over the parent element. Default value is "false"</description>
+ <name>followMouse</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of the target component</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay in milliseconds before tooltip will be hidden. Default value is "0"</description>
+ <name>hideDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Event that triggers the tooltip disappearance.
+ Default value is "none" (so, the component does not disappears)</description>
+ <name>hideEvent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the horizontal offset between pop-up list and mouse pointer. Default value is "10"</description>
+ <name>horizontalOffset</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Block/inline mode flag. Possible value are: "inline" or "block". Default value is "inline". Tooltip will contain div/span elements respectively</description>
+ <name>layout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Controls the way of data loading to a tooltip. May have following values: "client" (default) and "ajax"</description>
+ <name>mode</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the tooltip is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the tooltip is shown</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the tooltip is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the tooltip is hidden</description>
+ <name>onhide</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before the tooltip is shown</description>
+ <name>onshow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Delay in milliseconds before tooltip will be displayed. Default value is "0"</description>
+ <name>showDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Event that triggers the tooltip. Default value is "onmouseover"</description>
+ <name>showEvent</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Sets the vertical offset between pop-up list and mouse pointer. Default value is "10"</description>
+ <name>verticalOffset</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The same as CSS z-index for toolTip. Default value is "99"</description>
+ <name>zorder</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:tree&gt; component is designed for hierarchical data presentation and is applied for building a tree structure with a drag-and-drop capability.</description>
+ <name>tree</name>
+ <tag-class>org.richfaces.taglib.TreeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>List of comma separated cursors that indicates when acceptable draggable over dropzone</description>
+ <name>acceptCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A list of drag zones types, which elements are accepted by a drop zone</description>
+ <name>acceptedTypes</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method accepting an org.richfaces.component.UITree with return of java.lang.Boolean type.
+If returned value is:
+java.lang.Boolean. TRUE, a particular treeNode is expanded;
+java.lang.Boolean.FALSE, a particular treeNode is collapsed;
+null, a particular treeNode saves the current state</description>
+ <name>adviseNodeOpened</name>
+ <deferred-method>
+ <method-signature>java.lang.Boolean adviseNodeOpened(org.richfaces.component.UITree)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method accepting an org.richfaces.component.UITree with return of java.lang.Boolean type.
+If returned value is:
+java.lang.Boolean. TRUE, a particular treeNode is selected;
+java.lang.Boolean.FALSE, a particular treeNode is unselected;
+null, a particular treeNode saves the current state</description>
+ <name>adviseNodeSelected</name>
+ <deferred-method>
+ <method-signature>java.lang.Boolean adviseNodeSelected(org.richfaces.component.UITree)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Defines which nodes keys will be added to AjaxNodeKeys automatically on the request from the children of the node. Values: "none" - nothing, "node" - only current node, "subtree" - node and all its children.</description>
+ <name>ajaxChildActivationEncodeBehavior</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute defines row keys that are updated after an AJAX request.</description>
+ <name>ajaxKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Keys of the nodes (without subtree) to be updated for ajax request risen by the node itself</description>
+ <name>ajaxNodeKeys</name>
+ <deferred-value>
+ <type>java.util.Set</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines which nodes keys will be added to AjaxNodeKeys automatically on selecting ajax request from the node. Values: "none" - nothing, "node" - only current node, "subtree" - node and all its children.</description>
+ <name>ajaxNodeSelectionEncodeBehavior</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", an Ajax request to be submit when selecting node. Default value is "false".</description>
+ <name>ajaxSubmitSelection</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener called on expand/collapse event on the node</description>
+ <name>changeExpandListener</name>
+ <deferred-method>
+ <method-signature>void changeExpandListener(org.richfaces.event.NodeExpandedEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>It defines EL-binding for a component state for saving or redefinition</description>
+ <name>componentState</name>
+ <deferred-value>
+ <type>org.ajax4jsf.model.DataComponentState</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Mapping between drop types and acceptable cursors</description>
+ <name>cursorTypeMapping</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Disables keyboard navigation. Default value is "false"</description>
+ <name>disableKeyboardNavigation</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of a component that is used as drag pointer during the drag operation</description>
+ <name>dragIndicator</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after drag operation</description>
+ <name>dragListener</name>
+ <deferred-method>
+ <method-signature>void dragListener(org.richfaces.event.DragEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A drag zone type that is used for zone definition, which elements can be accepted by a drop zone</description>
+ <name>dragType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Data to be sent to the drop zone after a drop event. Default value is "getRowKey()".</description>
+ <name>dragValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after drop operation</description>
+ <name>dropListener</name>
+ <deferred-method>
+ <method-signature>void dropListener(org.richfaces.event.DropEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Data to be processed after a drop event. Default value is "getRowKey()".</description>
+ <name>dropValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates when you can grab and drag an object</description>
+ <name>grabCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates when you has grabbed something</description>
+ <name>grabbingCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component highlighted node</description>
+ <name>highlightedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The icon for node</description>
+ <name>icon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The icon for collapsed node</description>
+ <name>iconCollapsed</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The icon for expanded node</description>
+ <name>iconExpanded</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An icon for component leaves</description>
+ <name>iconLeaf</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be
+ converted and validated immediately (during an
+ Apply Request Values phase), rather than waiting until a
+ Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Node face facet name</description>
+ <name>nodeFace</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after selection of node.</description>
+ <name>nodeSelectListener</name>
+ <deferred-method>
+ <method-signature>void nodeSelectListener(org.richfaces.event.NodeSelectedEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a node is collapsed</description>
+ <name>oncollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the right mouse button is clicked over the component.
+ Returning false prevents a default browser context menu from being displayed.</description>
+ <name>oncontextmenu</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the dragging operation is finished</description>
+ <name>ondragend</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a draggable object enters the zone</description>
+ <name>ondragenter</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after a draggable object leaves the zone</description>
+ <name>ondragexit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the dragging operation is started</description>
+ <name>ondragstart</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when something is dropped into the drop zone</description>
+ <name>ondrop</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a draggable object is dropped into any zone</description>
+ <name>ondropend</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the draggable object is moved away from the drop zone</description>
+ <name>ondropout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the draggable object is over the drop zone</description>
+ <name>ondropover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a node is expanded</description>
+ <name>onexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a node is selected</description>
+ <name>onselected</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", data is preserved in a request. Default value is "true".</description>
+ <name>preserveDataInRequest</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Possible values are "state", "request", "none". Default value is "request"</description>
+ <name>preserveModel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, rendered in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates when rejectable draggable over dropzone</description>
+ <name>rejectCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Allow to select tree item using mouse right click</description>
+ <name>rightClickSelection</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Converter for a row key object</description>
+ <name>rowKeyConverter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a row key in a Request scope</description>
+ <name>rowKeyVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component selected node</description>
+ <name>selectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", connecting lines are show</description>
+ <name>showConnectingLines</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ValueBinding pointing at instance of class implementing org.richfaces.component.state.TreeStateAdvisor interface.</description>
+ <name>stateAdvisor</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a component state on the client side</description>
+ <name>stateVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Tree Nodes switch mode: "client", "server", "ajax"</description>
+ <name>switchType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Response waiting time on a particular request. If a response is not received during this time, the request is aborted</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false" do not toggle node state on click.
+ If "true", than node will be toggles on click on ether node content,
+ or node icon.
+ Default value is "false".</description>
+ <name>toggleOnClick</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute provides access to a TreeNode instance in a Request scope</description>
+ <name>treeNodeVar</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The attribute associates a type of dragable zone (dragType) with &lt;rich:dndParam&gt; defined for &lt;rich:dropSupport&gt; for passing parameter value to &lt;rich:dragIndicator&gt;. It uses JSON format: (drag_type: parameter_name).</description>
+ <name>typeMapping</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute contains a name providing an access to data defined with value</description>
+ <name>var</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:treeNode&gt; component is designed for creating sets of tree elements within a &lt;rich:tree&gt; component.</description>
+ <name>treeNode</name>
+ <tag-class>org.richfaces.taglib.TreeNodeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>List of comma separated cursors that indicates when acceptable draggable over dropzone</description>
+ <name>acceptCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A list of drag zones types, which elements are accepted by a drop zone</description>
+ <name>acceptedTypes</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Limits JSF tree processing (decoding, conversion, validation and model updating) only to a component that sends the request. Boolean. Default value is "false".</description>
+ <name>ajaxSingle</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An algorithm of AJAX request submission. Possible values are "inherit", "true", "false". Default value is "inherit".</description>
+ <name>ajaxSubmitSelection</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", after process validations phase it skips updates of model beans on a force render response. It can be used for validating components input</description>
+ <name>bypassUpdates</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener called on expand/collapse event on the node</description>
+ <name>changeExpandListener</name>
+ <deferred-method>
+ <method-signature>void changeExpandListener(org.richfaces.event.NodeExpandedEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Mapping between drop types and acceptable cursors</description>
+ <name>cursorTypeMapping</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Serialized (on default with JSON) data passed on the client by a developer on AJAX request. It's accessible via "data.foo" syntax</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of a component that is used as drag pointer during the drag operation</description>
+ <name>dragIndicator</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after drag operation</description>
+ <name>dragListener</name>
+ <deferred-method>
+ <method-signature>void dragListener(org.richfaces.event.DragEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>A drag zone type that is used for zone definition, which elements can be accepted by a drop zone</description>
+ <name>dragType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Data to be sent to the drop zone after a drop event. Default value is "getUITree().getDragValue()".</description>
+ <name>dragValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after drop operation</description>
+ <name>dropListener</name>
+ <deferred-method>
+ <method-signature>void dropListener(org.richfaces.event.DropEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>Data to be processed after a drop event. Default value is "getUITree().getDropValue()".</description>
+ <name>dropValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Name of requests queue to avoid send next request before complete other from same event. Can be used to reduce number of requests of frequently events (key press, mouse move etc.)</description>
+ <name>eventsQueue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID of an element to set focus after request is completed on client side</description>
+ <name>focus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates when you can grab and drag an object</description>
+ <name>grabCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates when you has grabbed something</description>
+ <name>grabbingCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component highlighted node</description>
+ <name>highlightedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The icon for node</description>
+ <name>icon</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The icon for collapsed node</description>
+ <name>iconCollapsed</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The icon for expanded node</description>
+ <name>iconExpanded</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An icon for component leaves</description>
+ <name>iconLeaf</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Attribute allows to ignore an Ajax Response produced by a request if the newest 'similar' request is
+in a queue already. ignoreDupResponses="true" does not cancel the request while it is processed on the server,
+but just allows to avoid unnecessary updates on the client side if the response isn't actual now</description>
+ <name>ignoreDupResponses</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", then of all AJAX-rendered on the page components only those will be updated,
+ which ID's are passed to the "reRender" attribute of the describable component.
+ "false"-the default value-means that all components with ajaxRendered="true" will be updated.</description>
+ <name>limitToList</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component node</description>
+ <name>nodeClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding representing an action listener method that will be notified after selection of node.</description>
+ <name>nodeSelectListener</name>
+ <deferred-method>
+ <method-signature>void nodeSelectListener(org.richfaces.event.NodeSelectedEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called before DOM is updated</description>
+ <name>onbeforedomupdate</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a node is collapsed</description>
+ <name>oncollapse</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after the request is completed</description>
+ <name>oncomplete</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the right mouse button is clicked over the component.
+ Returning false prevents a default browser context menu from being displayed.</description>
+ <name>oncontextmenu</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the dragging operation is finished. The default attribute value is "getDefaultOndragend()".</description>
+ <name>ondragend</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a draggable object enters the zone. The default attribute value is "getDefaultOndragenter()".</description>
+ <name>ondragenter</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called after a draggable object leaves the zone. The default attribute value is "getDefaultOndragexit()".</description>
+ <name>ondragexit</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the dragging operation is started. The default attribute value is "getDefaultOndragstart()".</description>
+ <name>ondragstart</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when something is dropped into the drop zone. The default attribute value is "getDefaultOndrop()".</description>
+ <name>ondrop</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a draggable object is dropped into any zone. The default attribute value is "getDefaultOndropend()".</description>
+ <name>ondropend</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the draggable object is moved away from the drop zone</description>
+ <name>ondropout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the draggable object is over the drop zone</description>
+ <name>ondropover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a node is expanded</description>
+ <name>onexpand</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a node is selected</description>
+ <name>onselected</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components, processed at the phases 2-5 in case of AjaxRequest caused by this component. Can be single id, comma-separated list of Id's, or EL Expression with array or Collection</description>
+ <name>process</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id['s] (in format of call UIComponent.findComponent()) of components,
+ rendered in case of AjaxRequest caused by this component.
+ Can be single id, comma-separated list of Id's, or EL Expression with array or Collection. Default value is "getDefaultReRender()".</description>
+ <name>reRender</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>List of comma separated cursors that indicates when rejectable draggable over dropzone</description>
+ <name>rejectCursors</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Attribute defines the time (in ms.) that the request will be wait in the queue before it is ready to send.
+When the delay time is over, the request will be sent to the server or removed if the newest 'similar' request is in a queue already</description>
+ <name>requestDelay</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more space-separated CSS class names to the component selected node</description>
+ <name>selectedClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If there are any component requests with identical IDs then these requests will be grouped.</description>
+ <name>similarityGroupingId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ID (in format of call UIComponent.findComponent()) of Request status component</description>
+ <name>status</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Gets timeout in ms. Default value is "getDefaultTimeout()".</description>
+ <name>timeout</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A node type</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute associates a type of dragable zone (dragType) with &lt;rich:dndParam&gt; defined for &lt;rich:dropSupport&gt; for passing parameter value to &lt;rich:dragIndicator&gt;. It uses JSON format: (drag_type: parameter_name).</description>
+ <name>typeMapping</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:treeNodesAdaptor&gt; provides the possibility to define data models and create representations for them.</description>
+ <name>treeNodesAdaptor</name>
+ <tag-class>org.richfaces.taglib.TreeNodesAdaptorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>This boolean expression is used to define which elements are processed. Default value is "true".</description>
+ <name>includedNode</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Defines collection to use at the other (non-top) levels of iteration</description>
+ <name>nodes</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A request-scope attribute via which the data object for the current collection element will be used when iterating</description>
+ <name>var</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<tag>
+ <description>The &lt;rich:virtualEarth&gt; component presents the Microsoft Virtual Earth map in the JSF applications.</description>
+ <name>virtualEarth</name>
+ <tag-class>org.richfaces.taglib.VirtualEarthTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Initial map type. The possible values are "Normal", "Small", "Tiny". Default value is "Normal".</description>
+ <name>dashboardSize</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Initial latitude coordinate in degrees, as a number between -90 and +90. Default value is "37.9721046".</description>
+ <name>lat</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Initial longitude coordinate in degrees, as a number between -180 and +180. Default value is "-122.04248428346".</description>
+ <name>lng</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Navigation control size. Possible values are "Road", "Aerial", "Hybrid", "Birdseye". Default value is "Road"</description>
+ <name>mapStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the Virtual Earth object is initiated</description>
+ <name>onLoadMap</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when the element is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed down over the element</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is pressed over the element and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is pressed down over the element</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved within the element</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved away from the element</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a pointer is moved onto the element</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The client-side script method to be called when a mouse button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style rules to be applied to the component</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Assigns one or more CSS class names to the component. Corresponds to the HTML "class" attribute.</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The JavaScript variable that is used to access the Virtual Earth API. If you have
+ more than one Virtual Earth components on the same page, use individual
+ key for each of them. Default value name is "map".</description>
+ <name>var</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Virtual earth version, Default value is "6.1".</description>
+ <name>version</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Initial zoom level as a number between 1 and 18. Default value is "17".</description>
+ <name>zoom</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+<function>
+ <name>clientId</name>
+ <function-class>org.richfaces.function.RichFunction</function-class>
+ <function-signature>java.lang.String clientId(java.lang.String)</function-signature>
+ </function>
+<function>
+ <name>component</name>
+ <function-class>org.richfaces.function.RichFunction</function-class>
+ <function-signature>java.lang.String component(java.lang.String)</function-signature>
+ </function>
+<function>
+ <name>element</name>
+ <function-class>org.richfaces.function.RichFunction</function-class>
+ <function-signature>java.lang.String element(java.lang.String)</function-signature>
+ </function>
+<function>
+ <name>findComponent</name>
+ <function-class>org.richfaces.function.RichFunction</function-class>
+ <function-signature>javax.faces.component.UIComponent findComponent(java.lang.String)</function-signature>
+ </function>
+<function>
+ <name>isUserInRole</name>
+ <function-class>org.richfaces.function.RichFunction</function-class>
+ <function-signature>boolean isUserInRole(java.lang.Object)</function-signature>
+ </function>
+
+</taglib>
\ No newline at end of file
diff --git a/etc/tlds/s.tld b/etc/tlds/s.tld
new file mode 100644
index 0000000..7cc09c6
--- /dev/null
+++ b/etc/tlds/s.tld
@@ -0,0 +1,2644 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+
+<taglib xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
+ version="2.1">
+ <tlib-version>2.0</tlib-version>
+ <short-name>s</short-name>
+ <uri>http://jboss.com/products/seam/taglib</uri>
+
+
+
+ <tag>
+ <description>A link that supports invocation of an action with control over conversation propagation. &lt;i&gt;Does not submit the form.&lt;/i&gt;</description>
+ <name>button</name>
+ <tag-class>org.jboss.seam.ui.taglib.ButtonTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>For a user agents that cannot display images, forms, or applets, this attribute specifies alternate text. The language of the alternate text is specified by the lang attribute</description>
+ <name>alt</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The name of the conversation for natural conversations</description>
+ <name>conversationName</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When set for a form control, this boolean attribute disables the control for your input</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the fragment identifier to link to.</description>
+ <name>fragment</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>image</description>
+ <name>image</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer button is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer button is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is pressed down</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is pressed and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; a pointer button is pressed down</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved within</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved away</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved onto</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; a pointer button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>${prop.xmlEncodedDescription}</description>
+ <name>outcome</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>a pageflow definition to begin. (This is only useful when propagation="begin" or propagation="join".)</description>
+ <name>pageflow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>determines the conversation propagation style: begin, join, nest, none or end.</description>
+ <name>propagation</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute tells the user agent the initial width of the control. The width is given in pixels except when type attribute has the value "text" or "password". In that case, its value refers to the (integer) number of characters</description>
+ <name>size</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specify the task to operate on (e.g. for @StartTask)</description>
+ <name>taskInstance</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>submit|reset|image|button This attribute specifies a type of control to create. The default value for this attribute is "submit"</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the JSF view id to link to.</description>
+ <name>view</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Cache the rendered page fragment using the installed cache provider.</description>
+ <name>cache</name>
+ <tag-class>org.jboss.seam.ui.taglib.CacheTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The cache provider to use, only needed if you install alter the default cache provider in an application where multiple cache providers are in use</description>
+ <name>cacheProvider</name>
+ <deferred-value>
+ <type>org.jboss.seam.cache.CacheProvider</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>a value expression that determines if the cache should be used.</description>
+ <name>enabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>the key to cache rendered content, often a value expression. For example, if we were caching a page fragment that displays a document, we might use key="Document-#{document.id}".</description>
+ <name>key</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>a cache node to use (different nodes can have different expiry policies).</description>
+ <name>region</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Add the conversation id to JSF link or button (e.g. &lt;h:commandLink /&gt;, &lt;s:button /&gt;).</description>
+ <name>conversationId</name>
+ <tag-class>org.jboss.seam.ui.taglib.ConversationIdTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A name of this parameter</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An initial value or a value binding</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Set the conversation name for a command link or button (or similar JSF control).</description>
+ <name>conversationName</name>
+ <tag-class>org.jboss.seam.ui.taglib.ConversationNameTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A name of this parameter</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An initial value or a value binding</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Customize the conversation propagation for a command link or button (or similar JSF control).</description>
+ <name>conversationPropagation</name>
+ <tag-class>org.jboss.seam.ui.taglib.ConversationPropagationTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A name of this parameter</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>a pageflow definition to begin. (This is only useful when propagation="begin" or propagation="join".)</description>
+ <name>pageflow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>determines the conversation propagation style: begin, join, nest, none or end.</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An initial value or a value binding</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>"Decorate" a JSF input field when validation fails or when required="true" is set.</description>
+ <name>decorate</name>
+ <tag-class>org.jboss.seam.ui.taglib.DecorateTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of the input field to decorate</description>
+ <name>for</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>XHTML template to use to decorate the input field</description>
+ <name>template</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Simulate pressing the action source when "enter" is pressed.</description>
+ <name>defaultAction</name>
+ <tag-class>org.jboss.seam.ui.taglib.DefaultActionTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>binding</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.el.ValueExpression</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id</description>
+ <name>id</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>value</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Render a HTML &lt;div&gt;.</description>
+ <name>div</name>
+ <tag-class>org.jboss.seam.ui.taglib.DivTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>binding</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.el.ValueExpression</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id</description>
+ <name>id</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Creates a SelectItem from an enum value.</description>
+ <name>enumItem</name>
+ <tag-class>org.jboss.seam.ui.taglib.EnumItemTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the string representation of the enum value.</description>
+ <name>enumValue</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A description used by tools only</description>
+ <name>itemDescription</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component isn't saved during state saving</description>
+ <name>itemDisabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>itemEscaped</description>
+ <name>itemEscaped</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A text shown by the item</description>
+ <name>itemLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Item value, which is passed to the server as a request parameter</description>
+ <name>itemValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the label to be used when rendering the SelectItem.</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A value reference pointing at a javax.faces.model.SelectItem
+ instance</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Validate all child JSF input fields against the bound propertys using Hibernate Validator.</description>
+ <name>validateEquality</name>
+ <tag-class>org.jboss.seam.ui.taglib.EqualityValidatorTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>binding</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.el.ValueExpression</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of component to validate against</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id</description>
+ <name>id</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Error message to show</description>
+ <name>message</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Message id to use on failure</description>
+ <name>messageId</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Renders a file upload control. This control must be used within a form with an encoding type of multipart/form-data, i.e:
+
+&lt;h:form enctype="multipart/form-data"&gt;
+
+For multipart requests, the Seam Multipart servlet filter must also be configured in web.xml:
+
+&lt;filter&gt;
+ &lt;filter-name&gt;Seam Filter&lt;/filter-name&gt;
+ &lt;filter-class&gt;org.jboss.seam.servlet.SeamFilter&lt;/filter-class&gt;
+&lt;/filter&gt;
+
+&lt;filter-mapping&gt;
+ &lt;filter-name&gt;Seam Filter&lt;/filter-name&gt;
+ &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
+&lt;/filter-mapping&gt;
+
+The following configuration options for multipart requests may be configured in components.xml:
+
+* createTempFiles - if this option is set to true, uploaded files are streamed to a temporary file instead of in memory.
+* maxRequestSize - the maximum size of a file upload request, in bytes.
+
+Here's an example:
+
+&lt;component class="org.jboss.seam.servlet.MultipartConfig"&gt;
+ &lt;property name="createTempFiles"&gt;true&lt;/property&gt;
+ &lt;property name="maxRequestSize"&gt;1000000&lt;/property&gt;
+&lt;/component&gt;</description>
+ <name>fileUpload</name>
+ <tag-class>org.jboss.seam.ui.taglib.FileUploadTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>a comma-separated list of content types to accept, may not be supported by the browser. E.g. "images/png,images/jpg", "images/*".</description>
+ <name>accept</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>left|center|right|justify [CI]
+ Deprecated. This attribute specifies the horizontal alignment of its element with respect to the surrounding context. Possible values:
+
+ * left: text lines are rendered flush left.
+ * center: text lines are centered.
+ * right: text lines are rendered flush right.
+ * justify: text lines are justified to both margins.
+
+ The default depends on the base text direction. For left to right text, the default is align=left, while for right to left text, the default is align=right</description>
+ <name>align</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>For a user agents that cannot display images, forms, or applets, this attribute specifies alternate text. The language of the alternate text is specified by the lang attribute</description>
+ <name>alt</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the property to receive the contentType</description>
+ <name>contentType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>converterMessage</description>
+ <name>converterMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>this value binding receives the file's content type (optional).</description>
+ <name>data</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When set for a form control, this boolean attribute disables the control for your input</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>this value binding receives the filename (optional).</description>
+ <name>fileName</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>this value binding receives the file size (optional).</description>
+ <name>fileSize</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A flag indicating that this component value must be converted
+ and validated immediately (that is, during Apply Request Values
+ phase), rather than waiting until a Process Validations phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>localContentType</description>
+ <name>localContentType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>localFileName</description>
+ <name>localFileName</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>localFileSize</description>
+ <name>localFileSize</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>localInputStream</description>
+ <name>localInputStream</name>
+ <deferred-value>
+ <type>java.io.InputStream</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>localValueSet</description>
+ <name>localValueSet</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>When the type attribute has the value "text" or "password", this attribute specifies the maximum number of characters you may enter. This number may exceed the specified size, in which case the user agent should offer a scrolling mechanism. The default value for this attribute is an unlimited number</description>
+ <name>maxlength</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; the element lost the focus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; the element value was changed</description>
+ <name>onchange</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer button is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer button is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; the element got the focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is pressed down</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is pressed and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; a pointer button is pressed down</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved within</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved away</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved onto</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; a pointer button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; The onselect event occurs when you select some text in a text field. This attribute may be used with the INPUT and TEXTAREA elements</description>
+ <name>onselect</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "true", this component is checked for non-empty input</description>
+ <name>required</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>requiredMessage</description>
+ <name>requiredMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute tells the user agent the initial width of the control. The width is given in pixels except when type attribute has the value "text" or "password". In that case, its value refers to the (integer) number of characters</description>
+ <name>size</name>
+ <deferred-value>
+ <type>int</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>valid</description>
+ <name>valid</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at a method that is called during
+ Process Validations phase of the request processing lifecycle,
+ to validate the current value of this component</description>
+ <name>validator</name>
+ <deferred-method>
+ <method-signature>void validator(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>validatorMessage</description>
+ <name>validatorMessage</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Listener for value changes</description>
+ <name>valueChangeListener</name>
+ <deferred-method>
+ <method-signature>void valueChangeListener(javax.faces.event.ValueChangeEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Output Seam Text. Parse errors generate WARN level log messages.</description>
+ <name>formattedText</name>
+ <tag-class>org.jboss.seam.ui.taglib.FormattedTextTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Surround a page fragment, allows you to apply render/not render without any html output</description>
+ <name>fragment</name>
+ <tag-class>org.jboss.seam.ui.taglib.FragmentTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Output an image to the view. You can specify the file as a path, a java.io.File, java.io.InputStream, java.net.URL or byte[]</description>
+ <name>graphicImage</name>
+ <tag-class>org.jboss.seam.ui.taglib.GraphicImageTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>alt</description>
+ <name>alt</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>dir</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>File name for the generated URL - allows a stable file name and thus browser caching</description>
+ <name>fileName</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>height</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>ismap</description>
+ <name>ismap</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>lang</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>longdesc</description>
+ <name>longdesc</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onclick</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ondblclick</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onkeydown</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onkeypress</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onkeyup</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmousedown</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmousemove</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmouseout</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmouseover</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmouseup</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>title</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>url</description>
+ <name>url</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>usemap</description>
+ <name>usemap</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>width</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>A label associated with the nearest JSF input component</description>
+ <name>label</name>
+ <tag-class>org.jboss.seam.ui.taglib.LabelTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note. Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>dir</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>escape</description>
+ <name>escape</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of input component this label is for</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>lang</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>JavaScript code. The onblur event occurs when an element loses focus either by the pointing device or by tabbing navigation. It may be used with the same elements as onfocus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onclick</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>ondblclick</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>JavaScript code</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onkeydown</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onkeypress</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onkeyup</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmousedown</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmousemove</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmouseout</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmouseover</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>onmouseup</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>tabindex</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>title</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value of this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>A link that supports invocation of an action with control over conversation propagation. Does not submit the form.</description>
+ <name>link</name>
+ <tag-class>org.jboss.seam.ui.taglib.LinkTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>This attribute assigns an access key to an element. An access key is a single character from the document character set. Note: Authors should consider the input method of the expected reader when specifying an accesskey</description>
+ <name>accesskey</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at the application action to be invoked,
+ if this UIComponent is activated by you, during the Apply
+ Request Values or Invoke Application phase of the request
+ processing lifecycle, depending on the value of the immediate
+ property</description>
+ <name>action</name>
+ <deferred-method>
+ <method-signature>java.lang.Object action()</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>MethodBinding pointing at method accepting an ActionEvent with return type void</description>
+ <name>actionListener</name>
+ <deferred-method>
+ <method-signature>void actionListener(javax.faces.event.ActionEvent)</method-signature>
+ </deferred-method>
+ </attribute>
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The character encoding of a resource designated by this hyperlink</description>
+ <name>charset</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The name of the conversation for natural conversations</description>
+ <name>conversationName</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Id of Converter to be used or reference to a Converter</description>
+ <name>converter</name>
+ <deferred-value>
+ <type>javax.faces.convert.Converter</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position and shape on the screen. The number and order of values depends on the shape being defined. Possible combinations:
+
+ * rect: left-x, top-y, right-x, bottom-y.
+ * circle: center-x, center-y, radius. Note. When the radius value is percentage value, user agents should calculate the final radius value based on the associated object's width and height. The radius should be the smaller value of the two.
+ * poly: x1, y1, x2, y2, ..., xN, yN. The first x and y coordinate pair and the last should be the same to close the polygon. When these coordinate values are not the same, user agents should infer an additional coordinate pair to close the polygon.
+
+ Coordinates are relative to the top, left corner of the object. All values are lengths. All values are separated by commas</description>
+ <name>coords</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Direction indication for text that does not inherit
+ directionality. Valid values are "LTR" (left-to-right)
+ and "RTL" (right-to-left)</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If true, write the link as disabled in HTML</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the fragment identifier to link to.</description>
+ <name>fragment</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Base language of a resource specified with the href attribute; hreflang may only be used with href</description>
+ <name>hreflang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>True means, that the default ActionListener should be executed
+ immediately (i.e. during Apply Request Values phase of the
+ request processing lifecycle), rather than waiting until the
+ Invoke Application phase</description>
+ <name>immediate</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Code describing the language used in the generated markup for this component</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>JavaScript code. The onblur event occurs when an element loses focus either by the pointing device or by tabbing navigation. It may be used with the same elements as onfocus</description>
+ <name>onblur</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer button is clicked</description>
+ <name>onclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer button is double-clicked</description>
+ <name>ondblclick</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>JavaScript code. The onfocus event occurs when an element gets focus</description>
+ <name>onfocus</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is pressed down</description>
+ <name>onkeydown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is pressed and released</description>
+ <name>onkeypress</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a key is released</description>
+ <name>onkeyup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; a pointer button is pressed down</description>
+ <name>onmousedown</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved within</description>
+ <name>onmousemove</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved away</description>
+ <name>onmouseout</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: a script expression; a pointer is moved onto</description>
+ <name>onmouseover</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>HTML: script expression; a pointer button is released</description>
+ <name>onmouseup</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The outcome to use when evaluating navigation rules</description>
+ <name>outcome</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>a pageflow definition to begin. (This is only useful when propagation="begin" or propagation="join".)</description>
+ <name>pageflow</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>determines the conversation propagation style: begin, join, nest, none or end.</description>
+ <name>propagation</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The relationship from the current document to the anchor specified by this hyperlink. The value of this attribute is a space-separated list of link types</description>
+ <name>rel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A reverse link from the anchor specified by this hyperlink to the current document. The value of this attribute is a space-separated list of link types</description>
+ <name>rev</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>default|rect|circle|poly [CI]
+ This attribute specifies the shape of a region. Possible values:
+
+ * default: Specifies the entire region.
+ * rect: Define a rectangular region.
+ * circle: Define a circular region.
+ * poly: Define a polygonal region.</description>
+ <name>shape</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the position of the current element in the tabbing order for the current document. This value must be a number between 0 and 32767. User agents should ignore leading zeros</description>
+ <name>tabindex</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>This attribute specifies the name of a frame where a document is to be opened.
+
+ By assigning a name to a frame via the name attribute, authors can refer to it as the "target" of links defined by other elements</description>
+ <name>target</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specify the task to operate on (e.g. for @StartTask)</description>
+ <name>taskInstance</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Advisory title information about markup elements generated for this component</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The content type of the resource designated by this hyperlink</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The current value for this component</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the JSF view id to link to.</description>
+ <name>view</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>"Decorate" a JSF input field with the validation error message.</description>
+ <name>message</name>
+ <tag-class>org.jboss.seam.ui.taglib.MessageTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>dir</description>
+ <name>dir</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>errorClass</description>
+ <name>errorClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>errorStyle</description>
+ <name>errorStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>fatalClass</description>
+ <name>fatalClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>fatalStyle</description>
+ <name>fatalStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>A client identifier of the component for which this component
+ represents associated message(s)</description>
+ <name>for</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>infoClass</description>
+ <name>infoClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>infoStyle</description>
+ <name>infoStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>lang</description>
+ <name>lang</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Indicates whether the detail of associated message(s) should
+ be displayed. Default is: false</description>
+ <name>showDetail</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Indicates whether the summary of associated message(s)
+ should be displayed. Default is: true</description>
+ <name>showSummary</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>style</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>styleClass</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>title</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>tooltip</description>
+ <name>tooltip</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>warnClass</description>
+ <name>warnClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>warnStyle</description>
+ <name>warnStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Write out script element for use with Seam Remoting</description>
+ <name>remote</name>
+ <tag-class>org.jboss.seam.ui.taglib.RemoteTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>The Seam components to include in the Seam Remoting JS interface stubs</description>
+ <name>include</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description></description>
+ <name>selection</name>
+ <tag-class>org.jboss.seam.ui.taglib.SelectionTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>dataModel</description>
+ <name>dataModel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>name</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>value</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>var</description>
+ <name>var</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Creates a List&lt;SelectItem&gt; from a List, Set, DataModel or Array.</description>
+ <name>selectItems</name>
+ <tag-class>org.jboss.seam.ui.taglib.SelectItemsTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if true the SelectItem will be rendered disabled. Can reference the var variable</description>
+ <name>disabled</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <name>itemDisabled</name>
+ <rtexprvalue>false</rtexprvalue>
+ <description>Alias for disabled : if true the SelectItem will be rendered disabled. Can reference the var variable</description>
+ </attribute>
+ <attribute>
+ <description>if false, characters in the label will not be escaped. Beware that this is a safety issue when the label is in any way derived from input supplied by the application's user. . Can reference the var variable</description>
+ <name>escape</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>if true, the noSelectionLabel will be hidden when a value is selected</description>
+ <name>hideNoSelectionLabel</name>
+ <deferred-value>
+ <type>java.lang.Boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>Value to return to the server if this option is selected. Optional, by default the var object is used. Can reference the var variable</description>
+ <name>itemValue</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>the label to be used when rendering the SelectItem. Can reference the var variable</description>
+ <name>label</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <name>itemLabel</name>
+ <rtexprvalue>false</rtexprvalue>
+ <description>Alias for label : the label to be used when rendering the SelectItem. Can reference the var variable</description>
+ </attribute>
+ <attribute>
+ <description>specifies the (optional) label to place at the top of list (if required="true" is also specified then selecting this value will cause a validation error)</description>
+ <name>noSelectionLabel</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>value</description>
+ <name>value</name>
+ <required>true</required>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>defines the name of the local variable that holds the current object during iteration</description>
+ <name>var</name>
+ <required>true</required>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Render a HTML &lt;span&gt;</description>
+ <name>span</name>
+ <tag-class>org.jboss.seam.ui.taglib.SpanTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>If "false", this component is not rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>CSS style(s) is/are to be applied when this component is rendered</description>
+ <name>style</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Corresponds to the HTML class attribute</description>
+ <name>styleClass</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Span title attribute</description>
+ <name>title</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Add the task id to an output link (or similar JSF control), when the task is available via #{task}.</description>
+ <name>taskId</name>
+ <tag-class>org.jboss.seam.ui.taglib.TaskIdTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>The attribute takes a value-binding expression for a component property of
+a backing bean</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.faces.component.UIComponent</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Every component may have a unique id that is automatically created if omitted</description>
+ <name>id</name>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <description>A name of this parameter</description>
+ <name>name</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>An initial value or a value binding</description>
+ <name>value</name>
+ <deferred-value>
+ <type>java.lang.Object</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Nested in a s:graphicImage. Transform an image by applying a blur</description>
+ <name>transformImageBlur</name>
+ <tag-class>org.jboss.seam.ui.taglib.TransformImageBlurTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>binding</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.el.ValueExpression</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id</description>
+ <name>id</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The radius of the blur (essentially the ammount of blur)</description>
+ <name>radius</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Nested in a s:graphicImage. Transform an image by altering the size</description>
+ <name>transformImageSize</name>
+ <tag-class>org.jboss.seam.ui.taglib.TransformImageSizeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>binding</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.el.ValueExpression</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Change the size of the image by a fraction. If factor is specified, height, width and maintainRatio should not be specified</description>
+ <name>factor</name>
+ <deferred-value>
+ <type>java.lang.Double</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The new height of the image</description>
+ <name>height</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id</description>
+ <name>id</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>If true, don't alter the ratio of the image. In this case only height or width should be specificed.</description>
+ <name>maintainRatio</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The new width of the image</description>
+ <name>width</name>
+ <deferred-value>
+ <type>java.lang.Integer</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Nested in a s:graphicImage. Transform an image by changing it's type</description>
+ <name>transformImageType</name>
+ <tag-class>org.jboss.seam.ui.taglib.TransformImageTypeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>binding</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.el.ValueExpression</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>The mime type of the output image</description>
+ <name>contentType</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id</description>
+ <name>id</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Validate all child JSF input fields against the bound propertys using Hibernate Validator.</description>
+ <name>validateAll</name>
+ <tag-class>org.jboss.seam.ui.taglib.ValidateAllTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>binding</description>
+ <name>binding</name>
+ <deferred-value>
+ <type>javax.el.ValueExpression</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>id</description>
+ <name>id</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>rendered</description>
+ <name>rendered</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>validatorsAdded</description>
+ <name>validatorsAdded</name>
+ <deferred-value>
+ <type>boolean</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Validate Seam Text input</description>
+ <name>validateFormattedText</name>
+ <tag-class>org.jboss.seam.ui.taglib.FormattedTextValidatorTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ </tag>
+
+ <tag>
+ <description>Validate the JSF component against the model</description>
+ <name>validate</name>
+ <tag-class>org.jboss.seam.ui.taglib.ModelValidatorTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ </tag>
+
+ <tag>
+ <description>Converter for java.util.concurrent.atomic.AtomicBoolean</description>
+ <name>convertAtomicBoolean</name>
+ <tag-class>org.jboss.seam.ui.taglib.AtomicBooleanTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ </tag>
+
+ <tag>
+ <description>Converter for java.util.concurrent.atomic.AtomicInteger</description>
+ <name>convertAtomicInteger</name>
+ <tag-class>org.jboss.seam.ui.taglib.AtomicIntegerTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ </tag>
+
+ <tag>
+ <description>Converter for java.util.concurrent.atomic.AtomicLong</description>
+ <name>convertAtomicLong</name>
+ <tag-class>org.jboss.seam.ui.taglib.AtomicLongTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ </tag>
+
+ <tag>
+ <description>Perform date or time conversions in the Seam timezone.</description>
+ <name>convertDateTime</name>
+ <tag-class>org.jboss.seam.ui.taglib.ConvertDateTimeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <attribute>
+ <description>Predefined formatting style which determines how the date component of a date string is to be formatted and parsed. Applied only if type is "date" or "both". Valid values are "default", "short", "medium", "long", and "full". Default value is "default".</description>
+ <name>dateStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Locale whose predefined styles for dates and times are used during formatting or parsing. If not specified, the Locale returned by FacesContext.getViewRoot().getLocale() will be used. Value must be either a VB expression that evaluates to a java.util.Locale instance, or a String that is valid to pass as the first argument to the constructor java.util.Locale(String language, String country). The empty string is passed as the second argument.</description>
+ <name>locale</name>
+ <deferred-value>
+ <type>java.util.Locale</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Custom formatting pattern which determines how the date/time string should be formatted and parsed.</description>
+ <name>pattern</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Predefined formatting style which determines how the time component of a date string is to be formatted and parsed. Applied only if type is "time" or "both". Valid values are "default", "short", "medium", "long", and "full". Default value is "default".</description>
+ <name>timeStyle</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Time zone in which to interpret any time information in the date String. Value must be either a VB expression that evaluates to a java.util.TimeZone instance, or a String that is a timezone ID as described in the javadocs for java.util.TimeZone.getTimeZone().</description>
+ <name>timeZone</name>
+ <deferred-value>
+ <type>java.util.TimeZone</type>
+ </deferred-value>
+ </attribute>
+ <attribute>
+ <description>Specifies what contents the string value will be formatted to include, or parsed expecting. Valid values are "date", "time", and "both". Default value is "date".</description>
+ <name>type</name>
+ <deferred-value>
+ <type>java.lang.String</type>
+ </deferred-value>
+ </attribute>
+
+ </tag>
+
+ <tag>
+ <description>Convert an entity.</description>
+ <name>convertEntity</name>
+ <tag-class>org.jboss.seam.ui.taglib.ConvertEntityTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ </tag>
+
+ <tag>
+ <description>Convert an enum.</description>
+ <name>convertEnum</name>
+ <tag-class>org.jboss.seam.ui.taglib.ConvertEnumTag</tag-class>
+ <body-content>JSP</body-content>
+
+
+ </tag>
+
+
+
+</taglib>
commit 2e369b22d7f76582ffc2b48b4db9c3989c6600a9
Merge: 6149cc2... 3acedb8...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 19 23:11:31 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 6149cc2829b64cb4d1691ee72d3c83312ebad589
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 19 23:09:37 2010 -0500
add new rowSelector JSF component to core-gui, deploy the component in the base perspective war, and demo its usage in the browseResources.xhtml page in the sample perspective war; add copyright headers
diff --git a/etc/modules/base-perspective-war/pom.xml b/etc/modules/base-perspective-war/pom.xml
new file mode 100644
index 0000000..6eea28d
--- /dev/null
+++ b/etc/modules/base-perspective-war/pom.xml
@@ -0,0 +1,221 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-parent</artifactId>
+ <version>1.4.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-server-base-perspective-war</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>war</packaging>
+
+ <name>RHQ Base Perspective War</name>
+ <description>an abstract WAR that can be used by the maven war plugin as an overlay (i.e. base) for a perspective WAR</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/etc/modules/base-perspecti...</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/etc/modules/base-perspecti...</developerConnection>
+ </scm>
+
+ <properties>
+ <jsf.version>1.2_14</jsf.version>
+ <facelets.version>1.1.15</facelets.version>
+ <!-- NOTE: Seam 2.1.2 and 2.2.0 can't be used in webapps deployed to the RHQ Server
+ due to https://jira.jboss.org/jira/browse/JBSEAM-4029. Seam 2.2.1 can be
+ used once it's released. -->
+ <seam.version>2.1.0.SP1</seam.version>
+ <jboss-el.version>1.0_02.CR5</jboss-el.version>
+ <richfaces.version>3.3.2.SR1</richfaces.version>
+ </properties>
+
+ <dependencyManagement>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-remoting-client-api</artifactId>
+ <version>${project.parent.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.sun.facelets</groupId>
+ <artifactId>jsf-facelets</artifactId>
+ <version>${facelets.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <version>${seam.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.el</groupId>
+ <artifactId>el-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-ui</artifactId>
+ <version>${seam.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.el</groupId>
+ <artifactId>jboss-el</artifactId>
+ <version>${jboss-el.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.el</groupId>
+ <artifactId>el-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.richfaces.framework</groupId>
+ <artifactId>richfaces-api</artifactId>
+ <version>${richfaces.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.richfaces.framework</groupId>
+ <artifactId>richfaces-impl</artifactId>
+ <version>${richfaces.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.richfaces.ui</groupId>
+ <artifactId>richfaces-ui</artifactId>
+ <version>${richfaces.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ <version>${jsf.version}</version>
+ </dependency>
+
+ </dependencies>
+
+ </dependencyManagement>
+
+ <dependencies>
+
+ <!-- This will pull in all the jars we need for making remote calls to the RHQ Server. -->
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-remoting-client-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.sun.facelets</groupId>
+ <artifactId>jsf-facelets</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-ui</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam-debug</artifactId>
+ <version>${seam.version}</version>
+ <!-- we should be pulling this in directly ourselves, not relying
+ jboss-seam-debug to provide it -->
+ <exclusions>
+ <exclusion>
+ <groupId>com.sun.facelets</groupId>
+ <artifactId>jsf-facelets</artifactId>
+ </exclusion>
+ </exclusions>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.el</groupId>
+ <artifactId>jboss-el</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.richfaces.framework</groupId>
+ <artifactId>richfaces-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.richfaces.framework</groupId>
+ <artifactId>richfaces-impl</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.richfaces.ui</groupId>
+ <artifactId>richfaces-ui</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>rhq-base-perspective</finalName>
+
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifest>
+ <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+ <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+ </manifest>
+ <manifestEntries>
+ <Build-Number>${buildNumber}</Build-Number>
+ </manifestEntries>
+ </archive>
+ <webResources>
+ <resource>
+ <filtering>true</filtering>
+ <directory>${basedir}/src/main/webapp</directory>
+ <includes>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ </webResources>
+ </configuration>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+ <repositories>
+ <repository>
+ <id>java.net-m1-releases</id>
+ <name>Java.net Maven1 Repository - for javax.faces, javax.el, com.sun.el, and com.sun.facelets releases</name>
+ <url>http://download.java.net/maven/1/</url>
+ <layout>legacy</layout>
+ </repository>
+ </repositories>
+
+</project>
diff --git a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPagedDataPerspectiveUIBean.java b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPagedDataPerspectiveUIBean.java
new file mode 100644
index 0000000..5741a0f
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPagedDataPerspectiveUIBean.java
@@ -0,0 +1,51 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.perspective;
+
+import org.jboss.seam.annotations.In;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.gui.model.DefaultPageControlSettingsUIBean;
+
+/**
+ * A base class for Seam components that utilize the RHQ remote API to retrieve a paged data set of objects, which are
+ * typically rendered using a dataTable component.
+ *
+ * @author Ian Springer
+ */
+public class AbstractPagedDataPerspectiveUIBean extends AbstractPerspectiveUIBean {
+ @In(value = "DefaultPageControlSettingsUIBean", create = true)
+ private DefaultPageControlSettingsUIBean defaultPageControlSettings;
+
+ private PageControl pageControl;
+
+ public PageControl getPageControl() {
+ if (this.pageControl == null) {
+ this.pageControl = getDefaultPageControl();
+ }
+ return pageControl;
+ }
+
+ public void setPageControl(PageControl pageControl) {
+ this.pageControl = pageControl;
+ }
+
+ protected PageControl getDefaultPageControl() {
+ return new PageControl(0, this.defaultPageControlSettings.getDefaultPageSize());
+ }
+}
diff --git a/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java
new file mode 100644
index 0000000..c24da91
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/java/org/rhq/enterprise/server/perspective/AbstractPerspectiveUIBean.java
@@ -0,0 +1,110 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.perspective;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.faces.FacesMessages;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.client.RemoteClient;
+import org.rhq.enterprise.server.auth.SubjectManagerRemote;
+
+import org.jboss.seam.annotations.web.RequestParameter;
+
+/**
+ * A base class for Seam components that utilize the RHQ remote API.
+ *
+ * @author Ian Springer
+ */
+public abstract class AbstractPerspectiveUIBean {
+ private static final String DEFAULT_SERVER_HOST = "127.0.0.1";
+ private static final int DEFAULT_SERVER_PORT = 7080;
+ private static final String DEFAULT_USERNAME = "rhqadmin";
+ private static final String DEFAULT_PASSWORD = "rhqadmin";
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @RequestParameter("rhqServerHost")
+ private String serverHost;
+
+ @RequestParameter("rhqServerPort")
+ private Integer serverPort;
+
+ @RequestParameter("rhqUsername")
+ private String username;
+
+ @RequestParameter("rhqPassword")
+ private String password;
+
+ @RequestParameter("rhqSessionId")
+ private Integer sessionId;
+
+ @In
+ private FacesMessages facesMessages;
+
+ private RemoteClient remoteClient;
+ private Subject subject;
+
+ protected FacesMessages getFacesMessages() {
+ return facesMessages;
+ }
+
+ protected RemoteClient getRemoteClient() throws Exception {
+ if (this.remoteClient == null) {
+ this.remoteClient = new RemoteClient(null, getServerHost(), getServerPort());
+ }
+ if (!this.remoteClient.isConnected()) {
+ this.remoteClient.connect();
+ }
+ return this.remoteClient;
+ }
+
+ protected Subject getSubject() throws Exception {
+ if (subject == null) {
+ RemoteClient remoteClient = getRemoteClient();
+ // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
+ SubjectManagerRemote subjectManager = remoteClient.getSubjectManagerRemote();
+ if (this.sessionId != null) {
+ log.info("Retrieving subject for user [" + getUsername() + "] and sessionId [" + this.sessionId + "]...");
+ this.subject = subjectManager.getSubjectByNameAndSessionId(getUsername(), this.sessionId);
+ } else {
+ log.info("Logging in as user [" + getUsername() + "] with password [" + getPassword() + "]...");
+ this.subject = subjectManager.login(getUsername(), getPassword());
+ }
+ }
+ return this.subject;
+ }
+
+ private String getServerHost() {
+ return (this.serverHost != null) ? this.serverHost : DEFAULT_SERVER_HOST;
+ }
+
+ private int getServerPort() {
+ return (this.serverPort != null) ? this.serverPort : DEFAULT_SERVER_PORT;
+ }
+
+ private String getUsername() {
+ return (this.username != null) ? this.username : DEFAULT_USERNAME;
+ }
+
+ private String getPassword() {
+ return (this.password != null) ? this.password : DEFAULT_PASSWORD;
+ }
+}
\ No newline at end of file
diff --git a/etc/modules/base-perspective-war/src/main/resources/seam.properties b/etc/modules/base-perspective-war/src/main/resources/seam.properties
new file mode 100644
index 0000000..b97c770
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/resources/seam.properties
@@ -0,0 +1,3 @@
+# NOTE: The presence of this file tells Seam to scan this WAR for Seam
+# components (i.e. classes with Name annotations) and to deploy
+# any that it finds.
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/components.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/components.xml
new file mode 100644
index 0000000..4631d2e
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/components.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<components xmlns="http://jboss.com/products/seam/components"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:security="http://jboss.com/products/seam/security"
+ xsi:schemaLocation=
+ "http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd
+ http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.0.xsd">
+
+ <component name="org.jboss.seam.core.init">
+ <property name="debug">false</property>
+ <!-- enable only when needed -->
+ <property name="transactionManagementEnabled">false</property>
+ </component>
+
+</components>
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml
new file mode 100644
index 0000000..84517f8
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/faces-config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+
+<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
+
+ <!-- /rhq/common/menu/menu.xhtml -->
+ <managed-bean>
+ <managed-bean-name>PerspectivesMenuUIBean</managed-bean-name>
+ <managed-bean-class>org.rhq.enterprise.gui.perspectives.PerspectivesMenuUIBean</managed-bean-class>
+ <managed-bean-scope>session</managed-bean-scope>
+ </managed-bean>
+
+<!--
+ <navigation-rule>
+ <from-tree-id></from-tree-id>
+ <navigation-case></navigation-case>
+ </navigation-rule> -->
+</faces-config>
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
new file mode 100644
index 0000000..263bbb2
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/includes/pageControls.xhtml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:onf="http://jboss.org/on/function">
+<body>
+
+ Usage: The following parameters must be set in the calling page:
+
+ dataTableName - Name of the data table to be controlled
+ dataModel - Data model of the underlying table being controlled (used for total row count)
+ pageControl - Page control value to set when changing the number of rows per page
+ pageControlSettingsUIBean (optional, defaults to #{DefaultPageControlSettingsUIBean}") - page control settings
+
+ <ui:composition>
+
+ <h:panelGroup layout="block" style="float: right; margin-right: 30px">
+ <ui:param name="dataScrollerName" value="#{dataTableName}Scroller"/>
+ <c:if test="#{empty pageControlSettingsUIBean}">
+ <ui:param name="pageControlSettingsUIBean" value="#{DefaultPageControlSettingsUIBean}"/>
+ </c:if>
+
+ <table>
+ <tr>
+ <td nowrap="nowrap">
+
+ <h:outputText value="Total: #{dataModel.rowCount}"
+ style="margin-right: 2em; font-weight: bold; "/>
+
+ <h:panelGroup layout="block" rendered="#{dataModel.rowCount gt pageControlSettingsUIBean.minimumPageSize
+ and pageControl.pageSize gt 0}">
+ <h:outputText value="Items Per Page: #{pageControl.pageSize}"
+ style="font-weight: bold; "
+ rendered="#{pageControlSettingsUIBean.pageSizeCount le 1}"/>
+ <h:panelGroup layout="block" rendered="#{pageControlSettingsUIBean.pageSizeCount gt 1}">
+ <h:outputText value="Items Per Page:"
+ style="margin-right: 1em; font-weight: bold; "/>
+ <h:selectOneListbox id="currentPageSize"
+ size="1"
+ value="#{pageControl.pageSize}">
+ <a4j:support event="onchange"
+ status="commonStatus"
+ reRender="#{dataTableName}, #{dataScrollerName}"/>
+ <f:selectItems value="#{pageControlSettingsUIBean.pageSizeSelectItems}"/>
+ </h:selectOneListbox>
+ </h:panelGroup>
+ </h:panelGroup>
+
+ </td>
+
+ <td nowrap="nowrap">
+
+ <rich:datascroller id="#{dataScrollerName}"
+ for="#{dataTableName}"
+ status="commonStatus"
+ rendered="#{pageControl.pageSize gt 0}"
+ selectedStyle="font-weight: bold;"
+ inactiveStyle="font-weight: normal;"
+ stepControls="show"
+ fastControls="hide"
+ boundaryControls="hide"
+ maxPages="#{pageControlSettingsUIBean.maximumPages}"
+ page="#{pageControl.pageNumber}">
+ <f:facet name="next">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="next_disabled">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright_gray.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="previous">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft.gif" style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="previous_disabled">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft_gray.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ </rich:datascroller>
+
+ </td>
+ </tr>
+ </table>
+
+ </h:panelGroup>
+
+ <div style="clear: both;"/>
+
+ </ui:composition>
+
+</body>
+</html>
+
\ No newline at end of file
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml
new file mode 100644
index 0000000..352ffac
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/jboss-web.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE jboss-web PUBLIC
+ "-//JBoss//DTD Web Application 4.2//EN"
+ "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
+
+<jboss-web>
+
+ <class-loading>
+ <loader-repository>
+ org.rhq:loader=sample-perspective
+ <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
+ </loader-repository>
+ </class-loading>
+
+</jboss-web>
diff --git a/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..87b477d
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ version="2.5">
+
+ <display-name>RHQ Perspective Webapp</display-name>
+
+ <!--=== Seam ===-->
+
+ <listener>
+ <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
+ </listener>
+
+ <!-- From Seam docs: The Seam master filter must be the first filter specified
+ in web.xml. This ensures it is run first. -->
+ <filter>
+ <filter-name>Seam Filter</filter-name>
+ <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>Seam Filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <servlet>
+ <servlet-name>Seam Resource Servlet</servlet-name>
+ <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Seam Resource Servlet</servlet-name>
+ <url-pattern>/seam/resource/*</url-pattern>
+ </servlet-mapping>
+
+ <!-- flags for debugging during development -->
+ <context-param>
+ <param-name>com.sun.faces.validateXml</param-name>
+ <param-value>false</param-value>
+ </context-param>
+ <context-param>
+ <param-name>com.sun.faces.verifyObjects</param-name>
+ <param-value>false</param-value>
+ </context-param>
+
+ <!--=== JSF spec ===-->
+
+ <servlet>
+ <servlet-name>Faces Servlet</servlet-name>
+ <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <!-- serve Facelets pages (*.xhtml) via the JSF servlet -->
+ <servlet-mapping>
+ <servlet-name>Faces Servlet</servlet-name>
+ <url-pattern>*.seam</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>Faces Servlet</servlet-name>
+ <url-pattern>*.xhtml</url-pattern>
+ </servlet-mapping>
+
+ <!-- the suffix for files containing JSF content (default is ".jsp") -->
+ <context-param>
+ <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
+ <param-value>.xhtml</param-value>
+ </context-param>
+
+ <!-- see http://www.jroller.com/page/mert?entry=state_saving_method_client_side for an explanation of the below param -->
+ <context-param>
+ <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
+ <param-value>server</param-value>
+ </context-param>
+
+ <!--=== Facelets ===-->
+
+ <!-- enable special debug output for development -->
+ <context-param>
+ <param-name>facelets.DEVELOPMENT</param-name>
+ <param-value>true</param-value>
+ </context-param>
+
+ <!--=== RichFaces ===-->
+
+ <!-- From Seam docs: If RichFaces is used in your project, Seam will install
+ the RichFaces Ajax filter for you, making sure to install it before all
+ other built-in filters. You don't need to install the RichFaces Ajax
+ filter in web.xml yourself. -->
+
+ <context-param>
+ <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
+ <param-value>com.sun.facelets.FaceletViewHandler</param-value>
+ </context-param>
+
+ <welcome-file-list>
+ <welcome-file>index.xhtml</welcome-file>
+ </welcome-file-list>
+
+</web-app>
diff --git a/etc/modules/base-perspective-war/src/main/webapp/index.xhtml b/etc/modules/base-perspective-war/src/main/webapp/index.xhtml
new file mode 100644
index 0000000..a461356
--- /dev/null
+++ b/etc/modules/base-perspective-war/src/main/webapp/index.xhtml
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
+
+ <head>
+ <title>
+ Perspective Web Application
+ </title>
+ </head>
+
+ <body style="background-color: #FF66CC">
+
+ <ui:remove>
+ <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
+ other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
+ We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
+ including an xml prolog causes IE6 to go into the undesirable "quirks mode".
+ (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
+ </ui:remove>
+
+ <f:view contentType="text/html; charset=UTF-8">
+
+ <h1>YOUR CONTENT GOES HERE.</h1>
+
+ </f:view>
+
+ </body>
+
+</html>
+
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
index 82643f8..f41c766 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
@@ -1,9 +1,28 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.sample.perspective;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.international.StatusMessage;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.Resource;
@@ -11,14 +30,10 @@ import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.gui.model.PagedDataModel;
import org.rhq.core.gui.model.PagedDataProvider;
-import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.client.RemoteClient;
-import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import org.rhq.enterprise.server.perspective.AbstractPagedDataPerspectiveUIBean;
-import org.richfaces.model.selection.Selection;
+import org.rhq.enterprise.server.resource.ResourceManagerRemote;
-import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
/**
@@ -30,6 +45,7 @@ import java.util.List;
@Scope(ScopeType.CONVERSATION)
public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
private PagedDataModel<Resource> dataModel;
+ private List<Resource> selectedResources;
public BrowseResourcesUIBean() {
return;
@@ -43,26 +59,36 @@ public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
return this.dataModel;
}
+ public List<Resource> getSelectedResources() {
+ return this.selectedResources;
+ }
+
+ public void setSelectedResources(List<Resource> selectedResources) {
+ this.selectedResources = selectedResources;
+ }
+
public void uninventorySelectedResources() throws Exception {
+ if (this.selectedResources.isEmpty()) {
+ getFacesMessages().add(StatusMessage.Severity.WARN, "You didn't select any Resources.");
+ return;
+ }
+
RemoteClient remoteClient = getRemoteClient();
Subject subject = getSubject();
// ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
- Selection selection = getSelection();
- Iterator<Object> keyIterator = selection.getKeys();
- List<Integer> resourceIds = new ArrayList<Integer>();
- while (keyIterator.hasNext()) {
- Integer resourceId = (Integer) keyIterator.next();
- if (selection.isSelected(resourceId)) {
- resourceIds.add(resourceId);
- }
+ int[] selectedResourceIds = new int[this.selectedResources.size()];
+ for (int i = 0, selectedResourcesSize = this.selectedResources.size(); i < selectedResourcesSize; i++) {
+ Resource selectedResource = this.selectedResources.get(i);
+ selectedResourceIds[i] = selectedResource.getId();
}
- int[] ids = ArrayUtils.unwrapCollection(resourceIds);
- resourceManager.uninventoryResources(subject, ids);
- // TODO: Add a Faces Message.
+ resourceManager.uninventoryResources(subject, selectedResourceIds);
+ // TODO: i18n this bad boy.
+ String pluralizer = (this.selectedResources.size() == 1) ? "" : "s";
+ getFacesMessages().add("Uninventoried " + this.selectedResources.size() + " Resource" + pluralizer + ".");
// Reset the data model, so the current page will get refreshed to reflect the Resources we just uninventoried.
this.dataModel = null;
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
index 1482b22..827274a 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
@@ -1,3 +1,21 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.sample.perspective;
import org.apache.commons.logging.Log;
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
index cb2147a..d5dc17d 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
@@ -1,3 +1,21 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.sample.perspective;
import java.util.Random;
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
index 8c702f1..328ae74 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
@@ -1,3 +1,21 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.sample.perspective;
import org.jboss.seam.ScopeType;
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index 3e354df..c5e0e49 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -6,7 +6,8 @@
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.org/rich">
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:rhq="http://rhq-project.org/rhq">
<ui:remove>
<!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
@@ -27,30 +28,50 @@
<h2>Browse Resources</h2>
+ <style type="text/css">
+ .infoBlock {
+ background-color: #BFF1B5; /* light green */
+ border-top-color: #00AC3D; /* medium green */
+ }
+
+ .warnBlock {
+ background-color: #FFFD99; /* light yellow */
+ border-top-color: #FF9C15; /* medium orange */
+ }
+ </style>
+ <rich:messages globalOnly="true" infoClass="infoBlock" warnClass="warnBlock"/>
+
<ui:remove><!-- The table needs to be surrounded by a form for paging and sorting to work! --></ui:remove>
<h:form>
- <rich:extendedDataTable id="resourcesDataTable"
+ <rich:dataTable id="resourcesDataTable"
value="#{BrowseResourcesUIBean.dataModel}" var="resource"
first="#{BrowseResourcesUIBean.pageControl.pageNumber}"
rows="#{BrowseResourcesUIBean.pageControl.pageSize}"
sortMode="multi"
- selectionMode="multi" selection="#{BrowseResourcesUIBean.selection}"
width="100%">
- <rich:column sortBy="#{r.id}" width="10%">
+
+ <rich:column width="20">
+ <f:facet name="header">
+ <!-- TODO -->
+ </f:facet>
+ <rhq:rowSelector mode="multi" value="#{BrowseResourcesUIBean.selectedResources}"/>
+ </rich:column>
+
+ <rich:column sortBy="#{r.id}" width="60">
<f:facet name="header">
<h:outputLabel for="id" value="Id" />
</f:facet>
<h:outputText id="id" value="#{resource.id}" />
</rich:column>
- <rich:column sortBy="#{r.name}" width="30%">
+ <rich:column sortBy="#{r.name}" width="240">
<f:facet name="header">
<h:outputLabel for="name" value="Name" />
</f:facet>
<h:outputText id="name" value="#{resource.name}" />
</rich:column>
- <rich:column sortBy="#{r.description}" width="60%">
+ <rich:column sortBy="#{r.description}">
<f:facet name="header">
<h:outputLabel for="description" value="Description" />
</f:facet>
@@ -72,7 +93,7 @@
</rich:column>
</rich:columnGroup>
</f:facet>
- </rich:extendedDataTable>
+ </rich:dataTable>
</h:form>
</f:view>
diff --git a/modules/core/gui/pom.xml b/modules/core/gui/pom.xml
index cef66ff..2873697 100644
--- a/modules/core/gui/pom.xml
+++ b/modules/core/gui/pom.xml
@@ -107,6 +107,13 @@
</dependency>
<dependency>
+ <groupId>javax.faces</groupId>
+ <artifactId>jsf-impl</artifactId>
+ <!-- NOTE: The version is defined in the root POM's dependencyManagement section. -->
+ <scope>provided</scope> <!-- by JBossAS -->
+ </dependency>
+
+ <dependency>
<groupId>org.richfaces.framework</groupId>
<artifactId>richfaces-api</artifactId>
<!-- NOTE: The version is defined in the root POM's dependencyManagement section. -->
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/model/AbstractPagedDataModel2.java b/modules/core/gui/src/main/java/org/rhq/core/gui/model/AbstractPagedDataModel2.java
new file mode 100644
index 0000000..d8e8123
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/model/AbstractPagedDataModel2.java
@@ -0,0 +1,315 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.model;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.faces.context.FacesContext;
+import javax.faces.model.DataModelListener;
+
+import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
+import org.ajax4jsf.model.Range;
+import org.ajax4jsf.model.SequenceRange;
+import org.ajax4jsf.model.SerializableDataModel;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.richfaces.model.DataProvider;
+import org.richfaces.model.ExtendedTableDataModel;
+import org.richfaces.model.Field;
+import org.richfaces.model.FilterField;
+import org.richfaces.model.LocaleAware;
+import org.richfaces.model.Modifiable;
+import org.richfaces.model.SortField2;
+import org.richfaces.model.impl.expressive.JavaBeanWrapper;
+import org.richfaces.model.impl.expressive.ObjectWrapperFactory;
+import org.richfaces.model.impl.expressive.WrappedBeanComparator2;
+import org.richfaces.model.impl.expressive.WrappedBeanFilter;
+
+/**
+ * @author Konstantin Mishin
+ *
+ */
+public class AbstractPagedDataModel2<T> extends ExtendedDataModel
+ implements Modifiable, LocaleAware {
+
+ protected class RowKeyWrapperFactory extends ObjectWrapperFactory {
+
+ private class ExtendedJavaBeanWrapper extends JavaBeanWrapper {
+
+ private Object key;
+
+ public ExtendedJavaBeanWrapper(Object key, Object o, Map<Object, Object> props) {
+ super(o, props);
+ this.key = key;
+ }
+
+ public Object getKey() {
+ return key;
+ }
+ }
+
+ public RowKeyWrapperFactory(FacesContext context, String var,
+ List<? extends Field> sortOrder) {
+ super(context, var, sortOrder);
+ }
+
+ @Override
+ public JavaBeanWrapper wrapObject(Object key) {
+ originalModel.setRowKey(key);
+ JavaBeanWrapper wrapObject = super.wrapObject(originalModel.getRowData());
+ return new ExtendedJavaBeanWrapper(key, wrapObject.getWrappedObject(), wrapObject.getProperties());
+ }
+
+ @Override
+ public Object unwrapObject(Object wrapper) {
+ return ((ExtendedJavaBeanWrapper) wrapper).getKey();
+ }
+ }
+
+ private static final Log log = LogFactory.getLog(AbstractPagedDataModel2.class);
+
+ private ExtendedTableDataModel<T> originalModel;
+ protected List<Object> rowKeys;
+ protected String var;
+ protected Locale locale;
+
+ private boolean sortNeeded = true;
+ private boolean filterNeeded = true;
+
+ @SuppressWarnings("unchecked")
+ public AbstractPagedDataModel2(DataProvider<T> dataProvider, String var) {
+ this(new ExtendedTableDataModel<T>(dataProvider), var);
+ }
+
+ public AbstractPagedDataModel2(DataProvider<T> dataProvider) {
+ this(dataProvider, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public AbstractPagedDataModel2(ExtendedTableDataModel<T> dataModel, String var) {
+ this.originalModel = dataModel;
+ this.var = var;
+ }
+
+ @Override
+ public void addDataModelListener(DataModelListener listener) {
+ originalModel.addDataModelListener(listener);
+ }
+
+ @Override
+ public DataModelListener[] getDataModelListeners() {
+ return originalModel.getDataModelListeners();
+ }
+
+ public Locale getLocale() {
+ return locale;
+ }
+
+ public void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+
+ @Override
+ public Object getRowKey() {
+ return originalModel.getRowKey();
+ }
+
+ @Override
+ public void setRowKey(Object key) {
+ originalModel.setRowKey(key);
+ }
+
+ @Override
+ public void walk(FacesContext context, DataVisitor visitor, Range range,
+ Object argument) throws IOException {
+ final SequenceRange seqRange = (SequenceRange) range;
+ int rows = seqRange.getRows();
+ int rowCount = getRowCount();
+ int currentRow = seqRange.getFirstRow();
+ if(rows > 0){
+ rows += currentRow;
+ rows = Math.min(rows, rowCount);
+ } else {
+ rows = rowCount;
+ }
+ for (; currentRow < rows; currentRow++) {
+ visitor.process(context, rowKeys.get(currentRow), argument);
+ }
+ }
+
+ /**
+ * Resets internal cached data. Call this method to reload data from data
+ * provider on first access for data.
+ */
+ public void reset(){
+ originalModel.reset();
+ rowKeys = null;
+ sortNeeded = true;
+ filterNeeded = true;
+ }
+
+ public Object getKey(T o) {
+ return originalModel.getKey(o);
+ }
+
+ public T getObjectByKey(Object key) {
+ return originalModel.getObjectByKey(key);
+ }
+
+ @Override
+ public int getRowCount() {
+ if (rowKeys == null) {
+ return -1;
+ } else {
+ return rowKeys.size();
+ }
+ }
+
+ @Override
+ public Object getRowData() {
+ return originalModel.getRowData();
+ }
+
+ @Override
+ public int getRowIndex() {
+ return rowKeys.indexOf(originalModel.getRowKey());
+ }
+
+ @Override
+ public Object getWrappedData() {
+ return originalModel.getWrappedData();
+ }
+
+ @Override
+ public boolean isRowAvailable() {
+ return originalModel.isRowAvailable();
+ }
+
+ @Override
+ public void setRowIndex(int rowIndex) {
+ Object originalKey = null;
+ if (rowIndex >= 0 && rowIndex < rowKeys.size()) {
+ originalKey = rowKeys.get(rowIndex);
+ }
+ originalModel.setRowKey(originalKey);
+ }
+
+ @Override
+ public void setWrappedData(Object data) {
+ originalModel.setWrappedData(data);
+ }
+
+ @Override
+ public SerializableDataModel getSerializableModel(Range range) {
+ return originalModel.getSerializableModel(range);
+ }
+
+ @Override
+ public void removeDataModelListener(DataModelListener listener) {
+ originalModel.removeDataModelListener(listener);
+ }
+
+ public void modify(List<FilterField> filterFields, List<SortField2> sortFields) {
+ if (sortNeeded || filterNeeded){
+ if (var == null){
+ throw new IllegalStateException("\"var\" model attribute cannot be null.");
+ }
+ int rowCount = originalModel.getRowCount();
+
+ if (rowCount > 0) {
+ rowKeys = new ArrayList<Object>(rowCount);
+ } else {
+ rowKeys = new ArrayList<Object>();
+ }
+
+ FacesContext context = FacesContext.getCurrentInstance();
+ try {
+
+ originalModel.walk(context, new DataVisitor() {
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
+ originalModel.setRowKey(rowKey);
+ if (originalModel.isRowAvailable()) {
+ rowKeys.add(rowKey);
+ }
+ }
+ }, new SequenceRange(0, -1),
+ null);
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ }
+
+ filter(filterFields);
+ filterNeeded = false;
+ sort(sortFields);
+ sortNeeded = false;
+ }
+ }
+
+ public void resetSort(){
+ this.sortNeeded = true;
+ }
+
+ public void resetFilter(){
+ this.filterNeeded = true;
+ }
+
+ public void setVar(String var){
+ this.var = var;
+ }
+
+ protected List<Object> filter(List<FilterField> filterFields) {
+ if (filterFields != null && !filterFields.isEmpty()) {
+ FacesContext context = FacesContext.getCurrentInstance();
+ List <Object> filteredCollection = new ArrayList<Object>();
+ ObjectWrapperFactory wrapperFactory = new RowKeyWrapperFactory(context, var, filterFields);
+
+ WrappedBeanFilter wrappedBeanFilter = new WrappedBeanFilter(filterFields, locale);
+ wrapperFactory.wrapList(rowKeys);
+ for (Object object : rowKeys) {
+ if(wrappedBeanFilter.accept((JavaBeanWrapper)object)) {
+ filteredCollection.add(object);
+ }
+ }
+ rowKeys = filteredCollection;
+ wrapperFactory.unwrapList(rowKeys);
+ }
+ return rowKeys;
+ }
+
+ protected void sort(List<SortField2> sortFields) {
+ if (sortFields != null && !sortFields.isEmpty()) {
+ FacesContext context = FacesContext.getCurrentInstance();
+ ObjectWrapperFactory wrapperFactory = new RowKeyWrapperFactory(
+ context, var, sortFields);
+
+ WrappedBeanComparator2 wrappedBeanComparator = new WrappedBeanComparator2(
+ sortFields, locale);
+ wrapperFactory.wrapList(rowKeys);
+ Collections.sort(rowKeys, wrappedBeanComparator);
+ wrapperFactory.unwrapList(rowKeys);
+ }
+ }
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java b/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
index e4ea04e..aa665cd 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
@@ -1,3 +1,21 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.core.gui.model;
import org.jboss.seam.ScopeType;
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataModel.java b/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataModel.java
new file mode 100644
index 0000000..3b35ac3
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataModel.java
@@ -0,0 +1,396 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.gui.model;
+
+import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
+import org.ajax4jsf.model.Range;
+import org.ajax4jsf.model.SequenceRange;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.util.OrderingField;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.core.domain.util.PageOrdering;
+import org.richfaces.model.FilterField;
+import org.richfaces.model.Modifiable;
+import org.richfaces.model.Ordering;
+import org.richfaces.model.SortField2;
+
+import javax.el.Expression;
+import javax.faces.context.FacesContext;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+/**
+ * @author Ian Springer
+ * @author Joseph Marques
+ *
+ * @param <T> the type of domain object (e.g. org.rhq.core.domain.Resource) that this data model represents
+ */
+public class PagedDataModel<T> extends ExtendedDataModel implements Modifiable {
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ protected Object currentRowKey;
+
+ protected PageList<T> currentPage;
+ protected LinkedHashMap<Object, T> currentPageDataByKey;
+
+ private PagedDataProvider<T> dataProvider;
+
+ /**
+ * the default pagination and sort settings
+ */
+ private PageControl defaultPageControl;
+
+ private SequenceRange currentSequenceRange;
+ private List<OrderingField> currentOrderingFields = Collections.emptyList();
+
+ private boolean sortRequested;
+
+ public PagedDataModel(PagedDataProvider<T> dataProvider) {
+ this.dataProvider = dataProvider;
+ // TODO: get the default page control from some managed bean
+ this.defaultPageControl = new PageControl(0, 15);
+ }
+
+ /**
+ * @see org.ajax4jsf.model.ExtendedDataModel#getRowKey()
+ */
+ @Override
+ public Object getRowKey() {
+ return this.currentRowKey;
+ }
+
+ /**
+ * @see org.ajax4jsf.model.ExtendedDataModel#setRowKey(Object)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setRowKey(Object key) {
+ this.currentRowKey = key;
+ }
+
+ /**
+ * @see org.ajax4jsf.model.ExtendedDataModel#walk(javax.faces.context.FacesContext,
+ * org.ajax4jsf.model.DataVisitor, org.ajax4jsf.model.Range,
+ * Object)
+ */
+ @Override
+ public void walk(FacesContext facesContext, DataVisitor dataVisitor, Range range, Object argument)
+ throws IOException {
+ SequenceRange sequenceRange = (SequenceRange) range;
+ boolean newPageRequested =
+ (this.currentSequenceRange == null ||
+ sequenceRange.getFirstRow() != this.currentSequenceRange.getFirstRow() ||
+ sequenceRange.getRows() != this.currentSequenceRange.getRows());
+ if (newPageRequested) {
+ log.info("*** New page requested.");
+ }
+ this.currentSequenceRange = sequenceRange;
+
+ if (newPageRequested || this.sortRequested) {
+ // If this is the very first request for this data set, or if the user has specified new paging or sorting
+ // settings, then we request data from data provider.
+ PageControl pageControl = createPageControl();
+ loadDataPage(pageControl);
+ this.sortRequested = false;
+ }
+
+ // Let the visitor pay a visit to each item in the current page. this.currentPageDataByKey is a LinkedHashMap,
+ // so we know we'll visit the nodes in the correct order.
+ for (Object key : this.currentPageDataByKey.keySet()) {
+ dataVisitor.process(facesContext, key, argument);
+ }
+ }
+
+ /**
+ * @see org.richfaces.model.Modifiable#modify(java.util.List, java.util.List)
+ */
+ public void modify(List<FilterField> filterFields, List<SortField2> sortFields) {
+ if (!sortRequested) {
+ List<OrderingField> orderingFields = toOrderingFields(sortFields);
+ fixOrder(orderingFields);
+ this.sortRequested = (!orderingFields.equals(this.currentOrderingFields));
+ if (this.sortRequested) {
+ log.info("*** Sort requested - order: " + orderingFields + ", previous order: " + this.currentOrderingFields);
+ }
+ this.currentOrderingFields = orderingFields;
+ }
+ }
+
+ /**
+ * @see javax.faces.model.DataModel#isRowAvailable()
+ */
+ @Override
+ public boolean isRowAvailable() {
+ if (this.currentRowKey == null) {
+ return false;
+ }
+ if (this.currentPageDataByKey.containsKey(this.currentRowKey)) {
+ return true;
+ }
+ // TODO: Should we load the current page here and look again for the current key - I don't think so.
+ return false;
+ }
+
+ /**
+ * @see javax.faces.model.DataModel#getRowData()
+ */
+ @Override
+ public Object getRowData() {
+ if (this.currentRowKey == null) {
+ // TODO: Is it right to return null here?
+ return null;
+ }
+ T dataObject = this.currentPageDataByKey.get(this.currentRowKey);
+ if (dataObject == null) {
+ loadDataPage(this.defaultPageControl);
+ }
+ return dataObject;
+ }
+
+ /**
+ * @see javax.faces.model.DataModel#getRowCount()
+ */
+ @Override
+ public int getRowCount() {
+ if (this.currentPage == null) {
+ loadDataPage(this.defaultPageControl);
+ }
+ return this.currentPage.getTotalSize();
+ }
+
+ /**
+ * @see javax.faces.model.DataModel#setRowIndex(int)
+ */
+ @Override
+ public void setRowIndex(final int rowIndex) {
+ throw new UnsupportedOperationException("This method is not called by the RichFaces rich:extendedDataTable component.");
+ }
+
+ /**
+ * @see javax.faces.model.DataModel#setWrappedData(Object)
+ */
+ @Override
+ public void setWrappedData(final Object data) {
+ throw new UnsupportedOperationException("This method is not called by the RichFaces rich:extendedDataTable component.");
+ }
+
+ /**
+ * @see javax.faces.model.DataModel#getRowIndex()
+ */
+ @Override
+ public int getRowIndex() {
+ throw new UnsupportedOperationException("This method is not called by the rich:extendedDataTable component.");
+ }
+
+ /**
+ * @see javax.faces.model.DataModel#getWrappedData()
+ */
+ @Override
+ public Object getWrappedData() {
+ throw new UnsupportedOperationException("This method is not called by the rich:extendedDataTable component.");
+ }
+
+ private PageControl createPageControl() {
+ int pageSize = this.currentSequenceRange.getRows();
+ int pageNumber = this.currentSequenceRange.getFirstRow() / pageSize;
+ PageControl pageControl = new PageControl(pageNumber, pageSize);
+ pageControl.getOrderingFields().addAll(this.currentOrderingFields);
+ return pageControl;
+ }
+
+ /**
+ * Convert RichFaces SortField2s to RHQ OrderingFields.
+ *
+ * @param sortFields the SortField2s to be converted
+ *
+ * @return the equivalent RHQ OrderingFields
+ */
+ private List<OrderingField> toOrderingFields(List<SortField2> sortFields) {
+ if (sortFields == null) {
+ sortFields = Collections.emptyList();
+ }
+ List<OrderingField> orderingFields = new ArrayList<OrderingField>(sortFields.size());
+ for (SortField2 sortField : sortFields) {
+ Expression expression = sortField.getExpression();
+ String expressionString = expression.getExpressionString();
+ String field;
+ if (expression.isLiteralText()) {
+ field = expressionString;
+ } else {
+ field = expressionString.replaceAll("[#|$]\\{", "").replaceAll("\\}", "");
+ }
+ Ordering ordering = sortField.getOrdering();
+ PageOrdering pageOrdering = (ordering == Ordering.ASCENDING) ? PageOrdering.ASC : PageOrdering.DESC;
+ OrderingField orderingField = new OrderingField(field, pageOrdering);
+ orderingFields.add(orderingField);
+ }
+ return orderingFields;
+ }
+
+ private void loadDataPage(PageControl pageControl) {
+ this.currentPage = getDataPage(pageControl);
+ this.currentPageDataByKey = new LinkedHashMap<Object, T>(this.currentPage.size());
+ for (T dataObject : this.currentPage) {
+ Object key = getPrimaryKey(dataObject);
+ this.currentPageDataByKey.put(key, dataObject);
+ }
+ }
+
+ /**
+ * Return the domain object's primary key - typically an Integer. Pretty much all RHQ domain objects use 'id' as the
+ * field name for the primary key, so provide a default implementation that grabs the 'id' field to make things as
+ * easy as possible for subclasses.
+ *
+ * @param object a domain object
+ * @return U the domain object's primary key - typically an Integer
+ */
+ protected Object getPrimaryKey(T object) {
+ Method method;
+ try {
+ method = object.getClass().getMethod("getId");
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException(object.getClass() + " does not define a public getId() method.");
+ }
+ try {
+ return method.invoke(object);
+ } catch (Exception e) {
+ throw new IllegalStateException("Failed to invoke getId() on " + object + ".", e);
+ }
+ }
+
+ private PageList<T> getDataPage(PageControl pageControl) {
+ PageList<T> results = null;
+ boolean tryQueryAgain = false;
+ try {
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": " + pageControl);
+ }
+ if (pageControl.getPageSize() == PageControl.SIZE_UNLIMITED && pageControl.getPageNumber() != 0) {
+ /*
+ * user is trying to get all of the results (SIZE_UNLIMITED), but not starting
+ * on the first page. while this is technically allowable, it generally doesn't
+ * make all that much sense and was most likely due to a mistake upstream in the
+ * usage of the pagination / sorting framework.
+ */
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Forcing UNLIMITED PageControl's pageNumber to 0");
+ }
+ pageControl.setPageNumber(0);
+ //setPageControl(pageControl);
+ }
+
+ // try the data fetch with the potentially changed (and persisted) PageControl object
+ results = this.dataProvider.getDataPage(pageControl);
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Successfully fetched page (first time)");
+ }
+
+ /*
+ * do the results make sense? there are certain times when no exception will be thrown but the
+ * user interface won't be properly updated because of the multi-user environment. if one user
+ * is looking at some data set while another user deletes that entire data set, the current user
+ * upon next sort or pagination action should realize that no results exist for his current page
+ * and the view should be rendered to reflect that. however, due to some defensive coding in the
+ * RF components, the DataTable component does not see this change. so, we have to explicitly
+ * update the page control to get the view consistent with the backend once again.
+ */
+ if (results.getTotalSize() <= pageControl.getStartRow() || (results.isEmpty() && pageControl.getPageNumber() != 0)) {
+ if (log.isTraceEnabled()) {
+ if (results.getTotalSize() <= pageControl.getStartRow()) {
+ //log.trace(pageControlView + ": Results size[" + results.getTotalSize()
+ // + "] was less than PageControl startRow[" + pageControl.getStartRow() + "]");
+ } else {
+ //log.trace(pageControlView + ": Results were empty, but pageNumber was non-zero");
+ }
+ }
+ pageControl.reset(); // this will reset to page 1, but will not reset any ordering.
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": resetting to " + pageControl);
+ }
+ tryQueryAgain = true;
+ }
+ } catch (Throwable t) {
+ /*
+ * known issues during pagination:
+ *
+ * 1) IndexOutOfBoundsException - trying to access a non-existent page
+ * 2) QuerySyntaxException - when the token passed by the SortableColumnHeaderListener does not
+ * match some alias on the underlying query that fetches the results
+ *
+ * but let's be extra careful and catch Throwable so as to handle any other exceptional case
+ * we've yet to uncover. however, we still want to return value data to the user, so let's
+ * try the query once again; this time, we want the first page and will not specify any explicit
+ * ordering (though the underlying SLSB may add a default ordering downstream).
+ */
+ pageControl.reset(); // this will reset to page 1, but will not reset any ordering.
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Received error[" + t.getMessage() + "], resetting to " + pageControl);
+ }
+ tryQueryAgain = true;
+ }
+
+ // round 2 should be guaranteed because of use of defaultPageControl
+ if (tryQueryAgain) {
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Trying query again");
+ }
+ try {
+ results = this.dataProvider.getDataPage(pageControl);
+ if (log.isTraceEnabled()) {
+ //log.trace(pageControlView + ": Successfully fetched page (second time)");
+ }
+ } catch (Throwable t) {
+ //log.error("Could not retrieve collection for " + pageControlView, t);
+ }
+ }
+
+ if (results == null) {
+ results = new PageList<T>();
+ }
+
+ return results;
+ }
+
+ private void fixOrder(List<OrderingField> orderingFields) {
+ Collections.reverse(orderingFields);
+ if (this.currentOrderingFields != null && orderingFields.size() > 1 &&
+ orderingFields.size() == this.currentOrderingFields.size()) {
+ for (int i = 1, sortFieldsSize = orderingFields.size(); i < sortFieldsSize; i++) {
+ OrderingField orderingField = orderingFields.get(i);
+ OrderingField currentOrderingField = this.currentOrderingFields.get(i);
+ if (orderingField.getField().equals(currentOrderingField.getField()) &&
+ orderingField.getOrdering() != currentOrderingField.getOrdering()) {
+ orderingFields.remove(i);
+ orderingFields.add(0, orderingField);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java b/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java
index ab6d02c..4fe4f20 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java
@@ -1,3 +1,21 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
package org.rhq.core.gui.model;
import org.rhq.core.domain.util.PageControl;
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
new file mode 100644
index 0000000..51f3a6b
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/component/RowSelectorComponent.java
@@ -0,0 +1,109 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.component;
+
+import org.rhq.core.gui.util.FacesExpressionUtility;
+
+import javax.el.ValueExpression;
+import javax.faces.component.UIInput;
+import javax.faces.context.FacesContext;
+
+/**
+ * An HTML component that allows rows in rich:*dataTables to be selected via either checkboxes (if in multi-select mode)
+ * or via radio buttons (if in single-select mode).
+ *
+ * NOTE: It is preferred to use the disabled attribute of this component instead of the rendered attribute. This will
+ * provide consistency to the rendered table such as regardless of what items appear in the table, the check-able
+ * column will always be rendered with a consistent width.
+ *
+ * @author Ian Springer
+ */
+public class RowSelectorComponent extends UIInput {
+ private Mode mode;
+
+ public static final String COMPONENT_TYPE = "org.rhq.RowSelector";
+ public static final String COMPONENT_FAMILY = "org.rhq.RowSelector";
+
+ private static final Mode DEFAULT_MODE = Mode.multi;
+
+ @Override
+ public String getFamily() {
+ return COMPONENT_FAMILY;
+ }
+
+ public Mode getMode() {
+ if (this.mode != null) {
+ return this.mode;
+ }
+
+ Mode mode = (Mode) getBinding("mode");
+ this.mode = (mode != null) ? mode : DEFAULT_MODE;
+
+ return this.mode;
+ }
+
+ public void setMode(Mode mode) {
+ this.mode = mode;
+ }
+
+ @Override
+ public Object getValue() {
+ if (getValueExpression("value") == null) {
+ throw new IllegalStateException("rowSelector 'value' attribute must be set to an EL expression.");
+ }
+ return super.getValue();
+ }
+
+ @Override
+ public Object saveState(FacesContext context) {
+ Object[] values = new Object[2];
+ values[0] = super.saveState(context);
+ values[1] = this.mode;
+ return values;
+ }
+
+ @Override
+ public void restoreState(FacesContext context, Object state) {
+ Object[] values = (Object[]) state;
+ super.restoreState(context, values[0]);
+ this.mode = (Mode) values[1];
+ }
+
+ public Object getBinding(String attr) {
+ if (attr == null) {
+ throw new NullPointerException("passed attribute is null");
+ }
+
+ ValueExpression valueExpression = this.getValueExpression(attr);
+ Object attribValue = (valueExpression != null) ? FacesExpressionUtility.getValue(valueExpression, Object.class)
+ : null;
+ return attribValue;
+ }
+
+ public enum Mode {
+ /**
+ * Only one row can be selected at a time.
+ */
+ single,
+ /**
+ * Multiple rows can be selected simultaneously.
+ */
+ multi
+ }
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
new file mode 100644
index 0000000..525821c
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/table/renderer/RowSelectorRenderer.java
@@ -0,0 +1,229 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2009-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.gui.table.renderer;
+
+import com.sun.faces.util.MessageUtils;
+import org.ajax4jsf.component.UIDataAdaptor;
+import org.ajax4jsf.model.ExtendedDataModel;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.rhq.core.gui.table.component.RowSelectorComponent;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.convert.Converter;
+import javax.faces.model.DataModel;
+import javax.faces.render.Renderer;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * An HTML renderer for {@link RowSelectorComponent}s (i.e. rhq:rowSelector).
+ *
+ * @author Ian Springer
+ */
+public class RowSelectorRenderer extends Renderer {
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void decode(FacesContext context, UIComponent component) {
+ validateParameters(context, component);
+
+ RowSelectorComponent rowSelector = (RowSelectorComponent) component;
+
+ UIDataAdaptor dataAdaptor = getEnclosingDataAdaptor(rowSelector);
+
+ List selectedDataObjects = getSelectedDataObjects(context, dataAdaptor);
+
+ // Always set the submitted value, so that, even if no rows were selected, the setter on the managed bean will
+ // still be passed an empty List, rather than null.
+ rowSelector.setSubmittedValue(selectedDataObjects);
+
+ Map<String, String> requestParamMap = context.getExternalContext().getRequestParameterMap();
+ String requestParamName = rowSelector.getClientId(context);
+ String selectedRowKey = requestParamMap.get(requestParamName);
+
+ if (selectedRowKey != null) {
+ Object rowKey = dataAdaptor.getRowKey();
+ Converter rowKeyConverter = dataAdaptor.getRowKeyConverter();
+ String rowKeyString = (rowKeyConverter != null) ? rowKeyConverter.getAsString(context, component, rowKey) :
+ String.valueOf(rowKey);
+ if (selectedRowKey.equals(rowKeyString)) {
+ Object rowData = dataAdaptor.getRowData();
+ selectedDataObjects.add(rowData);
+ }
+ }
+ }
+
+ @Override
+ public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
+ validateParameters(context, component);
+
+ RowSelectorComponent rowSelector = (RowSelectorComponent) component;
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.startElement("input", component);
+
+ writeIdAttributeIfNecessary(context, writer, component);
+
+ RowSelectorComponent.Mode selectionMode = rowSelector.getMode();
+ String type = (selectionMode == RowSelectorComponent.Mode.single) ? "radio" : "checkbox";
+ writer.writeAttribute("type", type, "type");
+
+ String clientId = component.getClientId(context);
+ writer.writeAttribute("name", clientId, "clientId");
+
+ UIDataAdaptor dataAdaptor = getEnclosingDataAdaptor(rowSelector);
+ Object rowKey = getRowKey(dataAdaptor);
+ writer.writeAttribute("value", rowKey, null);
+
+ // TODO: Write 'checked' attribute to allow checkbox to be selected by default? Probably overkill.
+
+ String onclick = "updateButtons('" + clientId + "')";
+ String userSpecifiedOnclick = (String) rowSelector.getAttributes().get("onclick");
+ if (userSpecifiedOnclick != null) {
+ onclick += "; " + userSpecifiedOnclick;
+ }
+ rowSelector.getAttributes().put("onclick", onclick);
+ // TODO: Add support for all the other common HTML attributes.
+ //RenderKitUtils.renderPassThruAttributes(writer, component, ATTRIBUTES);
+
+ Boolean disabled = (Boolean) rowSelector.getAttributes().get("disabled");
+ if (disabled != null && disabled) {
+ writer.writeAttribute("disabled", "disabled", "disabled");
+ }
+ //RenderKitUtils.renderXHTMLStyleBooleanAttributes(writer, component);
+
+ writer.endElement("input");
+ }
+
+ @Override
+ public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
+ validateParameters(context, component);
+
+ ResponseWriter writer = context.getResponseWriter();
+ writer.write("</input>");
+ }
+
+ private void validateParameters(FacesContext context, UIComponent component) {
+ if (context == null) {
+ throw new NullPointerException(MessageUtils.getExceptionMessageString(
+ MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "context"));
+ }
+
+ if (component == null) {
+ throw new NullPointerException(MessageUtils.getExceptionMessageString(
+ MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "component"));
+ }
+ }
+
+ private List getSelectedDataObjects(FacesContext context, UIDataAdaptor dataAdaptor) {
+ Map<String, Object> requestMap = context.getExternalContext().getRequestMap();
+ String selectedDataObjectsRequestAttributeName = dataAdaptor.getId() + ":" + "selectedDataObjects";
+ List selectedDataObjects = (List) requestMap.get(selectedDataObjectsRequestAttributeName);
+ if (selectedDataObjects == null) {
+ selectedDataObjects = new ArrayList();
+ requestMap.put(selectedDataObjectsRequestAttributeName, selectedDataObjects);
+ }
+ return selectedDataObjects;
+ }
+
+ private Object getRowKey(UIDataAdaptor dataAdaptor) {
+ Object rowKey;
+ DataModel dataModel = (DataModel) dataAdaptor.getAttributes().get("dataModel");
+ if (dataModel instanceof ExtendedDataModel) {
+ rowKey = dataAdaptor.getRowKey();
+ } else {
+ Object rowData = dataAdaptor.getRowData();
+ rowKey = getPrimaryKey(rowData);
+ }
+ return rowKey;
+ }
+
+ /**
+ * Return the specified row data object's primary key. Pretty much all RHQ domain objects use an Integer field named
+ * 'id' as the primary key.
+ *
+ * TODO: Nevertheless, it would be nice to provide a way for the user to override this via an attribute on the
+ * rowSelector component.
+ *
+ * @param object a row data object
+ * @return the row data object's primary key - typically an Integer for RHQ domain objects
+ */
+ private Object getPrimaryKey(Object object) {
+ Method method;
+ try {
+ method = object.getClass().getMethod("getId");
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException(object.getClass() + " does not define a public getId() method.");
+ }
+ try {
+ return method.invoke(object);
+ } catch (Exception e) {
+ throw new IllegalStateException("Failed to invoke getId() on " + object + ".", e);
+ }
+ }
+
+ private UIDataAdaptor getEnclosingDataAdaptor(UIComponent component) {
+ UIComponent current = component;
+ while ((current = current.getParent()) != null) {
+ if (current instanceof UIDataAdaptor) {
+ return (UIDataAdaptor) current;
+ }
+ }
+ throw new IllegalStateException("Enclosing UIDataAdaptor component (i.e. rich:*dataTable) not found for component "
+ + component + ".");
+ }
+
+ /**
+ * @param component the component of interest
+ *
+ * @return true if this renderer should render an id attribute.
+ */
+ protected boolean shouldWriteIdAttribute(UIComponent component) {
+ String id;
+ return (null != (id = component.getId()) &&
+ !id.startsWith(UIViewRoot.UNIQUE_ID_PREFIX));
+
+ }
+
+ protected String writeIdAttributeIfNecessary(FacesContext context,
+ ResponseWriter writer,
+ UIComponent component) {
+ String id = null;
+ if (shouldWriteIdAttribute(component)) {
+ try {
+ writer.writeAttribute("id", id = component.getClientId(context),
+ "id");
+ } catch (IOException e) {
+ String message = MessageUtils.getExceptionMessageString
+ (MessageUtils.CANT_WRITE_ID_ATTRIBUTE_ERROR_MESSAGE_ID,
+ e.getMessage());
+ log.warn(message);
+ }
+ }
+ return id;
+ }
+}
diff --git a/modules/core/gui/src/main/resources/META-INF/faces-config.xml b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
new file mode 100644
index 0000000..9a0011c
--- /dev/null
+++ b/modules/core/gui/src/main/resources/META-INF/faces-config.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
+ version="1.2">
+
+ <component>
+ <component-type>org.rhq.RowSelector</component-type>
+ <component-class>org.rhq.core.gui.table.component.RowSelectorComponent</component-class>
+ <component-extension>
+ <component-family>org.rhq.RowSelector</component-family>
+ <renderer-type>org.rhq.RowSelector</renderer-type>
+ </component-extension>
+ </component>
+
+ <render-kit>
+
+ <renderer>
+ <description>renders either one radio button or one checkbox per data table row, which the user can select in
+ order to select the corresponding row</description>
+ <component-family>org.rhq.RowSelector</component-family>
+ <renderer-type>org.rhq.RowSelector</renderer-type>
+ <renderer-class>org.rhq.core.gui.table.renderer.RowSelectorRenderer</renderer-class>
+ </renderer>
+
+ </render-kit>
+
+</faces-config>
diff --git a/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
new file mode 100644
index 0000000..818f507
--- /dev/null
+++ b/modules/core/gui/src/main/resources/META-INF/rhq.taglib.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE facelet-taglib PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
+ "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
+
+<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
+
+ <namespace>http://rhq-project.org/rhq</namespace>
+
+ <tag>
+ <tag-name>rowSelector</tag-name>
+ <component>
+ <component-type>org.rhq.RowSelector</component-type>
+ <renderer-type>org.rhq.RowSelector</renderer-type>
+ </component>
+ </tag>
+
+</facelet-taglib>
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/paging/PagedListDataModel.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/paging/PagedListDataModel.java
index e3c65c8..0d0c753 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/paging/PagedListDataModel.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/paging/PagedListDataModel.java
@@ -34,7 +34,7 @@ import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.util.HibernatePerformanceMonitor;
/**
- * <p>A special type of JSF DataModel to allow a datatable and datascroller to page through a large set of data without
+ * <p>A special type of JSF DataModel to allow a table and datascroller to page through a large set of data without
* having to hold the entire set of data in memory at once.</p>
*
* <p>Any time a managed bean wants to avoid holding an entire dataset, the managed bean should declare an inner class
commit 42febf6a49dc1d6fba32de1bac8428e9cb914962
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 19 23:01:59 2010 -0500
upgrade JSF RI version from 1.2_12 to 1.2_14
diff --git a/pom.xml b/pom.xml
index 7c5848b..c5cfd44 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,8 +66,8 @@
<hibernate-entitymanager.version>3.2.1.GA</hibernate-entitymanager.version>
<jaxb-api.version>2.1</jaxb-api.version>
<jaxb-impl.version>2.1.6</jaxb-impl.version>
- <jsf-api.version>1.2_12</jsf-api.version>
- <jsf-impl.version>1.2_12</jsf-impl.version>
+ <jsf-api.version>1.2_14</jsf-api.version>
+ <jsf-impl.version>1.2_14</jsf-impl.version>
<ojdbc14.version>10.2.0.4.0</ojdbc14.version>
<ojdbc5.version>11.2.0.1.0</ojdbc5.version>
<ems.version>1.2.11</ems.version>
commit 3acedb811109d740088d1280513d2d58dc1949b1
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Tue Jan 19 16:44:25 2010 -0500
removing child numbers in parens from left tree nav
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
index 298c0a0..35b0dce 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/navigation/ResourcesTree.xhtml
@@ -67,9 +67,6 @@
<h:outputText value="#{resourceTreeItem} "
styleClass="availLink#{resourceTreeItem.data.availability == 0 ? 'Down' : (resourceTreeItem.data.availability == 1 ? 'Up' : 'Mixed')}"/>
- <h:outputText value="(#{resourceTreeItem.children.size})"
- rendered="#{resourceTreeItem.data.subcategory == null}"
- styleClass="availLink#{resourceTreeItem.data.availability == 0 ? 'Down' : (resourceTreeItem.data.availability == 1 ? 'Up' : 'Mixed')}"/>
</rich:treeNode>
<rich:treeNode type="LockedResource"
commit 65ae35c8c3122f40ca1eccfd4bf69dbb8fceeb87
Merge: af0161f... c78a781...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 18 18:21:45 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit af0161f3ff6778f8e341b653da84ead4415a3467
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 18 18:19:27 2010 -0500
when the page size is updated via setPageSize(), also update the page number, so the current page still contains at least a subset of the items on the page with the previous page size
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
index 3940b06..0561a55 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
@@ -121,8 +121,9 @@ public class PageControl implements Serializable, Cloneable {
}
public void setPageSize(int pageSize) {
+ this.pageNumber = (pageSize != 0) ? (getStartRow() / pageSize) : 0;
this.pageSize = pageSize;
- }
+ }
public PageOrdering getPrimarySortOrder() {
OrderingField primaryOrderingField = getPrimaryOrderingField();
commit a82bd0200c35fd72db27a81115616d2508fd8d8c
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 18 18:17:30 2010 -0500
change a bunch of INFO log messages to DEBUG
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
index 8e9cabf..ef27906 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
@@ -126,7 +126,7 @@ public abstract class Criteria implements Serializable {
}
}
for (Map.Entry<String, Object> entries : results.entrySet()) {
- LOG.info("Filter: (" + entries.getKey() + ", " + entries.getValue() + ")");
+ LOG.debug("Filter: (" + entries.getKey() + ", " + entries.getValue() + ")");
}
return results;
}
@@ -161,7 +161,7 @@ public abstract class Criteria implements Serializable {
}
}
for (String entry : results) {
- LOG.info("Fetch: (" + entry + ")");
+ LOG.debug("Fetch: (" + entry + ")");
}
return results;
}
@@ -283,7 +283,7 @@ public abstract class Criteria implements Serializable {
}
}
}
- LOG.info("Page Control: " + pc);
+ LOG.debug("Page Control: " + pc);
return pc;
}
commit 9c3b5ac27ce7ab7030944f46778ac0d38403d99d
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 18 18:16:00 2010 -0500
add missing serialVersionUID field and implement equals() and hashCode()
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java
index 8d6bbed..e0a8197 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java
@@ -28,12 +28,12 @@ import java.io.Serializable;
* Object to hold an ORDER BY field argument including the name and sort order.
*/
public class OrderingField implements Serializable {
+ private static final long serialVersionUID = 1L;
+
private String field;
private PageOrdering ordering;
- private static final long serialVersionUID = 1L;
-
- public OrderingField() {
+ protected OrderingField() {
}
public OrderingField(String field, PageOrdering ordering) {
@@ -72,4 +72,29 @@ public class OrderingField implements Serializable {
ordering = PageOrdering.ASC;
}
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ OrderingField that = (OrderingField) o;
+
+ if (!field.equals(that.field)) return false;
+ if (ordering != that.ordering) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = field.hashCode();
+ result = 31 * result + ordering.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + "[field=" + this.field + ", ordering=" + this.ordering + "]";
+ }
}
\ No newline at end of file
commit bf899bfe5fa1166796ae631148b386e543dcd9ad
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 18 18:15:11 2010 -0500
update the various core Maven plugins to their latest versions
diff --git a/pom.xml b/pom.xml
index 0867279..7c5848b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -426,15 +426,15 @@
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
- <version>2.2-beta-2</version>
+ <version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
- <version>2.2</version>
+ <version>2.4</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
- <version>2.0.2</version>
+ <version>2.1</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
@@ -442,27 +442,27 @@
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
- <version>2.3</version>
+ <version>2.5</version>
</plugin>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
- <version>2.3.1</version>
+ <version>2.4</version>
</plugin>
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
- <version>1.0-alpha-3</version>
+ <version>1.0-beta-1</version>
</plugin>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
- <version>2.1</version>
+ <version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
- <version>2.2</version>
+ <version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
- <version>2.2</version>
+ <version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
@@ -470,7 +470,7 @@
</plugin>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
- <version>2.4.1</version>
+ <version>2.5.1</version>
</plugin>
<plugin>
<artifactId>maven-rar-plugin</artifactId>
@@ -484,7 +484,7 @@
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
- <version>2.2</version>
+ <version>2.4.1</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
@@ -492,15 +492,15 @@
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
- <version>2.0.4</version>
+ <version>2.1.1</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
- <version>2.4.2</version>
+ <version>2.5</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
- <version>2.1-alpha-1</version>
+ <version>2.1-beta-1</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
commit 0dfeac7bad2604074954bace7c33332d136e23d0
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Mon Jan 18 18:13:49 2010 -0500
add a base perspective war that perspective wars can use as a base via the war plugin's overlay feature; update the sample persp war to use the base persp war; add an example of rendering a table with paging, sorting, and selection in the sample persp war (this early example uses only pure RichFaces functionality and will be replaced with an example that uses a number of components to be added to the core-gui module)
diff --git a/etc/samples/perspectives/sample-perspective/app/pom.xml b/etc/samples/perspectives/sample-perspective/app/pom.xml
index 10dc2c0..bc71b69 100644
--- a/etc/samples/perspectives/sample-perspective/app/pom.xml
+++ b/etc/samples/perspectives/sample-perspective/app/pom.xml
@@ -10,6 +10,7 @@
<groupId>org.rhq</groupId>
<artifactId>rhq-sample-perspective-war</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>RHQ Sample Perspective War</name>
@@ -19,94 +20,48 @@
<developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/etc/samples/sample-perspec...</developerConnection>
</scm>
- <properties>
- <scm.module.path>modules/enterprise/gui/perspectives/sample-perspective-war/</scm.module.path>
- <war.dir>${basedir}/target/${final.name}</war.dir>
-
- <!-- NOTE: Seam 2.1.2 and 2.2.0 can't be used in webapps deployed to the RHQ Server
- due to https://jira.jboss.org/jira/browse/JBSEAM-4029. Seam 2.2.1 can be
- used once it's released. -->
- <seam.version>2.1.0.SP1</seam.version>
- <richfaces.version>3.3.2.SR1</richfaces.version>
- </properties>
+ <dependencyManagement>
- <dependencies>
+ <dependencies>
- <!-- This will pull in all the jars we need for making remote calls to the RHQ Server. -->
+ <!-- This will pull in the managed dependencies from the base-perspective-war pom. -->
<dependency>
<groupId>org.rhq</groupId>
- <artifactId>rhq-remoting-client-api</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>com.sun.facelets</groupId>
- <artifactId>jsf-facelets</artifactId>
- <version>1.1.15</version>
- </dependency>
-
- <dependency>
- <groupId>org.jboss.seam</groupId>
- <artifactId>jboss-seam</artifactId>
- <version>${seam.version}</version>
- <exclusions>
- <exclusion>
- <groupId>javax.el</groupId>
- <artifactId>el-api</artifactId>
- </exclusion>
- <exclusion>
- <groupId>xml-apis</groupId>
- <artifactId>xml-apis</artifactId>
- </exclusion>
- </exclusions>
+ <artifactId>rhq-enterprise-server-base-perspective-war</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>import</scope>
</dependency>
+
+ </dependencies>
- <dependency>
- <groupId>org.jboss.seam</groupId>
- <artifactId>jboss-seam-ui</artifactId>
- <version>${seam.version}</version>
- </dependency>
+ </dependencyManagement>
+
+ <dependencies>
+ <!-- This is needed by the war plugin for the overlay functionality. -->
<dependency>
- <groupId>org.jboss.seam</groupId>
- <artifactId>jboss-seam-debug</artifactId>
- <version>${seam.version}</version>
- <!-- we should be pulling this in directly ourselves, not relying
- jboss-seam-debug to provide it -->
- <exclusions>
- <exclusion>
- <groupId>com.sun.facelets</groupId>
- <artifactId>jsf-facelets</artifactId>
- </exclusion>
- </exclusions>
- <scope>runtime</scope>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-server-base-perspective-war</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <type>war</type>
</dependency>
+ <!-- This is used to pull in the war's classes and dependencies, which are not pulled in by the above dependency
+ of type war (see http://jira.codehaus.org/browse/MNG-1991). -->
<dependency>
- <groupId>org.richfaces.framework</groupId>
- <artifactId>richfaces-api</artifactId>
- <version>${richfaces.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.richfaces.framework</groupId>
- <artifactId>richfaces-impl</artifactId>
- <version>${richfaces.version}</version>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-server-base-perspective-war</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <type>warpath</type>
</dependency>
<dependency>
- <groupId>org.richfaces.ui</groupId>
- <artifactId>richfaces-ui</artifactId>
- <version>${richfaces.version}</version>
- </dependency>
-
- <dependency>
<groupId>javax.faces</groupId>
- <artifactId>jsf-api</artifactId>
- <version>1.2_13</version>
+ <artifactId>jsf-api</artifactId>
<scope>provided</scope>
</dependency>
-
+
</dependencies>
<build>
@@ -116,119 +71,36 @@
<plugin>
<artifactId>maven-war-plugin</artifactId>
- <configuration>
- <archive>
- <manifest>
- <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
- <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
- </manifest>
- <manifestEntries>
- <Build-Number>${buildNumber}</Build-Number>
- </manifestEntries>
- </archive>
- <webResources>
- <resource>
- <filtering>true</filtering>
- <directory>${basedir}/src/main/webapp</directory>
- <includes>
- <include>**/*.properties</include>
- </includes>
- </resource>
- </webResources>
+ <configuration>
+ <overlays>
+ <overlay>
+ <!-- empty groupId/artifactId detected as the current build.
+ earlier overlays win over later overlays, so put ourselves first. -->
+ </overlay>
+ <overlay>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-server-base-perspective-war</artifactId>
+ </overlay>
+ </overlays>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.appfuse</groupId>
+ <artifactId>maven-warpath-plugin</artifactId>
+ <version>2.0.2</version>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <goals>
+ <goal>add-classes</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
</plugins>
</build>
-
- <repositories>
- <repository>
- <id>java.net-m1-releases</id>
- <name>Java.net Maven1 Repository - for javax.faces, javax.el, com.sun.el, and com.sun.facelets releases</name>
- <url>http://download.java.net/maven/1/</url>
- <layout>legacy</layout>
- </repository>
- </repositories>
-
- <profiles>
-
- <!--
- <profile>
- <id>dev</id>
-
- <properties>
- <rhq.rootDir>../../../../..</rhq.rootDir>
- <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
- <rhq.deploymentName>${project.build.finalName}.war</rhq.deploymentName>
- <rhq.deploymentDir>${rhq.containerDir}/jbossas/server/default/deploy/${rhq.deploymentName}</rhq.deploymentDir>
- </properties>
-
- <build>
- <plugins>
-
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <version>1.1</version>
- <executions>
-
- <execution>
- <id>deploy-classes</id>
- <phase>compile</phase>
- <configuration>
- <tasks>
- <property name="classes.dir" location="${rhq.deploymentDir}/WEB-INF/classes" />
- <echo>*** Copying updated files from target/classes to ${classes.dir}...</echo>
- <copy todir="${classes.dir}" failonerror="false" verbose="${rhq.verbose}">
- <fileset dir="target/classes" />
- </copy>
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
-
- <execution>
- <id>deploy</id>
- <phase>package</phase>
- <configuration>
- <tasks>
- <property name="deployment.dir" location="${rhq.deploymentDir}" />
- <echo>*** Copying updated files from target${file.separator}${project.build.finalName}${file.separator} to ${deployment.dir}${file.separator}...</echo>
- <copy todir="${deployment.dir}" verbose="${rhq.verbose}">
- <fileset dir="${basedir}/target/${project.build.finalName}" />
- </copy>
- <delete dir="${deployment.dir}.rej" />
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
-
- <execution>
- <id>undeploy</id>
- <phase>clean</phase>
- <configuration>
- <tasks>
- <property name="deployment.dir" location="${rhq.deploymentDir}" />
- <echo>*** Deleting ${deployment.dir}${file.separator}...</echo>
- <delete dir="${deployment.dir}" />
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
-
- </executions>
- </plugin>
-
- </plugins>
- </build>
- </profile>
--->
- </profiles>
</project>
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/AbstractPerspectiveUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/AbstractPerspectiveUIBean.java
deleted file mode 100644
index 26038cd..0000000
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/AbstractPerspectiveUIBean.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.rhq.sample.perspective;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.enterprise.client.RemoteClient;
-import org.rhq.enterprise.server.auth.SubjectManagerRemote;
-
-import org.jboss.seam.annotations.web.RequestParameter;
-
-/**
- * A base class for Seam components that utilize the RHQ remote API.
- *
- * @author Ian Springer
- */
-public abstract class AbstractPerspectiveUIBean {
- private static final String DEFAULT_SERVER_HOST = "127.0.0.1";
- private static final int DEFAULT_SERVER_PORT = 7080;
- private static final String DEFAULT_USERNAME = "rhqadmin";
- private static final String DEFAULT_PASSWORD = "rhqadmin";
-
- private final Log log = LogFactory.getLog(this.getClass());
-
- @RequestParameter("rhqServerHost")
- private String serverHost;
-
- @RequestParameter("rhqServerPort")
- private Integer serverPort;
-
- @RequestParameter("rhqUsername")
- private String username;
-
- @RequestParameter("rhqPassword")
- private String password;
-
- @RequestParameter("rhqSessionId")
- private Integer sessionId;
-
- private RemoteClient remoteClient;
- private Subject subject;
-
- protected RemoteClient getRemoteClient() throws Exception {
- if (this.remoteClient == null) {
- this.remoteClient = new RemoteClient(null, getServerHost(), getServerPort());
- }
- if (!this.remoteClient.isConnected()) {
- this.remoteClient.connect();
- }
- return this.remoteClient;
- }
-
- protected Subject getSubject() throws Exception {
- if (subject == null) {
- RemoteClient remoteClient = getRemoteClient();
- // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
- SubjectManagerRemote subjectManager = remoteClient.getSubjectManagerRemote();
- if (this.sessionId != null) {
- log.info("Retrieving subject for user [" + getUsername() + "] and sessionId [" + this.sessionId + "]...");
- this.subject = subjectManager.getSubjectByNameAndSessionId(getUsername(), this.sessionId);
- } else {
- log.info("Logging in as user [" + getUsername() + "] with password [" + getPassword() + "]...");
- this.subject = subjectManager.login(getUsername(), getPassword());
- }
- }
- return this.subject;
- }
-
- private String getServerHost() {
- return (this.serverHost != null) ? this.serverHost : DEFAULT_SERVER_HOST;
- }
-
- private int getServerPort() {
- return (this.serverPort != null) ? this.serverPort : DEFAULT_SERVER_PORT;
- }
-
- private String getUsername() {
- return (this.username != null) ? this.username : DEFAULT_USERNAME;
- }
-
- private String getPassword() {
- return (this.password != null) ? this.password : DEFAULT_PASSWORD;
- }
-}
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
index 96525dd..82643f8 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
@@ -1,9 +1,25 @@
package org.rhq.sample.perspective;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.core.gui.model.PagedDataModel;
+import org.rhq.core.gui.model.PagedDataProvider;
+import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.client.RemoteClient;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
+import org.rhq.enterprise.server.perspective.AbstractPagedDataPerspectiveUIBean;
+import org.richfaces.model.selection.Selection;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
/**
* A Seam component that utilizes the RHQ remote API to obtain a paged list of all inventoried Resources.
@@ -11,27 +27,78 @@ import org.rhq.enterprise.server.resource.ResourceManagerRemote;
* @author Ian Springer
*/
@Name("BrowseResourcesUIBean")
-public class BrowseResourcesUIBean extends AbstractPerspectiveUIBean {
- private ResourcesDataModel dataModel;
+(a)Scope(ScopeType.CONVERSATION)
+public class BrowseResourcesUIBean extends AbstractPagedDataPerspectiveUIBean {
+ private PagedDataModel<Resource> dataModel;
public BrowseResourcesUIBean() {
return;
}
- public ResourcesDataModel getDataModel() throws Exception {
+ @Begin(join = true)
+ public PagedDataModel<Resource> getDataModel() throws Exception {
if (this.dataModel == null) {
this.dataModel = createDataModel();
}
return this.dataModel;
}
- private ResourcesDataModel createDataModel() throws Exception {
+ public void uninventorySelectedResources() throws Exception {
RemoteClient remoteClient = getRemoteClient();
Subject subject = getSubject();
// ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
- ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
+ ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
+
+ Selection selection = getSelection();
+ Iterator<Object> keyIterator = selection.getKeys();
+ List<Integer> resourceIds = new ArrayList<Integer>();
+ while (keyIterator.hasNext()) {
+ Integer resourceId = (Integer) keyIterator.next();
+ if (selection.isSelected(resourceId)) {
+ resourceIds.add(resourceId);
+ }
+ }
+ int[] ids = ArrayUtils.unwrapCollection(resourceIds);
+
+ resourceManager.uninventoryResources(subject, ids);
+ // TODO: Add a Faces Message.
+
+ // Reset the data model, so the current page will get refreshed to reflect the Resources we just uninventoried.
+ this.dataModel = null;
+ }
+
+ @Override
+ protected PageControl getDefaultPageControl() {
+ PageControl defaultPageControl = super.getDefaultPageControl();
+ defaultPageControl.addDefaultOrderingField("r.id");
+ return defaultPageControl;
+ }
- return new ResourcesDataModel(subject, resourceManager);
+ private PagedDataModel<Resource> createDataModel() throws Exception {
+ RemoteClient remoteClient = getRemoteClient();
+ Subject subject = getSubject();
+
+ // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
+ ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
+
+ ResourcesDataProvider dataProvider = new ResourcesDataProvider(subject, resourceManager);
+ return new PagedDataModel<Resource>(dataProvider);
+ }
+
+ private class ResourcesDataProvider implements PagedDataProvider<Resource> {
+ private Subject subject;
+ private ResourceManagerRemote resourceManager;
+
+ public ResourcesDataProvider(Subject subject, ResourceManagerRemote resourceManager) {
+ this.subject = subject;
+ this.resourceManager = resourceManager;
+ }
+
+ public PageList<Resource> getDataPage(PageControl pageControl) {
+ ResourceCriteria resourceCriteria = new ResourceCriteria();
+ resourceCriteria.setPageControl(pageControl);
+ return this.resourceManager.findResourcesByCriteria(this.subject, resourceCriteria);
+ }
}
}
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
index c62f4d9..1482b22 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/CurrentResourceUIBean.java
@@ -8,6 +8,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.client.RemoteClient;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
+import org.rhq.enterprise.server.perspective.AbstractPerspectiveUIBean;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.web.RequestParameter;
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
index d5ffc71..cb2147a 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/RandomResourceUIBean.java
@@ -9,12 +9,11 @@ import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.client.RemoteClient;
+import org.rhq.enterprise.server.perspective.AbstractPerspectiveUIBean;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import org.jboss.seam.annotations.Name;
-import javassist.NotFoundException;
-
/**
* A Seam component that utilizes the RHQ remote API.
*
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/ResourcesDataModel.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/ResourcesDataModel.java
deleted file mode 100644
index b1d97ae..0000000
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/ResourcesDataModel.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.rhq.sample.perspective;
-
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.util.PageControl;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.core.gui.model.AbstractPagedDataModel;
-import org.rhq.enterprise.server.resource.ResourceManagerRemote;
-
-/**
- * @author Ian Springer
- */
-public class ResourcesDataModel extends AbstractPagedDataModel<Resource, Integer> {
- private Subject subject;
- private ResourceManagerRemote resourceManager;
-
- public ResourcesDataModel(Subject subject, ResourceManagerRemote resourceManager) {
- this.subject = subject;
- this.resourceManager = resourceManager;
- }
-
- @Override
- protected PageList<Resource> findObjects(PageControl pageControl) {
- ResourceCriteria resourceCriteria = new ResourceCriteria();
- resourceCriteria.setPageControl(pageControl);
- return this.resourceManager.findResourcesByCriteria(this.subject, resourceCriteria);
- }
-
- @Override
- protected PageControl getDefaultPageControl() {
- return new PageControl(0, 10);
- }
-}
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
index 65aeed2..8c702f1 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/WizardBean.java
@@ -14,6 +14,7 @@ import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.client.RemoteClient;
import org.rhq.enterprise.server.auth.SubjectManagerRemote;
import org.rhq.enterprise.server.authz.RoleManagerRemote;
+import org.rhq.enterprise.server.perspective.AbstractPerspectiveUIBean;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerRemote;
@@ -80,7 +81,7 @@ public class WizardBean extends AbstractPerspectiveUIBean {
//define enumeration to enforce type restriction.
enum Group {//Compatible == homogeneous AND mixed != homogeneous
- Compatible, Mixed;
+ Compatible, Mixed
}
private String groupType = Group.Mixed.name(); //REQUIRED: defaults to mixed to all resources show up
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/includes/pageControls.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/includes/pageControls.xhtml
new file mode 100644
index 0000000..777e30f
--- /dev/null
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/WEB-INF/includes/pageControls.xhtml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:onf="http://jboss.org/on/function">
+<body>
+
+ Usage: The following parameters must be set in the calling page:
+
+ dataTableName - Name of the data table to be controlled
+ dataModel - Data model of the underlying table being controlled (used for total row count)
+ pageControl - Page control value to set when changing the number of rows per page
+ pageControlSettingsUIBean (optional, defaults to #{DefaultPageControlSettingsUIBean}") - page control settings
+
+ <ui:composition>
+
+ <h:panelGroup layout="block" style="float: right; margin-right: 30px">
+ <ui:param name="dataScrollerName" value="#{dataTableName}Scroller"/>
+ <c:if test="#{empty pageControlSettingsUIBean}">
+ <ui:param name="pageControlSettingsUIBean" value="#{DefaultPageControlSettingsUIBean}"/>
+ </c:if>
+
+ <table>
+ <tr>
+ <td nowrap="nowrap">
+
+ <h:outputText value="Total: #{dataModel.rowCount}"
+ style="margin-right: 2em; font-weight: bold; "/>
+
+ <h:panelGroup layout="block" rendered="#{dataModel.rowCount gt pageControlSettingsUIBean.minimumPageSize
+ and pageControl.pageSize gt 0}">
+ <h:outputText value="Items Per Page: #{pageControl.pageSize}"
+ style="font-weight: bold; "
+ rendered="#{pageControlSettingsUIBean.pageSizeCount le 1}"/>
+ <h:panelGroup layout="block" rendered="#{pageControlSettingsUIBean.pageSizeCount gt 1}">
+ <h:outputText value="Items Per Page:"
+ style="margin-right: 1em; font-weight: bold; "/>
+ <h:selectOneListbox id="currentPageSize"
+ size="1"
+ value="#{pageControl.pageSize}">
+ <a4j:support event="onchange"
+ status="commonStatus"
+ reRender="#{dataTableName}, #{dataScrollerName}"/>
+ <f:selectItems value="#{pageControlSettingsUIBean.pageSizeSelectItems}"/>
+ </h:selectOneListbox>
+ </h:panelGroup>
+ </h:panelGroup>
+
+ </td>
+
+ <td nowrap="nowrap">
+
+ <rich:datascroller id="#{dataScrollerName}"
+ for="#{dataTableName}"
+ status="commonStatus"
+ rendered="#{pageControl.pageSize gt 0}"
+ selectedStyle="font-weight: bold;"
+ inactiveStyle="font-weight: normal;"
+ stepControls="show"
+ fastControls="hide"
+ boundaryControls="hide"
+ maxPages="#{pageControlSettingsUIBean.maximumPages}"
+ page="#{pageControl.pageNumber}">
+ <f:facet name="next">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="next_disabled">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageright_gray.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="previous">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft.gif" style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ <f:facet name="previous_disabled">
+ <h:panelGroup>
+ <h:graphicImage value="http://127.0.0.1:7080/images/tbb_pageleft_gray.gif"
+ style="padding: 0px 5px 0px 7px;"/>
+ </h:panelGroup>
+ </f:facet>
+ </rich:datascroller>
+
+ </td>
+ </tr>
+ </table>
+
+ </h:panelGroup>
+
+ <div style="clear: both;"/>
+
+ </ui:composition>
+
+</body>
+</html>
+
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
index 71bd6bf..3e354df 100644
--- a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -27,27 +27,53 @@
<h2>Browse Resources</h2>
- <rich:dataTable id="resources" value="#{BrowseResourcesUIBean.dataModel}"
- var="resource" rows="10" width="100%">
- <rich:column sortBy="id">
+ <ui:remove><!-- The table needs to be surrounded by a form for paging and sorting to work! --></ui:remove>
+ <h:form>
+ <rich:extendedDataTable id="resourcesDataTable"
+ value="#{BrowseResourcesUIBean.dataModel}" var="resource"
+ first="#{BrowseResourcesUIBean.pageControl.pageNumber}"
+ rows="#{BrowseResourcesUIBean.pageControl.pageSize}"
+ sortMode="multi"
+ selectionMode="multi" selection="#{BrowseResourcesUIBean.selection}"
+ width="100%">
+ <rich:column sortBy="#{r.id}" width="10%">
<f:facet name="header">
<h:outputLabel for="id" value="Id" />
</f:facet>
<h:outputText id="id" value="#{resource.id}" />
</rich:column>
- <rich:column sortBy="name">
+
+ <rich:column sortBy="#{r.name}" width="30%">
<f:facet name="header">
<h:outputLabel for="name" value="Name" />
</f:facet>
<h:outputText id="name" value="#{resource.name}" />
</rich:column>
- <rich:column sortBy="description">
+
+ <rich:column sortBy="#{r.description}" width="60%">
<f:facet name="header">
<h:outputLabel for="description" value="Description" />
</f:facet>
<h:outputText id="description" value="#{resource.description}" />
</rich:column>
- </rich:dataTable>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="8">
+ <a4j:commandButton value="UNINVENTORY"
+ action="#{BrowseResourcesUIBean.uninventorySelectedResources}"
+ reRender="resourcesDataTable, resourcesDataTableScroller" />
+
+ <ui:include src="/WEB-INF/includes/pageControls.xhtml">
+ <ui:param name="dataTableName" value="resourcesDataTable"/>
+ <ui:param name="dataModel" value="#{BrowseResourcesUIBean.dataModel}"/>
+ <ui:param name="pageControl" value="#{BrowseResourcesUIBean.pageControl}"/>
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+ </rich:extendedDataTable>
+ </h:form>
</f:view>
diff --git a/modules/core/gui/pom.xml b/modules/core/gui/pom.xml
index 96a3212..cef66ff 100644
--- a/modules/core/gui/pom.xml
+++ b/modules/core/gui/pom.xml
@@ -126,17 +126,17 @@
<!-- == Seam Related Dependencies ================ -->
- <dependency>
- <groupId>org.jboss.seam</groupId>
- <artifactId>jboss-seam</artifactId>
- <version>${seam.version}</version>
- <exclusions>
- <exclusion>
- <groupId>xml-apis</groupId>
- <artifactId>xml-apis</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
+ <dependency>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>jboss-seam</artifactId>
+ <version>${seam.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
</dependencies>
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java b/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
new file mode 100644
index 0000000..e4ea04e
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/model/DefaultPageControlSettingsUIBean.java
@@ -0,0 +1,47 @@
+package org.rhq.core.gui.model;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+
+import javax.faces.model.SelectItem;
+
+/**
+ * @author Ian Springer
+ */
+@Name("DefaultPageControlSettingsUIBean")
+(a)Scope(ScopeType.APPLICATION)
+public class DefaultPageControlSettingsUIBean {
+ private static final int[] PAGE_SIZES = new int[] {15, 30, 45};
+ private static final SelectItem[] PAGE_SIZE_SELECT_ITEMS = new SelectItem[PAGE_SIZES.length];
+ static {
+ for (int i = 0; i < PAGE_SIZES.length; i++) {
+ PAGE_SIZE_SELECT_ITEMS[i] = new SelectItem(PAGE_SIZES[i], Integer.valueOf(PAGE_SIZES[i]).toString());
+ }
+ }
+ private static final int MINIMUM_PAGE_SIZE = PAGE_SIZES[0];
+ private static final int DEFAULT_PAGE_SIZE = PAGE_SIZES[0];
+
+ /** Limit to 7 pages until e find a general fix for RHQ-1813. */
+ private static final int MAXIMUM_PAGES = 7;
+
+ public SelectItem[] getPageSizeSelectItems() {
+ return PAGE_SIZE_SELECT_ITEMS;
+ }
+
+ public int getPageSizeCount() {
+ return PAGE_SIZES.length;
+ }
+
+ public int getMinimumPageSize() {
+ return MINIMUM_PAGE_SIZE;
+ }
+
+ public int getDefaultPageSize() {
+ return DEFAULT_PAGE_SIZE;
+ }
+
+ public int getMaximumPages() {
+ return MAXIMUM_PAGES;
+ }
+}
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java b/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java
new file mode 100644
index 0000000..ab6d02c
--- /dev/null
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/model/PagedDataProvider.java
@@ -0,0 +1,19 @@
+package org.rhq.core.gui.model;
+
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+
+/**
+ * A class that is able to return a paged, and optionally sorted, set of domain objects of type {@link T}}. Paging and
+ * sorting are done as specified by a provided {@link PageControl page control}.
+ *
+ * @param <T> the domain object type (e.g. org.rhq.core.domain.Resource)
+ */
+public interface PagedDataProvider<T> {
+ /**
+ * @param pageControl the page control that specifies which page to fetch and what field(s) to sort by
+ *
+ * @return List<T> the requested page, which also includes the total size of the data set
+ */
+ PageList<T> getDataPage(PageControl pageControl);
+}
diff --git a/modules/core/gui/src/main/resources/seam.properties b/modules/core/gui/src/main/resources/seam.properties
new file mode 100644
index 0000000..e6a8baf
--- /dev/null
+++ b/modules/core/gui/src/main/resources/seam.properties
@@ -0,0 +1,3 @@
+# NOTE: The presence of this file tells Seam to scan this JAR for Seam
+# components (i.e. classes with Name annotations) and to deploy
+# any that it finds.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/view.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/view.xhtml
index 7aba4ad..9598bfc 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/view.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/view.xhtml
@@ -1,781 +1,779 @@
-<?xml version="1.0"?>
-<!--
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:onc="http://jboss.org/on/component"
- xmlns:onf="http://jboss.org/on/function"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-
-<ui:composition template="/rhq/resource/layout/main.xhtml">
-
-<ui:param name="pageTitle" value="#{ResourceUIBean.resourceType.name} '#{ResourceUIBean.name}' - Inventory Data"/>
-<ui:param name="selectedTabName" value="Inventory.Overview"/>
-
-<ui:define name="content">
-
-
-
-<!-- =================== GENERAL PROPERTIES =================== -->
-<rich:panel styleClass="BlockContent">
-
- <f:facet name="header" styleClass="BlockTitle">
- General Properties
- </f:facet>
-
- <h:panelGrid columns="2" styleClass="general-props-table" columnClasses="general-prop-cell">
- <h:panelGroup layout="block">
- <b>Name: </b> <h:outputText value="#{ResourceUIBean.name}"/>
- </h:panelGroup>
-
- <rich:spacer/>
-
- <h:panelGroup layout="block">
- <b>Type: </b> <h:outputText value="#{ResourceUIBean.resourceType.name} (#{ResourceUIBean.resourceType.plugin})"/>
- </h:panelGroup>
-
- <h:panelGroup layout="block">
- <b>Date Created: </b>
- <h:outputText value="#{ResourceUIBean.ctime}">
- <f:converter converterId="UserDateTimeConverter" />
- </h:outputText>
- </h:panelGroup>
-
- <h:panelGroup layout="block">
- <h:outputText value="Version: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceUIBean.version}" rendered="#{!empty ResourceUIBean.version}"/>
- <h:outputText value="none" style="font-style: italic" rendered="#{empty ResourceUIBean.version}"/>
- </h:panelGroup>
-
- <h:panelGroup layout="block">
- <b>Date Last Modified: </b>
- <h:outputText value="#{ResourceUIBean.mtime}">
- <f:converter converterId="UserDateTimeConverter" />
- </h:outputText>
- </h:panelGroup>
-
- <h:panelGroup layout="block">
- <h:outputText value="Description: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceUIBean.description}" rendered="#{!empty ResourceUIBean.description}"/>
- <h:outputText value="none" style="font-style: italic" rendered="#{empty ResourceUIBean.description}"/>
- </h:panelGroup>
-
- <h:panelGroup layout="block">
- <h:outputText value="Resource Key: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceUIBean.resourceKey}" rendered="#{!empty ResourceUIBean.resourceKey}"/>
- <h:outputText value="none" style="font-style: italic" rendered="#{empty ResourceUIBean.resourceKey}"/>
- </h:panelGroup>
-
-
- <h:panelGroup layout="block" rendered="#{ResourceUIBean.resourceType.category == 'PLATFORM'}">
- <h:outputText value="Location: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceUIBean.location}" rendered="#{!empty ResourceUIBean.location}"/>
- <h:outputText value="unknown" style="font-style: italic" rendered="#{empty ResourceUIBean.location}"/>
- </h:panelGroup>
- </h:panelGrid>
-
- <h:form id="viewGeneralPropertiesForm">
-
- <input type="hidden" name="id" value="#{param.id}"/>
-
- <h:panelGrid columns="1" styleClass="buttons-table" columnClasses="button-cell"
- rendered="#{ResourceUIBean.permissions.inventory}">
- <h:commandButton value="EDIT..." action="#{EditGeneralPropertiesUIBean.begin}"
- title="Edit General Properties" styleClass="buttonmed"/>
- </h:panelGrid>
-
- </h:form>
-
-</rich:panel>
-
-<!-- =================== CHILD RESOURCES =================== -->
-<rich:panel styleClass="BlockContent">
-
-<f:facet name="header" styleClass="BlockTitle">
- <a name="ChildResources"/>
- Child Resources
-</f:facet>
-
-<h:form id="childResourcesForm">
-
- <input type="hidden" name="id" value="#{param.id}"/>
-
- <ui:remove><!--
- This method call clears any stale session-scoped beans that might have been left
- by previous calls to creation pages of various child resources.
- This then prevents the duplicate id errors when those pages are re-entered.
- --></ui:remove>
- #{ListChildResourcesUIBean.clearStaleBeans}
-
-<!-- CHILD RESOURCE TYPE FILTER -->
-<h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.utilizedChildTypesCount > 1}" style="margin-bottom: 6px;">
-
- <b>Filter By: </b>
- <h:selectOneMenu id="childTypeFilter" value="#{ListChildResourcesUIBean.childTypeFilter}">
- <a4j:support event="onchange"
- reRender="childResourcesDataTable, childResourcesDataTableScroller"
- oncomplete="disableConditionalButtons();"
- status="commonStatus"/>
-
- <f:selectItem itemLabel="All Resources" itemValue="ALL"/>
- <f:selectItems value="#{ListChildResourcesUIBean.utilizedChildServerTypes}"/>
- <f:selectItems value="#{ListChildResourcesUIBean.utilizedChildServiceTypes}"/>
- </h:selectOneMenu>
-
-
-
-</h:panelGroup>
-
-<h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.dataModel.rowCount == 0}">
- <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.childTypesCount == 0}">
- Resources of this type do not have child resources.
- </h:panelGroup>
- <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.childTypesCount > 0}">
- This resource does not currently have any child resources.
- </h:panelGroup>
-</h:panelGroup>
-
-<ui:param name="childResourcesDataModel" value="#{ListChildResourcesUIBean.dataModel}"/>
-<rich:dataTable id="childResourcesDataTable"
- rows="#{PageControl.ChildResourcesList.pageSize}"
- value="#{childResourcesDataModel}"
- rendered="#{ListChildResourcesUIBean.dataModel.rowCount > 0}"
- var="resourceComposite"
- styleClass="resources-table"
- columnClasses="resource-checkbox, resource-quicknav-cell, resource-name-cell, resource-category-cell, resource-type-cell, resource-plugin-cell, resource-description-cell, resource-availability-cell"
- columnsWidth="1%,1%"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
- onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
- <f:facet name="PageControlView">
- <onc:paginationControl id="ChildResourcesList"/>
- </f:facet>
-
- <rich:column>
- <f:facet name="header">
- <onc:allSelect target="selectedResources"/>
- </f:facet>
-
- <onc:select name="selectedResources" value="#{resourceComposite.resource.id}"
- rendered="#{resourceComposite.resource.resourceType.deletable}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Quick Links"/>
- </f:facet>
-
- <onc:quickNav>
- <f:param name="id" value="#{resourceComposite.resource.id}"/>
-
- <onc:icon name="Monitor"
- url="/rhq/resource/monitor/graphs.xhtml"
- alt="Monitor"
- visible="#{monitorEnabled}">
- </onc:icon>
-
- <onc:icon name="Inventory"
- url="/rhq/resource/inventory/view.xhtml"
- alt="Inventory"/>
-
- <onc:icon name="Alert"
- url="/rhq/resource/alert/listAlertDefinitions.xhtml"
- alt="Alerts"
- visible="#{monitorEnabled}"/>
-
- <onc:icon name="Configure"
- url="/rhq/resource/configuration/view.xhtml"
- alt="Configure"
- visible="#{resourceComposite.resourceFacets.configuration}"/>
-
- <onc:icon name="Operation"
- url="/rhq/resource/operation/resourceOperationScheduleNew.xhtml"
- alt="Operations"
- visible="#{resourceComposite.resourceFacets.operation}"/>
-
- <onc:icon name="Events"
- url="/rhq/resource/events/history.xhtml"
- alt="Events"
- visible="#{resourceComposite.resourceFacets.event}" />
-
- <onc:icon name="Content"
- url="/rhq/resource/content/view.xhtml"
- alt="Content"
- visible="#{resourceComposite.resourceFacets.content}"/>
-
- </onc:quickNav>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="res.name">
- <h:outputText styleClass="headerText" value="Name"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
- <f:param name="id" value="#{resourceComposite.resource.id}"/>
- <h:outputText value="#{resourceComposite.resource.name}"/>
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="res.resourceType.category">
- <h:outputText styleClass="headerText" value="Category"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{resourceComposite.resource.resourceType.category}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="res.resourceType.name">
- <h:outputText styleClass="headerText" value="Type"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{resourceComposite.resource.resourceType.name}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="res.resourceType.plugin">
- <h:outputText styleClass="headerText" value="Plugin"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{resourceComposite.resource.resourceType.plugin}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Description"/>
- </f:facet>
-
- <h:outputText value="#{resourceComposite.resource.description}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="a.availabilityType">
- <h:outputText styleClass="headerText" value="Availability"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:graphicImage value="/images/icons/availability_green_16.png" alt="Up" title="Up"
- rendered="#{resourceComposite.availability == 'UP'}"/>
- <h:graphicImage value="/images/icons/availability_red_16.png" alt="Down" title="Down"
- rendered="#{resourceComposite.availability == 'DOWN'}"/>
- <h:graphicImage value="/images/icons/availability_grey_16.png" alt="Unknown" title="Unknown"
- rendered="#{resourceComposite.availability == null}"/>
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="8">
- <onc:selectCommandButton action="#{DeleteResourcesUIBean.deleteSelectedResources}"
- value="DELETE" target="selectedResources"
- onclick="if (!confirm('#{msg['resource.inventory.view.deleteResourceConfirm']}')) return false"
- styleClass="on-pager-button buttonsmall" />
-
- <ui:include src="../include/pagination.xhtml">
- <ui:param name="paginationDataTableName" value="childResourcesDataTable"/>
- <ui:param name="paginationDataModel" value="#{childResourcesDataModel}"/>
- <ui:param name="paginationPageControl" value="#{PageControl.ChildResourcesList}"/>
- </ui:include>
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
-</rich:dataTable>
-
-</h:form>
-
-<script type="text/javascript">
- function addManuallyAddResourceTypeRequestParam(form)
- {
- var typeInput = form.elements['type'];
- typeInput.setAttribute("value", form.elements['manuallyAddResourceForm:manuallyAddResourceTypeInput'].value);
- }
-
- function addCreateNewResourceTypeRequestParam(form)
- {
- var typeInput = form.elements['type'];
- typeInput.setAttribute("value", form.elements['createNewResourceForm:createNewResourceTypeInput'].value);
- }
-</script>
-
-<h:panelGrid columns="3" styleClass="data-table" columnClasses="resources-control-cell" style="margin-top: 7px;"
- rendered="#{ResourceUIBean.permissions.createChildResources}" >
-
- <ui:remove><!-- column 1 --></ui:remove>
- <h:panelGroup>
- <h:form id="manuallyAddResourceForm" onsubmit="addManuallyAddResourceTypeRequestParam(this)">
-
- <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.manuallyAddableChildTypesCount > 0}">
-
- <input type="hidden" name="id" value="#{param.id}"/>
-
- <input type="hidden" name="type"/>
- <h:panelGrid columns="3" styleClass="buttons-table" columnClasses="button-cell">
- <h:outputText style="font-weight: bold;" value="Manually Add:"/>
- <h:selectOneMenu id="manuallyAddResourceTypeInput" value="#{ListChildResourcesUIBean.manuallyAddResourceTypeId}">
- <f:selectItem itemLabel="Select Type" itemValue="" itemDisabled="true"/>
- <f:selectItems value="#{ListChildResourcesUIBean.manuallyAddableChildServerTypes}"/>
- <f:selectItems value="#{ListChildResourcesUIBean.manuallyAddableChildServiceTypes}"/>
- </h:selectOneMenu>
- <h:commandButton action="#{ManuallyAddChildResourceUIBean.startWorkflow}" value="OK"
- styleClass="buttonmed" style="margin-left: 3px"/>
- </h:panelGrid>
- </h:panelGroup>
- </h:form>
- </h:panelGroup>
-
- <ui:remove><!-- column 2 --></ui:remove>
- <h:panelGroup>
- <h:form id="createNewResourceForm" onsubmit="addCreateNewResourceTypeRequestParam(this)">
-
- <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.creatableChildTypesCount > 0}">
-
- <input type="hidden" name="id" value="#{param.id}"/>
- <input type="hidden" name="parent" value="#{param.id}"/>
-
- <input type="hidden" name="type"/>
- <input type="hidden" name="mode" value="edit"/>
- <h:panelGrid columns="3" styleClass="buttons-table" columnClasses="button-cell">
- <h:outputText style="font-weight: bold;" value="Create New:"/>
- <h:selectOneMenu id="createNewResourceTypeInput" value="#{ListChildResourcesUIBean.createNewResourceTypeId}">
- <f:selectItem itemLabel="Select Type" itemValue="" itemDisabled="true"/>
- <f:selectItems value="#{ListChildResourcesUIBean.creatableChildServerTypes}"/>
- <f:selectItems value="#{ListChildResourcesUIBean.creatableChildServiceTypes}"/>
- </h:selectOneMenu>
- <h:commandButton id="createNewOKBtn" action="#{DetermineChildResourceCreationTypeUIBean.determineCreationType}" value="OK"
- styleClass="buttonmed" style="margin-left: 3px"/>
- </h:panelGrid>
- </h:panelGroup>
- </h:form>
- </h:panelGroup>
-
-</h:panelGrid>
-
-<!-- =================== CREATE CHILD RESOURCES HISTORY =================== -->
-<h:form id="createResourceHistoryForm">
- <input type="hidden" name="id" value="#{param.id}"/>
-
-<rich:panel rendered="#{ListCreateResourceHistoryUIBean.createHistoryCount > 0}" styleClass="BlockContent">
-<f:facet name="header" styleClass="BlockTitle"><h:outputText value="History of create child resource requests"/></f:facet>
-
-<ui:param name="createHistoryDataModel" value="#{ListCreateResourceHistoryUIBean.dataModel}"/>
-<rich:dataTable id="createHistoryDataTable"
- rows="#{PageControl.CreateResourceHistory.pageSize}"
- value="#{createHistoryDataModel}"
- var="createItem"
- width="100%"
- columnsWidth="12%,22%,16%,12%,13%,13%,12%"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
- onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
-
-<f:facet name="PageControlView">
- <onc:paginationControl id="CreateResourceHistory"/>
-</f:facet>
-
-<ui:remove><!-- Resource Type Name --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="crh.resourceType.name">
- <h:outputText styleClass="headerText" value="Created Resource Type"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{createItem.resourceType.name}"/>
-</rich:column>
-
-<ui:remove><!-- Resource Key --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="crh.newResourceKey">
- <h:outputText styleClass="headerText" value="Created Resource Key"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{createItem.newResourceKey}" rendered="#{createItem.newResourceKey ne null}"/>
- <i><h:outputText value="Plugin has not specified a key yet" rendered="#{createItem.newResourceKey eq null and createItem.status ne 'FAILURE'}"/></i>
- <i><h:outputText value="No resource key specified for failed request" rendered="#{createItem.newResourceKey eq null and createItem.status eq 'FAILURE'}"/></i>
-</rich:column>
-
-<ui:remove><!-- Request Status --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="crh.status">
- <h:outputText styleClass="headerText" value="Request Status"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{createItem.status}" rendered="#{createItem.status ne 'FAILURE'}"/>
- <onc:errorPopup popupId="create-#{createItem.id}" errorMessage="#{createItem.errorMessage}" rendered="#{createItem.status eq 'FAILURE'}">Failure</onc:errorPopup>
-</rich:column>
-
-<ui:remove><!-- Request Start Time --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="crh.ctime">
- <h:outputText styleClass="headerText" value="Request Started"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{createItem.createdTime}">
- <f:converter converterId="UserDateTimeConverter" />
- </h:outputText>
-</rich:column>
-
-<ui:remove><!-- Last Modified Time --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="crh.mtime">
- <h:outputText styleClass="headerText" value="Last Request Update"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{createItem.lastModifiedTime}">
- <f:converter converterId="UserDateTimeConverter" />
- </h:outputText>
-</rich:column>
-
-<ui:remove><!-- User --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="crh.subjectName">
- <h:outputText styleClass="headerText" value="User"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="${createItem.subjectName}"/>
-</rich:column>
-
-<ui:remove><!-- Retry failed create link --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Resubmit"/>
- </f:facet>
- <h:commandLink action="#{DetermineChildResourceCreationTypeUIBean.determineCreationType}" rendered="#{createItem.status eq 'FAILURE'}">
- <f:param name="retryCreateItemId" value="#{createItem.id}"/>
- <h:outputText value="Resubmit"/>
- </h:commandLink>
-</rich:column>
-
-<f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="8">
- <ui:param name="paginationDataTableName" value="createHistoryDataTable"/>
- <ui:param name="paginationDataModel" value="#{createHistoryDataModel}"/>
- <ui:param name="paginationPageControl" value="#{PageControl.CreateResourceHistory}"/>
- <ui:include src="../include/pagination.xhtml"/>
- </rich:column>
- </rich:columnGroup>
-</f:facet>
-
-</rich:dataTable>
-
-</rich:panel>
-</h:form>
-
-<!-- =================== DELETE CHILD RESOURCES HISTORY =================== -->
-<h:form id="deleteResourceHistoryForm">
- <input type="hidden" name="id" value="#{param.id}"/>
-
-<rich:panel rendered="#{ListDeleteResourceHistoryUIBean.deleteHistoryCount > 0}" styleClass="BlockContent">
-<f:facet name="header" styleClass="BlockTitle"><h:outputText value="History of delete child resource requests"/></f:facet>
-
-<ui:param name="deleteHistoryDataModel" value="#{ListDeleteResourceHistoryUIBean.dataModel}"/>
-<rich:dataTable id="deleteHistoryDataTable"
- rows="#{PageControl.DeleteResourceHistory.pageSize}"
- value="#{deleteHistoryDataModel}"
- var="deleteItem"
- width="100%"
- columnsWidth="16%,16%,17%,17%,17%,17%"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
- onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
-<f:facet name="PageControlView">
- <onc:paginationControl id="DeleteResourceHistory"/>
-</f:facet>
-
-<ui:remove><!-- Resource Name --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="drh.resource.name">
- <h:outputText styleClass="headerText" value="Deleted Resource Name"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{deleteItem.resource.name}"/>
-</rich:column>
-
-<ui:remove><!-- Resource Type --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="drh.resource.resourceType.name">
- <h:outputText styleClass="headerText" value="Deleted Resource Type"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{deleteItem.resource.resourceType.name}"/>
-</rich:column>
-
-<ui:remove><!-- Request Status --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="drh.status">
- <h:outputText styleClass="headerText" value="Request Status"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{deleteItem.status}" rendered="#{deleteItem.status ne 'FAILURE'}"/>
- <onc:errorPopup popupId="delete-#{deleteItem.id}" errorMessage="#{deleteItem.errorMessage}" rendered="#{deleteItem.status eq 'FAILURE'}">Failure</onc:errorPopup>
-
-</rich:column>
-
-<ui:remove><!-- Request Started Time --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="drh.ctime">
- <h:outputText styleClass="headerText" value="Request Started"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{deleteItem.createdTime}">
- <f:converter converterId="UserDateTimeConverter" />
- </h:outputText>
-</rich:column>
-
-<ui:remove><!-- Request Updated Time --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="drh.mtime">
- <h:outputText styleClass="headerText" value="Last Request Update"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{deleteItem.lastModifiedTime}">
- <f:converter converterId="UserDateTimeConverter" />
- </h:outputText>
-</rich:column>
-
-<ui:remove><!-- User --></ui:remove>
-<rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="drh.subjectName">
- <h:outputText styleClass="headerText" value="User"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="${deleteItem.subjectName}"/>
-</rich:column>
-
-<f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="6">
- <ui:param name="paginationDataTableName" value="deleteHistoryDataTable"/>
- <ui:param name="paginationDataModel" value="#{deleteHistoryDataModel}"/>
- <ui:param name="paginationPageControl" value="#{PageControl.DeleteResourceHistory}"/>
- <ui:include src="../include/pagination.xhtml"/>
- </rich:column>
- </rich:columnGroup>
-</f:facet>
-
-
-</rich:dataTable>
-
-</rich:panel>
-
-</h:form>
-
-</rich:panel>
-
-<!-- =================== GROUPS CONTAINING THIS RESOURCE =================== -->
-<rich:panel styleClass="BlockContent">
- <f:facet name="header" styleClass="BlockTitle">
- Groups Containing this Resource
- </f:facet>
-
- <h:form id="containingGroupsForm">
-
- <input type="hidden" name="id" value="#{param.id}"/>
-
- <a4j:keepAlive beanName="ListContainingGroupsUIBean" />
-
- <h:panelGroup layout="block" rendered="#{ListContainingGroupsUIBean.dataModel.rowCount == 0}">
- This resource is not currently a member of any groups.
- </h:panelGroup>
-
- <ui:param name="containingGroupsDataModel" value="#{ListContainingGroupsUIBean.dataModel}"/>
-
- <rich:dataTable id="containingGroupsDataTable"
- rows="#{PageControl.ContainingGroupsList.pageSize}"
- value="#{containingGroupsDataModel}"
- rendered="#{ListContainingGroupsUIBean.dataModel.rowCount > 0}"
- var="resourceGroupComposite"
- styleClass="resources-table"
- columnClasses="resource-quicknav-cell, group-category-cell, resource-name-cell, resource-description-cell, resource-availability-cell, resource-availability-cell"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
- onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
- <f:facet name="PageControlView">
- <onc:paginationControl id="ContainingGroupsList"/>
- </f:facet>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Quick Links"/>
- </f:facet>
-
- <onc:quickNav>
- <ui:remove><!-- Pass 'groupId' param to all child icons. --></ui:remove>
- <f:param name="groupId" value="#{resourceGroupComposite.resourceGroup.id}"/>
-
- <ui:remove>
- <!-- Include the Alert, Event and Content tabs even though we currently don't support them for
- Groups, so that the icon renderer can still render spacers. -->
- </ui:remove>
-
- <onc:icon name="Monitor" url="/rhq/group/monitor/graphs.xhtml" alt="Monitor"
- visible="#{monitorEnabled and resourceGroupComposite.category.name eq 'COMPATIBLE'}">
- <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
- </onc:icon>
-
- <onc:icon name="Inventory" url="/rhq/group/inventory/view.xhtml" alt="Inventory">
- <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
- </onc:icon>
-
- <onc:icon name="Alert" url="/rhq/group/alert/listGroupAlertDefinitions.xhtml" alt="Alert"
- visible="#{monitorEnabled and resourceGroupComposite.category.name eq 'COMPATIBLE'}"/>
-
- <onc:icon name="Configure" url="/rhq/group/configuration/viewCurrent.xhtml" alt="Configure"
- visible="#{resourceGroupComposite.category.name eq 'COMPATIBLE' and
- resourceGroupComposite.resourceFacets.configuration}">
- <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
- </onc:icon>
-
- <onc:icon name="Operation" url="/rhq/group/operation/groupOperationScheduleNew.xhtml" alt="Operations"
- visible="#{resourceGroupComposite.category.name eq 'COMPATIBLE' and
- resourceGroupComposite.resourceFacets.operation}">
- <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
- </onc:icon>
-
- <onc:icon name="Events" url="/rhq/resource/events/history.xhtml" alt="Events"
- visible="#{false and resourceGroupComposite.category.name eq 'COMPATIBLE' and
- resourceGroupComposite.resourceFacets.event}"/>
-
- <onc:icon name="Content" url="/rhq/resource/content/view.xhtml" alt="Content"
- visible="#{false and resourceGroupComposite.category.name eq 'COMPATIBLE' and
- resourceGroupComposite.resourceFacets.content}"/>
-
- </onc:quickNav>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Type"/>
- </f:facet>
-
- <h:outputText value="#{resourceGroupComposite.category}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="rg.name">
- <h:outputText styleClass="headerText" value="Name"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputLink value="/rhq/group/monitor/graphs.xhtml"
- rendered="#{resourceGroupComposite.category.name eq 'COMPATIBLE'}">
- <f:param name="groupId" value="#{resourceGroupComposite.resourceGroup.id}"/>
- <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
- <h:outputText value="#{resourceGroupComposite.resourceGroup.name}"/>
- </h:outputLink>
- <h:outputLink value="/rhq/group/inventory/view.xhtml"
- rendered="#{resourceGroupComposite.category.name eq 'MIXED'}">
- <f:param name="groupId" value="#{resourceGroupComposite.resourceGroup.id}"/>
- <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
- <f:param name="mode" value="view"/>
- <h:outputText value="#{resourceGroupComposite.resourceGroup.name}"/>
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="rg.description">
- <h:outputText styleClass="headerText" value="Description"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{resourceGroupComposite.resourceGroup.description}"/>
- </rich:column>
-
- <rich:column styleClass="resource-availability-cell">
- <f:facet name="header">
- <h:panelGroup>
- <onc:sortableColumnHeader sort="explicitAvail">
- <h:outputText value="Children" />
- </onc:sortableColumnHeader>
- </h:panelGroup>
- </f:facet>
-
- <h:outputText value="#{resourceGroupComposite.explicitFormatted}"
- escape="false" />
- </rich:column>
-
- <rich:column styleClass="resource-availability-cell">
- <f:facet name="header">
- <h:panelGroup>
- <onc:sortableColumnHeader sort="implicitAvail">
- <h:outputText value="Descendents" />
- </onc:sortableColumnHeader>
- </h:panelGroup>
- </f:facet>
-
- <h:outputText value="#{resourceGroupComposite.implicitFormatted}"
- escape="false" />
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="6">
- <ui:param name="paginationDataTableName" value="containingGroupsDataTable"/>
- <ui:param name="paginationDataModel" value="#{containingGroupsDataModel}"/>
- <ui:param name="paginationPageControl" value="#{PageControl.ContainingGroupsList}"/>
- <ui:include src="../include/pagination.xhtml"/>
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
- </rich:dataTable>
-
- </h:form>
-
-</rich:panel>
-
-</ui:define>
-
-</ui:composition>
-
-</html>
+<?xml version="1.0"?>
+<!--
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:onc="http://jboss.org/on/component"
+ xmlns:onf="http://jboss.org/on/function"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
+<ui:composition template="/rhq/resource/layout/main.xhtml">
+
+<ui:param name="pageTitle" value="#{ResourceUIBean.resourceType.name} '#{ResourceUIBean.name}' - Inventory Data"/>
+<ui:param name="selectedTabName" value="Inventory.Overview"/>
+
+<ui:define name="content">
+
+<!-- =================== GENERAL PROPERTIES =================== -->
+<rich:panel styleClass="BlockContent">
+
+ <f:facet name="header" styleClass="BlockTitle">
+ General Properties
+ </f:facet>
+
+ <h:panelGrid columns="2" styleClass="general-props-table" columnClasses="general-prop-cell">
+ <h:panelGroup layout="block">
+ <b>Name: </b> <h:outputText value="#{ResourceUIBean.name}"/>
+ </h:panelGroup>
+
+ <rich:spacer/>
+
+ <h:panelGroup layout="block">
+ <b>Type: </b> <h:outputText value="#{ResourceUIBean.resourceType.name} (#{ResourceUIBean.resourceType.plugin})"/>
+ </h:panelGroup>
+
+ <h:panelGroup layout="block">
+ <b>Date Created: </b>
+ <h:outputText value="#{ResourceUIBean.ctime}">
+ <f:converter converterId="UserDateTimeConverter" />
+ </h:outputText>
+ </h:panelGroup>
+
+ <h:panelGroup layout="block">
+ <h:outputText value="Version: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceUIBean.version}" rendered="#{!empty ResourceUIBean.version}"/>
+ <h:outputText value="none" style="font-style: italic" rendered="#{empty ResourceUIBean.version}"/>
+ </h:panelGroup>
+
+ <h:panelGroup layout="block">
+ <b>Date Last Modified: </b>
+ <h:outputText value="#{ResourceUIBean.mtime}">
+ <f:converter converterId="UserDateTimeConverter" />
+ </h:outputText>
+ </h:panelGroup>
+
+ <h:panelGroup layout="block">
+ <h:outputText value="Description: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceUIBean.description}" rendered="#{!empty ResourceUIBean.description}"/>
+ <h:outputText value="none" style="font-style: italic" rendered="#{empty ResourceUIBean.description}"/>
+ </h:panelGroup>
+
+ <h:panelGroup layout="block">
+ <h:outputText value="Resource Key: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceUIBean.resourceKey}" rendered="#{!empty ResourceUIBean.resourceKey}"/>
+ <h:outputText value="none" style="font-style: italic" rendered="#{empty ResourceUIBean.resourceKey}"/>
+ </h:panelGroup>
+
+
+ <h:panelGroup layout="block" rendered="#{ResourceUIBean.resourceType.category == 'PLATFORM'}">
+ <h:outputText value="Location: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceUIBean.location}" rendered="#{!empty ResourceUIBean.location}"/>
+ <h:outputText value="unknown" style="font-style: italic" rendered="#{empty ResourceUIBean.location}"/>
+ </h:panelGroup>
+ </h:panelGrid>
+
+ <h:form id="viewGeneralPropertiesForm">
+
+ <input type="hidden" name="id" value="#{param.id}"/>
+
+ <h:panelGrid columns="1" styleClass="buttons-table" columnClasses="button-cell"
+ rendered="#{ResourceUIBean.permissions.inventory}">
+ <h:commandButton value="EDIT..." action="#{EditGeneralPropertiesUIBean.begin}"
+ title="Edit General Properties" styleClass="buttonmed"/>
+ </h:panelGrid>
+
+ </h:form>
+
+</rich:panel>
+
+<!-- =================== CHILD RESOURCES =================== -->
+<rich:panel styleClass="BlockContent">
+
+<f:facet name="header" styleClass="BlockTitle">
+ <a name="ChildResources"/>
+ Child Resources
+</f:facet>
+
+<h:form id="childResourcesForm">
+
+ <input type="hidden" name="id" value="#{param.id}"/>
+
+ <ui:remove><!--
+ This method call clears any stale session-scoped beans that might have been left
+ by previous calls to creation pages of various child resources.
+ This then prevents the duplicate id errors when those pages are re-entered.
+ --></ui:remove>
+ #{ListChildResourcesUIBean.clearStaleBeans}
+
+<!-- CHILD RESOURCE TYPE FILTER -->
+<h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.utilizedChildTypesCount > 1}" style="margin-bottom: 6px;">
+
+ <b>Filter By: </b>
+ <h:selectOneMenu id="childTypeFilter" value="#{ListChildResourcesUIBean.childTypeFilter}">
+ <a4j:support event="onchange"
+ reRender="childResourcesDataTable, childResourcesDataTableScroller"
+ oncomplete="disableConditionalButtons();"
+ status="commonStatus"/>
+
+ <f:selectItem itemLabel="All Resources" itemValue="ALL"/>
+ <f:selectItems value="#{ListChildResourcesUIBean.utilizedChildServerTypes}"/>
+ <f:selectItems value="#{ListChildResourcesUIBean.utilizedChildServiceTypes}"/>
+ </h:selectOneMenu>
+
+
+
+</h:panelGroup>
+
+<h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.dataModel.rowCount == 0}">
+ <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.childTypesCount == 0}">
+ Resources of this type do not have child resources.
+ </h:panelGroup>
+ <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.childTypesCount > 0}">
+ This resource does not currently have any child resources.
+ </h:panelGroup>
+</h:panelGroup>
+
+<ui:param name="childResourcesDataModel" value="#{ListChildResourcesUIBean.dataModel}"/>
+<rich:dataTable id="childResourcesDataTable"
+ rows="#{PageControl.ChildResourcesList.pageSize}"
+ value="#{childResourcesDataModel}"
+ rendered="#{ListChildResourcesUIBean.dataModel.rowCount > 0}"
+ var="resourceComposite"
+ styleClass="resources-table"
+ columnClasses="resource-checkbox, resource-quicknav-cell, resource-name-cell, resource-category-cell, resource-type-cell, resource-plugin-cell, resource-description-cell, resource-availability-cell"
+ columnsWidth="1%,1%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+ onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+ <f:facet name="PageControlView">
+ <onc:paginationControl id="ChildResourcesList"/>
+ </f:facet>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:allSelect target="selectedResources"/>
+ </f:facet>
+
+ <onc:select name="selectedResources" value="#{resourceComposite.resource.id}"
+ rendered="#{resourceComposite.resource.resourceType.deletable}"/>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Quick Links"/>
+ </f:facet>
+
+ <onc:quickNav>
+ <f:param name="id" value="#{resourceComposite.resource.id}"/>
+
+ <onc:icon name="Monitor"
+ url="/rhq/resource/monitor/graphs.xhtml"
+ alt="Monitor"
+ visible="#{monitorEnabled}">
+ </onc:icon>
+
+ <onc:icon name="Inventory"
+ url="/rhq/resource/inventory/view.xhtml"
+ alt="Inventory"/>
+
+ <onc:icon name="Alert"
+ url="/rhq/resource/alert/listAlertDefinitions.xhtml"
+ alt="Alerts"
+ visible="#{monitorEnabled}"/>
+
+ <onc:icon name="Configure"
+ url="/rhq/resource/configuration/view.xhtml"
+ alt="Configure"
+ visible="#{resourceComposite.resourceFacets.configuration}"/>
+
+ <onc:icon name="Operation"
+ url="/rhq/resource/operation/resourceOperationScheduleNew.xhtml"
+ alt="Operations"
+ visible="#{resourceComposite.resourceFacets.operation}"/>
+
+ <onc:icon name="Events"
+ url="/rhq/resource/events/history.xhtml"
+ alt="Events"
+ visible="#{resourceComposite.resourceFacets.event}" />
+
+ <onc:icon name="Content"
+ url="/rhq/resource/content/view.xhtml"
+ alt="Content"
+ visible="#{resourceComposite.resourceFacets.content}"/>
+
+ </onc:quickNav>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="res.name">
+ <h:outputText styleClass="headerText" value="Name"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
+ <f:param name="id" value="#{resourceComposite.resource.id}"/>
+ <h:outputText value="#{resourceComposite.resource.name}"/>
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="res.resourceType.category">
+ <h:outputText styleClass="headerText" value="Category"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{resourceComposite.resource.resourceType.category}"/>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="res.resourceType.name">
+ <h:outputText styleClass="headerText" value="Type"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{resourceComposite.resource.resourceType.name}"/>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="res.resourceType.plugin">
+ <h:outputText styleClass="headerText" value="Plugin"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{resourceComposite.resource.resourceType.plugin}"/>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Description"/>
+ </f:facet>
+
+ <h:outputText value="#{resourceComposite.resource.description}"/>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="a.availabilityType">
+ <h:outputText styleClass="headerText" value="Availability"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:graphicImage value="/images/icons/availability_green_16.png" alt="Up" title="Up"
+ rendered="#{resourceComposite.availability == 'UP'}"/>
+ <h:graphicImage value="/images/icons/availability_red_16.png" alt="Down" title="Down"
+ rendered="#{resourceComposite.availability == 'DOWN'}"/>
+ <h:graphicImage value="/images/icons/availability_grey_16.png" alt="Unknown" title="Unknown"
+ rendered="#{resourceComposite.availability == null}"/>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="8">
+ <onc:selectCommandButton action="#{DeleteResourcesUIBean.deleteSelectedResources}"
+ value="DELETE" target="selectedResources"
+ onclick="if (!confirm('#{msg['resource.inventory.view.deleteResourceConfirm']}')) return false"
+ styleClass="on-pager-button buttonsmall" />
+
+ <ui:include src="../include/pagination.xhtml">
+ <ui:param name="paginationDataTableName" value="childResourcesDataTable"/>
+ <ui:param name="paginationDataModel" value="#{childResourcesDataModel}"/>
+ <ui:param name="paginationPageControl" value="#{PageControl.ChildResourcesList}"/>
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+</rich:dataTable>
+
+</h:form>
+
+<script type="text/javascript">
+ function addManuallyAddResourceTypeRequestParam(form)
+ {
+ var typeInput = form.elements['type'];
+ typeInput.setAttribute("value", form.elements['manuallyAddResourceForm:manuallyAddResourceTypeInput'].value);
+ }
+
+ function addCreateNewResourceTypeRequestParam(form)
+ {
+ var typeInput = form.elements['type'];
+ typeInput.setAttribute("value", form.elements['createNewResourceForm:createNewResourceTypeInput'].value);
+ }
+</script>
+
+<h:panelGrid columns="3" styleClass="data-table" columnClasses="resources-control-cell" style="margin-top: 7px;"
+ rendered="#{ResourceUIBean.permissions.createChildResources}" >
+
+ <ui:remove><!-- column 1 --></ui:remove>
+ <h:panelGroup>
+ <h:form id="manuallyAddResourceForm" onsubmit="addManuallyAddResourceTypeRequestParam(this)">
+
+ <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.manuallyAddableChildTypesCount > 0}">
+
+ <input type="hidden" name="id" value="#{param.id}"/>
+
+ <input type="hidden" name="type"/>
+ <h:panelGrid columns="3" styleClass="buttons-table" columnClasses="button-cell">
+ <h:outputText style="font-weight: bold;" value="Manually Add:"/>
+ <h:selectOneMenu id="manuallyAddResourceTypeInput" value="#{ListChildResourcesUIBean.manuallyAddResourceTypeId}">
+ <f:selectItem itemLabel="Select Type" itemValue="" itemDisabled="true"/>
+ <f:selectItems value="#{ListChildResourcesUIBean.manuallyAddableChildServerTypes}"/>
+ <f:selectItems value="#{ListChildResourcesUIBean.manuallyAddableChildServiceTypes}"/>
+ </h:selectOneMenu>
+ <h:commandButton action="#{ManuallyAddChildResourceUIBean.startWorkflow}" value="OK"
+ styleClass="buttonmed" style="margin-left: 3px"/>
+ </h:panelGrid>
+ </h:panelGroup>
+ </h:form>
+ </h:panelGroup>
+
+ <ui:remove><!-- column 2 --></ui:remove>
+ <h:panelGroup>
+ <h:form id="createNewResourceForm" onsubmit="addCreateNewResourceTypeRequestParam(this)">
+
+ <h:panelGroup layout="block" rendered="#{ListChildResourcesUIBean.creatableChildTypesCount > 0}">
+
+ <input type="hidden" name="id" value="#{param.id}"/>
+ <input type="hidden" name="parent" value="#{param.id}"/>
+
+ <input type="hidden" name="type"/>
+ <input type="hidden" name="mode" value="edit"/>
+ <h:panelGrid columns="3" styleClass="buttons-table" columnClasses="button-cell">
+ <h:outputText style="font-weight: bold;" value="Create New:"/>
+ <h:selectOneMenu id="createNewResourceTypeInput" value="#{ListChildResourcesUIBean.createNewResourceTypeId}">
+ <f:selectItem itemLabel="Select Type" itemValue="" itemDisabled="true"/>
+ <f:selectItems value="#{ListChildResourcesUIBean.creatableChildServerTypes}"/>
+ <f:selectItems value="#{ListChildResourcesUIBean.creatableChildServiceTypes}"/>
+ </h:selectOneMenu>
+ <h:commandButton id="createNewOKBtn" action="#{DetermineChildResourceCreationTypeUIBean.determineCreationType}" value="OK"
+ styleClass="buttonmed" style="margin-left: 3px"/>
+ </h:panelGrid>
+ </h:panelGroup>
+ </h:form>
+ </h:panelGroup>
+
+</h:panelGrid>
+
+<!-- =================== CREATE CHILD RESOURCES HISTORY =================== -->
+<h:form id="createResourceHistoryForm">
+ <input type="hidden" name="id" value="#{param.id}"/>
+
+<rich:panel rendered="#{ListCreateResourceHistoryUIBean.createHistoryCount > 0}" styleClass="BlockContent">
+<f:facet name="header" styleClass="BlockTitle"><h:outputText value="History of create child resource requests"/></f:facet>
+
+<ui:param name="createHistoryDataModel" value="#{ListCreateResourceHistoryUIBean.dataModel}"/>
+<rich:dataTable id="createHistoryDataTable"
+ rows="#{PageControl.CreateResourceHistory.pageSize}"
+ value="#{createHistoryDataModel}"
+ var="createItem"
+ width="100%"
+ columnsWidth="12%,22%,16%,12%,13%,13%,12%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+ onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+
+<f:facet name="PageControlView">
+ <onc:paginationControl id="CreateResourceHistory"/>
+</f:facet>
+
+<ui:remove><!-- Resource Type Name --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="crh.resourceType.name">
+ <h:outputText styleClass="headerText" value="Created Resource Type"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{createItem.resourceType.name}"/>
+</rich:column>
+
+<ui:remove><!-- Resource Key --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="crh.newResourceKey">
+ <h:outputText styleClass="headerText" value="Created Resource Key"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{createItem.newResourceKey}" rendered="#{createItem.newResourceKey ne null}"/>
+ <i><h:outputText value="Plugin has not specified a key yet" rendered="#{createItem.newResourceKey eq null and createItem.status ne 'FAILURE'}"/></i>
+ <i><h:outputText value="No resource key specified for failed request" rendered="#{createItem.newResourceKey eq null and createItem.status eq 'FAILURE'}"/></i>
+</rich:column>
+
+<ui:remove><!-- Request Status --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="crh.status">
+ <h:outputText styleClass="headerText" value="Request Status"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{createItem.status}" rendered="#{createItem.status ne 'FAILURE'}"/>
+ <onc:errorPopup popupId="create-#{createItem.id}" errorMessage="#{createItem.errorMessage}" rendered="#{createItem.status eq 'FAILURE'}">Failure</onc:errorPopup>
+</rich:column>
+
+<ui:remove><!-- Request Start Time --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="crh.ctime">
+ <h:outputText styleClass="headerText" value="Request Started"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{createItem.createdTime}">
+ <f:converter converterId="UserDateTimeConverter" />
+ </h:outputText>
+</rich:column>
+
+<ui:remove><!-- Last Modified Time --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="crh.mtime">
+ <h:outputText styleClass="headerText" value="Last Request Update"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{createItem.lastModifiedTime}">
+ <f:converter converterId="UserDateTimeConverter" />
+ </h:outputText>
+</rich:column>
+
+<ui:remove><!-- User --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="crh.subjectName">
+ <h:outputText styleClass="headerText" value="User"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="${createItem.subjectName}"/>
+</rich:column>
+
+<ui:remove><!-- Retry failed create link --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Resubmit"/>
+ </f:facet>
+ <h:commandLink action="#{DetermineChildResourceCreationTypeUIBean.determineCreationType}" rendered="#{createItem.status eq 'FAILURE'}">
+ <f:param name="retryCreateItemId" value="#{createItem.id}"/>
+ <h:outputText value="Resubmit"/>
+ </h:commandLink>
+</rich:column>
+
+<f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="8">
+ <ui:param name="paginationDataTableName" value="createHistoryDataTable"/>
+ <ui:param name="paginationDataModel" value="#{createHistoryDataModel}"/>
+ <ui:param name="paginationPageControl" value="#{PageControl.CreateResourceHistory}"/>
+ <ui:include src="../include/pagination.xhtml"/>
+ </rich:column>
+ </rich:columnGroup>
+</f:facet>
+
+</rich:dataTable>
+
+</rich:panel>
+</h:form>
+
+<!-- =================== DELETE CHILD RESOURCES HISTORY =================== -->
+<h:form id="deleteResourceHistoryForm">
+ <input type="hidden" name="id" value="#{param.id}"/>
+
+<rich:panel rendered="#{ListDeleteResourceHistoryUIBean.deleteHistoryCount > 0}" styleClass="BlockContent">
+<f:facet name="header" styleClass="BlockTitle"><h:outputText value="History of delete child resource requests"/></f:facet>
+
+<ui:param name="deleteHistoryDataModel" value="#{ListDeleteResourceHistoryUIBean.dataModel}"/>
+<rich:dataTable id="deleteHistoryDataTable"
+ rows="#{PageControl.DeleteResourceHistory.pageSize}"
+ value="#{deleteHistoryDataModel}"
+ var="deleteItem"
+ width="100%"
+ columnsWidth="16%,16%,17%,17%,17%,17%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+ onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+<f:facet name="PageControlView">
+ <onc:paginationControl id="DeleteResourceHistory"/>
+</f:facet>
+
+<ui:remove><!-- Resource Name --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="drh.resource.name">
+ <h:outputText styleClass="headerText" value="Deleted Resource Name"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{deleteItem.resource.name}"/>
+</rich:column>
+
+<ui:remove><!-- Resource Type --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="drh.resource.resourceType.name">
+ <h:outputText styleClass="headerText" value="Deleted Resource Type"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{deleteItem.resource.resourceType.name}"/>
+</rich:column>
+
+<ui:remove><!-- Request Status --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="drh.status">
+ <h:outputText styleClass="headerText" value="Request Status"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{deleteItem.status}" rendered="#{deleteItem.status ne 'FAILURE'}"/>
+ <onc:errorPopup popupId="delete-#{deleteItem.id}" errorMessage="#{deleteItem.errorMessage}" rendered="#{deleteItem.status eq 'FAILURE'}">Failure</onc:errorPopup>
+
+</rich:column>
+
+<ui:remove><!-- Request Started Time --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="drh.ctime">
+ <h:outputText styleClass="headerText" value="Request Started"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{deleteItem.createdTime}">
+ <f:converter converterId="UserDateTimeConverter" />
+ </h:outputText>
+</rich:column>
+
+<ui:remove><!-- Request Updated Time --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="drh.mtime">
+ <h:outputText styleClass="headerText" value="Last Request Update"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{deleteItem.lastModifiedTime}">
+ <f:converter converterId="UserDateTimeConverter" />
+ </h:outputText>
+</rich:column>
+
+<ui:remove><!-- User --></ui:remove>
+<rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="drh.subjectName">
+ <h:outputText styleClass="headerText" value="User"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="${deleteItem.subjectName}"/>
+</rich:column>
+
+<f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="6">
+ <ui:param name="paginationDataTableName" value="deleteHistoryDataTable"/>
+ <ui:param name="paginationDataModel" value="#{deleteHistoryDataModel}"/>
+ <ui:param name="paginationPageControl" value="#{PageControl.DeleteResourceHistory}"/>
+ <ui:include src="../include/pagination.xhtml"/>
+ </rich:column>
+ </rich:columnGroup>
+</f:facet>
+
+
+</rich:dataTable>
+
+</rich:panel>
+
+</h:form>
+
+</rich:panel>
+
+<!-- =================== GROUPS CONTAINING THIS RESOURCE =================== -->
+<rich:panel styleClass="BlockContent">
+ <f:facet name="header" styleClass="BlockTitle">
+ Groups Containing this Resource
+ </f:facet>
+
+ <h:form id="containingGroupsForm">
+
+ <input type="hidden" name="id" value="#{param.id}"/>
+
+ <a4j:keepAlive beanName="ListContainingGroupsUIBean" />
+
+ <h:panelGroup layout="block" rendered="#{ListContainingGroupsUIBean.dataModel.rowCount == 0}">
+ This resource is not currently a member of any groups.
+ </h:panelGroup>
+
+ <ui:param name="containingGroupsDataModel" value="#{ListContainingGroupsUIBean.dataModel}"/>
+
+ <rich:dataTable id="containingGroupsDataTable"
+ rows="#{PageControl.ContainingGroupsList.pageSize}"
+ value="#{containingGroupsDataModel}"
+ rendered="#{ListContainingGroupsUIBean.dataModel.rowCount > 0}"
+ var="resourceGroupComposite"
+ styleClass="resources-table"
+ columnClasses="resource-quicknav-cell, group-category-cell, resource-name-cell, resource-description-cell, resource-availability-cell, resource-availability-cell"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+ onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+ <f:facet name="PageControlView">
+ <onc:paginationControl id="ContainingGroupsList"/>
+ </f:facet>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Quick Links"/>
+ </f:facet>
+
+ <onc:quickNav>
+ <ui:remove><!-- Pass 'groupId' param to all child icons. --></ui:remove>
+ <f:param name="groupId" value="#{resourceGroupComposite.resourceGroup.id}"/>
+
+ <ui:remove>
+ <!-- Include the Alert, Event and Content tabs even though we currently don't support them for
+ Groups, so that the icon renderer can still render spacers. -->
+ </ui:remove>
+
+ <onc:icon name="Monitor" url="/rhq/group/monitor/graphs.xhtml" alt="Monitor"
+ visible="#{monitorEnabled and resourceGroupComposite.category.name eq 'COMPATIBLE'}">
+ <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
+ </onc:icon>
+
+ <onc:icon name="Inventory" url="/rhq/group/inventory/view.xhtml" alt="Inventory">
+ <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
+ </onc:icon>
+
+ <onc:icon name="Alert" url="/rhq/group/alert/listGroupAlertDefinitions.xhtml" alt="Alert"
+ visible="#{monitorEnabled and resourceGroupComposite.category.name eq 'COMPATIBLE'}"/>
+
+ <onc:icon name="Configure" url="/rhq/group/configuration/viewCurrent.xhtml" alt="Configure"
+ visible="#{resourceGroupComposite.category.name eq 'COMPATIBLE' and
+ resourceGroupComposite.resourceFacets.configuration}">
+ <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
+ </onc:icon>
+
+ <onc:icon name="Operation" url="/rhq/group/operation/groupOperationScheduleNew.xhtml" alt="Operations"
+ visible="#{resourceGroupComposite.category.name eq 'COMPATIBLE' and
+ resourceGroupComposite.resourceFacets.operation}">
+ <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
+ </onc:icon>
+
+ <onc:icon name="Events" url="/rhq/resource/events/history.xhtml" alt="Events"
+ visible="#{false and resourceGroupComposite.category.name eq 'COMPATIBLE' and
+ resourceGroupComposite.resourceFacets.event}"/>
+
+ <onc:icon name="Content" url="/rhq/resource/content/view.xhtml" alt="Content"
+ visible="#{false and resourceGroupComposite.category.name eq 'COMPATIBLE' and
+ resourceGroupComposite.resourceFacets.content}"/>
+
+ </onc:quickNav>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Type"/>
+ </f:facet>
+
+ <h:outputText value="#{resourceGroupComposite.category}"/>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="rg.name">
+ <h:outputText styleClass="headerText" value="Name"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputLink value="/rhq/group/monitor/graphs.xhtml"
+ rendered="#{resourceGroupComposite.category.name eq 'COMPATIBLE'}">
+ <f:param name="groupId" value="#{resourceGroupComposite.resourceGroup.id}"/>
+ <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
+ <h:outputText value="#{resourceGroupComposite.resourceGroup.name}"/>
+ </h:outputLink>
+ <h:outputLink value="/rhq/group/inventory/view.xhtml"
+ rendered="#{resourceGroupComposite.category.name eq 'MIXED'}">
+ <f:param name="groupId" value="#{resourceGroupComposite.resourceGroup.id}"/>
+ <f:param name="category" value="#{resourceGroupComposite.category.name}"/>
+ <f:param name="mode" value="view"/>
+ <h:outputText value="#{resourceGroupComposite.resourceGroup.name}"/>
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="rg.description">
+ <h:outputText styleClass="headerText" value="Description"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{resourceGroupComposite.resourceGroup.description}"/>
+ </rich:column>
+
+ <rich:column styleClass="resource-availability-cell">
+ <f:facet name="header">
+ <h:panelGroup>
+ <onc:sortableColumnHeader sort="explicitAvail">
+ <h:outputText value="Children" />
+ </onc:sortableColumnHeader>
+ </h:panelGroup>
+ </f:facet>
+
+ <h:outputText value="#{resourceGroupComposite.explicitFormatted}"
+ escape="false" />
+ </rich:column>
+
+ <rich:column styleClass="resource-availability-cell">
+ <f:facet name="header">
+ <h:panelGroup>
+ <onc:sortableColumnHeader sort="implicitAvail">
+ <h:outputText value="Descendents" />
+ </onc:sortableColumnHeader>
+ </h:panelGroup>
+ </f:facet>
+
+ <h:outputText value="#{resourceGroupComposite.implicitFormatted}"
+ escape="false" />
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="6">
+ <ui:param name="paginationDataTableName" value="containingGroupsDataTable"/>
+ <ui:param name="paginationDataModel" value="#{containingGroupsDataModel}"/>
+ <ui:param name="paginationPageControl" value="#{PageControl.ContainingGroupsList}"/>
+ <ui:include src="../include/pagination.xhtml"/>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+ </h:form>
+
+</rich:panel>
+
+</ui:define>
+
+</ui:composition>
+
+</html>
diff --git a/modules/enterprise/remoting/client-api/pom.xml b/modules/enterprise/remoting/client-api/pom.xml
index 0fc95b6..caa557f 100644
--- a/modules/enterprise/remoting/client-api/pom.xml
+++ b/modules/enterprise/remoting/client-api/pom.xml
@@ -30,7 +30,7 @@
<dependencies>
<dependency>
- <groupId>${groupId}</groupId>
+ <groupId>${project.groupId}</groupId>
<artifactId>rhq-enterprise-comm</artifactId>
<version>${project.version}</version>
<exclusions>
@@ -62,7 +62,7 @@
</dependency>
<dependency>
- <groupId>${groupId}</groupId>
+ <groupId>${project.groupId}</groupId>
<artifactId>rhq-enterprise-server</artifactId>
<version>${project.version}</version>
<exclusions>
@@ -83,6 +83,10 @@
<artifactId>commons-httpclient</artifactId>
</exclusion>
<exclusion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ </exclusion>
+ <exclusion>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
</exclusion>
@@ -108,25 +112,33 @@
</exclusion>
<exclusion>
<groupId>org.rhq</groupId>
- <artifactId>rhq-enterprise-server-xml-schemas</artifactId>
+ <artifactId>rhq-core-client-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.rhq</groupId>
- <artifactId>rhq-core-client-api</artifactId>
+ <artifactId>rhq-core-dbutils</artifactId>
</exclusion>
<exclusion>
<groupId>org.rhq</groupId>
- <artifactId>rhq-core-dbutils</artifactId>
+ <artifactId>rhq-enterprise-server-xml-schemas</artifactId>
</exclusion>
<exclusion>
<groupId>org.rhq</groupId>
<artifactId>safe-invoker</artifactId>
</exclusion>
<exclusion>
+ <groupId>org.rhq</groupId>
+ <artifactId>test-utils</artifactId>
+ </exclusion>
+ <exclusion>
<groupId>org.snmp4j</groupId>
<artifactId>snmp4j</artifactId>
</exclusion>
<exclusion>
+ <groupId>oswego-concurrent</groupId>
+ <artifactId>concurrent</artifactId>
+ </exclusion>
+ <exclusion>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
</exclusion>
@@ -138,13 +150,13 @@
</dependency>
<dependency>
- <groupId>${groupId}</groupId>
+ <groupId>${project.groupId}</groupId>
<artifactId>rhq-core-domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
- <groupId>${groupId}</groupId>
+ <groupId>${project.groupId}</groupId>
<artifactId>rhq-core-util</artifactId>
<version>${project.version}</version>
<exclusions>
@@ -156,6 +168,12 @@
</dependency>
<dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>rhq-core-gui</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>jboss</groupId>
<artifactId>jboss-remoting</artifactId>
</dependency>
@@ -169,6 +187,12 @@
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>${persistence-api.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>hibernate-annotations</groupId>
+ <artifactId>hibernate-annotations</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
commit c78a781e91450c6f85a32f52396cb394faddf967
Merge: 32122a1... 032c44a...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Jan 18 13:20:44 2010 -0500
Merge branch 'linux-config' of ssh://spinder@git.fedorahosted.org/git/rhq/rhq into linux-config
commit 32122a1828fe52354e03b35b0d74bcc2d9b4d224
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Jan 18 12:57:46 2010 -0500
Bug 535794 - modified code to conditionally handle PropertyMap as it is not instance of Map as assumed. Added code to order listings as UI does.
diff --git a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java
index 26b76fa..e57e3f5 100644
--- a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java
+++ b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/TabularWriter.java
@@ -18,30 +18,31 @@
*/
package org.rhq.enterprise.client;
-import au.com.bytecode.opencsv.CSVWriter;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.Property;
-import org.rhq.core.domain.configuration.PropertyList;
-import org.rhq.core.domain.configuration.PropertyMap;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.measurement.ResourceAvailability;
-import org.rhq.enterprise.client.utility.LazyLoadScenario;
-import org.rhq.enterprise.client.utility.ShortOutput;
-
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.LinkedHashMap;
-import java.util.Arrays;
+
+import au.com.bytecode.opencsv.CSVWriter;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.measurement.ResourceAvailability;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.client.utility.LazyLoadScenario;
+import org.rhq.enterprise.client.utility.ShortOutput;
/**
* @author Greg Hinkle
@@ -95,7 +96,6 @@ public class TabularWriter {
this.out = out;
}
-
public TabularWriter(PrintWriter out) {
this.out = out;
}
@@ -112,28 +112,25 @@ public class TabularWriter {
public void print(Object object) {
if (object instanceof Map) {
- print((Map)object);
+ print((Map) object);
return;
}
-
if (object instanceof Collection) {
print((Collection) object);
return;
}
-
if (object instanceof Configuration) {
print((Configuration) object);
return;
}
if (object != null && object.getClass().isArray()) {
- print((Object[])object);
+ print((Object[]) object);
return;
}
-
try {
if (SIMPLE_TYPES.contains(object.getClass())) {
@@ -145,12 +142,11 @@ public class TabularWriter {
Map<String, PropertyInfo> properties = new LinkedHashMap<String, PropertyInfo>();
int maxLength = 0;
-
for (PropertyDescriptor pd : summaryFilter.getPropertyDescriptors(object, exportMode)) {
Method m = pd.getReadMethod();
Object val = null;
if (m != null) {
- val = invoke(object,m);
+ val = invoke(object, m);
}
if (val != null) {
@@ -171,8 +167,7 @@ public class TabularWriter {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
- }
- catch (IntrospectionException e) {
+ } catch (IntrospectionException e) {
e.printStackTrace();
}
@@ -196,8 +191,7 @@ public class TabularWriter {
if (exportMode || !String.class.equals(propertyInfo.type)) {
out.println(propertyInfo.value);
- }
- else {
+ } else {
out.println(abbreviate(propertyInfo.value, width - 12 - maxLength));
}
}
@@ -236,7 +230,7 @@ public class TabularWriter {
}
if ((offset + (maxWidth - 3)) < string.length()) {
- return "..." + abbreviate(string.substring(offset), maxWidth - 3);
+ return "..." + abbreviate(string.substring(offset), maxWidth - 3);
}
return "..." + string.substring(string.length() - (maxWidth - 3));
@@ -253,11 +247,10 @@ public class TabularWriter {
data[i][1] = shortVersion(value);
i++;
}
- this.headers = new String[] { "Key", "Value"};
+ this.headers = new String[] { "Key", "Value" };
print(data);
}
-
public void print(Collection list) {
// List of arbitrary objects
if (list == null || list.size() == 0)
@@ -270,25 +263,21 @@ public class TabularWriter {
String[][] data = null;
-
if (!allOneType(list)) {
printStrings(list);
} else {
-
Object firstObject = list.iterator().next();
try {
-
if (firstObject instanceof String) {
- headers = new String[]{"Value"};
+ headers = new String[] { "Value" };
data = new String[list.size()][1];
int i = 0;
for (Object object : list) {
data[i++][0] = (String) object;
}
-
} else {
if (consistentMaps(list)) {
@@ -308,8 +297,9 @@ public class TabularWriter {
if (m != null) {
val = invoke(row, pd.getReadMethod());
}
- if ((val != null && !(val instanceof Collection)) ||
- ((val != null && (val instanceof Collection) && !((Collection) val).isEmpty())))
+ if ((val != null && !(val instanceof Collection))
+ || ((val != null && (val instanceof Collection) && !((Collection) val)
+ .isEmpty())))
allNull = false;
}
if (!allNull && !IGNORED_PROPS.contains(pd.getName())) {
@@ -320,7 +310,6 @@ public class TabularWriter {
}
}
-
headers = new String[pdList.size()];
data = new String[list.size()][pdList.size()];
@@ -339,13 +328,12 @@ public class TabularWriter {
i++;
}
-
this.print(data);
}
}
} catch (Exception e) {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} finally {
headers = null;
}
@@ -355,9 +343,6 @@ public class TabularWriter {
}
-
-
-
private boolean consistentMaps(Collection list) {
List<String> keys = null;
String[][] data = new String[list.size()][];
@@ -369,18 +354,52 @@ public class TabularWriter {
if (keys == null) {
keys = new ArrayList<String>();
- for (Object key : ((Map) row).keySet()) {
- String headerKey = stringValueOf(key);
- keys.add(headerKey);
+ //insert check for PropertyMap as they are not instances of Map
+ if (row instanceof PropertyMap) {
+ //TODO: spinder 1/15/10. PropertyMap is arbitrarily complex. Only serialize simple props?
+ for (Object key : ((PropertyMap) row).getMap().keySet()) {
+ String headerKey = stringValueOf(key);
+ keys.add(headerKey);
+ }
+ } else {//else row is a Map
+ for (Object key : ((Map) row).keySet()) {
+ String headerKey = stringValueOf(key);
+ keys.add(headerKey);
+ }
+ }
+ //conditionally put order on the headers to mimic core gui listing style/order
+ //Ex. Pid Name Size User Time Kernel Time
+ if (keys.contains("pid")) {
+ String[] processAttribute = { "pid", "name", "size", "userTime", "kernelTime" };
+ List<String> newKeyOrder = new ArrayList<String>();
+ for (String attribute : processAttribute) {
+ newKeyOrder.add(attribute);
+ keys.remove(attribute);
+ }
+ //postpend remaining keys if any to the newHeader list
+ for (String key : keys) {
+ newKeyOrder.add(key);
+ }
+ keys = newKeyOrder;
}
}
data[i] = new String[keys.size()];
- for (Object key : ((Map) row).keySet()) {
- if (!keys.contains(stringValueOf(key))) {
- return false;
+ if (row instanceof PropertyMap) {
+ for (String key : keys) {
+ if (!keys.contains(stringValueOf(key))) {
+ return false;
+ }
+ data[i][keys.lastIndexOf(stringValueOf(key))] = shortVersion(((PropertyMap) row).get(String
+ .valueOf(key)));
+ }
+ } else {//else row is a Map
+ for (Object key : ((Map) row).keySet()) {
+ if (!keys.contains(stringValueOf(key))) {
+ return false;
+ }
+ data[i][keys.lastIndexOf(stringValueOf(key))] = shortVersion(((Map) row).get(key));
}
- data[i][keys.lastIndexOf(stringValueOf(key))] = shortVersion(((Map) row).get(key));
}
i++;
}
@@ -395,7 +414,6 @@ public class TabularWriter {
}
-
public void print(Configuration config) {
out.println("Configuration [" + config.getId() + "] - " + config.getNotes());
for (PropertySimple p : config.getSimpleProperties().values()) {
@@ -419,7 +437,6 @@ public class TabularWriter {
if (p.getList().get(0) instanceof PropertyMap) {
consistentMaps(p.getList());
-
} else {
for (Property entry : p.getList()) {
if (entry instanceof PropertySimple) {
@@ -446,7 +463,6 @@ public class TabularWriter {
out.println(indent(depth) + "}");
}
-
private String indent(int x) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < x; i++) {
@@ -455,7 +471,6 @@ public class TabularWriter {
return buf.toString();
}
-
private void printStrings(Collection list) {
for (Object object : list) {
out.println(stringValueOf(object));
@@ -563,7 +578,6 @@ public class TabularWriter {
out.print(data.length + " rows\n");
}
-
private void printSpaced(PrintWriter out, String data, int length) {
int dataLength = data.length();
if (dataLength > length) {
@@ -608,12 +622,10 @@ public class TabularWriter {
this.exportMode = exportMode;
}
-
-
private static String shortVersion(Object object) {
if (object instanceof ShortOutput) {
- return ((ShortOutput)object).getShortOutput();
+ return ((ShortOutput) object).getShortOutput();
} else if (object instanceof PropertySimple) {
return ((PropertySimple) object).getStringValue();
} else if (object instanceof ResourceType) {
@@ -627,9 +639,6 @@ public class TabularWriter {
}
}
-
-
-
private static Object invoke(Object o, Method m) throws IllegalAccessException, InvocationTargetException {
boolean access = m.isAccessible();
m.setAccessible(true);
commit 032c44a0fbc146c26468324046e327e80768f871
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Fri Jan 15 15:45:24 2010 -0500
update structured config for cobbler
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
index 7c633ae..eecf935 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
@@ -145,6 +145,24 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
return resourceConfig;
}
+ protected void updateStructuredConfiguration(Configuration config) throws Exception {
+ abortIfAugeasNotAvailable();
+
+ // Load the config files from disk and build a tree representation of them in memory.
+ loadConfigurationFiles(this.augeas);
+
+ ConfigurationDefinition resourceConfigDef = this.resourceContext.getResourceType()
+ .getResourceConfigurationDefinition();
+
+ Collection<PropertyDefinition> propDefs = resourceConfigDef.getPropertyDefinitions().values();
+ for (PropertyDefinition propDef : propDefs) {
+ setNode(propDef, config, this.augeas, this.resourceConfigRootNode);
+ }
+
+ // Write the updated tree out to the config file.
+ saveConfigurationFiles();
+ }
+
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
try {
abortIfAugeasNotAvailable();
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index 38a146f..18e93c6 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -106,6 +106,11 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
public void persistStructuredConfiguration(Configuration configuration) {
+ try {
+ updateStructuredConfiguration(configuration);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
}
public void validateRawConfiguration(RawConfiguration rawConfiguration) {
commit 1cf678a882021df289c34b0da293b5518f9c8e88
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Fri Jan 15 14:16:15 2010 -0500
quick update
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index 88fe018..38a146f 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -31,6 +31,7 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
@@ -56,7 +57,10 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
return super.getAvailability();
}
- @Override
+ public void updateResourceConfiguration(ConfigurationUpdateReport report) {
+ super.updateResourceConfiguration(report);
+ }
+
public Set<RawConfiguration> loadRawConfigurations() {
try {
Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
@@ -75,7 +79,6 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
}
- @Override
public Configuration loadStructuredConfiguration() {
try {
return loadResourceConfiguration();
@@ -85,19 +88,15 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
- @Override
public RawConfiguration mergeRawConfiguration(Configuration from, RawConfiguration to) {
// TODO Auto-generated method stub
return null;
}
- @Override
public void mergeStructuredConfiguration(RawConfiguration from, Configuration to) {
// TODO Auto-generated method stub
-
}
- @Override
public void persistRawConfiguration(RawConfiguration rawConfiguration) {
try {
FileUtils.writeByteArrayToFile(new File(rawConfiguration.getPath()), rawConfiguration.getContents());
@@ -106,22 +105,15 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
}
- @Override
public void persistStructuredConfiguration(Configuration configuration) {
- // TODO Auto-generated method stub
-
}
- @Override
public void validateRawConfiguration(RawConfiguration rawConfiguration) {
// TODO Auto-generated method stub
-
}
- @Override
public void validateStructuredConfiguration(Configuration configuration) {
// TODO Auto-generated method stub
-
}
}
commit e31597ab8179adc84394ba8fd0d2dfcf51007edd
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Jan 14 15:05:40 2010 -0500
Added update operations for saving raw config file.
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index 0c6f4d0..88fe018 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -20,7 +20,6 @@ package org.rhq.plugins.cobbler;
import java.io.File;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
import net.augeas.Augeas;
@@ -30,17 +29,10 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertyMap;
-import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
-import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
-import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
-import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
-import org.rhq.plugins.augeas.helper.AugeasNode;
-import org.rhq.plugins.augeas.helper.AugeasUtility;
/**
* The ResourceComponent for the "Cobbler File" ResourceType.
@@ -65,49 +57,6 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
}
@Override
- protected String getNodeInsertionPoint(Augeas augeas, AugeasNode node, PropertyDefinitionSimple propDefSimple,
- PropertySimple propSimple) {
- if ("alias".equals(propSimple.getName())) {
- return String.format("%s/canonical", node.getParent().getPath());
- }
- return super.getNodeInsertionPoint(augeas, node, propDefSimple, propSimple);
- }
-
- @Override
- protected AugeasNode getNewListMemberNode(AugeasNode listNode, PropertyDefinitionMap listMemberPropDefMap,
- int listIndex) {
- return new AugeasNode(listNode, "0" + listIndex);
- }
-
- protected AugeasNode getExistingChildNodeForListMemberPropertyMap(AugeasNode parentNode,
- PropertyDefinitionList propDefList, PropertyMap propMap) {
- // First find all child nodes with the same 'canonical' value as the PropertyMap.
- Augeas augeas = getAugeas();
- String canonicalFilter = parentNode.getPath() + "/*/canonical";
- String canonical = propMap.getSimple("canonical").getStringValue();
- List<String> canonicalPaths = AugeasUtility.matchFilter(augeas, canonicalFilter, canonical);
- if (canonicalPaths.isEmpty()) {
- return null;
- }
-
- // Now see if there's at least one node in this list with an 'ipaddr' value with the same IP address version as
- // the PropertyMap.
- String ipaddr = propMap.getSimple("ipaddr").getStringValue();
- int ipAddressVersion = (ipaddr.indexOf(':') == -1) ? 4 : 6;
- for (String canonicalPath : canonicalPaths) {
- AugeasNode canonicalNode = new AugeasNode(canonicalPath);
- AugeasNode childNode = canonicalNode.getParent();
- AugeasNode ipaddrNode = new AugeasNode(childNode, "ipaddr");
- String existingIpaddr = augeas.get(ipaddrNode.getPath());
- int existingIpAddressVersion = (existingIpaddr.indexOf(':') == -1) ? 4 : 6;
- if (existingIpAddressVersion == ipAddressVersion) {
- return childNode;
- }
- }
- return null;
- }
-
- @Override
public Set<RawConfiguration> loadRawConfigurations() {
try {
Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
@@ -150,8 +99,11 @@ public class CobblerComponent extends AugeasConfigurationComponent implements Re
@Override
public void persistRawConfiguration(RawConfiguration rawConfiguration) {
- // TODO Auto-generated method stub
-
+ try {
+ FileUtils.writeByteArrayToFile(new File(rawConfiguration.getPath()), rawConfiguration.getContents());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
}
@Override
commit 87b56d1f7586e6e6db856abb442dcff3db58d663
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Jan 14 14:46:07 2010 -0500
Added Raw Config support to display modules.conf and settings
diff --git a/modules/plugins/cobbler/pom.xml b/modules/plugins/cobbler/pom.xml
index 5faed52..dec5fa7 100644
--- a/modules/plugins/cobbler/pom.xml
+++ b/modules/plugins/cobbler/pom.xml
@@ -35,7 +35,11 @@
<artifactId>rhq-augeas-plugin</artifactId>
<version>${project.version}</version>
</dependency>
-
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.4</version>
+ </dependency>
</dependencies>
<build>
@@ -220,7 +224,29 @@
</executions>
</plugin>
-
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>copy-commons-io-jar</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.4</version>
+ </artifactItem>
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
</profile>
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index b102f99..0c6f4d0 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -18,12 +18,14 @@
*/
package org.rhq.plugins.cobbler;
+import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.augeas.Augeas;
+import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -36,34 +38,26 @@ import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
-import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
-import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
import org.rhq.plugins.augeas.helper.AugeasNode;
import org.rhq.plugins.augeas.helper.AugeasUtility;
-import org.rhq.plugins.platform.PlatformComponent;
/**
* The ResourceComponent for the "Cobbler File" ResourceType.
*
* @author Ian Springer
*/
-public class CobblerComponent extends AugeasConfigurationComponent<PlatformComponent> implements
- ResourceConfigurationFacet {
-
+public class CobblerComponent extends AugeasConfigurationComponent implements ResourceConfigurationFacet {
+ private static final String MODULES_PATH = "/etc/cobbler/modules.conf";
+ private static final String SETTINGS_PATH = "/etc/cobbler/settings";
private final Log log = LogFactory.getLog(this.getClass());
- public void start(ResourceContext<PlatformComponent> resourceContext) throws InvalidPluginConfigurationException,
- Exception {
- super.start(resourceContext);
- }
-
@Override
protected void setupAugeasModules(Augeas augeas) {
augeas.set("/augeas/load/CobblerSettings/lens", "CobblerSettings.lns");
- augeas.set("/augeas/load/CobblerSettings/incl[1]", "/etc/cobbler/settings");
+ augeas.set("/augeas/load/CobblerSettings/incl[1]", SETTINGS_PATH);
augeas.set("/augeas/load/CobblerModules/lens", "CobblerModules.lns");
- augeas.set("/augeas/load/CobblerModules/incl[1]", "/etc/cobbler/modules.conf");
+ augeas.set("/augeas/load/CobblerModules/incl[1]", MODULES_PATH);
}
public AvailabilityType getAvailability() {
@@ -115,9 +109,21 @@ public class CobblerComponent extends AugeasConfigurationComponent<PlatformCompo
@Override
public Set<RawConfiguration> loadRawConfigurations() {
- Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
- RawConfiguration config = new RawConfiguration();
- return null;
+ try {
+ Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
+ RawConfiguration modules = new RawConfiguration();
+ modules.setPath(MODULES_PATH);
+ modules.setContents(FileUtils.readFileToByteArray(new File(MODULES_PATH)));
+ configs.add(modules);
+
+ RawConfiguration settings = new RawConfiguration();
+ settings.setPath(SETTINGS_PATH);
+ settings.setContents(FileUtils.readFileToByteArray(new File(SETTINGS_PATH)));
+ configs.add(settings);
+ return configs;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
}
@Override
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index 039e053..8838dd5 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -6,6 +6,7 @@
package="org.rhq.plugins.cobbler"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:xmlns:rhq-plugin"
+ ampsVersion="2.1"
xmlns:c="urn:xmlns:rhq-configuration">
<depends plugin="Augeas"/>
@@ -32,7 +33,7 @@
default="/files/etc/cobbler/"/>
</plugin-configuration>
- <resource-configuration>
+ <resource-configuration configurationFormat="both">
<c:simple-property name="settings/server" displayName="Server" type="string" required="true" activationPolicy="immediate"
description="The IP address of the cobbler server."/>
</resource-configuration>
commit 74cd75f2efc2fac3b03512ea45f491bcaf0282b5
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Jan 14 12:55:58 2010 -0500
Added raw config elements to cobbler component
diff --git a/.classpath b/.classpath
index 465b86e..4e8ba69 100644
--- a/.classpath
+++ b/.classpath
@@ -107,6 +107,8 @@
<classpathentry kind="src" path="modules/plugins/platform/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/hosts/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/hosts/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/raw-config-test/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/raw-config-test/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/cobbler/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/cobbler/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/virt/src/main/java"/>
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index d3d5eb0..b102f99 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -18,19 +18,24 @@
*/
package org.rhq.plugins.cobbler;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import net.augeas.Augeas;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
@@ -43,7 +48,8 @@ import org.rhq.plugins.platform.PlatformComponent;
*
* @author Ian Springer
*/
-public class CobblerComponent extends AugeasConfigurationComponent<PlatformComponent> {
+public class CobblerComponent extends AugeasConfigurationComponent<PlatformComponent> implements
+ ResourceConfigurationFacet {
private final Log log = LogFactory.getLog(this.getClass());
@@ -107,4 +113,57 @@ public class CobblerComponent extends AugeasConfigurationComponent<PlatformCompo
return null;
}
+ @Override
+ public Set<RawConfiguration> loadRawConfigurations() {
+ Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
+ RawConfiguration config = new RawConfiguration();
+ return null;
+ }
+
+ @Override
+ public Configuration loadStructuredConfiguration() {
+ try {
+ return loadResourceConfiguration();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ @Override
+ public RawConfiguration mergeRawConfiguration(Configuration from, RawConfiguration to) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void mergeStructuredConfiguration(RawConfiguration from, Configuration to) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void persistRawConfiguration(RawConfiguration rawConfiguration) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void persistStructuredConfiguration(Configuration configuration) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateRawConfiguration(RawConfiguration rawConfiguration) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateStructuredConfiguration(Configuration configuration) {
+ // TODO Auto-generated method stub
+
+ }
+
}
commit 5320954554042de2f6588a10b6db6d05397205da
Merge: c7ca48c... 043cc86...
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Jan 14 11:34:03 2010 -0500
Merge branch 'master' into linux-config
commit c7ca48cc57eca0caca53ee3fe82768e85904eb55
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Jan 14 10:24:28 2010 -0500
Added a prototype to deal with system config services over dbus
diff --git a/.classpath b/.classpath
index afe2979..f0058f2 100644
--- a/.classpath
+++ b/.classpath
@@ -110,6 +110,7 @@
<classpathentry kind="src" path="modules/plugins/cobbler/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/cobbler/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/virt/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/virt/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/snmptrapd/src/main/java"/>
diff --git a/modules/plugins/services/README.txt b/modules/plugins/services/README.txt
new file mode 100644
index 0000000..cdb7881
--- /dev/null
+++ b/modules/plugins/services/README.txt
@@ -0,0 +1,4 @@
+This plugin lists and enables system-config-services related operations. It is still a prototype and thus will not get automatically built. To install it one needs to do the following.
+1) yum install dbus-java
+2) if on X86_64, ln -s /usr/lib64/libmatthew-java /usr/lib/
+3) cd $RHQ_DIR/modules/plugins/services && mvn -Pdev install
diff --git a/modules/plugins/services/pom.xml b/modules/plugins/services/pom.xml
new file mode 100644
index 0000000..1380cd6
--- /dev/null
+++ b/modules/plugins/services/pom.xml
@@ -0,0 +1,260 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-plugins-parent</artifactId>
+ <version>1.4.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-services-plugin</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Services Plugin</name>
+ <description>Do some System config services stuff</description>
+
+ <properties>
+ <scm.module.path>modules/plugins/services</scm.module.path>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-downloads/rhq-plugins</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${project.build.outputDirectory}/lib"/>
+ <copy todir="${project.build.outputDirectory}/lib">
+ <fileset dir="/usr/share/java/dbus-java">
+ <include name="*.jar"/>
+ </fileset>
+
+ <fileset dir="/usr/lib/libmatthew-java">
+ <include name="*.jar"/>
+ </fileset>
+ </copy>
+ <mkdir dir="${rhq.deploymentDir}" />
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.outputDirectory}">
+ <patternset>
+ <include name="META-INF/**" />
+ </patternset>
+ </unjar>
+ <jar destfile="${deployment.file}" manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF" update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>copy-twitter4j-jar</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>net.homeip.yusuke</groupId>
+ <artifactId>twitter4j</artifactId>
+ <version>2.0.8</version>
+ </artifactItem>
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ </profile>
+ </profiles>
+
+ <repositories>
+ <repository>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>jboss</id>
+ <name>JBoss Repository</name>
+ <url>http://repository.jboss.org/maven2/</url>
+ </repository>
+ </repositories>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>jboss</id>
+ <name>JBoss Plugin Repository</name>
+ <url>http://repository.jboss.org/maven2/</url>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-domain</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-plugin-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-native-system</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>dbus-java-bin</artifactId>
+ <version>2.5</version>
+ <scope>system</scope>
+ <systemPath>/usr/share/java/dbus-java/dbus-bin.jar</systemPath>
+ </dependency>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>libdbus-java</artifactId>
+ <version>2.5</version>
+ <scope>system</scope>
+ <systemPath>/usr/share/java/dbus-java/dbus.jar</systemPath>
+ </dependency>
+
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>dbus-java-viewer</artifactId>
+ <version>2.5</version>
+ <scope>system</scope>
+ <systemPath>/usr/share/java/dbus-java/dbus-viewer.jar</systemPath>
+ </dependency>
+
+
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>lib-matthew-cgi</artifactId>
+ <version>0.5</version>
+ <scope>system</scope>
+ <systemPath>/usr/lib/libmatthew-java/cgi.jar</systemPath>
+ </dependency>
+
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>lib-matthew-hexdump</artifactId>
+ <version>0.2</version>
+ <scope>system</scope>
+ <systemPath>/usr/lib/libmatthew-java/hexdump.jar</systemPath>
+ </dependency>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>lib-matthew-debug-enable</artifactId>
+ <version>1.1</version>
+ <scope>system</scope>
+ <systemPath>/usr/lib/libmatthew-java/debug-enable.jar</systemPath>
+ </dependency>
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>lib-matthew-debug-disable</artifactId>
+ <version>1.1</version>
+ <scope>system</scope>
+ <systemPath>/usr/lib/libmatthew-java/debug-disable.jar</systemPath>
+ </dependency>
+
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>lib-matthew-io</artifactId>
+ <version>0.1</version>
+ <scope>system</scope>
+ <systemPath>/usr/lib/libmatthew-java/io.jar</systemPath>
+ </dependency>
+
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>lib-matthew-unix</artifactId>
+ <version>0.5</version>
+ <scope>system</scope>
+ <systemPath>/usr/lib/libmatthew-java/unix.jar</systemPath>
+ </dependency>
+
+ </dependencies>
+</project>
diff --git a/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ChkconfigService.java b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ChkconfigService.java
new file mode 100644
index 0000000..48eb3b4
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ChkconfigService.java
@@ -0,0 +1,37 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.fedoraproject.Config.Services;
+
+import org.freedesktop.dbus.DBusInterface;
+
+/**
+ * @author paji
+ *
+ */
+public interface ChkconfigService extends DBusInterface {
+ void disable();
+
+ void enable();
+
+ int get_enabled();
+}
diff --git a/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Introspectable.java b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Introspectable.java
new file mode 100644
index 0000000..3785443
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Introspectable.java
@@ -0,0 +1,30 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.fedoraproject.Config.Services;
+
+import org.freedesktop.dbus.DBusInterface;
+
+public interface Introspectable extends DBusInterface {
+ String Introspect();
+}
diff --git a/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Service.java b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Service.java
new file mode 100644
index 0000000..d4bae86
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/Service.java
@@ -0,0 +1,30 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.fedoraproject.Config.Services;
+
+import org.freedesktop.dbus.DBusInterface;
+
+public interface Service extends DBusInterface {
+ void save();
+}
diff --git a/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ServiceHerder.java b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ServiceHerder.java
new file mode 100644
index 0000000..a9fb1ae
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/ServiceHerder.java
@@ -0,0 +1,45 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.fedoraproject.Config.Services;
+
+import org.freedesktop.dbus.DBusInterface;
+import org.freedesktop.dbus.DBusSignal;
+import org.freedesktop.dbus.exceptions.DBusException;
+
+/**
+ * @author paji
+ *
+ */
+public interface ServiceHerder extends DBusInterface {
+ boolean is_ready();
+
+ String[] list_services();
+
+ public class notify extends DBusSignal {
+ public notify(String source, String path, String iface, String member, String sig, Object... args)
+ throws DBusException {
+ super(source, path, iface, member, sig, args);
+ }
+
+ }
+}
diff --git a/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/SysVService.java b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/SysVService.java
new file mode 100644
index 0000000..e4e3950
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/SysVService.java
@@ -0,0 +1,48 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.fedoraproject.Config.Services;
+
+import org.freedesktop.dbus.DBusInterface;
+
+public interface SysVService extends DBusInterface {
+ String get_description();
+
+ int[] get_runlevels();
+
+ String get_shortdescription();
+
+ int get_status();
+
+ int get_status_updates_running();
+
+ void reload();
+
+ void restart();
+
+ void set_runlevels(int[] levels);
+
+ void start();
+
+ void stop();
+}
diff --git a/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/XinetdService.java b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/XinetdService.java
new file mode 100644
index 0000000..e28bb74
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/fedoraproject/Config/Services/XinetdService.java
@@ -0,0 +1,32 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.fedoraproject.Config.Services;
+
+import org.freedesktop.dbus.DBusInterface;
+
+public interface XinetdService extends DBusInterface {
+ String get_description();
+
+ void save(boolean enabled);
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceComponent.java b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceComponent.java
new file mode 100644
index 0000000..d63d9ca
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceComponent.java
@@ -0,0 +1,78 @@
+package org.rhq.plugins.services;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.freedesktop.dbus.DBusConnection;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
+import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.services.Service;
+import org.rhq.services.SysVService;
+import org.rhq.services.XinetdService;
+
+public class ServiceComponent<T extends ResourceComponent> implements ResourceComponent<T>, ConfigurationFacet {
+ private final Log log = LogFactory.getLog(this.getClass());
+ private ResourceContext<T> resourceContext;
+ private String resourceDescription;
+ private Service service;
+ DBusConnection conn;
+
+ @Override
+ public void start(ResourceContext<T> context) throws InvalidPluginConfigurationException, Exception {
+ this.resourceContext = context;
+ this.resourceDescription = this.resourceContext.getResourceType() + " Resource with key ["
+ + this.resourceContext.getResourceKey() + "]";
+ Configuration pluginConfig = resourceContext.getPluginConfiguration();
+ String type = pluginConfig.getSimple("type").getStringValue();
+ String name = pluginConfig.getSimple("name").getStringValue();
+ conn = DBusConnection.getConnection(DBusConnection.SYSTEM);
+ if (ServiceDiscoveryComponent.SYS_V_SERVICE.equals(type)) {
+ service = SysVService.load(name, conn);
+ } else if (ServiceDiscoveryComponent.XINETD_SERVICE.equals(type)) {
+ service = XinetdService.load(name, conn);
+ }
+
+ }
+
+ @Override
+ public void stop() {
+ if (conn != null) {
+ conn.disconnect();
+ }
+ }
+
+ @Override
+ public AvailabilityType getAvailability() {
+ if (service.isSysVService()) {
+ SysVService s = (SysVService) service;
+ if (s.isRunning()) {
+ return AvailabilityType.UP;
+ } else {
+ return AvailabilityType.DOWN;
+ }
+ }
+ return AvailabilityType.UP;
+ }
+
+ @Override
+ public Configuration loadResourceConfiguration() throws Exception {
+ Configuration config = new Configuration();
+ String name = resourceContext.getPluginConfiguration().getSimple("name").getStringValue();
+ config.put(new PropertySimple("name", name));
+ config.put(new PropertySimple("enabled", service.isEnabled()));
+ return config;
+ }
+
+ @Override
+ public void updateResourceConfiguration(ConfigurationUpdateReport report) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceDiscoveryComponent.java b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceDiscoveryComponent.java
new file mode 100644
index 0000000..0715702
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServiceDiscoveryComponent.java
@@ -0,0 +1,46 @@
+package org.rhq.plugins.services;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+public class ServiceDiscoveryComponent implements ResourceDiscoveryComponent<ServicesComponent> {
+ public static final String SYS_V_SERVICE = "SysV";
+ public static final String XINETD_SERVICE = "Xinetd";
+
+ @Override
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ServicesComponent> context)
+ throws InvalidPluginConfigurationException, Exception {
+ Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>();
+ ServicesComponent servicesComponent = context.getParentResourceComponent();
+ List<String> services = servicesComponent.getSysVServices();
+ for (String name : services) {
+ Configuration pluginConfig = context.getDefaultPluginConfiguration();
+ pluginConfig.put(new PropertySimple("name", name));
+ pluginConfig.put(new PropertySimple("type", SYS_V_SERVICE));
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(context.getResourceType(), name, name
+ + " (Sys V)", null, "Service - [" + name + "]", pluginConfig, null);
+ details.add(detail);
+ }
+ services = servicesComponent.getXinetDServices();
+
+ for (String name : services) {
+ Configuration pluginConfig = context.getDefaultPluginConfiguration();
+ pluginConfig.put(new PropertySimple("name", name));
+ pluginConfig.put(new PropertySimple("type", XINETD_SERVICE));
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(context.getResourceType(), name, name
+ + " (XinetD)", null, "Service - [" + name + "]", pluginConfig, null);
+ details.add(detail);
+ }
+ return details;
+
+ }
+
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesComponent.java b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesComponent.java
new file mode 100644
index 0000000..611f0e4
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesComponent.java
@@ -0,0 +1,157 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.plugins.services;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.freedesktop.dbus.DBusConnection;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
+import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.services.ServiceManager;
+
+/**
+ * The ResourceComponent for the "Services File" ResourceType.
+ *
+ * @author Partha Aji
+ */
+public class ServicesComponent<T extends ResourceComponent> implements ResourceComponent<T>, ConfigurationFacet {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+ private ResourceContext<T> resourceContext;
+ private String resourceDescription;
+ private List<String> sysVServices;
+ private List<String> xinetdServices;
+
+ public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception {
+ this.resourceContext = resourceContext;
+ this.resourceDescription = this.resourceContext.getResourceType() + " Resource with key ["
+ + this.resourceContext.getResourceKey() + "]";
+ }
+
+ public void stop() {
+ return;
+ }
+
+ public AvailabilityType getAvailability() {
+ return AvailabilityType.UP;
+ }
+
+ private void setupServices() throws Exception {
+ DBusConnection conn = null;
+ try {
+ conn = DBusConnection.getConnection(DBusConnection.SYSTEM);
+ sysVServices = ServiceManager.instance().listSysVServices(conn);
+ xinetdServices = ServiceManager.instance().listXinetdServices(conn);
+ } finally {
+ if (conn != null) {
+ conn.disconnect();
+ }
+ }
+ }
+
+ public List<String> getSysVServices() throws Exception {
+ if (sysVServices == null) {
+ setupServices();
+ }
+ return sysVServices;
+ }
+
+ public List<String> getXinetDServices() throws Exception {
+ if (xinetdServices == null) {
+ setupServices();
+ }
+ return xinetdServices;
+ }
+
+ @Override
+ public Configuration loadResourceConfiguration() throws Exception {
+ Configuration resourceConfig = new Configuration();
+ resourceConfig.setNotes("Loaded at " + new Date());
+ PropertyList entriesProp = new PropertyList("services");
+ resourceConfig.put(entriesProp);
+
+ for (String name : getSysVServices()) {
+ PropertyMap entryProp = new PropertyMap("service");
+ entriesProp.add(entryProp);
+ entryProp.put(new PropertySimple("name", name));
+ entryProp.put(new PropertySimple("type", "Sys V Service"));
+ }
+
+ for (String name : getXinetDServices()) {
+ PropertyMap entryProp = new PropertyMap("service");
+ entriesProp.add(entryProp);
+ entryProp.put(new PropertySimple("name", name));
+ entryProp.put(new PropertySimple("type", "XinetD Service"));
+ }
+ return resourceConfig;
+
+ }
+
+ @Override
+ public void updateResourceConfiguration(ConfigurationUpdateReport report) {
+ /**
+ * Configuration resourceConfig = report.getConfiguration();
+ Services newServices = new Services();
+
+ PropertyList entriesProp = resourceConfig.getList(".");
+ for (Property entryProp: entriesProp.getList()) {
+ PropertyMap entryPropMap = (PropertyMap) entryProp;
+ String ipAddress = entryPropMap.getSimple("ipaddr").getStringValue();
+ String canonicalName = entryPropMap.getSimple("canonical").getStringValue();
+ String aliases = entryPropMap.getSimpleValue("alias", null);
+ Set<String> aliasSet;
+ if (aliases == null) {
+ aliasSet = null;
+ } else {
+ String[] aliasArray = aliases.trim().split("\\s+");
+ aliasSet = new LinkedHashSet<String>(aliasArray.length);
+ for (String alias : aliasArray) {
+ aliasSet.add(alias);
+ }
+ }
+ ServicesEntry entry = new ServicesEntry(ipAddress, canonicalName, aliasSet);
+ newServices.addEntry(entry);
+ }
+
+ File servicesFile = (File)this.servicesComponent.getConfigurationFiles().get(0);
+ try {
+ Services.store(newServices, servicesFile);
+ }
+ catch (IOException e) {
+ throw new RuntimeException("Failed to write services file [" + servicesFile + "].", e);
+ }
+
+ report.setStatus(ConfigurationUpdateStatus.SUCCESS);
+ return;
+ */
+
+ }
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesDiscoveryComponent.java b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesDiscoveryComponent.java
new file mode 100644
index 0000000..3209910
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/plugins/services/ServicesDiscoveryComponent.java
@@ -0,0 +1,77 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.plugins.services;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ManualAddFacet;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+/**
+ * The ResourceDiscoveryComponent for the "Services File" ResourceType.
+ *
+ * @author Partha Aji
+ */
+public class ServicesDiscoveryComponent<T extends ResourceComponent> implements ResourceDiscoveryComponent<T>,
+ ManualAddFacet<T> {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @Override
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<T> discoveryContext)
+ throws InvalidPluginConfigurationException, Exception {
+ Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>(1);
+
+ Configuration pluginConfig = discoveryContext.getDefaultPluginConfiguration();
+
+ DiscoveredResourceDetails resource = createResourceDetails(discoveryContext, pluginConfig);
+ discoveredResources.add(resource);
+ log.debug("Discovered " + discoveryContext.getResourceType().getName() + " Resource with key ["
+ + resource.getResourceKey() + "].");
+
+ return discoveredResources;
+ }
+
+ @Override
+ public DiscoveredResourceDetails discoverResource(Configuration pluginConfiguration,
+ ResourceDiscoveryContext<T> discoveryContext) throws InvalidPluginConfigurationException {
+
+ DiscoveredResourceDetails resource = createResourceDetails(discoveryContext, pluginConfiguration);
+ return resource;
+ }
+
+ private DiscoveredResourceDetails createResourceDetails(ResourceDiscoveryContext<T> discoveryContext,
+ Configuration pluginConfiguration) {
+ ResourceType resourceType = discoveryContext.getResourceType();
+ String resourceKey = "services";
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(resourceType, resourceKey, resourceType
+ .getName(), null, resourceType.getDescription(), pluginConfiguration, null);
+ return resource;
+ }
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/services/Service.java b/modules/plugins/services/src/main/java/org/rhq/services/Service.java
new file mode 100644
index 0000000..54d9dbd
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/services/Service.java
@@ -0,0 +1,102 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.services;
+
+import org.fedoraproject.Config.Services.ChkconfigService;
+import org.fedoraproject.Config.Services.Introspectable;
+import org.freedesktop.dbus.DBusConnection;
+import org.freedesktop.dbus.exceptions.DBusException;
+
+public abstract class Service implements ChkconfigService, org.fedoraproject.Config.Services.Service, Introspectable {
+
+ public static final int SVC_STATUS_REFRESHING = 0;
+ public static final int SVC_STATUS_UNKNOWN = 1;
+ public static final int SVC_STATUS_STOPPED = 2;
+ public static final int SVC_STATUS_RUNNING = 3;
+ public static final int SVC_STATUS_DEAD = 4;
+
+ public static final int SVC_ENABLED_REFRESHING = 0;
+ public static final int SVC_ENABLED_ERROR = 1;
+ public static final int SVC_ENABLED_YES = 2;
+ public static final int SVC_ENABLED_NO = 3;
+ public static final int SVC_ENABLED_CUSTOM = 4;
+
+ private ChkconfigService chkconfig;
+ private org.fedoraproject.Config.Services.Service service;
+ private Introspectable introspectable;
+ protected DBusConnection conn;
+ public static final String BUS_NAME = "org.fedoraproject.Config.Services";
+
+ protected abstract String getObjectPath();
+
+ protected Service() {
+ }
+
+ protected void setup(DBusConnection con) throws DBusException {
+
+ /**"/org/fedoraproject/Config/Services/ServiceHerders/SysVServiceHerder/Services/"+sysVservice.replace("-", "_"),*/
+ conn = con;
+ chkconfig = conn.getRemoteObject(BUS_NAME, getObjectPath(), ChkconfigService.class);
+ service = conn.getRemoteObject(BUS_NAME, getObjectPath(), org.fedoraproject.Config.Services.Service.class);
+ introspectable = conn.getRemoteObject(BUS_NAME, getObjectPath(), Introspectable.class);
+ }
+
+ @Override
+ public void disable() {
+ chkconfig.disable();
+ }
+
+ @Override
+ public void enable() {
+ chkconfig.enable();
+ }
+
+ @Override
+ public int get_enabled() {
+ return chkconfig.get_enabled();
+ }
+
+ public boolean isEnabled() {
+ return SVC_ENABLED_YES == chkconfig.get_enabled();
+ }
+
+ @Override
+ public boolean isRemote() {
+ return true;
+ }
+
+ @Override
+ public void save() {
+ service.save();
+ }
+
+ @Override
+ public String Introspect() {
+ return introspectable.Introspect();
+ }
+
+ public boolean isSysVService() {
+ return false;
+ }
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/services/ServiceManager.java b/modules/plugins/services/src/main/java/org/rhq/services/ServiceManager.java
new file mode 100644
index 0000000..03da734
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/services/ServiceManager.java
@@ -0,0 +1,55 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.services;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.fedoraproject.Config.Services.ServiceHerder;
+import org.freedesktop.dbus.DBusConnection;
+import org.freedesktop.dbus.exceptions.DBusException;
+
+public class ServiceManager {
+ private static final ServiceManager INSTANCE = new ServiceManager();
+
+ private ServiceManager() {
+ }
+
+ public static final ServiceManager instance() {
+ return INSTANCE;
+ }
+
+ public List<String> listSysVServices(DBusConnection conn) throws DBusException {
+ return listServices(conn, "/org/fedoraproject/Config/Services/ServiceHerders/SysVServiceHerder");
+ }
+
+ public List<String> listXinetdServices(DBusConnection conn) throws DBusException {
+ return listServices(conn, "/org/fedoraproject/Config/Services/ServiceHerders/XinetdServiceHerder");
+ }
+
+ private List<String> listServices(DBusConnection conn, String herderPath) throws DBusException {
+ ServiceHerder herder = (ServiceHerder) conn.getRemoteObject(Service.BUS_NAME, herderPath, ServiceHerder.class);
+ return Arrays.asList(herder.list_services());
+ }
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/services/ServiceStatus.java b/modules/plugins/services/src/main/java/org/rhq/services/ServiceStatus.java
new file mode 100644
index 0000000..0ee3757
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/services/ServiceStatus.java
@@ -0,0 +1,28 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.services;
+
+public enum ServiceStatus {
+
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/services/SysVService.java b/modules/plugins/services/src/main/java/org/rhq/services/SysVService.java
new file mode 100644
index 0000000..d0ded27
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/services/SysVService.java
@@ -0,0 +1,149 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.services;
+
+import org.freedesktop.dbus.DBusConnection;
+import org.freedesktop.dbus.exceptions.DBusException;
+
+/**
+ * @author paji
+ *
+ */
+public class SysVService extends Service implements org.fedoraproject.Config.Services.SysVService {
+
+ private String serviceName;
+ private org.fedoraproject.Config.Services.SysVService service;
+ private static final String SERVICE_PATH = "/org/fedoraproject/Config/Services/ServiceHerders/SysVServiceHerder/Services/";
+
+ protected SysVService(String name) {
+ serviceName = name;
+ }
+
+ public static SysVService load(String serviceName, DBusConnection conn) throws DBusException {
+ SysVService service = new SysVService(serviceName);
+ service.setup(conn);
+ return service;
+ }
+
+ @Override
+ protected void setup(DBusConnection con) throws DBusException {
+ super.setup(con);
+ service = con.getRemoteObject(BUS_NAME, getObjectPath(), org.fedoraproject.Config.Services.SysVService.class);
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#get_description()
+ */
+ @Override
+ public String get_description() {
+ return service.get_description();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#get_runlevels()
+ */
+ @Override
+ public int[] get_runlevels() {
+ return service.get_runlevels();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#get_shortdescription()
+ */
+ @Override
+ public String get_shortdescription() {
+ return service.get_shortdescription();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#get_status()
+ */
+ @Override
+ public int get_status() {
+ return service.get_status();
+ }
+
+ public boolean isRunning() {
+ return get_status() == SVC_STATUS_RUNNING;
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#get_status_updates_running()
+ */
+ @Override
+ public int get_status_updates_running() {
+ return service.get_status_updates_running();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#reload()
+ */
+ @Override
+ public void reload() {
+ service.reload();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#restart()
+ */
+ @Override
+ public void restart() {
+ service.restart();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#set_runlevels(int[])
+ */
+ @Override
+ public void set_runlevels(int[] levels) {
+ service.set_runlevels(levels);
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#start()
+ */
+ @Override
+ public void start() {
+ service.start();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.SysVService#stop()
+ */
+ @Override
+ public void stop() {
+ service.stop();
+ }
+
+ @Override
+ protected String getObjectPath() {
+ return SERVICE_PATH + serviceName.replace("-", "_");
+ }
+
+ @Override
+ public boolean isSysVService() {
+ return true;
+ }
+
+}
diff --git a/modules/plugins/services/src/main/java/org/rhq/services/XinetdService.java b/modules/plugins/services/src/main/java/org/rhq/services/XinetdService.java
new file mode 100644
index 0000000..a5e05c9
--- /dev/null
+++ b/modules/plugins/services/src/main/java/org/rhq/services/XinetdService.java
@@ -0,0 +1,74 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.services;
+
+import org.freedesktop.dbus.DBusConnection;
+import org.freedesktop.dbus.exceptions.DBusException;
+
+/**
+ * @author paji
+ *
+ */
+public class XinetdService extends Service implements org.fedoraproject.Config.Services.XinetdService {
+ private String serviceName;
+ private org.fedoraproject.Config.Services.XinetdService service;
+ private static final String SERVICE_PATH = "/org/fedoraproject/Config/Services/ServiceHerders/XinetdServiceHerder/Services/";
+
+ protected XinetdService(String name) {
+ serviceName = name;
+ }
+
+ public static XinetdService load(String serviceName, DBusConnection conn) throws DBusException {
+ XinetdService service = new XinetdService(serviceName);
+ service.setup(conn);
+ return service;
+ }
+
+ @Override
+ protected void setup(DBusConnection con) throws DBusException {
+ super.setup(con);
+ service = con.getRemoteObject(BUS_NAME, getObjectPath(), org.fedoraproject.Config.Services.XinetdService.class);
+ }
+
+ /* (non-Javadoc)
+ * @see org.rhq.services.Service#getObjectPath()
+ */
+ @Override
+ protected String getObjectPath() {
+ return SERVICE_PATH + serviceName.replace("-", "_");
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.XinetdService#get_description()
+ */
+ @Override
+ public String get_description() {
+ return service.get_description();
+ }
+
+ /* (non-Javadoc)
+ * @see org.fedoraproject.Config.Services.XinetdService#save(boolean)
+ */
+ @Override
+ public void save(boolean enabled) {
+ service.save(enabled);
+ }
+
+}
diff --git a/modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml
new file mode 100644
index 0000000..9723932
--- /dev/null
+++ b/modules/plugins/services/src/main/resources/META-INF/rhq-plugin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin name="Services"
+ displayName="Services"
+ description="Support for services file"
+ package="org.rhq.plugins.services"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <service name="Services File"
+ description="the local file used for mapping host names to IP addresses"
+ discovery="ServicesDiscoveryComponent"
+ class="ServicesComponent"
+ supportsManualAdd="true">
+
+ <runs-inside>
+ <parent-resource-type name="Linux" plugin="Platforms"/>
+ <parent-resource-type name="Java" plugin="Platforms"/>
+ </runs-inside>
+
+
+
+ <resource-configuration>
+ <c:list-property name="services" displayName="Services">
+ <c:map-property name="service">
+ <c:simple-property name="name" displayName="Service Name" type="string" required="true" activationPolicy="immediate"
+ description="Name of the service"/>
+
+ <c:simple-property name="type" displayName="Service Type" type="string" required="true" activationPolicy="immediate"
+ description="TSys V / XinetD service."/>
+ </c:map-property>
+ </c:list-property>
+ </resource-configuration>
+ <service name="Service" description="a service"
+ discovery="ServiceDiscoveryComponent" class="ServiceComponent">
+ <plugin-configuration>
+ <c:simple-property name="name" required="true" readOnly="true"/>
+ <c:simple-property name="type" required="true" readOnly="true"/>
+ </plugin-configuration>
+ <resource-configuration>
+ <c:simple-property name="name" displayName = "Name" required="true" readOnly="true" description="Name of the Service"/>
+ <c:simple-property name="enabled" type="boolean" displayName = "Enabled" readOnly="true" description="True if the Service is Enabled"/>
+ </resource-configuration>
+ </service>
+ </service>
+
+</plugin>
+
\ No newline at end of file
diff --git a/modules/plugins/services/src/test/resources/log4j.xml b/modules/plugins/services/src/test/resources/log4j.xml
new file mode 100644
index 0000000..8ec981a
--- /dev/null
+++ b/modules/plugins/services/src/test/resources/log4j.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+ <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <param name="Threshold" value="ERROR"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <!-- The default pattern: Date Priority [Category] Messagen -->
+
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
+ </layout>
+ </appender>
+
+ <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
+ <param name="File" value="target/test.log"/>
+ <param name="Threshold" value="DEBUG"/>
+ <param name="Append" value="false"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} (%F:%M:%L) -%m%n"/>
+ </layout>
+ </appender>
+
+ <category name="org.rhq.plugins">
+ <priority value="DEBUG"/>
+ </category>
+
+ <root>
+ <!-- default log priority -->
+ <priority value="INFO"/>
+
+ <appender-ref ref="CONSOLE"/>
+ <appender-ref ref="FILE"/>
+ </root>
+
+</log4j:configuration>
commit 27ebddfe7dad84a990fb5949acadefaddf0be8b8
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Jan 14 15:28:08 2010 +0100
Handling the "Listen port" case in Apache 1.3. address detection.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
index b5c6a9f..4470ec5 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
@@ -87,6 +87,10 @@ public enum HttpdAddressUtility {
Address tmp = Address.parse(listen);
host = tmp.host;
portToUse = tmp.port;
+ if (portToUse == -1) {
+ host = null;
+ portToUse = Integer.parseInt(tmp.host);
+ }
}
if (host == null) {
commit ac2cb95b8f7a6be3e0cd73fd2bfac83b502bf694
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Jan 14 15:18:47 2010 +0100
Some fixes + discovery working for Apache 1.3.x
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryDiscoveryComponent.java
index 7430b12..5d03170 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryDiscoveryComponent.java
@@ -27,6 +27,8 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import net.augeas.AugeasException;
+
import org.rhq.augeas.node.AugeasNode;
import org.rhq.augeas.tree.AugeasTree;
import org.rhq.core.domain.configuration.Configuration;
@@ -54,7 +56,15 @@ public class ApacheDirectoryDiscoveryComponent implements ResourceDiscoveryCompo
Set<DiscoveredResourceDetails> discoveredResources = new LinkedHashSet<DiscoveredResourceDetails>();
- AugeasTree tree = context.getParentResourceComponent().getServerConfigurationTree();
+ AugeasTree tree = null;
+
+ try {
+ tree = context.getParentResourceComponent().getServerConfigurationTree();
+ } catch (AugeasException e) {
+ //we depend on Augeas to do anything useful with directories.
+ //give up, if Augeas isn't there.
+ return discoveredResources;
+ }
List<AugeasNode> directories = tree.matchRelative(context.getParentResourceComponent().getNode(tree), "<Directory");
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
index 270dbd8..1935c82 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
@@ -378,7 +378,7 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
AugeasProxy proxy = getAugeasProxy();
AugeasTree tree = getAugeasTree();
String[] vhostDefs = vhostDef.split(" ");
- HttpdAddressUtility.Address addr = HttpdAddressUtility.getVirtualHostSampleAddress(tree, vhostDefs[0], serverName);
+ HttpdAddressUtility.Address addr = getAddressUtility().getVirtualHostSampleAddress(tree, vhostDefs[0], serverName);
String resourceName;
if (serverName != null) {
@@ -794,6 +794,12 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
this.eventContext.unregisterEventPoller(ERROR_LOG_ENTRY_EVENT_TYPE, errorLogFile.getPath());
}
+ /**
+ * Checks whether the configuration is supported for this apache instance.
+ * Checks for Augeas availability and Apache version greater than 2.x are made.
+ *
+ * @throws IllegalStateException if configuration isn't supported
+ */
public void checkConfigurationSupported() {
if (!HAS_AUGEAS) {
throw new IllegalStateException(CONFIGURATION_NOT_SUPPORTED_ERROR_MESSAGE);
@@ -806,6 +812,11 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
}
}
+ public HttpdAddressUtility getAddressUtility() {
+ String version = resourceContext.getVersion();
+ return HttpdAddressUtility.get(version);
+ }
+
private String getNewVhostFileName(HttpdAddressUtility.Address address, String mask) {
String filename = address.host + "_" + address.port;
String fullPath = mask.replace("*", filename);
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
index e58d3d4..dae7df0 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
@@ -20,6 +20,7 @@ package org.rhq.plugins.apache;
import java.io.File;
import java.io.IOException;
+import java.net.InetAddress;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -55,6 +56,10 @@ import org.rhq.plugins.apache.util.HttpdAddressUtility;
import org.rhq.plugins.apache.util.OsProcessUtility;
import org.rhq.plugins.apache.util.HttpdAddressUtility.Address;
import org.rhq.plugins.platform.PlatformComponent;
+import org.rhq.plugins.www.snmp.SNMPClient;
+import org.rhq.plugins.www.snmp.SNMPException;
+import org.rhq.plugins.www.snmp.SNMPSession;
+import org.rhq.plugins.www.snmp.SNMPValue;
import org.rhq.rhqtransform.impl.PluginDescriptorBasedAugeasConfiguration;
/**
@@ -129,6 +134,8 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
AugeasTree serverConfig = loadAugeas(pluginConfig);
+ String serverUrl = null;
+ String vhostsGlobInclude = null;
if (serverConfig != null) {
//now check if the httpd.conf doesn't redefine the ServerRoot
List<AugeasNode> serverRoots = serverConfig.matchRelative(serverConfig.getRootNode(), "ServerRoot/param");
@@ -137,17 +144,21 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
serverRootProp.setValue(serverRoot);
}
- String url = getUrl(serverConfig);
- if (url != null) {
- Property urlProp = new PropertySimple(ApacheServerComponent.PLUGIN_CONFIG_PROP_URL, url);
- pluginConfig.put(urlProp);
- }
-
- //now try to detect where to put the new files if vhost-per-file option is selected
- String globInclude = scanForGlobInclude(serverConfig);
- if (globInclude != null) {
- pluginConfig.put(new PropertySimple(ApacheServerComponent.PLUGIN_CONFIG_PROP_VHOST_FILES_MASK, globInclude));
- }
+ serverUrl = getUrl(serverConfig, binaryInfo.getVersion());
+ vhostsGlobInclude = scanForGlobInclude(serverConfig);
+ } else {
+ //try SNMP to get the server's URL
+ serverUrl = getUrl(pluginConfig);
+ vhostsGlobInclude = "--none--";
+ }
+
+ if (serverUrl != null) {
+ Property urlProp = new PropertySimple(ApacheServerComponent.PLUGIN_CONFIG_PROP_URL, serverUrl);
+ pluginConfig.put(urlProp);
+ }
+
+ if (vhostsGlobInclude != null) {
+ pluginConfig.put(new PropertySimple(ApacheServerComponent.PLUGIN_CONFIG_PROP_VHOST_FILES_MASK, vhostsGlobInclude));
}
discoveredResources.add(createResourceDetails(discoveryContext, pluginConfig, process.getProcessInfo(),
@@ -222,11 +233,56 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
*
* @throws Exception
*/
- private static String getUrl(AugeasTree serverConfig) throws Exception {
- Address addr = HttpdAddressUtility.getMainServerSampleAddress(serverConfig);
+ private static String getUrl(AugeasTree serverConfig, String version) throws Exception {
+ Address addr = HttpdAddressUtility.get(version).getMainServerSampleAddress(serverConfig);
return addr == null ? null : "http://" + addr.host + ":" + addr.port + "/";
}
+ /**
+ * Return the root URL as determined from the SNMP session.
+ *
+ * @param pluginConfiguration
+ * @return the URL or null if SNMP session couldn't be obtained
+ * @throws Exception
+ */
+ private static String getUrl(Configuration pluginConfiguration) throws Exception {
+ SNMPClient snmpClient = new SNMPClient();
+ try {
+ SNMPSession snmpSession = ApacheServerComponent.getSNMPSession(snmpClient, pluginConfiguration);
+ if (!snmpSession.ping()) {
+ return null;
+ }
+
+ SNMPValue nameValue;
+ SNMPValue portValue;
+ try {
+ nameValue = snmpSession.getNextValue(SNMPConstants.COLUMN_VHOST_NAME);
+ } catch (SNMPException e) {
+ throw new Exception("Error getting SNMP value: " + SNMPConstants.COLUMN_VHOST_NAME + ": "
+ + e.getMessage(), e);
+ }
+
+ try {
+ portValue = snmpSession.getNextValue(SNMPConstants.COLUMN_VHOST_PORT);
+ } catch (SNMPException e) {
+ throw new Exception("Error getting SNMP column: " + SNMPConstants.COLUMN_VHOST_PORT + ": "
+ + e.getMessage(), e);
+ }
+
+ String host = nameValue.toString();
+ String fullPort = portValue.toString();
+
+ // The port value will be in the form "1.3.6.1.2.1.6.XXXXX",
+ // where "1.3.6.1.2.1.6" represents the TCP protocol ID,
+ // and XXXXX is the actual port number
+ int port = Integer.parseInt(fullPort.substring(fullPort.lastIndexOf(".") + 1));
+
+ return "http://" + host + ":" + port + "/";
+ } finally {
+ snmpClient.close();
+ }
+ }
+
@Nullable
private String getServerRoot(@NotNull ApacheBinaryInfo binaryInfo, @NotNull ProcessInfo processInfo) {
String[] cmdLine = processInfo.getCommandLine();
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
index dd88ad9..a91363d 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
@@ -497,20 +497,22 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
if (configTree != null) {
+ ApacheServerComponent parent = resourceContext.getParentResourceComponent();
if (vhostAddressStrings.length == 1 && MAIN_SERVER_RESOURCE_KEY.equals(vhostAddressStrings[0])) {
- vhostAddresses.add(HttpdAddressUtility.getMainServerSampleAddress(configTree));
+ vhostAddresses.add(parent.getAddressUtility().getMainServerSampleAddress(configTree));
} else {
for (int i = 0; i < vhostAddressStrings.length; ++i) {
- vhostAddresses.add(HttpdAddressUtility.getVirtualHostSampleAddress(configTree, vhostAddressStrings[i],
+ vhostAddresses.add(parent.getAddressUtility().getVirtualHostSampleAddress(configTree, vhostAddressStrings[i],
vhostServerName));
}
}
} else {
Configuration pluginConfig = resourceContext.getPluginConfiguration();
- HttpdAddressUtility.Address addr = HttpdAddressUtility.Address.parse(pluginConfig.getSimpleValue(URL_CONFIG_PROP, null));
- //chop off the schema part of the URL
- URI uri = new URI(addr.host);
- addr.host = uri.getHost();
+ URI uri = new URI(pluginConfig.getSimpleValue(URL_CONFIG_PROP, null));
+ String host = uri.getHost();
+ int port = uri.getPort();
+ if (port == -1) port = 80;
+ HttpdAddressUtility.Address addr = new HttpdAddressUtility.Address(host, port);
if (addr != null) {
vhostAddresses.add(addr);
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
index 79ca9d5..7e41eb4 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
@@ -70,8 +70,10 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
//read the virtual hosts from augeas
AugeasTree ag = null;
+ ApacheServerComponent serverComponent = context.getParentResourceComponent();
+
try {
- ag = context.getParentResourceComponent().getAugeasTree();
+ ag = serverComponent.getAugeasTree();
} catch (AugeasException e) {
//ok, augeas is not around, let's try fall back to SNMP
try {
@@ -87,7 +89,7 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
ResourceType resourceType = context.getResourceType();
- File configPath = context.getParentResourceComponent().getServerRoot();
+ File configPath = serverComponent.getServerRoot();
File logsDir = new File(configPath, LOGS_DIRECTORY_NAME);
List<AugeasNode> virtualHosts = ag.matchRelative(ag.getRootNode(), "<VirtualHost");
@@ -119,7 +121,7 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
Configuration pluginConfiguration = context.getDefaultPluginConfiguration();
- Address address = HttpdAddressUtility.getVirtualHostSampleAddress(ag, firstAddress, serverName);
+ Address address = serverComponent.getAddressUtility().getVirtualHostSampleAddress(ag, firstAddress, serverName);
if (address != null) {
String url = "http://" + address.host + ":" + address.port + "/";
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ModJKDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ModJKDiscoveryComponent.java
index c90d353..64b7810 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ModJKDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ModJKDiscoveryComponent.java
@@ -90,7 +90,7 @@ public class ModJKDiscoveryComponent implements ResourceDiscoveryComponent<Apach
//TODO the can be simplified using augeas...
String confPath = confPathProp.getStringValue();
if (!confPath.startsWith("/")) { // TODO implement for Windows too
- String basePath = context.getParentResourceComponent().getAugeasTree().getRootNode().getChildByLabel("ServerRoot").get(0).getValue();
+ String basePath = context.getParentResourceComponent().getServerRoot().getAbsolutePath();
confPath = basePath + "/" + confPath;
}
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
index eadcedb..b5c6a9f 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
@@ -38,23 +38,124 @@ import org.rhq.augeas.tree.AugeasTree;
*
* @author Lukas Krejci
*/
-public class HttpdAddressUtility {
+public enum HttpdAddressUtility {
+
+ APACHE_1_3 {
+ public Address getMainServerSampleAddress(AugeasTree ag) {
+ try {
+ Address addr = null;
+
+ //check if there is a ServerName directive
+ List<AugeasNode> serverNameNodes = ag.matchRelative(ag.getRootNode(), "ServerName");
+
+ if (serverNameNodes.size() > 0) {
+ String serverName = serverNameNodes.get(0).getChildByLabel("param").get(0).getValue();
+ addr = Address.parse(serverName);
+ } else {
+ List<AugeasNode> ports = ag.matchRelative(ag.getRootNode(), "Port/param");
+ List<AugeasNode> bindAddresses = ag.matchRelative(ag.getRootNode(), "BindAddress/param");
+ List<AugeasNode> listens = ag.matchRelative(ag.getRootNode(), "Listen/param");
+
+ String port = null;
+ String bindAddress = null;
+ String listen = null;
+
+ if (ports.size() > 0) {
+ port = ports.get(0).getValue();
+ }
+
+ if (bindAddresses.size() > 0) {
+ bindAddress = bindAddresses.get(0).getValue();
+ }
+
+ if (listens.size() > 0) {
+ listen = listens.get(0).getValue();
+ }
+
+ String host = null;
+ int portToUse = -1;
+
+ if (bindAddress != null && !"*".equals(bindAddress)) {
+ host = bindAddress;
+ }
+
+ if (port != null) {
+ portToUse = Integer.parseInt(port);
+ }
+
+ if (listen != null) {
+ Address tmp = Address.parse(listen);
+ host = tmp.host;
+ portToUse = tmp.port;
+ }
+
+ if (host == null) {
+ host = InetAddress.getLocalHost().getHostName();
+ }
+
+ addr = new Address(host, portToUse);
+ }
+ return addr;
+ } catch (Exception e) {
+ log.info("Failed to obtain main server address. Is augeas installed and correct lens in use?");
+
+ return null;
+ }
+ }
+ },
+ APACHE_2_x {
+ public Address getMainServerSampleAddress(AugeasTree ag) {
+ try {
+ Address addr = null;
+
+ //check if there is a ServerName directive
+ List<AugeasNode> serverNameNodes = ag.matchRelative(ag.getRootNode(), "ServerName");
+
+ if (serverNameNodes.size() > 0) {
+ String serverName = serverNameNodes.get(0).getChildByLabel("param").get(0).getValue();
+ addr = Address.parse(serverName);
+ } else {
+ //there has to be at least one Listen directive
+ AugeasNode listen = ag.matchRelative(ag.getRootNode(), "Listen").get(0);
+
+ List<AugeasNode> params = listen.getChildByLabel("param");
+ String address = params.get(0).getValue();
+
+ addr = Address.parse(address);
+
+ if (addr.port == -1) {
+ addr.port = Integer.parseInt(addr.host);
+ try {
+ addr.host = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ throw new IllegalStateException("Unable to get the localhost address.", e);
+ }
+ }
+ }
+ return addr;
+ } catch (Exception e) {
+ log.info("Failed to obtain main server address. Is augeas installed and correct lens in use?");
+
+ return null;
+ }
+ }
+ };
private static final Log log = LogFactory.getLog(HttpdAddressUtility.class);
-
- private HttpdAddressUtility() {
-
+
+ public static HttpdAddressUtility get(String version) {
+ return version.startsWith("1.") ? APACHE_1_3 : APACHE_2_x;
}
public static class Address {
public String host;
public int port = -1;
-
+
public Address(String host, int port) {
this.host = host;
this.port = port;
}
-
+
/**
* A simple parser of the provided address into host and port
* sections.
@@ -78,70 +179,38 @@ public class HttpdAddressUtility {
}
}
}
-
+
@Override
public int hashCode() {
int hash = port;
- if (host != null) hash *= host.hashCode();
+ if (host != null)
+ hash *= host.hashCode();
return hash;
}
-
+
@Override
public boolean equals(Object other) {
- if (!(other instanceof Address)) return false;
-
- Address o = (Address)other;
-
+ if (!(other instanceof Address))
+ return false;
+
+ Address o = (Address) other;
+
if (this.host == null) {
return o.host == null && this.port == o.port;
} else {
return this.host.equals(o.host) && this.port == o.port;
}
}
- }
-
+ }
+
/**
* This just constructs a first available address under which the server or one of its virtual hosts can be reached.
*
* @param ag the tree of the httpd configuration
* @return the address or null on failure
*/
- public static Address getMainServerSampleAddress(AugeasTree ag) {
- try {
- Address addr = null;
-
- //check if there is a ServerName directive
- List<AugeasNode> serverNameNodes = ag.matchRelative(ag.getRootNode(), "ServerName");
-
- if (serverNameNodes.size() > 0) {
- String serverName = serverNameNodes.get(0).getChildByLabel("param").get(0).getValue();
- addr = Address.parse(serverName);
- } else {
- //there has to be at least one Listen directive
- AugeasNode listen = ag.matchRelative(ag.getRootNode(), "Listen").get(0);
-
- List<AugeasNode> params = listen.getChildByLabel("param");
- String address = params.get(0).getValue();
-
- addr = Address.parse(address);
-
- if (addr.port == -1) {
- addr.port = Integer.parseInt(addr.host);
- try {
- addr.host = InetAddress.getLocalHost().getHostName();
- } catch (UnknownHostException e) {
- throw new IllegalStateException("Unable to get the localhost address.", e);
- }
- }
- }
- return addr;
- } catch (Exception e) {
- log.info("Failed to obtain main server address. Is augeas installed and correct lens in use?");
-
- return null;
- }
- }
-
+ public abstract Address getMainServerSampleAddress(AugeasTree ag);
+
/**
* This constructs an address on which given virtual host can be accessed.
*
@@ -151,26 +220,28 @@ public class HttpdAddressUtility {
*
* @return the address on which the virtual host can be accessed or null on error
*/
- public static Address getVirtualHostSampleAddress(AugeasTree ag, String virtualHost, String serverName) {
+ public Address getVirtualHostSampleAddress(AugeasTree ag, String virtualHost, String serverName) {
Address addr = Address.parse(virtualHost);
if (addr.port == -1) {
//just port specified
Address serverAddr = getMainServerSampleAddress(ag);
-
- if (serverAddr == null) return null;
-
+
+ if (serverAddr == null)
+ return null;
+
addr.port = Integer.parseInt(addr.host);
addr.host = serverAddr.host;
} else {
String host = addr.host;
if ("*".equals(host) || "_default_".equals(host)) {
Address serverAddr = getMainServerSampleAddress(ag);
- if (serverAddr == null) return null;
+ if (serverAddr == null)
+ return null;
host = serverAddr.host;
}
addr.host = host;
}
-
+
if (serverName != null) {
int colonIdx = serverName.indexOf(':');
if (colonIdx >= 0) {
@@ -181,7 +252,7 @@ public class HttpdAddressUtility {
}
addr.host = addr.host.replaceAll("\\*", "replaced-wildcard");
}
-
+
return addr;
- }
+ }
}
commit f6d252848c6818272426ee9d0f44683ca9a7f1f9
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Jan 13 23:31:18 2010 +0100
Discovery of vhosts falls back to SNMP when Augeas not installed. Nicer error messages when configuration not supported.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
index 0b43873..270dbd8 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
@@ -28,6 +28,7 @@ import java.util.Set;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
+import net.augeas.Augeas;
import net.augeas.AugeasException;
import org.apache.commons.logging.Log;
@@ -88,6 +89,9 @@ import org.rhq.rhqtransform.AugeasRHQComponent;
*/
public class ApacheServerComponent implements AugeasRHQComponent<PlatformComponent>, MeasurementFacet, OperationFacet,
ConfigurationFacet, CreateChildResourceFacet {
+
+ private static final String CONFIGURATION_NOT_SUPPORTED_ERROR_MESSAGE = "Configuration is supported only for Apache version 2 and up using Augeas. You either have an old version of Apache or Augeas is not installed.";
+
private final Log log = LogFactory.getLog(this.getClass());
public static final String PLUGIN_CONFIG_PROP_SERVER_ROOT = "serverRoot";
@@ -134,6 +138,18 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
private ApacheBinaryInfo binaryInfo;
private long availPingTime = -1;
+ private static final boolean HAS_AUGEAS;
+ static {
+ boolean augeasPresent;
+ try {
+ new Augeas();
+ augeasPresent = true;
+ } catch (Throwable e) {
+ augeasPresent = false;
+ }
+ HAS_AUGEAS = augeasPresent;
+ }
+
/**
* Delegate instance for handling all calls to invoke operations on this component.
*/
@@ -289,9 +305,7 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
}
public Configuration loadResourceConfiguration() throws Exception {
- if (!isConfigurationSupported()) {
- throw new IllegalStateException("Configuration is supported only for Apache version 2 and up.");
- }
+ checkConfigurationSupported();
try {
ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType()
@@ -780,9 +794,16 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
this.eventContext.unregisterEventPoller(ERROR_LOG_ENTRY_EVENT_TYPE, errorLogFile.getPath());
}
- private boolean isConfigurationSupported() {
+ public void checkConfigurationSupported() {
+ if (!HAS_AUGEAS) {
+ throw new IllegalStateException(CONFIGURATION_NOT_SUPPORTED_ERROR_MESSAGE);
+ }
+
String version = resourceContext.getVersion();
- return version.startsWith("2.");
+
+ if (!version.startsWith("2.")) {
+ throw new IllegalStateException(CONFIGURATION_NOT_SUPPORTED_ERROR_MESSAGE);
+ }
}
private String getNewVhostFileName(HttpdAddressUtility.Address address, String mask) {
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
index bbb884a..dd88ad9 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
@@ -137,6 +137,8 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
}
public Configuration loadResourceConfiguration() throws Exception {
+ resourceContext.getParentResourceComponent().checkConfigurationSupported();
+
AugeasTree tree = getServerConfigurationTree();
ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType()
.getResourceConfigurationDefinition();
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
index bdaf076..79ca9d5 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
@@ -33,6 +33,7 @@ import net.augeas.AugeasException;
import org.rhq.augeas.node.AugeasNode;
import org.rhq.augeas.tree.AugeasTree;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
@@ -41,11 +42,16 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.plugins.apache.util.HttpdAddressUtility;
import org.rhq.plugins.apache.util.HttpdAddressUtility.Address;
+import org.rhq.plugins.www.snmp.SNMPException;
+import org.rhq.plugins.www.snmp.SNMPSession;
+import org.rhq.plugins.www.snmp.SNMPValue;
/**
* Discovers VirtualHosts under the Apache server by reading them out from Augeas tree constructed
- * in the parent component.
+ * in the parent component. If Augeas is not present, an attempt is made to discover the vhosts using
+ * SNMP module.
*
+ * @author Ian Springer
* @author Lukas Krejci
*/
public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDiscoveryComponent<ApacheServerComponent> {
@@ -54,59 +60,36 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
private static final String RT_LOG_FILE_NAME_SUFFIX = "_rt.log";
- private final Log log = LogFactory.getLog(getClass());
-
+ private static final Log log = LogFactory.getLog(ApacheVirtualHostServiceDiscoveryComponent.class);
+
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ApacheServerComponent> context)
throws InvalidPluginConfigurationException, Exception {
Set<DiscoveredResourceDetails> discoveredResources = new LinkedHashSet<DiscoveredResourceDetails>();
- //first define the root server as one virtual host
- ResourceType resourceType = context.getResourceType();
-
- Configuration mainServerPluginConfig = context.getDefaultPluginConfiguration();
-
- File configPath = context.getParentResourceComponent().getServerRoot();
- File logsDir = new File(configPath, LOGS_DIRECTORY_NAME);
-
- String mainServerUrl = context.getParentResourceContext().getPluginConfiguration().getSimple(
- ApacheServerComponent.PLUGIN_CONFIG_PROP_URL).getStringValue();
- if (mainServerUrl != null && !"null".equals(mainServerUrl)) {
- PropertySimple mainServerUrlProp = new PropertySimple(ApacheVirtualHostServiceComponent.URL_CONFIG_PROP,
- mainServerUrl);
-
- mainServerPluginConfig.put(mainServerUrlProp);
-
- URI mainServerUri = new URI(mainServerUrl);
- String host = mainServerUri.getHost();
- int port = mainServerUri.getPort();
- if (port == -1) {
- port = 80;
- }
-
- File rtLogFile = new File(logsDir, host + port
- + RT_LOG_FILE_NAME_SUFFIX);
-
- PropertySimple rtLogProp = new PropertySimple(
- ApacheVirtualHostServiceComponent.RESPONSE_TIME_LOG_FILE_CONFIG_PROP, rtLogFile.toString());
- mainServerPluginConfig.put(rtLogProp);
- }
-
- DiscoveredResourceDetails mainServer = new DiscoveredResourceDetails(resourceType,
- ApacheVirtualHostServiceComponent.MAIN_SERVER_RESOURCE_KEY, "Main Server", null, null,
- mainServerPluginConfig, null);
- discoveredResources.add(mainServer);
-
//read the virtual hosts from augeas
AugeasTree ag = null;
try {
ag = context.getParentResourceComponent().getAugeasTree();
} catch (AugeasException e) {
- log.warn("Could not obtain the Augeas tree, giving up virtual host discovery.", e);
+ //ok, augeas is not around, let's try fall back to SNMP
+ try {
+ discoverUsingSnmp(context, discoveredResources);
+ } catch (Exception se) {
+ log.warn("Neither Augeas nor SNMP module was found installed on this machine/Apache server. No virtual hosts can be found.");
+ }
return discoveredResources;
}
+ //first define the root server as one virtual host
+ discoverMainServer(context, discoveredResources);
+
+ ResourceType resourceType = context.getResourceType();
+
+ File configPath = context.getParentResourceComponent().getServerRoot();
+ File logsDir = new File(configPath, LOGS_DIRECTORY_NAME);
+
List<AugeasNode> virtualHosts = ag.matchRelative(ag.getRootNode(), "<VirtualHost");
for (AugeasNode node : virtualHosts) {
@@ -144,9 +127,8 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
pluginConfiguration.put(urlProp);
}
- File rtLogFile = new File(logsDir, address.host + address.port
- + RT_LOG_FILE_NAME_SUFFIX);
-
+ File rtLogFile = new File(logsDir, address.host + address.port + RT_LOG_FILE_NAME_SUFFIX);
+
PropertySimple rtLogProp = new PropertySimple(
ApacheVirtualHostServiceComponent.RESPONSE_TIME_LOG_FILE_CONFIG_PROP, rtLogFile.toString());
pluginConfiguration.put(rtLogProp);
@@ -164,4 +146,111 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
return discoveredResources;
}
+
+ private void discoverUsingSnmp(ResourceDiscoveryContext<ApacheServerComponent> context,
+ Set<DiscoveredResourceDetails> discoveredResources) throws Exception {
+
+ SNMPSession snmpSession = context.getParentResourceComponent().getSNMPSession();
+
+ List<SNMPValue> nameValues;
+ List<SNMPValue> portValues;
+ SNMPValue descValue;
+
+ try {
+ nameValues = snmpSession.getColumn(SNMPConstants.COLUMN_VHOST_NAME);
+ } catch (SNMPException e) {
+ throw new Exception(
+ "Error getting SNMP column: " + SNMPConstants.COLUMN_VHOST_NAME + ": " + e.getMessage(), e);
+ }
+
+ try {
+ portValues = snmpSession.getColumn(SNMPConstants.COLUMN_VHOST_PORT);
+ } catch (SNMPException e) {
+ throw new Exception(
+ "Error getting SNMP column: " + SNMPConstants.COLUMN_VHOST_PORT + ": " + e.getMessage(), e);
+ }
+
+ try {
+ // Just get the first one - they are all the same.
+ descValue = snmpSession.getNextValue(SNMPConstants.COLUMN_VHOST_DESC);
+ } catch (SNMPException e) {
+ throw new Exception("Error getting SNMP value: " + SNMPConstants.COLUMN_VHOST_DESC + ": " + e.getMessage(),
+ e);
+ }
+
+ ApacheServerComponent parentApacheComponent = context.getParentResourceComponent();
+ File configPath = parentApacheComponent.getServerRoot();
+ File logsDir = new File(configPath, "logs");
+
+ for (int i = 0; i < nameValues.size(); i++) {
+ SNMPValue nameValue = nameValues.get(i);
+ String host = nameValue.toString();
+ SNMPValue portValue = portValues.get(i);
+ String fullPort = portValue.toString();
+
+ // The port value will be in the form "1.3.6.1.2.1.6.XXXXX",
+ // where "1.3.6.1.2.1.6" represents the TCP protocol ID,
+ // and XXXXX is the actual port number
+ String portString = fullPort.substring(fullPort.lastIndexOf(".") + 1);
+ int port = Integer.parseInt(portString);
+ port = port == 0 ? 80 : port;
+ String key = host + ":" + port;
+ String name = "Virtual Host " + key;
+ String version = null; // virtualhosts don't have versions.
+ String desc = descValue.toString();
+ DiscoveredResourceDetails resourceDetails = new DiscoveredResourceDetails(context.getResourceType(), key,
+ name, version, desc, null, null);
+
+ // Init the plugin config...
+ Configuration pluginConfig = resourceDetails.getPluginConfiguration();
+
+ String url = "http://" + host + ":" + port + "/";
+ Property urlProp = new PropertySimple(ApacheVirtualHostServiceComponent.URL_CONFIG_PROP, url);
+ pluginConfig.put(urlProp);
+
+ String rtLogFileName = host + port + RT_LOG_FILE_NAME_SUFFIX;
+ File rtLogFile = new File(logsDir, rtLogFileName);
+ pluginConfig.put(new PropertySimple(ApacheVirtualHostServiceComponent.RESPONSE_TIME_LOG_FILE_CONFIG_PROP,
+ rtLogFile));
+
+ discoveredResources.add(resourceDetails);
+ }
+ }
+
+ private void discoverMainServer(ResourceDiscoveryContext<ApacheServerComponent> context,
+ Set<DiscoveredResourceDetails> discoveredResources) throws Exception {
+
+ ResourceType resourceType = context.getResourceType();
+ Configuration mainServerPluginConfig = context.getDefaultPluginConfiguration();
+
+ File configPath = context.getParentResourceComponent().getServerRoot();
+ File logsDir = new File(configPath, LOGS_DIRECTORY_NAME);
+
+ String mainServerUrl = context.getParentResourceContext().getPluginConfiguration().getSimple(
+ ApacheServerComponent.PLUGIN_CONFIG_PROP_URL).getStringValue();
+ if (mainServerUrl != null && !"null".equals(mainServerUrl)) {
+ PropertySimple mainServerUrlProp = new PropertySimple(ApacheVirtualHostServiceComponent.URL_CONFIG_PROP,
+ mainServerUrl);
+
+ mainServerPluginConfig.put(mainServerUrlProp);
+
+ URI mainServerUri = new URI(mainServerUrl);
+ String host = mainServerUri.getHost();
+ int port = mainServerUri.getPort();
+ if (port == -1) {
+ port = 80;
+ }
+
+ File rtLogFile = new File(logsDir, host + port + RT_LOG_FILE_NAME_SUFFIX);
+
+ PropertySimple rtLogProp = new PropertySimple(
+ ApacheVirtualHostServiceComponent.RESPONSE_TIME_LOG_FILE_CONFIG_PROP, rtLogFile.toString());
+ mainServerPluginConfig.put(rtLogProp);
+ }
+
+ DiscoveredResourceDetails mainServer = new DiscoveredResourceDetails(resourceType,
+ ApacheVirtualHostServiceComponent.MAIN_SERVER_RESOURCE_KEY, "Main Server", null, null,
+ mainServerPluginConfig, null);
+ discoveredResources.add(mainServer);
+ }
}
\ No newline at end of file
commit 9a4891564ffcc26fc508a67ba3680d41454c2637
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 13 16:10:19 2010 -0500
Added code enable AugeasConfigComponent to load multiple lenses..
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
index dadc167..7c633ae 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
@@ -36,6 +36,7 @@ import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.rhq.augeas.util.Glob;
import org.rhq.core.domain.configuration.AbstractPropertyMap;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
@@ -61,7 +62,6 @@ import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.augeas.helper.AugeasNode;
-import org.rhq.augeas.util.Glob;
/**
* @author Ian Springer
@@ -93,7 +93,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
public void start(ResourceContext<T> resourceContext) throws InvalidPluginConfigurationException, Exception {
this.resourceContext = resourceContext;
this.resourceDescription = this.resourceContext.getResourceType() + " Resource with key ["
- + this.resourceContext.getResourceKey() + "]";
+ + this.resourceContext.getResourceKey() + "]";
initGlobs();
Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
@@ -112,7 +112,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
}
public void stop() {
- if (this.augeas!=null)
+ if (this.augeas != null)
this.augeas.close();
}
@@ -146,12 +146,9 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
}
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
- try
- {
+ try {
abortIfAugeasNotAvailable();
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
report.setErrorMessage(e.getLocalizedMessage());
return;
}
@@ -288,8 +285,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
return this.resourceContext;
}
- public String getResourceDescription()
- {
+ public String getResourceDescription() {
return this.resourceDescription;
}
@@ -303,26 +299,30 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
return this.augeas;
}
- private Augeas createAugeas() {
+ protected void setupAugeasModules(Augeas augeas) {
Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
String augeasModuleName = pluginConfig.getSimpleValue(AUGEAS_MODULE_NAME_PROP, null);
if (augeasModuleName == null) {
throw new IllegalStateException("Plugin config property '" + AUGEAS_MODULE_NAME_PROP + "' is required.");
}
+ augeas.set("/augeas/load/" + augeasModuleName + "/lens", augeasModuleName + ".lns");
+ int idx = 1;
+ for (String incl : this.includeGlobs) {
+ augeas.set("/augeas/load/" + augeasModuleName + "/incl[" + (idx++) + "]", incl);
+ }
+ idx = 1;
+ for (String excl : this.excludeGlobs) {
+ augeas.set("/augeas/load/" + augeasModuleName + "/excl[" + (idx++) + "]", excl);
+ }
+ }
+
+ private Augeas createAugeas() {
+ Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
Augeas augeas;
try {
augeas = new Augeas(this.augeasRootPath, AUGEAS_LOAD_PATH, Augeas.NO_MODL_AUTOLOAD);
- augeas.set("/augeas/load/" + augeasModuleName + "/lens", augeasModuleName + ".lns");
-
- int idx = 1;
- for (String incl : this.includeGlobs) {
- augeas.set("/augeas/load/" + augeasModuleName + "/incl[" + (idx++) + "]", incl);
- }
- idx = 1;
- for (String excl : this.excludeGlobs) {
- augeas.set("/augeas/load/" + augeasModuleName + "/excl[" + (idx++) + "]", excl);
- }
+ setupAugeasModules(augeas);
loadConfigurationFiles(augeas);
} catch (RuntimeException e) {
augeas = null;
@@ -677,9 +677,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
log.debug("Resource Config Root Node = \"" + this.resourceConfigRootNode + "\"");
}
- private void abortIfAugeasNotAvailable()
- throws Exception
- {
+ private void abortIfAugeasNotAvailable() throws Exception {
if (getAugeas() == null) {
if (isAugeasAvailable()) {
initAugeas();
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
index 5552eed..d3d5eb0 100644
--- a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -36,22 +36,28 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
import org.rhq.plugins.augeas.helper.AugeasNode;
import org.rhq.plugins.augeas.helper.AugeasUtility;
+import org.rhq.plugins.platform.PlatformComponent;
/**
* The ResourceComponent for the "Cobbler File" ResourceType.
*
* @author Ian Springer
*/
-public class CobblerComponent extends AugeasConfigurationComponent {
+public class CobblerComponent extends AugeasConfigurationComponent<PlatformComponent> {
private final Log log = LogFactory.getLog(this.getClass());
- public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception {
+ public void start(ResourceContext<PlatformComponent> resourceContext) throws InvalidPluginConfigurationException,
+ Exception {
super.start(resourceContext);
}
- public void stop() {
- return;
+ @Override
+ protected void setupAugeasModules(Augeas augeas) {
+ augeas.set("/augeas/load/CobblerSettings/lens", "CobblerSettings.lns");
+ augeas.set("/augeas/load/CobblerSettings/incl[1]", "/etc/cobbler/settings");
+ augeas.set("/augeas/load/CobblerModules/lens", "CobblerModules.lns");
+ augeas.set("/augeas/load/CobblerModules/incl[1]", "/etc/cobbler/modules.conf");
}
public AvailabilityType getAvailability() {
commit c8379990529e5f3a72feba34c796f3de4ad38c6b
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Jan 13 14:44:15 2010 -0500
minor syntax fix on plugin name
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index 44b9589..039e053 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -10,7 +10,7 @@
<depends plugin="Augeas"/>
- <server name="Cobbler File"
+ <server name="Cobbler"
description="the local file used for mapping modules and setttings"
discovery="CobblerDiscoveryComponent"
class="CobblerComponent"
commit 8c369a74ad82ac8a29ac13e1f25a9e00d283015c
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Jan 13 14:39:47 2010 -0500
changing cobbler from service to server
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index e908fa0..44b9589 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -10,7 +10,7 @@
<depends plugin="Augeas"/>
- <service name="Cobbler File"
+ <server name="Cobbler File"
description="the local file used for mapping modules and setttings"
discovery="CobblerDiscoveryComponent"
class="CobblerComponent"
@@ -37,7 +37,7 @@
description="The IP address of the cobbler server."/>
</resource-configuration>
- </service>
+ </server>
</plugin>
commit 802b1163045d20f0b813b7cb6776feefa355c600
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Jan 13 14:30:09 2010 -0500
fixing descriptor syntax issue in partha code
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index 261274f..e908fa0 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -11,7 +11,7 @@
<depends plugin="Augeas"/>
<service name="Cobbler File"
- description="the local file used for mapping /etc/cobbler/ modules & setttings"
+ description="the local file used for mapping modules and setttings"
discovery="CobblerDiscoveryComponent"
class="CobblerComponent"
supportsManualAdd="true">
commit 70d1c52d458d95b5bab1114fe52c1f1be330c7a0
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 13 14:23:36 2010 -0500
Small updates on cobbler-plugin .
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
index 5f22ca8..261274f 100644
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -26,23 +26,15 @@
description="the name of the Augeas module/lens to use for loading and updating this Resource's configuration"/>
<c:simple-property name="configurationFilesInclusionPatterns"
- default="/etc/cobbler" required="true" readOnly="true"
+ default="/etc/cobbler/settings|/etc/cobbler/modules.conf" required="true" readOnly="true"
description="the absolute paths of the configuration files, delimited with pipe characters; wildcards are permitted in the last component of the path (e.g. /etc/cron.d/*)"/>
+ <c:simple-property name="resourceConfigurationRootNode" required="true" readOnly="true"
+ default="/files/etc/cobbler/"/>
</plugin-configuration>
<resource-configuration>
- <c:list-property name="." displayName="Entries">
- <c:map-property name="*[canonical]">
- <c:simple-property name="ipaddr" displayName="IP Address" type="string" required="true" activationPolicy="immediate"
- description="The IP address of the host entry. The address may be an IPv4 address (e.g., 192.168.1.10) or an IPv6 address (e.g., fec0:0:0:bebe::2)."/>
-
- <c:simple-property name="canonical" displayName="Canonical Host Name" type="string" required="true" activationPolicy="immediate"
- description="The canonical host name to refer to the IP address. Host names may contain only alphanumeric characters, minus signs ('-'), and periods ('.'). They must begin with an alphabetic character and end with an alphanumeric character (e.g., foo.mydomain.org). A canonical name can be mapped to only one IPv4 address and/or to only one IPv6 address."/>
-
- <c:simple-property name="alias" displayName="Aliases" type="longString" required="false" activationPolicy="immediate"
- description="Optional aliases provide for name changes, alternate spellings, shorter host names, or generic host names (e.g., localhost); aliases should be newline or space separated)."/>
- </c:map-property>
- </c:list-property>
+ <c:simple-property name="settings/server" displayName="Server" type="string" required="true" activationPolicy="immediate"
+ description="The IP address of the cobbler server."/>
</resource-configuration>
</service>
diff --git a/modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java b/modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java
index cbbbe2e..3888e6f 100644
--- a/modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java
+++ b/modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java
@@ -18,48 +18,28 @@
*/
package org.rhq.plugins.cobbler;
-import java.io.File;
-
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.plugins.augeas.AugeasConfigurationComponent;
-import org.rhq.plugins.augeas.test.AbstractAugeasConfigurationComponentTest;
/**
* An integration test for {@link CobblerComponent}.
*
* @author Ian Springer
*/
-public class CobblerComponentTest extends AbstractAugeasConfigurationComponentTest {
+public class CobblerComponentTest {
private static final String PLUGIN_NAME = "Cobbler";
private static final String RESOURCE_TYPE_NAME = "Cobbler File";
- @Override
protected String getPluginName() {
return PLUGIN_NAME;
}
- @Override
protected String getResourceTypeName() {
return RESOURCE_TYPE_NAME;
}
- @Override
- protected boolean isResourceConfigSupported() {
- // The cobbler plugin will use Augeas if it's available but will fall back to direct file parsing if it's not.
- return true;
- }
-
- @Override
- protected void tweakDefaultPluginConfig(Configuration defaultPluginConfig) {
- super.tweakDefaultPluginConfig(defaultPluginConfig);
- String cobblerFilePath = new File("/etc/cobbler").getAbsolutePath();
- defaultPluginConfig.put(new PropertySimple(AugeasConfigurationComponent.INCLUDE_GLOBS_PROP, cobblerFilePath));
- }
-
- @Override
protected Configuration getExpectedResourceConfig() {
Configuration config = new Configuration();
PropertyList entries = new PropertyList(".");
@@ -100,7 +80,6 @@ public class CobblerComponentTest extends AbstractAugeasConfigurationComponentTe
return config;
}
- @Override
protected Configuration getUpdatedResourceConfig() {
Configuration config = new Configuration();
PropertyList entries = new PropertyList(".");
commit f5d69c0234c437e7cd2c30a08658a7a4dcbe1697
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Jan 13 14:15:49 2010 -0500
removing vi artifact from partha checkin
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml~ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml~
deleted file mode 100644
index da88adc..0000000
--- a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml~
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<plugin name="Cobbler"
- displayName="Cobbler"
- description="Support for cobbler file"
- package="org.rhq.plugins.cobbler"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="urn:xmlns:rhq-plugin"
- xmlns:c="urn:xmlns:rhq-configuration">
-
- <depends plugin="Augeas"/>
-
- <service name="Cobbler File"
- description="the local file used for mapping host names to IP addresses"
- discovery="CobblerDiscoveryComponent"
- class="CobblerComponent"
- supportsManualAdd="true">
-
- <runs-inside>
- <parent-resource-type name="Linux" plugin="Platforms"/>
- <parent-resource-type name="Windows" plugin="Platforms"/>
- <parent-resource-type name="Solaris" plugin="Platforms"/>
- <parent-resource-type name="HP-UX" plugin="Platforms"/>
- <parent-resource-type name="AIX" plugin="Platforms"/>
- <parent-resource-type name="FreeBSD" plugin="Platforms"/>
- <parent-resource-type name="Mac OS X" plugin="Platforms"/>
- <parent-resource-type name="Java" plugin="Platforms"/>
- </runs-inside>
-
- <plugin-configuration>
- <c:simple-property name="augeasModuleName" displayName="Augeas Module Name" default="Cobbler" required="true" readOnly="true"
- description="the name of the Augeas module/lens to use for loading and updating this Resource's configuration"/>
-
- <c:simple-property name="configurationFilesInclusionPatterns"
- default="/etc/cobbler" required="true" readOnly="true"
- description="the absolute paths of the configuration files, delimited with pipe characters; wildcards are permitted in the last component of the path (e.g. /etc/cron.d/*)"/>
- </plugin-configuration>
-
- <resource-configuration>
- <c:list-property name="." displayName="Entries">
- <c:map-property name="*[canonical]">
- <c:simple-property name="ipaddr" displayName="IP Address" type="string" required="true" activationPolicy="immediate"
- description="The IP address of the host entry. The address may be an IPv4 address (e.g., 192.168.1.10) or an IPv6 address (e.g., fec0:0:0:bebe::2)."/>
-
- <c:simple-property name="canonical" displayName="Canonical Host Name" type="string" required="true" activationPolicy="immediate"
- description="The canonical host name to refer to the IP address. Host names may contain only alphanumeric characters, minus signs ('-'), and periods ('.'). They must begin with an alphabetic character and end with an alphanumeric character (e.g., foo.mydomain.org). A canonical name can be mapped to only one IPv4 address and/or to only one IPv6 address."/>
-
- <c:simple-property name="alias" displayName="Aliases" type="longString" required="false" activationPolicy="immediate"
- description="Optional aliases provide for name changes, alternate spellings, shorter host names, or generic host names (e.g., localhost); aliases should be newline or space separated)."/>
- </c:map-property>
- </c:list-property>
- </resource-configuration>
-
- </service>
-
-</plugin>
-
\ No newline at end of file
commit 24e22024d5c6aacfacbae76ed4ce940a73b5d1e1
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Jan 13 14:07:21 2010 -0500
adding cobbler to plugin pom
diff --git a/modules/plugins/pom.xml b/modules/plugins/pom.xml
index 6e7d53e..4d6b6a4 100644
--- a/modules/plugins/pom.xml
+++ b/modules/plugins/pom.xml
@@ -106,6 +106,7 @@
<module>grub</module>
<!-- not behaving <module>hardware</module> -->
<module>hosts</module>
+ <module>cobbler</module>
<module>sudoers</module>
<module>hudson</module>
<!-- error in code generation (see RHQ-1225) <module>jira</module> -->
commit 13fc399f615031b8086d732461349c321b965a12
Merge: ff45557... 4d2b970...
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 13 13:46:31 2010 -0500
Merge branch 'master' into linux-config
commit ff455571f1209c3190c2f8bd5a09908cfd6b4490
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 13 13:43:49 2010 -0500
Initial Cobbler plugin skeleton
diff --git a/.classpath b/.classpath
index 4598f49..5281300 100644
--- a/.classpath
+++ b/.classpath
@@ -105,8 +105,10 @@
<classpathentry kind="src" path="modules/plugins/hudson/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/platform/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/hosts/src/main/java"/>
- <classpathentry kind="src" path="modules/plugins/hosts/src/test/java"/>
- <classpathentry kind="src" path="modules/plugins/virt/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/hosts/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/cobbler/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/cobbler/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/virt/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/aliases/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/snmptrapd/src/main/java"/>
diff --git a/modules/plugins/cobbler/pom.xml b/modules/plugins/cobbler/pom.xml
new file mode 100644
index 0000000..5faed52
--- /dev/null
+++ b/modules/plugins/cobbler/pom.xml
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-plugins-parent</artifactId>
+ <version>1.4.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-cobbler-plugin</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Cobbler File Plugin</name>
+ <description>A plugin for managing the system cobbler file</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/plugins/cobbler</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/plugins/cobbler</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/plugins/cobbler/</scm.module.path>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>${rhq.groupId}</groupId>
+ <artifactId>rhq-augeas-plugin</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>integration-tests</id>
+ <activation>
+ <property>
+ <name>maven.test.skip</name>
+ <value>!true</value>
+ </property>
+ </activation>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>pre-integration-test</phase>
+ <configuration>
+ <tasks>
+ <echo>Setting up integration test plugin container environment under target/itest/...</echo>
+
+ <property name="settings.localRepository" location="${user.home}/.m2/repository" />
+
+ <mkdir dir="target/itest/plugins" />
+ <copy toDir="target/itest/plugins" flatten="true" verbose="true">
+ <!-- the plugin jar for this plugin -->
+ <fileset dir="${project.build.directory}" includes="${project.artifactId}-${project.version}.jar" />
+ <!-- the plugin jars for the plugins this plugin depends on -->
+ <fileset dir="${settings.localRepository}/">
+ <include name="org/rhq/rhq-platform-plugin/${project.version}/rhq-platform-plugin-${project.version}.jar" />
+ <include name="org/rhq/rhq-augeas-plugin/${project.version}/rhq-augeas-plugin-${project.version}.jar" />
+ </fileset>
+ </copy>
+
+ <!-- copy SIGAR jar and native libs into the lib dir -->
+ <mkdir dir="target/itest/lib" />
+ <unzip dest="target/itest/lib">
+ <fileset dir="${settings.localRepository}/org/hyperic/sigar-dist/${sigar.version}" includes="*.zip" />
+ <patternset>
+ <include name="**/lib/sigar.jar" />
+ <include name="**/lib/bcel*.jar" />
+ <include name="**/lib/*.so" />
+ <include name="**/lib/*.sl" />
+ <include name="**/lib/*.dll" />
+ <include name="**/lib/*.dylib" />
+ </patternset>
+ </unzip>
+ <move todir="target/itest/lib" flatten="true">
+ <fileset dir="target/itest/lib">
+ <include name="**/lib/*" />
+ </fileset>
+ </move>
+ <delete dir="target/itest/lib/hyperic-sigar-${sigar.version}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- Integration testing voodoo to load and test this plugin with its plugin dependencies -->
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ <executions>
+ <execution>
+ <id>surefire-it</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <skip>${maven.test.skip}</skip>
+ <excludedGroups>${rhq.testng.excludedGroups}</excludedGroups>
+ <useSystemClassLoader>true</useSystemClassLoader>
+ <argLine>-Dorg.hyperic.sigar.path=${basedir}/target/itest/lib</argLine>
+ <!--<argLine>-Dorg.hyperic.sigar.path=${basedir}/target/itest/lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y</argLine>-->
+ <systemProperties>
+ <property>
+ <name>project.artifactId</name>
+ <value>${project.artifactId}</value>
+ </property>
+ <property>
+ <name>project.version</name>
+ <value>${project.version}</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>
+ ${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-downloads/rhq-plugins
+ </rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${rhq.deploymentDir}" />
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.outputDirectory}">
+ <patternset><include name="META-INF/**" /></patternset>
+ </unjar>
+ <jar destfile="${deployment.file}" manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF" update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+</project>
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
new file mode 100644
index 0000000..5552eed
--- /dev/null
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java
@@ -0,0 +1,104 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.plugins.cobbler;
+
+import java.util.List;
+
+import net.augeas.Augeas;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionList;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.plugins.augeas.AugeasConfigurationComponent;
+import org.rhq.plugins.augeas.helper.AugeasNode;
+import org.rhq.plugins.augeas.helper.AugeasUtility;
+
+/**
+ * The ResourceComponent for the "Cobbler File" ResourceType.
+ *
+ * @author Ian Springer
+ */
+public class CobblerComponent extends AugeasConfigurationComponent {
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception {
+ super.start(resourceContext);
+ }
+
+ public void stop() {
+ return;
+ }
+
+ public AvailabilityType getAvailability() {
+ return super.getAvailability();
+ }
+
+ @Override
+ protected String getNodeInsertionPoint(Augeas augeas, AugeasNode node, PropertyDefinitionSimple propDefSimple,
+ PropertySimple propSimple) {
+ if ("alias".equals(propSimple.getName())) {
+ return String.format("%s/canonical", node.getParent().getPath());
+ }
+ return super.getNodeInsertionPoint(augeas, node, propDefSimple, propSimple);
+ }
+
+ @Override
+ protected AugeasNode getNewListMemberNode(AugeasNode listNode, PropertyDefinitionMap listMemberPropDefMap,
+ int listIndex) {
+ return new AugeasNode(listNode, "0" + listIndex);
+ }
+
+ protected AugeasNode getExistingChildNodeForListMemberPropertyMap(AugeasNode parentNode,
+ PropertyDefinitionList propDefList, PropertyMap propMap) {
+ // First find all child nodes with the same 'canonical' value as the PropertyMap.
+ Augeas augeas = getAugeas();
+ String canonicalFilter = parentNode.getPath() + "/*/canonical";
+ String canonical = propMap.getSimple("canonical").getStringValue();
+ List<String> canonicalPaths = AugeasUtility.matchFilter(augeas, canonicalFilter, canonical);
+ if (canonicalPaths.isEmpty()) {
+ return null;
+ }
+
+ // Now see if there's at least one node in this list with an 'ipaddr' value with the same IP address version as
+ // the PropertyMap.
+ String ipaddr = propMap.getSimple("ipaddr").getStringValue();
+ int ipAddressVersion = (ipaddr.indexOf(':') == -1) ? 4 : 6;
+ for (String canonicalPath : canonicalPaths) {
+ AugeasNode canonicalNode = new AugeasNode(canonicalPath);
+ AugeasNode childNode = canonicalNode.getParent();
+ AugeasNode ipaddrNode = new AugeasNode(childNode, "ipaddr");
+ String existingIpaddr = augeas.get(ipaddrNode.getPath());
+ int existingIpAddressVersion = (existingIpaddr.indexOf(':') == -1) ? 4 : 6;
+ if (existingIpAddressVersion == ipAddressVersion) {
+ return childNode;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerDiscoveryComponent.java b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerDiscoveryComponent.java
new file mode 100644
index 0000000..95f459e
--- /dev/null
+++ b/modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerDiscoveryComponent.java
@@ -0,0 +1,30 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.plugins.cobbler;
+
+import org.rhq.plugins.augeas.AugeasConfigurationDiscoveryComponent;
+import org.rhq.plugins.platform.PlatformComponent;
+
+/**
+ * The ResourceDiscoveryComponent for the "Cobbler File" ResourceType.
+ *
+ * @author Ian Springer
+ */
+public class CobblerDiscoveryComponent extends AugeasConfigurationDiscoveryComponent<PlatformComponent> {
+}
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
new file mode 100644
index 0000000..5f22ca8
--- /dev/null
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin name="Cobbler"
+ displayName="Cobbler"
+ description="Support for cobbler file"
+ package="org.rhq.plugins.cobbler"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <depends plugin="Augeas"/>
+
+ <service name="Cobbler File"
+ description="the local file used for mapping /etc/cobbler/ modules & setttings"
+ discovery="CobblerDiscoveryComponent"
+ class="CobblerComponent"
+ supportsManualAdd="true">
+
+ <runs-inside>
+ <parent-resource-type name="Linux" plugin="Platforms"/>
+ <parent-resource-type name="Java" plugin="Platforms"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="augeasModuleName" displayName="Augeas Module Name" default="Cobbler" required="true" readOnly="true"
+ description="the name of the Augeas module/lens to use for loading and updating this Resource's configuration"/>
+
+ <c:simple-property name="configurationFilesInclusionPatterns"
+ default="/etc/cobbler" required="true" readOnly="true"
+ description="the absolute paths of the configuration files, delimited with pipe characters; wildcards are permitted in the last component of the path (e.g. /etc/cron.d/*)"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:list-property name="." displayName="Entries">
+ <c:map-property name="*[canonical]">
+ <c:simple-property name="ipaddr" displayName="IP Address" type="string" required="true" activationPolicy="immediate"
+ description="The IP address of the host entry. The address may be an IPv4 address (e.g., 192.168.1.10) or an IPv6 address (e.g., fec0:0:0:bebe::2)."/>
+
+ <c:simple-property name="canonical" displayName="Canonical Host Name" type="string" required="true" activationPolicy="immediate"
+ description="The canonical host name to refer to the IP address. Host names may contain only alphanumeric characters, minus signs ('-'), and periods ('.'). They must begin with an alphabetic character and end with an alphanumeric character (e.g., foo.mydomain.org). A canonical name can be mapped to only one IPv4 address and/or to only one IPv6 address."/>
+
+ <c:simple-property name="alias" displayName="Aliases" type="longString" required="false" activationPolicy="immediate"
+ description="Optional aliases provide for name changes, alternate spellings, shorter host names, or generic host names (e.g., localhost); aliases should be newline or space separated)."/>
+ </c:map-property>
+ </c:list-property>
+ </resource-configuration>
+
+ </service>
+
+</plugin>
+
diff --git a/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml~ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml~
new file mode 100644
index 0000000..da88adc
--- /dev/null
+++ b/modules/plugins/cobbler/src/main/resources/META-INF/rhq-plugin.xml~
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin name="Cobbler"
+ displayName="Cobbler"
+ description="Support for cobbler file"
+ package="org.rhq.plugins.cobbler"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <depends plugin="Augeas"/>
+
+ <service name="Cobbler File"
+ description="the local file used for mapping host names to IP addresses"
+ discovery="CobblerDiscoveryComponent"
+ class="CobblerComponent"
+ supportsManualAdd="true">
+
+ <runs-inside>
+ <parent-resource-type name="Linux" plugin="Platforms"/>
+ <parent-resource-type name="Windows" plugin="Platforms"/>
+ <parent-resource-type name="Solaris" plugin="Platforms"/>
+ <parent-resource-type name="HP-UX" plugin="Platforms"/>
+ <parent-resource-type name="AIX" plugin="Platforms"/>
+ <parent-resource-type name="FreeBSD" plugin="Platforms"/>
+ <parent-resource-type name="Mac OS X" plugin="Platforms"/>
+ <parent-resource-type name="Java" plugin="Platforms"/>
+ </runs-inside>
+
+ <plugin-configuration>
+ <c:simple-property name="augeasModuleName" displayName="Augeas Module Name" default="Cobbler" required="true" readOnly="true"
+ description="the name of the Augeas module/lens to use for loading and updating this Resource's configuration"/>
+
+ <c:simple-property name="configurationFilesInclusionPatterns"
+ default="/etc/cobbler" required="true" readOnly="true"
+ description="the absolute paths of the configuration files, delimited with pipe characters; wildcards are permitted in the last component of the path (e.g. /etc/cron.d/*)"/>
+ </plugin-configuration>
+
+ <resource-configuration>
+ <c:list-property name="." displayName="Entries">
+ <c:map-property name="*[canonical]">
+ <c:simple-property name="ipaddr" displayName="IP Address" type="string" required="true" activationPolicy="immediate"
+ description="The IP address of the host entry. The address may be an IPv4 address (e.g., 192.168.1.10) or an IPv6 address (e.g., fec0:0:0:bebe::2)."/>
+
+ <c:simple-property name="canonical" displayName="Canonical Host Name" type="string" required="true" activationPolicy="immediate"
+ description="The canonical host name to refer to the IP address. Host names may contain only alphanumeric characters, minus signs ('-'), and periods ('.'). They must begin with an alphabetic character and end with an alphanumeric character (e.g., foo.mydomain.org). A canonical name can be mapped to only one IPv4 address and/or to only one IPv6 address."/>
+
+ <c:simple-property name="alias" displayName="Aliases" type="longString" required="false" activationPolicy="immediate"
+ description="Optional aliases provide for name changes, alternate spellings, shorter host names, or generic host names (e.g., localhost); aliases should be newline or space separated)."/>
+ </c:map-property>
+ </c:list-property>
+ </resource-configuration>
+
+ </service>
+
+</plugin>
+
\ No newline at end of file
diff --git a/modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java b/modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java
new file mode 100644
index 0000000..cbbbe2e
--- /dev/null
+++ b/modules/plugins/cobbler/src/test/java/org/rhq/plugins/cobbler/CobblerComponentTest.java
@@ -0,0 +1,142 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.plugins.cobbler;
+
+import java.io.File;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.plugins.augeas.AugeasConfigurationComponent;
+import org.rhq.plugins.augeas.test.AbstractAugeasConfigurationComponentTest;
+
+/**
+ * An integration test for {@link CobblerComponent}.
+ *
+ * @author Ian Springer
+ */
+public class CobblerComponentTest extends AbstractAugeasConfigurationComponentTest {
+ private static final String PLUGIN_NAME = "Cobbler";
+ private static final String RESOURCE_TYPE_NAME = "Cobbler File";
+
+ @Override
+ protected String getPluginName() {
+ return PLUGIN_NAME;
+ }
+
+ @Override
+ protected String getResourceTypeName() {
+ return RESOURCE_TYPE_NAME;
+ }
+
+ @Override
+ protected boolean isResourceConfigSupported() {
+ // The cobbler plugin will use Augeas if it's available but will fall back to direct file parsing if it's not.
+ return true;
+ }
+
+ @Override
+ protected void tweakDefaultPluginConfig(Configuration defaultPluginConfig) {
+ super.tweakDefaultPluginConfig(defaultPluginConfig);
+ String cobblerFilePath = new File("/etc/cobbler").getAbsolutePath();
+ defaultPluginConfig.put(new PropertySimple(AugeasConfigurationComponent.INCLUDE_GLOBS_PROP, cobblerFilePath));
+ }
+
+ @Override
+ protected Configuration getExpectedResourceConfig() {
+ Configuration config = new Configuration();
+ PropertyList entries = new PropertyList(".");
+ config.put(entries);
+
+ PropertyMap entry;
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "127.0.0.1"));
+ entry.put(new PropertySimple("canonical", "localhost"));
+ entry.put(new PropertySimple("alias", "localhost.localdomain\nlocalhost4\nlocalhost4.localdomain4"));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "::1"));
+ entry.put(new PropertySimple("canonical", "localhost"));
+ entry.put(new PropertySimple("alias", "localhost.localdomain\nlocalhost6\nlocalhost6.localdomain6"));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "1.1.1.1"));
+ entry.put(new PropertySimple("canonical", "one-one-one-one.com"));
+ entry.put(new PropertySimple("alias", null));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "2.2.2.2"));
+ entry.put(new PropertySimple("canonical", "two-two-two-two.com"));
+ entry.put(new PropertySimple("alias", "alias"));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "3.3.3.3"));
+ entry.put(new PropertySimple("canonical", "three-three-three-three.com"));
+ entry.put(new PropertySimple("alias", "alias1\nalias2"));
+ entries.getList().add(entry);
+
+ return config;
+ }
+
+ @Override
+ protected Configuration getUpdatedResourceConfig() {
+ Configuration config = new Configuration();
+ PropertyList entries = new PropertyList(".");
+ config.put(entries);
+
+ PropertyMap entry;
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "127.0.0.1"));
+ entry.put(new PropertySimple("canonical", "localhost"));
+ entry.put(new PropertySimple("alias", "hehe\nlocalhost4\nlocalhost4.localdomain4"));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "::1"));
+ entry.put(new PropertySimple("canonical", "localhost"));
+ entry.put(new PropertySimple("alias", "localhost.localdomain\nlocalhost6\nlocalhost6.localdomain6"));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "1.1.1.1"));
+ entry.put(new PropertySimple("canonical", "one-one-one-one.com"));
+ entry.put(new PropertySimple("alias", ""));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "2.2.2.2"));
+ entry.put(new PropertySimple("canonical", "two-two-two-two.com"));
+ entry.put(new PropertySimple("alias", ""));
+ entries.getList().add(entry);
+
+ entry = new PropertyMap("*[canonical]");
+ entry.put(new PropertySimple("ipaddr", "3.3.3.3"));
+ entry.put(new PropertySimple("canonical", "three-three-three-three.com"));
+ entry.put(new PropertySimple("alias", "aliast1.org\nalias2.org"));
+ entries.getList().add(entry);
+ return config;
+ }
+}
commit 84be929a051d192489b2c6309e2323b560cab939
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Jan 13 13:24:25 2010 +0100
Get RT log autodiscovery back to the vhost discovery component, change the vhost resource name from "VirtualHost blah" to "Virtual Host blah", the server ping URL uses ServerName or the localhost's domain name (if server name not configured in httpd.conf) instead of just localhost IP.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
index 28e7cb3..e58d3d4 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerDiscoveryComponent.java
@@ -137,7 +137,7 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
serverRootProp.setValue(serverRoot);
}
- String url = getUrl(pluginConfig, serverConfig);
+ String url = getUrl(serverConfig);
if (url != null) {
Property urlProp = new PropertySimple(ApacheServerComponent.PLUGIN_CONFIG_PROP_URL, url);
pluginConfig.put(urlProp);
@@ -218,13 +218,11 @@ public class ApacheServerDiscoveryComponent implements ResourceDiscoveryComponen
* Return the root URL as determined from the Httpd configuration loaded by Augeas.
* he URL's protocol is assumed to be "http" and its path is assumed to be "/".
*
- * @param pluginConfig
- *
* @return
*
* @throws Exception
*/
- private static String getUrl(Configuration pluginConfig, AugeasTree serverConfig) throws Exception {
+ private static String getUrl(AugeasTree serverConfig) throws Exception {
Address addr = HttpdAddressUtility.getMainServerSampleAddress(serverConfig);
return addr == null ? null : "http://" + addr.host + ":" + addr.port + "/";
}
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
index 120e422..bdaf076 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
@@ -18,6 +18,8 @@
*/
package org.rhq.plugins.apache;
+import java.io.File;
+import java.net.URI;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
@@ -48,8 +50,12 @@ import org.rhq.plugins.apache.util.HttpdAddressUtility.Address;
*/
public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDiscoveryComponent<ApacheServerComponent> {
+ public static final String LOGS_DIRECTORY_NAME = "logs";
+
+ private static final String RT_LOG_FILE_NAME_SUFFIX = "_rt.log";
+
private final Log log = LogFactory.getLog(getClass());
-
+
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ApacheServerComponent> context)
throws InvalidPluginConfigurationException, Exception {
@@ -59,21 +65,41 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
ResourceType resourceType = context.getResourceType();
Configuration mainServerPluginConfig = context.getDefaultPluginConfiguration();
+
+ File configPath = context.getParentResourceComponent().getServerRoot();
+ File logsDir = new File(configPath, LOGS_DIRECTORY_NAME);
- String mainServerUrl = context.getParentResourceContext().getPluginConfiguration().getSimple(ApacheServerComponent.PLUGIN_CONFIG_PROP_URL).getStringValue();
+ String mainServerUrl = context.getParentResourceContext().getPluginConfiguration().getSimple(
+ ApacheServerComponent.PLUGIN_CONFIG_PROP_URL).getStringValue();
if (mainServerUrl != null && !"null".equals(mainServerUrl)) {
- PropertySimple mainServerUrlProp = new PropertySimple(ApacheVirtualHostServiceComponent.URL_CONFIG_PROP, mainServerUrl);
-
+ PropertySimple mainServerUrlProp = new PropertySimple(ApacheVirtualHostServiceComponent.URL_CONFIG_PROP,
+ mainServerUrl);
+
mainServerPluginConfig.put(mainServerUrlProp);
+
+ URI mainServerUri = new URI(mainServerUrl);
+ String host = mainServerUri.getHost();
+ int port = mainServerUri.getPort();
+ if (port == -1) {
+ port = 80;
+ }
+
+ File rtLogFile = new File(logsDir, host + port
+ + RT_LOG_FILE_NAME_SUFFIX);
+
+ PropertySimple rtLogProp = new PropertySimple(
+ ApacheVirtualHostServiceComponent.RESPONSE_TIME_LOG_FILE_CONFIG_PROP, rtLogFile.toString());
+ mainServerPluginConfig.put(rtLogProp);
}
-
- DiscoveredResourceDetails mainServer = new DiscoveredResourceDetails(resourceType, ApacheVirtualHostServiceComponent.MAIN_SERVER_RESOURCE_KEY, "Main Server",
- null, null, mainServerPluginConfig, null);
+
+ DiscoveredResourceDetails mainServer = new DiscoveredResourceDetails(resourceType,
+ ApacheVirtualHostServiceComponent.MAIN_SERVER_RESOURCE_KEY, "Main Server", null, null,
+ mainServerPluginConfig, null);
discoveredResources.add(mainServer);
//read the virtual hosts from augeas
AugeasTree ag = null;
-
+
try {
ag = context.getParentResourceComponent().getAugeasTree();
} catch (AugeasException e) {
@@ -86,53 +112,56 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
for (AugeasNode node : virtualHosts) {
List<AugeasNode> hosts = ag.matchRelative(node, "param");
String firstAddress = hosts.get(0).getValue();
-
+
List<AugeasNode> serverNames = ag.matchRelative(node, "ServerName/param");
String serverName = null;
if (serverNames.size() > 0) {
serverName = serverNames.get(0).getValue();
}
-
+
StringBuilder keyBuilder = new StringBuilder();
if (serverName != null) {
keyBuilder.append(serverName).append("|");
}
keyBuilder.append(firstAddress);
-
+
Iterator<AugeasNode> it = hosts.iterator();
it.next();
-
+
while (it.hasNext()) {
keyBuilder.append(" ").append(it.next().getValue());
}
-
+
String resourceKey = keyBuilder.toString();
-
+
Configuration pluginConfiguration = context.getDefaultPluginConfiguration();
Address address = HttpdAddressUtility.getVirtualHostSampleAddress(ag, firstAddress, serverName);
if (address != null) {
String url = "http://" + address.host + ":" + address.port + "/";
-
+
PropertySimple urlProp = new PropertySimple(ApacheVirtualHostServiceComponent.URL_CONFIG_PROP, url);
pluginConfiguration.put(urlProp);
}
+
+ File rtLogFile = new File(logsDir, address.host + address.port
+ + RT_LOG_FILE_NAME_SUFFIX);
- String resourceName = "VirtualHost ";
+ PropertySimple rtLogProp = new PropertySimple(
+ ApacheVirtualHostServiceComponent.RESPONSE_TIME_LOG_FILE_CONFIG_PROP, rtLogFile.toString());
+ pluginConfiguration.put(rtLogProp);
+
+ String resourceName = "Virtual Host ";
if (serverName != null) {
resourceName += address.host + ":" + address.port;
} else {
resourceName += resourceKey;
}
-
- //TODO there is no simple way how to determine the RT log file. The server can listen on multiple
- //ports and vhost can be configured to listen on all of them. Also the server can listen on multiple
- //IPs and virtual host can also listen on all of them. Thus the host_port_rt.log is rather non-deterministic.
-
- discoveredResources.add(new DiscoveredResourceDetails(resourceType, resourceKey, resourceName, null,
- null, pluginConfiguration, null));
+
+ discoveredResources.add(new DiscoveredResourceDetails(resourceType, resourceKey, resourceName, null, null,
+ pluginConfiguration, null));
}
return discoveredResources;
- }
+ }
}
\ No newline at end of file
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
index 47a8f89..eadcedb 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
@@ -108,23 +108,32 @@ public class HttpdAddressUtility {
*/
public static Address getMainServerSampleAddress(AugeasTree ag) {
try {
- //there has to be at least one Listen directive
- AugeasNode listen = ag.matchRelative(ag.getRootNode(), "Listen").get(0);
+ Address addr = null;
- List<AugeasNode> params = listen.getChildByLabel("param");
- String address = params.get(0).getValue();
+ //check if there is a ServerName directive
+ List<AugeasNode> serverNameNodes = ag.matchRelative(ag.getRootNode(), "ServerName");
- Address addr = Address.parse(address);
-
- if (addr.port == -1) {
- addr.port = Integer.parseInt(addr.host);
- try {
- addr.host = InetAddress.getLocalHost().getHostAddress();
- } catch (UnknownHostException e) {
- throw new IllegalStateException("Unable to get the localhost address.", e);
- }
+ if (serverNameNodes.size() > 0) {
+ String serverName = serverNameNodes.get(0).getChildByLabel("param").get(0).getValue();
+ addr = Address.parse(serverName);
+ } else {
+ //there has to be at least one Listen directive
+ AugeasNode listen = ag.matchRelative(ag.getRootNode(), "Listen").get(0);
+
+ List<AugeasNode> params = listen.getChildByLabel("param");
+ String address = params.get(0).getValue();
+
+ addr = Address.parse(address);
+
+ if (addr.port == -1) {
+ addr.port = Integer.parseInt(addr.host);
+ try {
+ addr.host = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ throw new IllegalStateException("Unable to get the localhost address.", e);
+ }
+ }
}
-
return addr;
} catch (Exception e) {
log.info("Failed to obtain main server address. Is augeas installed and correct lens in use?");
commit 013ac3ef6d939ca3fb92c772ac2795c28cf9265a
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Jan 13 11:04:53 2010 +0100
Update the metrics collection for vhosts to work without augeas.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
index 0d8556f..0b43873 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
@@ -28,6 +28,8 @@ import java.util.Set;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
+import net.augeas.AugeasException;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
@@ -328,7 +330,7 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
}
}
- public AugeasProxy getAugeasProxy() throws AugeasTreeException {
+ public AugeasProxy getAugeasProxy() throws AugeasException {
AugeasConfigurationApache config = new AugeasConfigurationApache(resourceContext.getPluginConfiguration());
AugeasTreeBuilderApache builder = new AugeasTreeBuilderApache();
AugeasProxy augeasProxy = new AugeasProxy(config, builder);
@@ -336,7 +338,7 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
return augeasProxy;
}
- public AugeasTree getAugeasTree() throws AugeasTreeException {
+ public AugeasTree getAugeasTree() throws AugeasException {
AugeasProxy proxy = getAugeasProxy();
String module = ((AugeasConfigurationApache)proxy.getConfiguration()).getAugeasModuleName();
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
index e517d09..bbb884a 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
@@ -21,6 +21,7 @@ package org.rhq.plugins.apache;
import java.io.File;
import java.net.InetAddress;
import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
@@ -30,6 +31,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import net.augeas.AugeasException;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -452,6 +455,8 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
ConfigurationTimestamp currentTimestamp = resourceContext.getParentResourceComponent().getConfigurationTimestamp();
if (!lastConfigurationTimeStamp.equals(currentTimestamp)) {
snmpWwwServiceIndex = -1;
+ //don't go through this configuration again even if we fail further below.. we'd fail again.
+ lastConfigurationTimeStamp = currentTimestamp;
//configuration has changed. re-read the service index of this virtual host
@@ -477,18 +482,36 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
}
vhostAddressStrings = key.substring(pipeIdx + 1).split(" ");
- AugeasTree configTree = resourceContext.getParentResourceComponent().getAugeasTree();
-
+ AugeasTree configTree = null;
+ try {
+ configTree = resourceContext.getParentResourceComponent().getAugeasTree();
+ } catch (AugeasException e) {
+ //ok, we'll need to live without augeas...
+ }
+
//convert the vhost addresses into fully qualified ip/port addresses
List<HttpdAddressUtility.Address> vhostAddresses = new ArrayList<HttpdAddressUtility.Address>(
vhostAddressStrings.length);
- if (vhostAddressStrings.length == 1 && MAIN_SERVER_RESOURCE_KEY.equals(vhostAddressStrings[0])) {
- vhostAddresses = Collections.singletonList(HttpdAddressUtility.getMainServerSampleAddress(configTree));
- } else {
- for (int i = 0; i < vhostAddressStrings.length; ++i) {
- vhostAddresses.add(HttpdAddressUtility.getVirtualHostSampleAddress(configTree, vhostAddressStrings[i],
- vhostServerName));
+
+ if (configTree != null) {
+ if (vhostAddressStrings.length == 1 && MAIN_SERVER_RESOURCE_KEY.equals(vhostAddressStrings[0])) {
+ vhostAddresses.add(HttpdAddressUtility.getMainServerSampleAddress(configTree));
+ } else {
+ for (int i = 0; i < vhostAddressStrings.length; ++i) {
+ vhostAddresses.add(HttpdAddressUtility.getVirtualHostSampleAddress(configTree, vhostAddressStrings[i],
+ vhostServerName));
+ }
+ }
+ } else {
+ Configuration pluginConfig = resourceContext.getPluginConfiguration();
+ HttpdAddressUtility.Address addr = HttpdAddressUtility.Address.parse(pluginConfig.getSimpleValue(URL_CONFIG_PROP, null));
+ //chop off the schema part of the URL
+ URI uri = new URI(addr.host);
+ addr.host = uri.getHost();
+
+ if (addr != null) {
+ vhostAddresses.add(addr);
}
}
@@ -510,7 +533,6 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
}
}
}
- lastConfigurationTimeStamp = currentTimestamp;
return snmpWwwServiceIndex;
}
@@ -530,6 +552,18 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
}
}
+ //ok, try the hardest...
+ for(HttpdAddressUtility.Address listAddress: addresses) {
+ InetAddress[] listAddresses = InetAddress.getAllByName(listAddress.host);
+ for (InetAddress listInetAddr : listAddresses) {
+ for (InetAddress ip : ipAddresses) {
+ if (ip.equals(listInetAddr) && addressToCheck.port == listAddress.port) {
+ return true;
+ }
+ }
+ }
+ }
+
return false;
}
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
index 29fd4f3..47a8f89 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
@@ -48,13 +48,37 @@ public class HttpdAddressUtility {
public static class Address {
public String host;
- public int port;
+ public int port = -1;
public Address(String host, int port) {
this.host = host;
this.port = port;
}
+ /**
+ * A simple parser of the provided address into host and port
+ * sections.
+ *
+ * @param address the address to parse
+ * @return an instance of Address with host and port set accordingly
+ */
+ public static Address parse(String address) {
+ int lastColonIdx = address.lastIndexOf(':');
+ if (lastColonIdx == -1) {
+ return new Address(address, -1);
+ } else {
+ int lastRightBracketPos = address.lastIndexOf(']');
+ if (lastColonIdx > lastRightBracketPos) {
+ String host = address.substring(0, lastColonIdx);
+ int port = Integer.parseInt(address.substring(lastColonIdx + 1));
+ return new Address(host, port);
+ } else {
+ //this is an IP6 address without a port spec
+ return new Address(address, -1);
+ }
+ }
+ }
+
@Override
public int hashCode() {
int hash = port;
@@ -90,29 +114,18 @@ public class HttpdAddressUtility {
List<AugeasNode> params = listen.getChildByLabel("param");
String address = params.get(0).getValue();
- String host = null;
- String port = null;
- if (address.startsWith("[")) {
- int bracketIdx = address.indexOf(']');
- host = address.substring(1, bracketIdx);
- port = address.substring(bracketIdx + 2);
- } else {
- String[] hostPort = address.split(":");
- if (hostPort.length == 1) {
- port = hostPort[0];
- } else {
- host = hostPort[0];
- port = hostPort[1];
- }
- }
- if (host == null) {
+ Address addr = Address.parse(address);
+
+ if (addr.port == -1) {
+ addr.port = Integer.parseInt(addr.host);
try {
- host = InetAddress.getLocalHost().getHostAddress();
+ addr.host = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
throw new IllegalStateException("Unable to get the localhost address.", e);
}
}
- return new Address(host, Integer.parseInt(port));
+
+ return addr;
} catch (Exception e) {
log.info("Failed to obtain main server address. Is augeas installed and correct lens in use?");
@@ -130,31 +143,23 @@ public class HttpdAddressUtility {
* @return the address on which the virtual host can be accessed or null on error
*/
public static Address getVirtualHostSampleAddress(AugeasTree ag, String virtualHost, String serverName) {
- Address addr = new Address(null, -1);
- if (virtualHost.startsWith("[")) {
- //TODO IPv6 address
- return null;
+ Address addr = Address.parse(virtualHost);
+ if (addr.port == -1) {
+ //just port specified
+ Address serverAddr = getMainServerSampleAddress(ag);
+
+ if (serverAddr == null) return null;
+
+ addr.port = Integer.parseInt(addr.host);
+ addr.host = serverAddr.host;
} else {
- String[] hostPort = virtualHost.split(":");
- if (hostPort.length == 1) {
- //just address specified
+ String host = addr.host;
+ if ("*".equals(host) || "_default_".equals(host)) {
Address serverAddr = getMainServerSampleAddress(ag);
-
if (serverAddr == null) return null;
-
- addr.port = Integer.parseInt(hostPort[0]);
- addr.host = serverAddr.host;
- } else {
- String host = hostPort[0];
- if ("*".equals(host) || "_default_".equals(host)) {
- Address serverAddr = getMainServerSampleAddress(ag);
- if (serverAddr == null) return null;
- host = serverAddr.host;
- }
- String port = hostPort[1];
- addr.host = host;
- addr.port = Integer.parseInt(port);
+ host = serverAddr.host;
}
+ addr.host = host;
}
if (serverName != null) {
commit 82eca6251e91b96118ae42951040515c531e3c1e
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Jan 13 11:02:26 2010 +0100
!= != .equals() ! (so to speak)
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/ConfigurationTimestamp.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/ConfigurationTimestamp.java
index 111f523..f7a8b5a 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/ConfigurationTimestamp.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/ConfigurationTimestamp.java
@@ -64,7 +64,7 @@ public class ConfigurationTimestamp {
Long otherModified = oLastModified.get(entry.getKey());
if (otherModified == null) return false;
- if (entry.getValue() != otherModified) return false;
+ if (!entry.getValue().equals(otherModified)) return false;
}
return true;
commit 286d7d1b717dd2d61fd10296a67a2157bfeb4abe
Merge: 40d4c18... 327e4b5...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 12 10:52:12 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 40d4c18ba06a98bf08d4ca315184ad8c0acd3164
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 12 10:52:01 2010 -0500
a page that demonstrates a paged/sortable data table
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
new file mode 100644
index 0000000..96525dd
--- /dev/null
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/BrowseResourcesUIBean.java
@@ -0,0 +1,37 @@
+package org.rhq.sample.perspective;
+
+import org.jboss.seam.annotations.Name;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.client.RemoteClient;
+import org.rhq.enterprise.server.resource.ResourceManagerRemote;
+
+/**
+ * A Seam component that utilizes the RHQ remote API to obtain a paged list of all inventoried Resources.
+ *
+ * @author Ian Springer
+ */
+@Name("BrowseResourcesUIBean")
+public class BrowseResourcesUIBean extends AbstractPerspectiveUIBean {
+ private ResourcesDataModel dataModel;
+
+ public BrowseResourcesUIBean() {
+ return;
+ }
+
+ public ResourcesDataModel getDataModel() throws Exception {
+ if (this.dataModel == null) {
+ this.dataModel = createDataModel();
+ }
+ return this.dataModel;
+ }
+
+ private ResourcesDataModel createDataModel() throws Exception {
+ RemoteClient remoteClient = getRemoteClient();
+ Subject subject = getSubject();
+
+ // ***NOTE***: The javassist.NotFoundException stack traces that are logged by this call can be ignored.
+ ResourceManagerRemote resourceManager = remoteClient.getResourceManagerRemote();
+
+ return new ResourcesDataModel(subject, resourceManager);
+ }
+}
\ No newline at end of file
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/ResourcesDataModel.java b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/ResourcesDataModel.java
new file mode 100644
index 0000000..b1d97ae
--- /dev/null
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/java/org/rhq/sample/perspective/ResourcesDataModel.java
@@ -0,0 +1,34 @@
+package org.rhq.sample.perspective;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.core.gui.model.AbstractPagedDataModel;
+import org.rhq.enterprise.server.resource.ResourceManagerRemote;
+
+/**
+ * @author Ian Springer
+ */
+public class ResourcesDataModel extends AbstractPagedDataModel<Resource, Integer> {
+ private Subject subject;
+ private ResourceManagerRemote resourceManager;
+
+ public ResourcesDataModel(Subject subject, ResourceManagerRemote resourceManager) {
+ this.subject = subject;
+ this.resourceManager = resourceManager;
+ }
+
+ @Override
+ protected PageList<Resource> findObjects(PageControl pageControl) {
+ ResourceCriteria resourceCriteria = new ResourceCriteria();
+ resourceCriteria.setPageControl(pageControl);
+ return this.resourceManager.findResourcesByCriteria(this.subject, resourceCriteria);
+ }
+
+ @Override
+ protected PageControl getDefaultPageControl() {
+ return new PageControl(0, 10);
+ }
+}
diff --git a/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
new file mode 100644
index 0000000..71bd6bf
--- /dev/null
+++ b/etc/samples/perspectives/sample-perspective/app/src/main/webapp/browseResources.xhtml
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich">
+<ui:remove>
+ <!-- Set the content type to "text/html" to ensure "application/xhtml+xml", which would put Firefox and
+ other Gecko-based browsers into XML mode (which requires pages to be well-formed XML), is not used.
+ We also specify the charset/encoding here, since we cannot specify it via the xml prolog, since
+ including an xml prolog causes IE6 to go into the undesirable "quirks mode".
+ (see https://jira.jboss.org/jira/browse/EMBJOPR-19) -->
+</ui:remove>
+
+ <head>
+ <title>
+ Browse Resources
+ </title>
+ </head>
+
+ <body style="background-color: #FFF">
+
+ <f:view contentType="text/html; charset=UTF-8">
+
+ <h2>Browse Resources</h2>
+
+ <rich:dataTable id="resources" value="#{BrowseResourcesUIBean.dataModel}"
+ var="resource" rows="10" width="100%">
+ <rich:column sortBy="id">
+ <f:facet name="header">
+ <h:outputLabel for="id" value="Id" />
+ </f:facet>
+ <h:outputText id="id" value="#{resource.id}" />
+ </rich:column>
+ <rich:column sortBy="name">
+ <f:facet name="header">
+ <h:outputLabel for="name" value="Name" />
+ </f:facet>
+ <h:outputText id="name" value="#{resource.name}" />
+ </rich:column>
+ <rich:column sortBy="description">
+ <f:facet name="header">
+ <h:outputLabel for="description" value="Description" />
+ </f:facet>
+ <h:outputText id="description" value="#{resource.description}" />
+ </rich:column>
+ </rich:dataTable>
+
+ </f:view>
+
+ </body>
+
+</html>
commit 327e4b579d91908c7599016a1d8e618bf9d13119
Merge: c1c3dd7... 8c6f3cf...
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Jan 12 10:24:43 2010 -0500
Merge branch 'master' into linux-config
commit c1c3dd7fb5b70d673610b7b1fc0e98878782ae71
Merge: 869853e... cd2a4e1...
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Jan 12 09:45:29 2010 -0500
Merge branch 'master' into linux-config
commit 3309818a43c6cca805aa16847f94ca423967487c
Merge: 1fe6c1e... 869853e...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 12 09:39:44 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit 1fe6c1e82dd3581409b95fc20c116b06c685e530
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 12 09:39:26 2010 -0500
upgrade from RF 3.3.0.GA to RF 3.3.2.SR1 (https://bugzilla.redhat.com/535797)
diff --git a/pom.xml b/pom.xml
index 34487d0..134b444 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
<postgresql.version>8.4-701.jdbc3</postgresql.version>
<h2.version>1.1.117</h2.version>
<jtds.version>1.2.2</jtds.version>
- <richfaces.version>3.3.0.GA</richfaces.version>
+ <richfaces.version>3.3.2.SR1</richfaces.version>
<sigar.version>1.6.3.82</sigar.version>
<quartz.version>1.6.5</quartz.version>
<jna.version>3.2.2</jna.version>
commit 869853e767580ae2e683bb55232f3be82ce35494
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Mon Jan 11 17:52:01 2010 -0500
metric support for samba
diff --git a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
index 40ed13e..9bd3859 100644
--- a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
+++ b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
@@ -23,28 +23,37 @@ import net.augeas.Augeas;
import org.rhq.core.domain.configuration.*;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.measurement.MeasurementDataNumeric;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
-import org.rhq.core.system.ProcessExecution;
-import org.rhq.core.system.ProcessExecutionResults;
-import org.rhq.core.system.SystemInfo;
+import org.rhq.core.pluginapi.util.ObjectUtil;
+import org.rhq.core.system.*;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
import org.rhq.plugins.augeas.helper.AugeasNode;
+import java.util.List;
+import java.util.Set;
+
/**
* TODO
*/
-public class SambaServerComponent extends AugeasConfigurationComponent implements OperationFacet {
+public class SambaServerComponent extends AugeasConfigurationComponent implements OperationFacet, MeasurementFacet {
+
static final String ENABLE_RECYCLING = "enableRecycleBin";
static final String AUTHCONFIG_PATH = "/usr/bin/authconfig";
static final String NET_PATH = "/usr/bin/net";
static final String SPACE = " ";
+ private static final int PORT = 445;
+ private ProcessInfo processInfo;
private ResourceContext resourceContext;
@@ -52,6 +61,7 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
public void start(ResourceContext resourceContext) throws Exception {
this.resourceContext = resourceContext;
super.start(resourceContext);
+ getProcess();
}
public void stop() {
@@ -129,6 +139,33 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
return super.toPropertyValue(propDefSimple, augeas, node);
}
+ private void getProcess() {
+
+ List<ProcessInfo> procs =
+ resourceContext.getSystemInformation().getProcesses("process|basename|match=smbd,process|basename|nomatch|parent=smbd");
+
+ if (procs.size() == 1) {
+ this.processInfo = procs.get(0).getAggregateProcessTree();
+ }
+ }
+
+ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+
+ NetworkStats stats = resourceContext.getSystemInformation().getNetworkStats("localhost", PORT);
+
+ processInfo.refresh();
+
+ for (MeasurementScheduleRequest request : metrics) {
+ if (request.getName().startsWith("NetworkStat.")) {
+ int val = stats.getByName(request.getName().substring("NetworkStat.".length()));
+ report.addData(new MeasurementDataNumeric(request, (double) val));
+ } else if (request.getName().startsWith("Process.")) {
+ Double value = ObjectUtil.lookupDeepNumericAttributeProperty(processInfo, request.getName().substring("Process.".length()));
+ report.addData(new MeasurementDataNumeric(request, value));
+ }
+ }
+ }
+
public OperationResult invokeOperation(String name, Configuration params) throws Exception {
OperationResult result = null;
diff --git a/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml
index 6b3f594..06058bb 100644
--- a/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml
@@ -29,6 +29,7 @@
default="/files/etc/samba/smb.conf/target[.='global']"/>
</c:group>
</plugin-configuration>
+
<operation name="join"
displayName="Join Active Server Directory"
@@ -39,6 +40,24 @@
displayName="Disconnect Active Server Directory"
description="Disconnects the Samba domain member to the Active Server Directory">
</operation>
+
+ <metric property="NetworkStat.tcpInboundTotal" displayName="TCP Inbound Connections" displayType="summary"/>
+ <metric property="NetworkStat.tcpOutboundTotal" displayName="TCP Outbound Connections" displayType="summary"/>
+ <metric property="NetworkStat.allInboundTotal" displayName="All Inbound Connections" displayType="summary"/>
+ <metric property="NetworkStat.allOutboundTotal" displayName="All Outbound Connections" displayType="summary"/>
+ <metric property="NetworkStat.tcpEstablished" displayName="State ESTABLISHED"/>
+ <metric property="NetworkStat.tcpSynSent" displayName="State SYN_SENT"/>
+ <metric property="NetworkStat.tcpSynRecv" displayName="State SYN_RECV"/>
+ <metric property="NetworkStat.tcpFinWait1" displayName="State FIN_WAIT1"/>
+ <metric property="NetworkStat.tcpFinWait2" displayName="State FIN_WAIT2"/>
+ <metric property="NetworkStat.tcpTimeWait" displayName="State TIME_WAIT"/>
+ <metric property="NetworkStat.tcpClose" displayName="State CLOSE"/>
+ <metric property="NetworkStat.tcpCloseWait" displayName="State CLOSE_WAIT"/>
+ <metric property="NetworkStat.tcpLastAck" displayName="State LAST_ACK"/>
+ <metric property="NetworkStat.tcpListen" displayName="State LISTEN"/>
+ <metric property="NetworkStat.tcpClosing" displayName="State CLOSING"/>
+ <metric property="NetworkStat.tcpIdle" displayName="State IDLE"/>
+ <metric property="NetworkStat.tcpBound" displayName="State BOUND"/>
<resource-configuration>
<c:group name="Basic Configurations">
diff --git a/modules/plugins/validate-all-plugins/pom.xml b/modules/plugins/validate-all-plugins/pom.xml
index 287ccd1..6094456 100644
--- a/modules/plugins/validate-all-plugins/pom.xml
+++ b/modules/plugins/validate-all-plugins/pom.xml
@@ -40,6 +40,7 @@
<pathelement path="${test.classpath}" />
<pathelement location="../apache/target/rhq-apache-plugin-${project.version}.jar" />
<pathelement location="../augeas/target/rhq-augeas-plugin-${project.version}.jar" />
+ <pathelement location="../samba/target/rhq-samba-plugin-${project.version}.jar" />
<pathelement location="../database/target/rhq-database-plugin-${project.version}.jar" />
<pathelement location="../grub/target/rhq-grub-plugin-${project.version}.jar" />
<!--<pathelement location="../hardware/target/rhq-hardware-plugin-${project.version}.jar" />-->
commit a12c9c7c6be4e7507324193d37db4319ca43eafd
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 11 17:42:00 2010 -0500
Update the linux config m2 settings to hopefully get the linux-confg
build under control
diff --git a/etc/m2/settings-linux-config.xml b/etc/m2/settings-linux-config.xml
index ee22bd1..dd464f7 100644
--- a/etc/m2/settings-linux-config.xml
+++ b/etc/m2/settings-linux-config.xml
@@ -41,6 +41,25 @@
<agent1.communications.connector.bind-port>33334</agent1.communications.connector.bind-port>
<agent2.communications.connector.bind-port>44445</agent2.communications.connector.bind-port>
</properties>
+ <repositories>
+ <!-- Public JBoss Repo -->
+ <repository>
+ <id>jboss</id>
+ <name>JBoss Repository</name>
+ <url>http://repository.jboss.org/maven2/</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ <!-- Oracle Driver
+ To package the Oracle OJDBC driver set -Drhq.m2.repo.url.oracle and this repo definition will
+ be used to pick it up at build time. -->
+ <repository>
+ <id>ojdbc-repo</id>
+ <name>M2 Repo containing OJDBC driver jar</name>
+ <url>${rhq.m2.repo.url.oracle}</url>
+ </repository>
+ </repositories>
</profile>
</profiles>
commit 63ce5a0b20a8e8b1682fbbd191a104d12af34167
Merge: deeae15... 22f4c57...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 11 17:18:18 2010 -0500
Merge branch 'linux-config' into linux-config-dev
commit deeae15f22750242dafdbb4dca6bf1e8f4710a47
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 11 17:17:30 2010 -0500
Trivial - comment additions
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/PerspectiveServerPluginManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/PerspectiveServerPluginManager.java
index ad35c69..85aa235 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/PerspectiveServerPluginManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/perspective/PerspectiveServerPluginManager.java
@@ -33,6 +33,7 @@ import javax.naming.InitialContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.util.file.FileUtil;
import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
@@ -89,7 +90,9 @@ public class PerspectiveServerPluginManager extends ServerPluginManager {
this.metadataManager.loadPlugin((PerspectivePluginDescriptorType) env.getPluginDescriptor());
- deployEmbeddedWars(env); // TODO: Should this be done in startPlugin() instead?
+ // Do this here and not startPlugin() because if the app does not deploy the perspective should
+ // be considered invalid.
+ deployEmbeddedWars(env);
}
private void deployEmbeddedWars(ServerPluginEnvironment env) {
@@ -165,6 +168,8 @@ public class PerspectiveServerPluginManager extends ServerPluginManager {
this.metadataManager.stop();
this.metadataManager.start();
}
+
+ // TODO: execute An MBean Start on any perspective webapps?
}
/**
@@ -191,6 +196,8 @@ public class PerspectiveServerPluginManager extends ServerPluginManager {
this.metadataManager.start();
}*/
+ // TODO: execute An MBean Stop on any perspective webapps?
+
super.stopPlugin(pluginName);
}
@@ -211,7 +218,8 @@ public class PerspectiveServerPluginManager extends ServerPluginManager {
@Override
public synchronized void unloadPlugin(String pluginName) throws Exception {
ServerPluginEnvironment env = getPluginEnvironment(pluginName);
- undeployWars(env); // TODO: Should this be done in stopPlugin() instead?
+ // Do this here and not stopPlugin(), treat this as a precursor to a possible perspectve deletion
+ undeployWars(env);
this.metadataManager.unloadPlugin((PerspectivePluginDescriptorType) env.getPluginDescriptor());
super.unloadPlugin(pluginName);
}
commit 0a58f9dea8797474a95eab33ce7ff6a5d4aa8692
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 11 17:17:12 2010 -0500
Fix test given perspective schema change
diff --git a/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml b/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml
index ac01d06..8bc5462 100644
--- a/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml
+++ b/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<perspectivePlugin
+<perspective-plugin
apiVersion="1.0"
version="1.0"
description="A Sample Perspective Utilizing Every Extension Point and Filter"
@@ -11,4 +11,4 @@
xmlns:serverplugin="urn:xmlns:rhq-serverplugin"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-</perspectivePlugin>
+</perspective-plugin>
commit 135a8930896d5764570ee899a2c2f98ceee5ebf4
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 11 17:15:57 2010 -0500
Add new repo declaration for those folks that have access to an oracle
driver. The repo url is then filtered using the property
rhq.m2.repo.url.oracle. This property, when specified on the command
line will activate the ojdbc-driver maven profile automatically.
diff --git a/etc/m2/settings.xml b/etc/m2/settings.xml
index ba7e3b0..7ac4fd1 100644
--- a/etc/m2/settings.xml
+++ b/etc/m2/settings.xml
@@ -93,14 +93,14 @@
</snapshots>
</repository>
-->
- <!-- Uncomment this and point it at a local repo that contains the Oracle JDBC jar. -->
- <!--
+ <!-- Oracle Driver
+ To package the Oracle OJDBC driver set -Drhq.m2.repo.url.oracle and this repo definition will
+ be used to pick it up at build time. -->
<repository>
- <id>internal</id>
- <name>Internal Repository</name>
- <url>http://foo.example.com/m2-repo/</url>
+ <id>ojdbc-repo</id>
+ <name>M2 Repo containing OJDBC driver jar</name>
+ <url>${rhq.m2.repo.url.oracle}</url>
</repository>
- -->
</repositories>
diff --git a/modules/plugins/oracle/pom.xml b/modules/plugins/oracle/pom.xml
index 2af38c3..9020061 100644
--- a/modules/plugins/oracle/pom.xml
+++ b/modules/plugins/oracle/pom.xml
@@ -37,7 +37,12 @@
<profiles>
<profile>
- <id>ojdbc-driver</id>
+ <id>ojdbc-driver</id>
+ <activation>
+ <property>
+ <name>rhq.m2.repo.url.oracle</name>
+ </property>
+ </activation>
<!-- Make sure the Oracle JDBC jar gets included in the plugin jar's lib dir. -->
diff --git a/pom.xml b/pom.xml
index 34487d0..6bb8f4c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -715,6 +715,11 @@
<profiles>
<profile>
<id>ojdbc-driver</id>
+ <activation>
+ <property>
+ <name>rhq.m2.repo.url.oracle</name>
+ </property>
+ </activation>
<dependencies>
<!-- Oracle JDBC driver - required only if you want to run the tests, or dbsetup, against Oracle.
commit d1811ce0d082d0ec188a2b6715630d9c144ebc1b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 11 17:13:19 2010 -0500
Conform to display name convention for SS plugins
diff --git a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index 75187b2..28da3b9 100644
--- a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -4,7 +4,7 @@
apiVersion="1.0"
version="1.0"
description="A Sample Perspective Utilizing Every Extension Point and Filter"
- displayName="Sample Perspective"
+ displayName="Perspective:Sample"
name="SamplePerspective"
package="org.rhq.perspective.sample"
xmlns="urn:xmlns:rhq-serverplugin.perspective"
diff --git a/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index 94ec77b..06c665b 100644
--- a/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -4,7 +4,7 @@
version="1.0"
apiVersion="2.0"
description="The Core Perspective defining Core UI Elements"
- displayName="Core Perspective"
+ displayName="Perspective:Core"
name="CorePerspective"
package="org.rhq.perspective.core"
xmlns="urn:xmlns:rhq-serverplugin.perspective"
commit 22f4c57476ba7900d3be847717a00272fc121743
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Jan 11 16:06:31 2010 -0500
fix unit test file with upated node name to match schema.
diff --git a/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml b/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml
index ac01d06..8bc5462 100644
--- a/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml
+++ b/modules/enterprise/server/xml-schemas/src/test/resources/test-serverplugin-perspective.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<perspectivePlugin
+<perspective-plugin
apiVersion="1.0"
version="1.0"
description="A Sample Perspective Utilizing Every Extension Point and Filter"
@@ -11,4 +11,4 @@
xmlns:serverplugin="urn:xmlns:rhq-serverplugin"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-</perspectivePlugin>
+</perspective-plugin>
commit 7a3d23c9e853edb5bc2b8bc6ac937bde14d3c483
Merge: 34b0f30... 58a51a0...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Jan 11 10:02:35 2010 -0500
Merge branch 'linux-config' of ssh://spinder@git.fedorahosted.org/git/rhq/rhq into linux-config
commit 34b0f3024a987ac3e3427a284ffaa5f1da05f16c
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Jan 11 10:00:19 2010 -0500
Bug 537480 - added a check for null reference.
diff --git a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ConfigurationClassBuilder.java b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ConfigurationClassBuilder.java
index 8ab54f5..138e45b 100644
--- a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ConfigurationClassBuilder.java
+++ b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/utility/ConfigurationClassBuilder.java
@@ -18,24 +18,25 @@
*/
package org.rhq.enterprise.client.utility;
+import java.util.LinkedHashMap;
+
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
-import java.util.LinkedHashMap;
-
/**
* @author Greg Hinkle
*/
public class ConfigurationClassBuilder {
-
- public static LinkedHashMap<String, CtClass> translateParameters(ConfigurationDefinition def) throws NotFoundException {
+ public static LinkedHashMap<String, CtClass> translateParameters(ConfigurationDefinition def)
+ throws NotFoundException {
LinkedHashMap<String, CtClass> result = new LinkedHashMap<String, CtClass>();
if (def == null || def.getPropertyDefinitions() == null) {
return result;
@@ -55,28 +56,28 @@ public class ConfigurationClassBuilder {
private static CtClass getSimpleTypeClass(PropertyDefinitionSimple simple) throws NotFoundException {
Class paramType = null;
switch (simple.getType()) {
- case STRING:
- case LONG_STRING:
- case PASSWORD:
- case FILE:
- case DIRECTORY:
- paramType = String.class;
- break;
- case BOOLEAN:
- paramType = Boolean.TYPE;
- break;
- case INTEGER:
- paramType = Integer.TYPE;
- break;
- case LONG:
- paramType = Long.TYPE;
- break;
- case FLOAT:
- paramType = Float.TYPE;
- break;
- case DOUBLE:
- paramType = Double.TYPE;
- break;
+ case STRING:
+ case LONG_STRING:
+ case PASSWORD:
+ case FILE:
+ case DIRECTORY:
+ paramType = String.class;
+ break;
+ case BOOLEAN:
+ paramType = Boolean.TYPE;
+ break;
+ case INTEGER:
+ paramType = Integer.TYPE;
+ break;
+ case LONG:
+ paramType = Long.TYPE;
+ break;
+ case FLOAT:
+ paramType = Float.TYPE;
+ break;
+ case DOUBLE:
+ paramType = Double.TYPE;
+ break;
}
return ClassPool.getDefault().get(paramType.getName());
}
@@ -94,20 +95,16 @@ public class ConfigurationClassBuilder {
}
}
-
-
-
-
private static String simpleName(String name) {
- return decapitalize(name.replaceAll("\\W",""));
+ return decapitalize(name.replaceAll("\\W", ""));
}
-
private static String decapitalize(String name) {
return Character.toLowerCase(name.charAt(0)) + name.substring(1, name.length());
}
- public static Configuration translateParametersToConfig(ConfigurationDefinition parametersConfigurationDefinition, Object[] args) throws NotFoundException {
+ public static Configuration translateParametersToConfig(ConfigurationDefinition parametersConfigurationDefinition,
+ Object[] args) throws NotFoundException {
LinkedHashMap<String, CtClass> translateParameters = translateParameters(parametersConfigurationDefinition);
Configuration config = new Configuration();
@@ -120,35 +117,38 @@ public class ConfigurationClassBuilder {
}
-
- public static Object translateResults(ConfigurationDefinition resultsConfigurationDefinition, Configuration result) throws NotFoundException {
+ public static Object translateResults(ConfigurationDefinition resultsConfigurationDefinition, Configuration result)
+ throws NotFoundException {
CtClass expectedReturn = translateConfiguration(resultsConfigurationDefinition);
if (expectedReturn.equals(ClassPool.getDefault().get(Configuration.class.getName()))) {
return result;
} else {
+ //bail on translation if Configuration passed in is null
+ if (result == null)
+ return result;
PropertySimple simple = result.getSimple("operationResult");
if (simple != null) {
if (expectedReturn.getName().equals(String.class.getName())) {
return simple.getStringValue();
} else if (expectedReturn.getName().equals(Boolean.class.getName())
- || expectedReturn.getName().equals(Boolean.TYPE.getName())) {
+ || expectedReturn.getName().equals(Boolean.TYPE.getName())) {
return simple.getBooleanValue();
} else if (expectedReturn.getName().equals(Integer.class.getName())
- || expectedReturn.getName().equals(Integer.TYPE.getName())) {
+ || expectedReturn.getName().equals(Integer.TYPE.getName())) {
return simple.getIntegerValue();
} else if (expectedReturn.getName().equals(Long.class.getName())
- || expectedReturn.getName().equals(Long.TYPE.getName())) {
+ || expectedReturn.getName().equals(Long.TYPE.getName())) {
return simple.getLongValue();
} else if (expectedReturn.getName().equals(Float.class.getName())
- || expectedReturn.getName().equals(Float.TYPE.getName())) {
+ || expectedReturn.getName().equals(Float.TYPE.getName())) {
return simple.getFloatValue();
} else if (expectedReturn.getName().equals(Double.class.getName())
- || expectedReturn.getName().equals(Double.TYPE.getName())) {
+ || expectedReturn.getName().equals(Double.TYPE.getName())) {
return simple.getDoubleValue();
} else if (expectedReturn.getName().equals(Boolean.class.getName())
- || expectedReturn.getName().equals(Boolean.TYPE.getName())) {
+ || expectedReturn.getName().equals(Boolean.TYPE.getName())) {
return simple.getBooleanValue();
}
}
commit 58a51a0f16b9460880af83b92faa4875d382e263
Merge: ea22bea... 706bfb5...
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Fri Jan 8 20:05:34 2010 -0500
Merge branch 'linux-config' of ssh://git.fedorahosted.org/git/rhq/rhq into linux-config
commit ea22beacd7b2684c1ac9f77ec1ed9068d04b7efb
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Fri Jan 8 20:04:27 2010 -0500
add missing 'javaHome' prop to server's plugin config and improve code that initializes and uses that prop (fix for https://bugzilla.redhat.com/show_bug.cgi?id=553808)
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
index adc6f0e..7189f39 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
@@ -1,424 +1,422 @@
-/*
-* Jopr Management Platform
-* Copyright (C) 2005-2009 Red Hat, Inc.
-* All rights reserved.
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License, version 2, as
-* published by the Free Software Foundation, and/or the GNU Lesser
-* General Public License, version 2.1, also as published by the Free
-* Software Foundation.
-*
-* This program 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 General Public License and the GNU Lesser General Public License
-* for more details.
-*
-* You should have received a copy of the GNU General Public License
-* and the GNU Lesser General Public License along with this program;
-* if not, write to the Free Software Foundation, Inc.,
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-package org.rhq.plugins.jbossas5;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.maven.artifact.versioning.ComparableVersion;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertyList;
-import org.rhq.core.domain.configuration.PropertyMap;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
-import org.rhq.core.pluginapi.inventory.ClassLoaderFacet;
-import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
-import org.rhq.core.pluginapi.inventory.ProcessScanResult;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.core.pluginapi.inventory.ManualAddFacet;
-import org.rhq.core.pluginapi.util.FileUtils;
-import org.rhq.core.system.ProcessInfo;
-import org.rhq.plugins.jbossas5.helper.JBossInstallationInfo;
-import org.rhq.plugins.jbossas5.helper.JBossInstanceInfo;
-import org.rhq.plugins.jbossas5.helper.JBossProperties;
-import org.rhq.plugins.jbossas5.helper.JBossProductType;
-import org.rhq.plugins.jbossas5.util.JnpConfig;
-
-import org.jboss.on.common.jbossas.JBossASDiscoveryUtils;
-
-/**
- * A Resource discovery component for JBoss AS, 5.2.0.Beta1 or later, and JBoss EAP and SOA-P, 5.0.0.Beta or later,
- * Servers.
- *
- * @author Ian Springer
- * @author Mark Spritzler
- */
-public class ApplicationServerDiscoveryComponent implements ResourceDiscoveryComponent, ClassLoaderFacet,
- ManualAddFacet {
- private static final String CHANGE_ME = "***CHANGE_ME***";
- private static final String JBOSS_SERVICE_XML = "conf" + File.separator + "jboss-service.xml";
- private static final String JBOSS_NAMING_SERVICE_XML = "deploy" + File.separator + "naming-service.xml";
- private static final String ANY_ADDRESS = "0.0.0.0";
- private static final String LOCALHOST = "127.0.0.1";
- private static final String JAVA_HOME_ENV_VAR = "JAVA_HOME";
-
- private static final Map<JBossProductType, ComparableVersion> MINIMUM_PRODUCT_VERSIONS = new HashMap(3);
- static {
- MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.AS, new ComparableVersion("5.2.0.Beta1"));
- MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.EAP, new ComparableVersion("5.0.0.Beta"));
- MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.SOA, new ComparableVersion("5.0.0.Beta"));
- }
-
- private static final String[] CLIENT_JARS = new String[] {
- "client/jbossall-client.jar",
- "common/lib/jboss-security-aspects.jar",
- "lib/jboss-managed.jar",
- "lib/jboss-metatype.jar",
- "lib/jboss-dependency.jar"
- };
-
- private final Log log = LogFactory.getLog(this.getClass());
-
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext discoveryContext) {
- log.trace("Discovering JBoss AS 5.x and 6.x Resources...");
- Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
- DiscoveredResourceDetails inProcessJBossAS = discoverInProcessJBossAS(discoveryContext);
- if (inProcessJBossAS != null) {
- // If we're running inside a JBoss AS JVM, that's the only AS instance we want to discover.
- resources.add(inProcessJBossAS);
- } else {
- // Otherwise, scan the process table for external AS instances.
- resources.addAll(discoverExternalJBossAsProcesses(discoveryContext));
- }
- log.trace("Discovered " + resources.size() + " JBossAS 5.x and 6.x Resources.");
- return resources;
- }
-
- public DiscoveredResourceDetails discoverResource(Configuration pluginConfig,
- ResourceDiscoveryContext discoveryContext)
- throws InvalidPluginConfigurationException {
- // Set default values on any props that are not set.
- //setPluginConfigurationDefaults(pluginConfiguration);
-
- ProcessInfo processInfo = null;
- String jbossHomeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR)
- .getStringValue();
- JBossInstallationInfo installInfo;
- try {
- installInfo = new JBossInstallationInfo(new File(jbossHomeDir));
- } catch (IOException e) {
- throw new InvalidPluginConfigurationException(e);
- }
- DiscoveredResourceDetails resourceDetails = createResourceDetails(discoveryContext, pluginConfig, processInfo,
- installInfo);
- return resourceDetails;
- }
-
- @SuppressWarnings("unchecked")
- public List<URL> getAdditionalClasspathUrls(ResourceDiscoveryContext context, DiscoveredResourceDetails details)
- throws Exception {
- Configuration pluginConfig = details.getPluginConfiguration();
- String homeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR).getStringValue();
-
- List<URL> clientJars = new ArrayList<URL>();
-
- for (String jarFileName : CLIENT_JARS) {
- File clientJar = new File(homeDir, jarFileName);
- if (!clientJar.exists()) {
- throw new FileNotFoundException("Cannot find [" + clientJar + "] - unable to manage server.");
- }
- if (!clientJar.canRead()) {
- throw new IOException("Cannot read [" + clientJar + "] - unable to manage server.");
- }
- clientJars.add(clientJar.toURI().toURL());
- }
-
- return clientJars;
- }
-
- private Set<DiscoveredResourceDetails> discoverExternalJBossAsProcesses(ResourceDiscoveryContext discoveryContext) {
- Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
- List<ProcessScanResult> autoDiscoveryResults = discoveryContext.getAutoDiscoveredProcesses();
-
- for (ProcessScanResult autoDiscoveryResult : autoDiscoveryResults) {
- ProcessInfo processInfo = autoDiscoveryResult.getProcessInfo();
- if (log.isDebugEnabled())
- log.debug("Discovered JBoss AS process: " + processInfo);
-
- JBossInstanceInfo cmdLine;
- try {
- cmdLine = new JBossInstanceInfo(processInfo);
- } catch (Exception e) {
- log.error("Failed to process JBoss AS command line: " + Arrays.asList(processInfo.getCommandLine()), e);
- continue;
- }
-
- // Skip it if it's an AS/EAP/SOA-P version we don't support.
- JBossInstallationInfo installInfo = cmdLine.getInstallInfo();
- if (!isSupportedProduct(installInfo)) {
- continue;
- }
-
- File installHome = new File(cmdLine.getSystemProperties().getProperty(JBossProperties.HOME_DIR));
- File configDir = new File(cmdLine.getSystemProperties().getProperty(JBossProperties.SERVER_HOME_DIR));
-
- // The config dir might be a symlink - call getCanonicalFile() to resolve it if so, before
- // calling isDirectory() (isDirectory() returns false for a symlink, even if it points at
- // a directory).
- try {
- if (!configDir.getCanonicalFile().isDirectory()) {
- log.warn("Skipping discovery for JBoss AS process " + processInfo + ", because configuration dir '"
- + configDir + "' does not exist or is not a directory.");
- continue;
- }
- } catch (IOException e) {
- log.error("Skipping discovery for JBoss AS process " + processInfo + ", because configuration dir '"
- + configDir + "' could not be canonicalized.", e);
- continue;
- }
-
- Configuration pluginConfiguration = discoveryContext.getDefaultPluginConfiguration();
-
- String jnpURL = getJnpURL(cmdLine, installHome, configDir);
-
- // TODO? Set the connection type - local or remote
-
- // Set the required props...
- pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.NAMING_URL,
- jnpURL));
- pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.HOME_DIR,
- installHome.getAbsolutePath()));
- pluginConfiguration.put(new PropertySimple(
- ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR, configDir));
-
- // Set the optional props...
- pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.SERVER_NAME,
- cmdLine.getSystemProperties().getProperty(JBossProperties.SERVER_NAME)));
- pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.BIND_ADDRESS,
- cmdLine.getSystemProperties().getProperty(JBossProperties.BIND_ADDRESS)));
-
- JBossASDiscoveryUtils.UserInfo userInfo = JBossASDiscoveryUtils.getJmxInvokerUserInfo(configDir);
- if (userInfo != null) {
- pluginConfiguration.put(
- new PropertySimple(ApplicationServerPluginConfigurationProperties.PRINCIPAL,
- userInfo.getUsername()));
- pluginConfiguration.put(
- new PropertySimple(ApplicationServerPluginConfigurationProperties.CREDENTIALS,
- userInfo.getPassword()));
- }
-
- String javaHome = processInfo.getEnvironmentVariable(JAVA_HOME_ENV_VAR);
- if (javaHome == null && log.isDebugEnabled()) {
- log.debug("JAVA_HOME environment variable not set in JBoss AS process - defaulting "
- + ApplicationServerPluginConfigurationProperties.JAVA_HOME
- + " connection property to the plugin container JRE dir.");
- javaHome = System.getenv(JAVA_HOME_ENV_VAR);
- }
-
- pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.JAVA_HOME,
- javaHome));
-
- initLogEventSourcesConfigProp(configDir, pluginConfiguration);
-
- // TODO: Init props that have static defaults.
- //setPluginConfigurationDefaults(pluginConfiguration);
-
- DiscoveredResourceDetails resourceDetails = createResourceDetails(discoveryContext, pluginConfiguration,
- processInfo, installInfo);
- resources.add(resourceDetails);
- }
- return resources;
- }
-
- @Nullable
- private DiscoveredResourceDetails discoverInProcessJBossAS(ResourceDiscoveryContext discoveryContext) {
- try {
- return new InProcessJBossASDiscovery().discoverInProcessJBossAS(discoveryContext);
- } catch (Throwable t) {
- log.debug("In-process JBoss AS discovery failed - we are probably not running embedded within JBoss AS.", t);
- return null;
- }
- }
-
- private DiscoveredResourceDetails createResourceDetails(ResourceDiscoveryContext discoveryContext,
- Configuration pluginConfig, @Nullable ProcessInfo processInfo, JBossInstallationInfo installInfo) {
- String serverHomeDir = pluginConfig.getSimple(
- ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR).getStringValue();
- File absoluteConfigPath = resolvePathRelativeToHomeDir(pluginConfig, serverHomeDir);
-
- // Canonicalize the config path, so it's consistent no matter how it's entered.
- // This prevents two servers with different forms of the same config path, but
- // that are actually the same server, from ending up in inventory.
- // JON: fix for JBNADM-2634 - do not resolve symlinks (ips, 12/18/07)
- String key = FileUtils.getCanonicalPath(absoluteConfigPath.getPath());
-
- String bindAddress = pluginConfig.getSimple(
- ApplicationServerPluginConfigurationProperties.BIND_ADDRESS).getStringValue();
- String namingUrl = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.NAMING_URL)
- .getStringValue();
-
- // Only include the JNP port in the Resource name if its value is not "***CHANGE_ME***".
- String namingPort = null;
- //noinspection ConstantConditions
- int colonIndex = namingUrl.lastIndexOf(':');
- if ((colonIndex != -1) && (colonIndex != (namingUrl.length() - 1))) {
- // NOTE: We assume the JNP URL does not have a trailing slash.
- String port = namingUrl.substring(colonIndex + 1);
- if (!port.equals(CHANGE_ME))
- namingPort = port;
- }
-
- String configName = absoluteConfigPath.getName();
- String baseName = discoveryContext.getSystemInformation().getHostname();
- String description = installInfo.getProductType().DESCRIPTION;
- File deployDir = new File(absoluteConfigPath, "deploy");
- File rhqInstallerWar = new File(deployDir, "rhq-installer.war");
- File rhqInstallerWarUndeployed = new File(deployDir, "rhq-installer.war.rej");
- boolean isRhqServer = rhqInstallerWar.exists() || rhqInstallerWarUndeployed.exists();
- if (isRhqServer) {
- baseName += " RHQ Server, ";
- description += " hosting the RHQ Server";
- // We know this is an RHQ Server. Let's add an event source for its server log file, but disable it by default.
- configureEventSourceForServerLogFile(pluginConfig);
- }
- String name = formatServerName(baseName, bindAddress, namingPort, configName, installInfo);
-
- return new DiscoveredResourceDetails(discoveryContext.getResourceType(), key, name, installInfo.getVersion(),
- description, pluginConfig, processInfo);
- }
-
- private String formatServerName(String baseName, String bindingAddress, String jnpPort, String configName,
- JBossInstallationInfo installInfo) {
- baseName = baseName + " " + installInfo.getProductType().NAME + " " + installInfo.getVersion() + " "
- + configName;
- String details = null;
- if ((bindingAddress != null) && (jnpPort != null && !jnpPort.equals(CHANGE_ME))) {
- details = bindingAddress + ":" + jnpPort;
- } else if ((bindingAddress == null) && (jnpPort != null && !jnpPort.equals(CHANGE_ME))) {
- details = jnpPort;
- } else if (bindingAddress != null) {
- details = bindingAddress;
- }
-
- return baseName + ((details != null) ? (" (" + details + ")") : "");
- }
-
- private void configureEventSourceForServerLogFile(Configuration pluginConfig) {
- File rhqLogFile = resolvePathRelativeToHomeDir(pluginConfig, "../logs/rhq-server-log4j.log");
- if (rhqLogFile.exists() && !rhqLogFile.isDirectory()) {
- try {
- PropertyMap serverLogEventSource = new PropertyMap("serverLog");
- serverLogEventSource.put(new PropertySimple(
- LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, rhqLogFile
- .getCanonicalPath()));
- serverLogEventSource.put(new PropertySimple(
- LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
- serverLogEventSource.put(new PropertySimple(
- LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.MINIMUM_SEVERITY, "info"));
- PropertyList logEventSources = pluginConfig
- .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
- logEventSources.add(serverLogEventSource);
- } catch (IOException e) {
- log.warn("Unable to setup RHQ Server log file monitoring.", e);
- }
- }
- }
-
- private String getJnpURL(JBossInstanceInfo cmdLine, File installHome, File configDir) {
- File jnpServiceUrlFile = new File(configDir, "data/jnp-service.url");
- if (jnpServiceUrlFile.exists() && jnpServiceUrlFile.canRead()) {
- try {
- BufferedReader br = new BufferedReader(new FileReader(jnpServiceUrlFile));
- String jnpUrl = br.readLine();
- if (jnpUrl != null) {
- if (log.isDebugEnabled()) {
- log.debug("Read JNP URL from jnp-service.url file: " + jnpUrl);
- }
- return jnpUrl;
- }
- } catch (IOException ioe) {
- // Nothing to do
- }
- }
-
- log.warn("Failed to read JNP URL from '" + jnpServiceUrlFile + "'.");
-
- // Above did not work, so fall back to our previous scheme
- JnpConfig jnpConfig = getJnpConfig(installHome, configDir, cmdLine.getSystemProperties());
- String jnpAddress = (jnpConfig.getJnpAddress() != null) ? jnpConfig.getJnpAddress() : CHANGE_ME;
- if (ANY_ADDRESS.equals(jnpAddress)) {
- jnpAddress = LOCALHOST;
- }
- String jnpPort = (jnpConfig.getJnpPort() != null) ? String.valueOf(jnpConfig.getJnpPort()) : CHANGE_ME;
- return "jnp://" + jnpAddress + ":" + jnpPort;
- }
-
- private static JnpConfig getJnpConfig(File installHome, File configDir, Properties props) {
- File serviceXML = new File(configDir, JBOSS_SERVICE_XML);
- JnpConfig config = JnpConfig.getConfig(installHome, serviceXML, props);
- if ((config == null) || (config.getJnpPort() == null)) {
- File namingServiceFile = new File(configDir, JBOSS_NAMING_SERVICE_XML);
- if (namingServiceFile.exists()) {
- config = JnpConfig.getConfig(installHome, namingServiceFile, props);
- }
- }
- return config;
- }
-
- private void initLogEventSourcesConfigProp(File configDir, Configuration pluginConfig) {
- File logDir = new File(configDir, "log");
- File serverLogFile = new File(logDir, "server.log");
- if (serverLogFile.exists() && !serverLogFile.isDirectory()) {
- PropertyMap serverLogEventSource = new PropertyMap("serverLog");
- serverLogEventSource.put(new PropertySimple(
- LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, serverLogFile));
- serverLogEventSource.put(new PropertySimple(
- LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
- PropertyList logEventSources = pluginConfig
- .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
- logEventSources.add(serverLogEventSource);
- }
- }
-
- private boolean isSupportedProduct(JBossInstallationInfo installInfo) {
- ComparableVersion version = new ComparableVersion(installInfo.getVersion());
- JBossProductType productType = installInfo.getProductType();
- ComparableVersion minimumVersion = MINIMUM_PRODUCT_VERSIONS.get(productType);
- // The product is supported if the version is greater than or equal to the minimum version.
- boolean supported = (version.compareTo(minimumVersion) >= 0);
- if (!supported) {
- log.debug(productType + " version " + version + " is not supported by this plugin (minimum " + productType
- + " version is " + minimumVersion + ") - skipping...");
- }
- return supported;
- }
-
- @NotNull
- private static File resolvePathRelativeToHomeDir(Configuration pluginConfig, @NotNull String path) {
- File configDir = new File(path);
- if (!configDir.isAbsolute()) {
- String homeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR).getStringValue();
- configDir = new File(homeDir, path);
- }
- return configDir;
- }
-}
+/*
+* Jopr Management Platform
+* Copyright (C) 2005-2009 Red Hat, Inc.
+* All rights reserved.
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License, version 2, as
+* published by the Free Software Foundation, and/or the GNU Lesser
+* General Public License, version 2.1, also as published by the Free
+* Software Foundation.
+*
+* This program 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 General Public License and the GNU Lesser General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License
+* and the GNU Lesser General Public License along with this program;
+* if not, write to the Free Software Foundation, Inc.,
+* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+package org.rhq.plugins.jbossas5;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.maven.artifact.versioning.ComparableVersion;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertyList;
+import org.rhq.core.domain.configuration.PropertyMap;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
+import org.rhq.core.pluginapi.inventory.ClassLoaderFacet;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ProcessScanResult;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.core.pluginapi.inventory.ManualAddFacet;
+import org.rhq.core.pluginapi.util.FileUtils;
+import org.rhq.core.system.ProcessInfo;
+import org.rhq.plugins.jbossas5.helper.JBossInstallationInfo;
+import org.rhq.plugins.jbossas5.helper.JBossInstanceInfo;
+import org.rhq.plugins.jbossas5.helper.JBossProperties;
+import org.rhq.plugins.jbossas5.helper.JBossProductType;
+import org.rhq.plugins.jbossas5.util.JnpConfig;
+
+import org.jboss.on.common.jbossas.JBossASDiscoveryUtils;
+
+/**
+ * A Resource discovery component for JBoss AS, 5.2.0.Beta1 or later, and JBoss EAP and SOA-P, 5.0.0.Beta or later,
+ * Servers.
+ *
+ * @author Ian Springer
+ * @author Mark Spritzler
+ */
+public class ApplicationServerDiscoveryComponent implements ResourceDiscoveryComponent, ClassLoaderFacet,
+ ManualAddFacet {
+ private static final String CHANGE_ME = "***CHANGE_ME***";
+ private static final String JBOSS_SERVICE_XML = "conf" + File.separator + "jboss-service.xml";
+ private static final String JBOSS_NAMING_SERVICE_XML = "deploy" + File.separator + "naming-service.xml";
+ private static final String ANY_ADDRESS = "0.0.0.0";
+ private static final String LOCALHOST = "127.0.0.1";
+ private static final String JAVA_HOME_ENV_VAR = "JAVA_HOME";
+
+ private static final Map<JBossProductType, ComparableVersion> MINIMUM_PRODUCT_VERSIONS = new HashMap(3);
+ static {
+ MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.AS, new ComparableVersion("5.2.0.Beta1"));
+ MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.EAP, new ComparableVersion("5.0.0.Beta"));
+ MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.SOA, new ComparableVersion("5.0.0.Beta"));
+ }
+
+ private static final String[] CLIENT_JARS = new String[] {
+ "client/jbossall-client.jar",
+ "common/lib/jboss-security-aspects.jar",
+ "lib/jboss-managed.jar",
+ "lib/jboss-metatype.jar",
+ "lib/jboss-dependency.jar"
+ };
+
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext discoveryContext) {
+ log.trace("Discovering JBoss AS 5.x and 6.x Resources...");
+ Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
+ DiscoveredResourceDetails inProcessJBossAS = discoverInProcessJBossAS(discoveryContext);
+ if (inProcessJBossAS != null) {
+ // If we're running inside a JBoss AS JVM, that's the only AS instance we want to discover.
+ resources.add(inProcessJBossAS);
+ } else {
+ // Otherwise, scan the process table for external AS instances.
+ resources.addAll(discoverExternalJBossAsProcesses(discoveryContext));
+ }
+ log.trace("Discovered " + resources.size() + " JBossAS 5.x and 6.x Resources.");
+ return resources;
+ }
+
+ public DiscoveredResourceDetails discoverResource(Configuration pluginConfig,
+ ResourceDiscoveryContext discoveryContext)
+ throws InvalidPluginConfigurationException {
+ // Set default values on any props that are not set.
+ //setPluginConfigurationDefaults(pluginConfiguration);
+
+ ProcessInfo processInfo = null;
+ String jbossHomeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR)
+ .getStringValue();
+ JBossInstallationInfo installInfo;
+ try {
+ installInfo = new JBossInstallationInfo(new File(jbossHomeDir));
+ } catch (IOException e) {
+ throw new InvalidPluginConfigurationException(e);
+ }
+ DiscoveredResourceDetails resourceDetails = createResourceDetails(discoveryContext, pluginConfig, processInfo,
+ installInfo);
+ return resourceDetails;
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<URL> getAdditionalClasspathUrls(ResourceDiscoveryContext context, DiscoveredResourceDetails details)
+ throws Exception {
+ Configuration pluginConfig = details.getPluginConfiguration();
+ String homeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR).getStringValue();
+
+ List<URL> clientJars = new ArrayList<URL>();
+
+ for (String jarFileName : CLIENT_JARS) {
+ File clientJar = new File(homeDir, jarFileName);
+ if (!clientJar.exists()) {
+ throw new FileNotFoundException("Cannot find [" + clientJar + "] - unable to manage server.");
+ }
+ if (!clientJar.canRead()) {
+ throw new IOException("Cannot read [" + clientJar + "] - unable to manage server.");
+ }
+ clientJars.add(clientJar.toURI().toURL());
+ }
+
+ return clientJars;
+ }
+
+ private Set<DiscoveredResourceDetails> discoverExternalJBossAsProcesses(ResourceDiscoveryContext discoveryContext) {
+ Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
+ List<ProcessScanResult> autoDiscoveryResults = discoveryContext.getAutoDiscoveredProcesses();
+
+ for (ProcessScanResult autoDiscoveryResult : autoDiscoveryResults) {
+ ProcessInfo processInfo = autoDiscoveryResult.getProcessInfo();
+ if (log.isDebugEnabled())
+ log.debug("Discovered JBoss AS process: " + processInfo);
+
+ JBossInstanceInfo cmdLine;
+ try {
+ cmdLine = new JBossInstanceInfo(processInfo);
+ } catch (Exception e) {
+ log.error("Failed to process JBoss AS command line: " + Arrays.asList(processInfo.getCommandLine()), e);
+ continue;
+ }
+
+ // Skip it if it's an AS/EAP/SOA-P version we don't support.
+ JBossInstallationInfo installInfo = cmdLine.getInstallInfo();
+ if (!isSupportedProduct(installInfo)) {
+ continue;
+ }
+
+ File installHome = new File(cmdLine.getSystemProperties().getProperty(JBossProperties.HOME_DIR));
+ File configDir = new File(cmdLine.getSystemProperties().getProperty(JBossProperties.SERVER_HOME_DIR));
+
+ // The config dir might be a symlink - call getCanonicalFile() to resolve it if so, before
+ // calling isDirectory() (isDirectory() returns false for a symlink, even if it points at
+ // a directory).
+ try {
+ if (!configDir.getCanonicalFile().isDirectory()) {
+ log.warn("Skipping discovery for JBoss AS process " + processInfo + ", because configuration dir '"
+ + configDir + "' does not exist or is not a directory.");
+ continue;
+ }
+ } catch (IOException e) {
+ log.error("Skipping discovery for JBoss AS process " + processInfo + ", because configuration dir '"
+ + configDir + "' could not be canonicalized.", e);
+ continue;
+ }
+
+ Configuration pluginConfiguration = discoveryContext.getDefaultPluginConfiguration();
+
+ String jnpURL = getJnpURL(cmdLine, installHome, configDir);
+
+ // TODO? Set the connection type - local or remote
+
+ // Set the required props...
+ pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.NAMING_URL,
+ jnpURL));
+ pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.HOME_DIR,
+ installHome.getAbsolutePath()));
+ pluginConfiguration.put(new PropertySimple(
+ ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR, configDir));
+
+ // Set the optional props...
+ pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.SERVER_NAME,
+ cmdLine.getSystemProperties().getProperty(JBossProperties.SERVER_NAME)));
+ pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.BIND_ADDRESS,
+ cmdLine.getSystemProperties().getProperty(JBossProperties.BIND_ADDRESS)));
+
+ JBossASDiscoveryUtils.UserInfo userInfo = JBossASDiscoveryUtils.getJmxInvokerUserInfo(configDir);
+ if (userInfo != null) {
+ pluginConfiguration.put(
+ new PropertySimple(ApplicationServerPluginConfigurationProperties.PRINCIPAL,
+ userInfo.getUsername()));
+ pluginConfiguration.put(
+ new PropertySimple(ApplicationServerPluginConfigurationProperties.CREDENTIALS,
+ userInfo.getPassword()));
+ }
+
+ String javaHome = processInfo.getEnvironmentVariable(JAVA_HOME_ENV_VAR);
+ if (javaHome == null && log.isDebugEnabled()) {
+ log.debug("Unable to determine the JAVA_HOME environment variable for the JBoss AS process - "
+ + " the Agent is probably running as a user that does not have access to the AS process's "
+ + " environment.");
+ }
+ pluginConfiguration.put(new PropertySimple(ApplicationServerPluginConfigurationProperties.JAVA_HOME,
+ javaHome));
+
+ initLogEventSourcesConfigProp(configDir, pluginConfiguration);
+
+ // TODO: Init props that have static defaults.
+ //setPluginConfigurationDefaults(pluginConfiguration);
+
+ DiscoveredResourceDetails resourceDetails = createResourceDetails(discoveryContext, pluginConfiguration,
+ processInfo, installInfo);
+ resources.add(resourceDetails);
+ }
+ return resources;
+ }
+
+ @Nullable
+ private DiscoveredResourceDetails discoverInProcessJBossAS(ResourceDiscoveryContext discoveryContext) {
+ try {
+ return new InProcessJBossASDiscovery().discoverInProcessJBossAS(discoveryContext);
+ } catch (Throwable t) {
+ log.debug("In-process JBoss AS discovery failed - we are probably not running embedded within JBoss AS.", t);
+ return null;
+ }
+ }
+
+ private DiscoveredResourceDetails createResourceDetails(ResourceDiscoveryContext discoveryContext,
+ Configuration pluginConfig, @Nullable ProcessInfo processInfo, JBossInstallationInfo installInfo) {
+ String serverHomeDir = pluginConfig.getSimple(
+ ApplicationServerPluginConfigurationProperties.SERVER_HOME_DIR).getStringValue();
+ File absoluteConfigPath = resolvePathRelativeToHomeDir(pluginConfig, serverHomeDir);
+
+ // Canonicalize the config path, so it's consistent no matter how it's entered.
+ // This prevents two servers with different forms of the same config path, but
+ // that are actually the same server, from ending up in inventory.
+ // JON: fix for JBNADM-2634 - do not resolve symlinks (ips, 12/18/07)
+ String key = FileUtils.getCanonicalPath(absoluteConfigPath.getPath());
+
+ String bindAddress = pluginConfig.getSimple(
+ ApplicationServerPluginConfigurationProperties.BIND_ADDRESS).getStringValue();
+ String namingUrl = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.NAMING_URL)
+ .getStringValue();
+
+ // Only include the JNP port in the Resource name if its value is not "***CHANGE_ME***".
+ String namingPort = null;
+ //noinspection ConstantConditions
+ int colonIndex = namingUrl.lastIndexOf(':');
+ if ((colonIndex != -1) && (colonIndex != (namingUrl.length() - 1))) {
+ // NOTE: We assume the JNP URL does not have a trailing slash.
+ String port = namingUrl.substring(colonIndex + 1);
+ if (!port.equals(CHANGE_ME))
+ namingPort = port;
+ }
+
+ String configName = absoluteConfigPath.getName();
+ String baseName = discoveryContext.getSystemInformation().getHostname();
+ String description = installInfo.getProductType().DESCRIPTION;
+ File deployDir = new File(absoluteConfigPath, "deploy");
+ File rhqInstallerWar = new File(deployDir, "rhq-installer.war");
+ File rhqInstallerWarUndeployed = new File(deployDir, "rhq-installer.war.rej");
+ boolean isRhqServer = rhqInstallerWar.exists() || rhqInstallerWarUndeployed.exists();
+ if (isRhqServer) {
+ baseName += " RHQ Server, ";
+ description += " hosting the RHQ Server";
+ // We know this is an RHQ Server. Let's add an event source for its server log file, but disable it by default.
+ configureEventSourceForServerLogFile(pluginConfig);
+ }
+ String name = formatServerName(baseName, bindAddress, namingPort, configName, installInfo);
+
+ return new DiscoveredResourceDetails(discoveryContext.getResourceType(), key, name, installInfo.getVersion(),
+ description, pluginConfig, processInfo);
+ }
+
+ private String formatServerName(String baseName, String bindingAddress, String jnpPort, String configName,
+ JBossInstallationInfo installInfo) {
+ baseName = baseName + " " + installInfo.getProductType().NAME + " " + installInfo.getVersion() + " "
+ + configName;
+ String details = null;
+ if ((bindingAddress != null) && (jnpPort != null && !jnpPort.equals(CHANGE_ME))) {
+ details = bindingAddress + ":" + jnpPort;
+ } else if ((bindingAddress == null) && (jnpPort != null && !jnpPort.equals(CHANGE_ME))) {
+ details = jnpPort;
+ } else if (bindingAddress != null) {
+ details = bindingAddress;
+ }
+
+ return baseName + ((details != null) ? (" (" + details + ")") : "");
+ }
+
+ private void configureEventSourceForServerLogFile(Configuration pluginConfig) {
+ File rhqLogFile = resolvePathRelativeToHomeDir(pluginConfig, "../logs/rhq-server-log4j.log");
+ if (rhqLogFile.exists() && !rhqLogFile.isDirectory()) {
+ try {
+ PropertyMap serverLogEventSource = new PropertyMap("serverLog");
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, rhqLogFile
+ .getCanonicalPath()));
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.MINIMUM_SEVERITY, "info"));
+ PropertyList logEventSources = pluginConfig
+ .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
+ logEventSources.add(serverLogEventSource);
+ } catch (IOException e) {
+ log.warn("Unable to setup RHQ Server log file monitoring.", e);
+ }
+ }
+ }
+
+ private String getJnpURL(JBossInstanceInfo cmdLine, File installHome, File configDir) {
+ File jnpServiceUrlFile = new File(configDir, "data/jnp-service.url");
+ if (jnpServiceUrlFile.exists() && jnpServiceUrlFile.canRead()) {
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(jnpServiceUrlFile));
+ String jnpUrl = br.readLine();
+ if (jnpUrl != null) {
+ if (log.isDebugEnabled()) {
+ log.debug("Read JNP URL from jnp-service.url file: " + jnpUrl);
+ }
+ return jnpUrl;
+ }
+ } catch (IOException ioe) {
+ // Nothing to do
+ }
+ }
+
+ log.warn("Failed to read JNP URL from '" + jnpServiceUrlFile + "'.");
+
+ // Above did not work, so fall back to our previous scheme
+ JnpConfig jnpConfig = getJnpConfig(installHome, configDir, cmdLine.getSystemProperties());
+ String jnpAddress = (jnpConfig.getJnpAddress() != null) ? jnpConfig.getJnpAddress() : CHANGE_ME;
+ if (ANY_ADDRESS.equals(jnpAddress)) {
+ jnpAddress = LOCALHOST;
+ }
+ String jnpPort = (jnpConfig.getJnpPort() != null) ? String.valueOf(jnpConfig.getJnpPort()) : CHANGE_ME;
+ return "jnp://" + jnpAddress + ":" + jnpPort;
+ }
+
+ private static JnpConfig getJnpConfig(File installHome, File configDir, Properties props) {
+ File serviceXML = new File(configDir, JBOSS_SERVICE_XML);
+ JnpConfig config = JnpConfig.getConfig(installHome, serviceXML, props);
+ if ((config == null) || (config.getJnpPort() == null)) {
+ File namingServiceFile = new File(configDir, JBOSS_NAMING_SERVICE_XML);
+ if (namingServiceFile.exists()) {
+ config = JnpConfig.getConfig(installHome, namingServiceFile, props);
+ }
+ }
+ return config;
+ }
+
+ private void initLogEventSourcesConfigProp(File configDir, Configuration pluginConfig) {
+ File logDir = new File(configDir, "log");
+ File serverLogFile = new File(logDir, "server.log");
+ if (serverLogFile.exists() && !serverLogFile.isDirectory()) {
+ PropertyMap serverLogEventSource = new PropertyMap("serverLog");
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.LOG_FILE_PATH, serverLogFile));
+ serverLogEventSource.put(new PropertySimple(
+ LogFileEventResourceComponentHelper.LogEventSourcePropertyNames.ENABLED, Boolean.FALSE));
+ PropertyList logEventSources = pluginConfig
+ .getList(LogFileEventResourceComponentHelper.LOG_EVENT_SOURCES_CONFIG_PROP);
+ logEventSources.add(serverLogEventSource);
+ }
+ }
+
+ private boolean isSupportedProduct(JBossInstallationInfo installInfo) {
+ ComparableVersion version = new ComparableVersion(installInfo.getVersion());
+ JBossProductType productType = installInfo.getProductType();
+ ComparableVersion minimumVersion = MINIMUM_PRODUCT_VERSIONS.get(productType);
+ // The product is supported if the version is greater than or equal to the minimum version.
+ boolean supported = (version.compareTo(minimumVersion) >= 0);
+ if (!supported) {
+ log.debug(productType + " version " + version + " is not supported by this plugin (minimum " + productType
+ + " version is " + minimumVersion + ") - skipping...");
+ }
+ return supported;
+ }
+
+ @NotNull
+ private static File resolvePathRelativeToHomeDir(Configuration pluginConfig, @NotNull String path) {
+ File configDir = new File(path);
+ if (!configDir.isAbsolute()) {
+ String homeDir = pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.HOME_DIR).getStringValue();
+ configDir = new File(homeDir, path);
+ }
+ return configDir;
+ }
+}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerOperationsDelegate.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerOperationsDelegate.java
index cba1e71..643c9cc 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerOperationsDelegate.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerOperationsDelegate.java
@@ -111,7 +111,7 @@ public class ApplicationServerOperationsDelegate {
ApplicationServerComponent serverComponent, SystemInfo systemInfo) {
this.serverComponent = serverComponent;
this.resourceContext = serverComponent.getResourceContext();
- this.pluginConfig = resourceContext.getPluginConfiguration();
+ this.pluginConfig = this.resourceContext.getPluginConfiguration();
this.systemInfo = systemInfo;
}
@@ -284,7 +284,7 @@ public class ApplicationServerOperationsDelegate {
throw new IllegalStateException(
"The '"
+ ApplicationServerPluginConfigurationProperties.JAVA_HOME
- + "' connection property must be set in order to start or stop the application server via script.");
+ + "' connection property must be set in order to start the application server or to stop it via script.");
}
validateJavaHomePathProperty();
@@ -596,30 +596,16 @@ public class ApplicationServerOperationsDelegate {
}
/**
- * Return the absolute path of this JBoss server's JAVA_HOME directory (e.g.
- * "C:\opt\jdk1.5.0_14"); will only return null in the rare case when the
- * "java.home" system property is not set, and when this is the case, a
- * warning will be logged.
+ * Return the absolute path of this JBoss server's JAVA_HOME directory (e.g. "C:\opt\jdk1.5.0_14"), as defined by
+ * the 'javaHome' plugin config prop, or null if that prop is not set.
*
- * @return the absolute path of this JBoss server's JAVA_HOME directory
- * (e.g. "C:\opt\jdk1.5.0_14"); will only be null in the rare case
- * when the "java.home" system property is not set
+ * @return the absolute path of this JBoss server's JAVA_HOME directory, as defined by
+ * the 'javaHome' plugin config prop, or null if that prop is not set
*/
@Nullable
public File getJavaHomePath() {
- Configuration pluginConfig = serverComponent.getResourceContext()
- .getPluginConfiguration();
- String javaHomePath = pluginConfig.getSimpleValue(
- ApplicationServerPluginConfigurationProperties.JAVA_HOME, null);
-
- if (javaHomePath == null) {
- log
- .warn("The '"
- + "JAVA_HOME"
- + "' System property is not set - unable to set default value for the '"
- + "JAVA_HOME" + "' connection property.");
- }
-
+ String javaHomePath = this.pluginConfig.getSimpleValue(ApplicationServerPluginConfigurationProperties.JAVA_HOME,
+ null);
File javaHome = (javaHomePath != null) ? new File(javaHomePath) : null;
return javaHome;
}
diff --git a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
index df6a2d5..e9049da 100644
--- a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
@@ -1005,6 +1005,12 @@
(e.g. 10.11.14.233 or foo.example.com); specify 0.0.0.0 to tell the
application server to bind to all available network interfaces; defaults to
'127.0.0.1'."/>
+ <c:simple-property name="javaHome" required="false"
+ description="The absolute path to a JRE or JDK installation directory containing
+ the JVM that should be used to start and shutdown this JBoss AS server;
+ this property must be set in order for the Start operation to work,
+ or for the Shutdown operation to work when the shutdown method is set
+ to 'shutdown script'."/>
</c:group>
<c:group name="advanced" displayName="Advanced" hiddenByDefault="true">
commit 706bfb5abaa25a48e1c636012e68663a0a9ce36b
Author: Partha Aji <paji(a)redhat.com>
Date: Fri Jan 8 19:26:53 2010 -0500
Fixed a post fix component unit test..
diff --git a/modules/plugins/postfix/src/test/java/org/rhq/plugins/postfix/PostfixComponentTest.java b/modules/plugins/postfix/src/test/java/org/rhq/plugins/postfix/PostfixComponentTest.java
index 7e28b3b..6724673 100644
--- a/modules/plugins/postfix/src/test/java/org/rhq/plugins/postfix/PostfixComponentTest.java
+++ b/modules/plugins/postfix/src/test/java/org/rhq/plugins/postfix/PostfixComponentTest.java
@@ -75,6 +75,7 @@ public class PostfixComponentTest extends AbstractAugeasConfigurationComponentTe
config.put(new PropertySimple("myhostname", "virtual.domain.com"));
config.put(new PropertySimple("myorigin", "$myhostname"));
config.put(new PropertySimple("mynetworks", "168.100.189.0/28"));
+ config.put(new PropertySimple("mydestination", "$myhostname"));
config.put(new PropertySimple("inet_interfaces", "$myhostname, localhost.$mydomain, localhost, $mydomain"));
config.put(new PropertySimple("smtpd_banner", "$myhostname ESMTP"));
config.put(new PropertySimple("disable_vrfy_command", false));
commit 2c1375ba564b7207cf59ae541990affe482a7bdc
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Fri Jan 8 18:12:00 2010 -0500
add better exception handling
diff --git a/modules/core/native-system/src/test/java/org/rhq/core/system/SigarTest.java b/modules/core/native-system/src/test/java/org/rhq/core/system/SigarTest.java
index 8f6332a..228decf 100644
--- a/modules/core/native-system/src/test/java/org/rhq/core/system/SigarTest.java
+++ b/modules/core/native-system/src/test/java/org/rhq/core/system/SigarTest.java
@@ -44,7 +44,7 @@ public class SigarTest {
try {
Sigar.load();
} catch (Exception e) {
- throw new IllegalStateException("Cannot initialize SIGAR");
+ throw new IllegalStateException("Cannot initialize SIGAR.", e);
}
}
@@ -58,38 +58,95 @@ public class SigarTest {
for (long pid : pids) {
printNow("*** Retrieving process info for PID [" + pid + "]...");
- ProcExe exe = sigar.getProcExe(pid);
- printNow(" exe: " + exe.toMap());
-
- ProcState state = sigar.getProcState(pid);
- printNow(" state: " + state.toMap());
-
- List<String> args = Arrays.asList(sigar.getProcArgs(pid));
- printNow(" args: " + args);
-
- Map env = sigar.getProcEnv(pid);
- printNow(" env: " + env);
-
- ProcCpu cpu = sigar.getProcCpu(pid);
- printNow(" cpu: " + cpu.toMap());
-
- ProcCred cred = sigar.getProcCred(pid);
- printNow(" cred: " + cred.toMap());
-
- ProcFd fd = sigar.getProcFd(pid);
- printNow(" fd: " + fd.toMap());
-
- ProcMem mem = sigar.getProcMem(pid);
- printNow(" mem: " + mem.toMap());
-
- List modules = sigar.getProcModules(pid);
- printNow(" modules:" + modules);
-
- ProcStat stat = sigar.getProcStat();
- printNow(" stat: " + stat.toMap());
-
- ProcTime time = sigar.getProcTime(pid);
- printNow(" time: " + time.toMap());
+ SigarException sigarException = null;
+
+ ProcExe exe = null;
+ try {
+ exe = sigar.getProcExe(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" exe: " + ((exe != null) ? exe.toMap() : ("<UNKNOWN: " + sigarException + ">")));
+
+ ProcState state = null;
+ try {
+ state = sigar.getProcState(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" state: " + ((state != null) ? state.toMap() : ("<UNKNOWN: " + sigarException + ">")));
+
+ List<String> args = null;
+ try {
+ args = Arrays.asList(sigar.getProcArgs(pid));
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" args: " + ((args != null) ? args : ("<UNKNOWN: " + sigarException + ">")));
+
+ Map env = null;
+ try {
+ env = sigar.getProcEnv(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" env: " + ((env != null) ? env : ("<UNKNOWN: " + sigarException + ">")));
+
+ ProcCpu cpu = null;
+ try {
+ cpu = sigar.getProcCpu(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" cpu: " + ((cpu != null) ? cpu.toMap() : ("<UNKNOWN: " + sigarException + ">")));
+
+ ProcCred cred = null;
+ try {
+ cred = sigar.getProcCred(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" cred: " + ((cred != null) ? cred.toMap() : ("<UNKNOWN: " + sigarException + ">")));
+
+ ProcFd fd = null;
+ try {
+ fd = sigar.getProcFd(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" fd: " + ((fd != null) ? fd.toMap() : ("<UNKNOWN: " + sigarException + ">")));
+
+ ProcMem mem = null;
+ try {
+ mem = sigar.getProcMem(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" mem: " + ((mem != null) ? mem.toMap() : ("<UNKNOWN: " + sigarException + ">")));
+
+ List modules = null;
+ try {
+ modules = sigar.getProcModules(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" modules:" + ((modules != null) ? modules : ("<UNKNOWN: " + sigarException + ">")));
+
+ ProcStat stat = null;
+ try {
+ stat = sigar.getProcStat();
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" stat: " + ((stat != null) ? stat.toMap() : ("<UNKNOWN: " + sigarException + ">")));
+
+ ProcTime time = null;
+ try {
+ time = sigar.getProcTime(pid);
+ } catch (SigarException e) {
+ sigarException = e;
+ }
+ printNow(" time: " + ((time != null) ? time.toMap() : ("<UNKNOWN: " + sigarException + ">")));
printNow("");
}
commit 54e8060c9a6f0d3627e493c87991fee69da4664c
Merge: 158985c... d1afdaf...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 8 17:05:34 2010 -0500
Merge branch 'linux-config' into linux-config-dev
commit d1afdaf4d3126e530c6cf3dc6a3b6fec60cfab93
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 8 17:04:24 2010 -0500
Git LT commit
diff --git a/etc/eclipse-tools/RHQ Remote Debugging - Server.launch b/etc/eclipse-tools/RHQ Remote Debugging - Server.launch
index 43cdd2e..6b68fc6 100644
--- a/etc/eclipse-tools/RHQ Remote Debugging - Server.launch
+++ b/etc/eclipse-tools/RHQ Remote Debugging - Server.launch
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.remoteJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/rhq"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.ALLOW_TERMINATE" value="true"/>
-<mapAttribute key="org.eclipse.jdt.launching.CONNECT_MAP">
-<mapEntry key="port" value="8787"/>
-<mapEntry key="hostname" value="localhost"/>
-</mapAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="rhq"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_CONNECTOR_ID" value="org.eclipse.jdt.launching.socketAttachConnector"/>
-</launchConfiguration>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.remoteJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/rhq"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.ALLOW_TERMINATE" value="true"/>
+<mapAttribute key="org.eclipse.jdt.launching.CONNECT_MAP">
+<mapEntry key="port" value="8787"/>
+<mapEntry key="hostname" value="localhost"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="rhq"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_CONNECTOR_ID" value="org.eclipse.jdt.launching.socketAttachConnector"/>
+</launchConfiguration>
commit 158985c86fb75e3811f9ea744c6eabf57e3904ff
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 8 17:01:06 2010 -0500
Git forced commit, probably due to line termination issues.
diff --git a/etc/eclipse-tools/RHQ Remote Debugging - Server.launch b/etc/eclipse-tools/RHQ Remote Debugging - Server.launch
index 43cdd2e..6b68fc6 100644
--- a/etc/eclipse-tools/RHQ Remote Debugging - Server.launch
+++ b/etc/eclipse-tools/RHQ Remote Debugging - Server.launch
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.remoteJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/rhq"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.ALLOW_TERMINATE" value="true"/>
-<mapAttribute key="org.eclipse.jdt.launching.CONNECT_MAP">
-<mapEntry key="port" value="8787"/>
-<mapEntry key="hostname" value="localhost"/>
-</mapAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="rhq"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_CONNECTOR_ID" value="org.eclipse.jdt.launching.socketAttachConnector"/>
-</launchConfiguration>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.remoteJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/rhq"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.ALLOW_TERMINATE" value="true"/>
+<mapAttribute key="org.eclipse.jdt.launching.CONNECT_MAP">
+<mapEntry key="port" value="8787"/>
+<mapEntry key="hostname" value="localhost"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="rhq"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_CONNECTOR_ID" value="org.eclipse.jdt.launching.socketAttachConnector"/>
+</launchConfiguration>
commit 00e7321f7a98b3bf929e4293b559b291aec48ea7
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 8 17:00:18 2010 -0500
finished up support for trait activation for ResourceTypeActivator.
Added new ActivatorHelper class to use common code for trait handling
across Inventory, ResourceType and Trait Activators. Includes
handling for groups of resources and all/any logic.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
index 7ec3386..c5d21ca 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/MenuItem.java
@@ -105,7 +105,7 @@ public class MenuItem extends Extension implements Serializable, Cloneable {
List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
rawResourceConditions.size());
for (ResourceType rawResourceCondition : rawResourceConditions) {
- List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getPermission();
+ List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
String rawName = rawPermission.getName().toString();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
index b2fe630..50e43f0 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/Tab.java
@@ -133,7 +133,7 @@ public class Tab extends Extension implements Serializable, Cloneable {
List<ResourceConditionSet> resourceConditionSets = new ArrayList<ResourceConditionSet>(
rawResourceConditions.size());
for (ResourceType rawResourceCondition : rawResourceConditions) {
- List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getPermission();
+ List<ResourcePermissionActivatorType> rawPermissions = rawResourceCondition.getResourcePermission();
EnumSet<Permission> permissions = EnumSet.noneOf(Permission.class);
for (ResourcePermissionActivatorType rawPermission : rawPermissions) {
String rawName = rawPermission.getName().toString();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java
new file mode 100644
index 0000000..21b63a1
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ActivatorHelper.java
@@ -0,0 +1,107 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.perspective.activator;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.measurement.MeasurementDataTrait;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+public class ActivatorHelper {
+
+ private static final Log LOG = LogFactory.getLog(ActivatorHelper.class);
+
+ /**
+ * Test trait conditions against resources. Optionally, one or all resources must much all of the
+ * trait conditions.
+ *
+ * @param subject The current user
+ * @param traitMatchers The trait activator pattern matchers that must all be satisfied
+ * @param resources The resources whose trait values will be tested
+ * @param matchAll If true then all resources must pass, if false only one must pass
+ * @return true if, optionally, all or any resources satisfy the trait conditions
+ */
+ public static boolean areTraitsSatisfied(Subject subject, Map<String, Matcher> traitMatchers,
+ Collection<Resource> resources, boolean matchAll) {
+
+ // return true if there are no trait activators to satisfy
+ if (traitMatchers.isEmpty()) {
+ return true;
+ }
+
+ MeasurementDataManagerLocal measurementDataManager = LookupUtil.getMeasurementDataManager();
+
+ for (Resource resource : resources) {
+ boolean traitsSatisfied = true;
+ List<MeasurementDataTrait> traits = measurementDataManager.findCurrentTraitsForResource(subject, resource
+ .getId(), null);
+
+ int numTraitsTested = 0;
+ for (MeasurementDataTrait trait : traits) {
+ Matcher traitMatcher = traitMatchers.get(trait.getName());
+ if (null != traitMatcher) {
+ ++numTraitsTested;
+
+ traitMatcher.reset(trait.getValue());
+ if (!traitMatcher.find()) {
+ traitsSatisfied = false;
+ break;
+ }
+ }
+ }
+
+ if (traitsSatisfied) {
+ if (numTraitsTested != traitMatchers.size()) {
+ if (LOG.isDebugEnabled()) {
+ String error = "" //
+ + "Potential error in perspective descriptor." //
+ + " Not all trait activators matched trait for resource type: " + traitMatchers.keySet() //
+ + " Or, Trait value may not yet have been collected for resource.";
+ LOG.debug(error);
+ }
+
+ return false;
+ }
+
+ if (!matchAll) {
+ return true;
+ }
+ } else {
+ if (matchAll) {
+ return false;
+ }
+ }
+ }
+
+ // if we've run through all the resources then either every resource matched (for matchAll) or
+ // every resource failed (for !matchAll)
+ return matchAll;
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/InventoryActivator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/InventoryActivator.java
index 1cf3eea..4003d7b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/InventoryActivator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/InventoryActivator.java
@@ -19,19 +19,13 @@
package org.rhq.enterprise.server.perspective.activator;
import java.util.List;
-import java.util.Map;
import java.util.Set;
-import java.util.regex.Matcher;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.perspective.activator.context.GlobalActivationContext;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -42,8 +36,6 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class InventoryActivator extends AbstractGlobalActivator {
static final long serialVersionUID = 1L;
- private final Log log = LogFactory.getLog(this.getClass());
-
private List<ResourceConditionSet> resourceConditionSets;
public InventoryActivator(List<ResourceConditionSet> resourceConditionSets) {
@@ -58,6 +50,7 @@ public class InventoryActivator extends AbstractGlobalActivator {
*/
public boolean isActive(GlobalActivationContext context) {
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
+ Subject subject = context.getSubject();
for (ResourceConditionSet rcs : this.resourceConditionSets) {
ResourceCriteria criteria = new ResourceCriteria();
@@ -72,56 +65,7 @@ public class InventoryActivator extends AbstractGlobalActivator {
PageList<Resource> resources = resourceManager.findResourcesByCriteria(context.getSubject(), criteria);
if (!((null == resources) || resources.isEmpty())) {
- return traitsSatisfied(context, rcs.getTraitMatchers(), resources);
- }
- }
-
- return false;
- }
-
- /**
- * If any returned resource satisfies all trait activators then return true since it means there
- * is at least one inventoried resource satisfying all activation conditions.
- * If a trait activator exists for a trait not returned by the resource it is ignored.
- * // TODO: is a warning needed for ignored trait conditions?
- */
- private boolean traitsSatisfied(GlobalActivationContext context, Map<String, Matcher> traitMatchers,
- PageList<Resource> resources) {
-
- // return true if there are no trait activators to satisfy
- if (traitMatchers.isEmpty()) {
- return true;
- }
-
- MeasurementDataManagerLocal measurementDataManager = LookupUtil.getMeasurementDataManager();
-
- for (Resource resource : resources) {
- boolean traitsSatisfied = true;
- List<MeasurementDataTrait> traits = measurementDataManager.findCurrentTraitsForResource(context
- .getSubject(), resource.getId(), null);
-
- int numTraitsTested = 0;
- for (MeasurementDataTrait trait : traits) {
- Matcher traitMatcher = traitMatchers.get(trait.getName());
- if (null != traitMatcher) {
- ++numTraitsTested;
-
- traitMatcher.reset(trait.getValue());
- if (!traitMatcher.find()) {
- traitsSatisfied = false;
- break;
- }
- }
- }
-
- if (traitsSatisfied) {
- if (numTraitsTested != traitMatchers.size()) {
- String error = "Potential error in perspective descriptor. Not all trait activators matched trait for resource type: "
- + traitMatchers.keySet();
- log.warn(error);
- return false;
- }
- return true;
+ return ActivatorHelper.areTraitsSatisfied(subject, rcs.getTraitMatchers(), resources, false);
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ResourceTypeActivator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ResourceTypeActivator.java
index b6322f8..317ebe2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ResourceTypeActivator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/ResourceTypeActivator.java
@@ -18,10 +18,14 @@
*/
package org.rhq.enterprise.server.perspective.activator;
+import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.server.perspective.activator.context.AbstractResourceOrGroupActivationContext;
/**
@@ -29,7 +33,7 @@ import org.rhq.enterprise.server.perspective.activator.context.AbstractResourceO
*/
public class ResourceTypeActivator extends AbstractResourceOrGroupActivator {
static final long serialVersionUID = 1L;
-
+
private List<ResourceConditionSet> resourceConditionSets;
public ResourceTypeActivator(List<ResourceConditionSet> resourceConditionSets) {
@@ -44,23 +48,35 @@ public class ResourceTypeActivator extends AbstractResourceOrGroupActivator {
*/
public boolean isActive(AbstractResourceOrGroupActivationContext context) {
for (ResourceConditionSet resourceConditionSet : this.resourceConditionSets) {
- if (context.getResourceType().getPlugin().equals(resourceConditionSet.getPluginName()) &&
- context.getResourceType().getName().equals(resourceConditionSet.getResourceTypeName())) {
+ if (context.getResourceType().getPlugin().equals(resourceConditionSet.getPluginName())
+ && context.getResourceType().getName().equals(resourceConditionSet.getResourceTypeName())) {
if (hasResourcePermissions(context, resourceConditionSet.getPermissions())) {
- // TODO: Evaluate traits.
- return true;
+ if (hasTraits(context, resourceConditionSet.getTraitMatchers())) {
+ return true;
+ }
}
}
}
return false;
}
- private boolean hasResourcePermissions(AbstractResourceOrGroupActivationContext context, EnumSet<Permission> resourcePermissions) {
+ private boolean hasResourcePermissions(AbstractResourceOrGroupActivationContext context,
+ EnumSet<Permission> resourcePermissions) {
for (Permission permission : resourcePermissions) {
- if (!context.hasResourcePermission(permission)) {
- return false;
- }
+ if (!context.hasResourcePermission(permission)) {
+ return false;
+ }
}
return true;
}
+
+ private boolean hasTraits(AbstractResourceOrGroupActivationContext context, Map<String, Matcher> traitMatchers) {
+
+ if (traitMatchers.isEmpty()) {
+ return true;
+ }
+
+ Collection<Resource> resources = context.getResources();
+ return ActivatorHelper.areTraitsSatisfied(context.getSubject(), traitMatchers, resources, true);
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/TraitActivator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/TraitActivator.java
index edf80d2..c5098f1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/TraitActivator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/TraitActivator.java
@@ -18,24 +18,14 @@
*/
package org.rhq.enterprise.server.perspective.activator;
-import java.util.Set;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.measurement.DataType;
-import org.rhq.core.domain.measurement.MeasurementDataTrait;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.resource.group.ResourceGroup;
-import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
-import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
import org.rhq.enterprise.server.perspective.activator.context.AbstractResourceOrGroupActivationContext;
-import org.rhq.enterprise.server.perspective.activator.context.GroupActivationContext;
-import org.rhq.enterprise.server.perspective.activator.context.ResourceActivationContext;
-import org.rhq.enterprise.server.util.LookupUtil;
/**
* @author Ian Springer
@@ -43,61 +33,16 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class TraitActivator extends AbstractResourceOrGroupActivator {
static final long serialVersionUID = 1L;
- private String name;
- private Pattern value;
+ private Map<String, Matcher> traitMatcher;
- public TraitActivator(String name, Pattern value) {
- this.name = name;
- this.value = value;
+ public TraitActivator(String traitName, Pattern pattern) {
+ traitMatcher = new HashMap<String, Matcher>(1);
+ traitMatcher.put(traitName, pattern.matcher(""));
}
public boolean isActive(AbstractResourceOrGroupActivationContext context) {
- if (context instanceof ResourceActivationContext) {
- ResourceActivationContext resourceContext = (ResourceActivationContext)context;
- Resource resource = resourceContext.getResource();
- ResourceType resourceType = context.getResourceType();
- Set<MeasurementDefinition> measurementDefinitions = resourceType.getMetricDefinitions();
- MeasurementDefinition measurementDefinition = getMeasurementDefiniton(measurementDefinitions);
- if (measurementDefinition == null) {
- // No such trait.
- // TODO: Mistake in descriptor error - log an error.
- return false;
- }
- if (measurementDefinition.getDataType() != DataType.TRAIT) {
- // Measurement isn't a trait.
- // TODO: Mistake in descriptor error - log an error.
- return false;
- }
- MeasurementScheduleManagerLocal measurementScheduleManager = LookupUtil.getMeasurementScheduleManager();
-
- Subject subject = context.getSubject();
- MeasurementSchedule schedule = measurementScheduleManager.getSchedule(subject, resource.getId(),
- measurementDefinition.getId(), false);
- MeasurementDataManagerLocal measurementDataManager = LookupUtil.getMeasurementDataManager();
- MeasurementDataTrait trait = measurementDataManager.getCurrentTraitForSchedule(schedule.getId());
- String value = trait.getValue();
- if (value == null) {
- return false;
- }
- Matcher matcher = this.value.matcher(value);
- return matcher.matches();
- } else if (context instanceof GroupActivationContext) {
- GroupActivationContext groupContext = (GroupActivationContext)context;
- ResourceGroup group = groupContext.getGroup();
- // TODO: Finish this.
- return true;
- } else {
- return false;
- }
- }
-
- private MeasurementDefinition getMeasurementDefiniton(Set<MeasurementDefinition> measurementDefinitions) {
- for (MeasurementDefinition measurementDefinition : measurementDefinitions) {
- if (measurementDefinition.getName().equals(this.name)) {
- return measurementDefinition;
- }
- }
- return null;
+ Collection<Resource> resources = context.getResources();
+ return ActivatorHelper.areTraitsSatisfied(context.getSubject(), traitMatcher, resources, true);
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/AbstractResourceOrGroupActivationContext.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/AbstractResourceOrGroupActivationContext.java
index 097c27e..cf044f8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/AbstractResourceOrGroupActivationContext.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/AbstractResourceOrGroupActivationContext.java
@@ -19,9 +19,11 @@
package org.rhq.enterprise.server.perspective.activator.context;
import java.util.EnumSet;
+import java.util.Set;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.ResourceTypeFacet;
@@ -39,7 +41,11 @@ public abstract class AbstractResourceOrGroupActivationContext extends GlobalAct
}
public abstract ResourceType getResourceType();
+
public abstract EnumSet<ResourceTypeFacet> getFacets();
+
+ public abstract Set<Resource> getResources();
+
protected abstract EnumSet<Permission> getResourcePermissions();
public boolean hasResourcePermission(Permission permission) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/GroupActivationContext.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/GroupActivationContext.java
index 6dc90da..9e853f0 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/GroupActivationContext.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/GroupActivationContext.java
@@ -19,10 +19,13 @@
package org.rhq.enterprise.server.perspective.activator.context;
import java.util.EnumSet;
+import java.util.List;
import java.util.Set;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.criteria.ResourceGroupCriteria;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.ResourceTypeFacet;
import org.rhq.core.domain.resource.composite.ResourceFacets;
@@ -65,14 +68,30 @@ public class GroupActivationContext extends AbstractResourceOrGroupActivationCon
public EnumSet<Permission> getResourcePermissions() {
// lazy load
if (this.resourcePermissions == null) {
- Set<Permission> perms = this.authorizationManager.getImplicitGroupPermissions(getSubject(),
- this.group.getId());
+ Set<Permission> perms = this.authorizationManager.getImplicitGroupPermissions(getSubject(), this.group
+ .getId());
this.resourcePermissions = EnumSet.copyOf(perms);
}
return this.resourcePermissions;
}
+ public Set<Resource> getResources() {
+ // lazy load
+ if (null == this.group.getExplicitResources()) {
+ ResourceGroupCriteria criteria = new ResourceGroupCriteria();
+ criteria.addFilterId(this.group.getId());
+ criteria.fetchExplicitResources(true);
+ List<ResourceGroup> resourceGroups = LookupUtil.getResourceGroupManager().findResourceGroupsByCriteria(
+ this.getSubject(), criteria);
+ if (!resourceGroups.isEmpty()) {
+ this.group.setExplicitResources(resourceGroups.get(0).getExplicitResources());
+ }
+ }
+ return this.group.getExplicitResources();
+ }
+
public ResourceGroup getGroup() {
return group;
}
+
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/ResourceActivationContext.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/ResourceActivationContext.java
index 2c8b4cc..510f584 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/ResourceActivationContext.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/perspective/activator/context/ResourceActivationContext.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.perspective.activator.context;
import java.util.EnumSet;
+import java.util.HashSet;
import java.util.Set;
import org.rhq.core.domain.auth.Subject;
@@ -36,6 +37,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
public class ResourceActivationContext extends AbstractResourceOrGroupActivationContext {
private Resource resource;
+ private Set<Resource> resourceAsSet;
transient EnumSet<ResourceTypeFacet> facets;
transient EnumSet<Permission> resourcePermissions;
@@ -45,6 +47,8 @@ public class ResourceActivationContext extends AbstractResourceOrGroupActivation
public ResourceActivationContext(Subject subject, Resource resource) {
super(subject);
this.resource = resource;
+ this.resourceAsSet = new HashSet<Resource>(1);
+ this.resourceAsSet.add(resource);
}
@Override
@@ -56,8 +60,8 @@ public class ResourceActivationContext extends AbstractResourceOrGroupActivation
public EnumSet<ResourceTypeFacet> getFacets() {
// lazy load
if (this.facets == null) {
- ResourceFacets resourceFacets = this.resourceTypeManager.getResourceFacets(
- resource.getResourceType().getId());
+ ResourceFacets resourceFacets = this.resourceTypeManager.getResourceFacets(resource.getResourceType()
+ .getId());
this.facets = resourceFacets.getFacets();
}
return this.facets;
@@ -73,7 +77,7 @@ public class ResourceActivationContext extends AbstractResourceOrGroupActivation
// lazy load
if (this.resourcePermissions == null) {
Set<Permission> perms = this.authorizationManager.getImplicitResourcePermissions(getSubject(),
- this.resource.getId());
+ this.resource.getId());
this.resourcePermissions = EnumSet.copyOf(perms);
}
return this.resourcePermissions;
@@ -82,4 +86,9 @@ public class ResourceActivationContext extends AbstractResourceOrGroupActivation
public Resource getResource() {
return resource;
}
+
+ public Set<Resource> getResources() {
+ return this.resourceAsSet;
+ }
+
}
commit 25ce901ca5e47bb0a51a96243e8b9d677e7eb88c
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 8 16:57:05 2010 -0500
Added infrastructure for the SupportFacet. Note that detection
of said facet is done via an expected plugin config prop. This
should probably be enhanced to actually drive off of a specific
support meta-data decl in the plugin descriptor.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index b0a9776..f96e819 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@ -86,8 +86,8 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
query = "SELECT rt FROM ResourceType AS rt WHERE LOWER(rt.name) = LOWER(:name)"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_PLUGIN, query = "SELECT rt FROM ResourceType AS rt WHERE rt.plugin = :plugin"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_NAME_AND_PLUGIN, // TODO: QUERY: names are case-sensitive
- hints = { @QueryHint(name = "org.hibernate.cacheable", value = "true"),
- @QueryHint(name = "org.hibernate.cacheRegion", value = "metadata") }, query = "SELECT rt FROM ResourceType AS rt WHERE LOWER(rt.name) = LOWER(:name) AND rt.plugin = :plugin"),
+ hints = { @QueryHint(name = "org.hibernate.able", value = "true"),
+ @QueryHint(name = "org.hibernate.Region", value = "metadata") }, query = "SELECT rt FROM ResourceType AS rt WHERE LOWER(rt.name) = LOWER(:name) AND rt.plugin = :plugin"),
@NamedQuery(name = ResourceType.QUERY_FIND_ALL, query = "SELECT rt FROM ResourceType AS rt"),
@NamedQuery(name = ResourceType.QUERY_FIND_BY_PARENT_AND_NAME, // TODO: QUERY: Not looking up by the full key, get rid of this query
query = "SELECT rt FROM ResourceType AS rt WHERE :parent MEMBER OF rt.parentResourceTypes AND rt.name = :name"),
@@ -127,9 +127,7 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ "AND (UPPER(res.name) LIKE :nameFilter OR :nameFilter is null) "
+ "AND (res.resourceType.plugin = :pluginName OR :pluginName is null) "
+ "AND (:inventoryStatus = res.inventoryStatus OR :inventoryStatus is null) "
- + "ORDER BY res.resourceType.name "
-
- ),
+ + "ORDER BY res.resourceType.name "),
@NamedQuery(name = ResourceType.QUERY_FIND_UTILIZED_CHILDREN_BY_CATEGORY, query = "SELECT DISTINCT res.resourceType "
+ "FROM Resource res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.subjects) s "
+ "WHERE s = :subject "
@@ -177,7 +175,8 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ " (SELECT COUNT(resConfig) FROM rt.resourceConfigurationDefinition resConfig)," // configuration
+ " (SELECT COUNT(operationDef) FROM rt.operationDefinitions operationDef)," // operation
+ " (SELECT COUNT(packageType) FROM rt.packageTypes packageType)," // content
- + " (SELECT COUNT(metricDef) FROM rt.metricDefinitions metricDef WHERE metricDef.dataType = 3)" // calltime
+ + " (SELECT COUNT(metricDef) FROM rt.metricDefinitions metricDef WHERE metricDef.dataType = 3)," // calltime
+ + " (SELECT COUNT(propDef) FROM rt.pluginConfigurationDefinition pluginConfig JOIN pluginConfig.propertyDefinitions propDef WHERE propDef.name = 'snapshotLogEnabled')" // support
+ " ) " //
+ " FROM ResourceType rt " //
+ " WHERE ( rt.id = :resourceTypeId OR :resourceTypeId IS NULL )"),
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceTypeFacet.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceTypeFacet.java
index 867fe85..38b15ff 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceTypeFacet.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceTypeFacet.java
@@ -24,11 +24,5 @@ package org.rhq.core.domain.resource;
* @author Ian Springer
*/
public enum ResourceTypeFacet {
- MEASUREMENT,
- EVENT,
- PLUGIN_CONFIGURATION,
- CONFIGURATION,
- OPERATION,
- CONTENT,
- CALL_TIME
+ MEASUREMENT, EVENT, PLUGIN_CONFIGURATION, CONFIGURATION, OPERATION, CONTENT, CALL_TIME, SUPPORT
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceFacets.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceFacets.java
index 973e18a..30712b3 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceFacets.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceFacets.java
@@ -35,8 +35,8 @@ import org.rhq.core.domain.resource.ResourceTypeFacet;
public class ResourceFacets implements Serializable {
private static final long serialVersionUID = 1L;
- public static ResourceFacets NONE = new ResourceFacets(-1, false, false, false, false, false, false, false);
- public static ResourceFacets ALL = new ResourceFacets(-1, true, true, true, true, true, true, true);
+ public static ResourceFacets NONE = new ResourceFacets(-1, false, false, false, false, false, false, false, false);
+ public static ResourceFacets ALL = new ResourceFacets(-1, true, true, true, true, true, true, true, true);
/*
* immutable private member data makes this object safe to use in a concurrent environment, such as a
* concurrent-acess cache of ResourceFacets objects
@@ -49,10 +49,11 @@ public class ResourceFacets implements Serializable {
private final boolean operation;
private final boolean content;
private final boolean callTime;
+ private final boolean support;
private EnumSet<ResourceTypeFacet> facets;
public ResourceFacets(int resourceTypeId, boolean measurement, boolean event, boolean pluginConfiguration,
- boolean configuration, boolean operation, boolean content, boolean callTime) {
+ boolean configuration, boolean operation, boolean content, boolean callTime, boolean support) {
this.resourceTypeId = resourceTypeId;
this.measurement = measurement;
this.event = event;
@@ -60,12 +61,13 @@ public class ResourceFacets implements Serializable {
this.configuration = configuration;
this.operation = operation;
this.content = content;
- this.callTime = callTime;
+ this.callTime = callTime;
+ this.support = support;
initEnum();
}
public ResourceFacets(int resourceTypeId, Number measurement, Number event, Number pluginConfiguration,
- Number configuration, Number operation, Number content, Number callTime) {
+ Number configuration, Number operation, Number content, Number callTime, Number support) {
this.resourceTypeId = resourceTypeId;
this.measurement = measurement.intValue() != 0;
this.event = event.intValue() != 0;
@@ -74,6 +76,7 @@ public class ResourceFacets implements Serializable {
this.operation = operation.intValue() != 0;
this.content = content.intValue() != 0;
this.callTime = callTime.intValue() != 0;
+ this.support = support.intValue() != 0;
initEnum();
}
@@ -147,6 +150,15 @@ public class ResourceFacets implements Serializable {
}
/**
+ * Does this resource expose support snapshot capability? If so, the Support sub-tab will be displayed in the GUI.
+ *
+ * @return true if the resource allows support snapshots, false otherwise
+ */
+ public boolean isSupport() {
+ return support;
+ }
+
+ /**
* Returns an enum representation of the facets.
*
* @return an enum representation of the facets
@@ -157,12 +169,21 @@ public class ResourceFacets implements Serializable {
private void initEnum() {
this.facets = EnumSet.noneOf(ResourceTypeFacet.class);
- if (measurement) this.facets.add(ResourceTypeFacet.MEASUREMENT);
- if (event) this.facets.add(ResourceTypeFacet.EVENT);
- if (pluginConfiguration) this.facets.add(ResourceTypeFacet.PLUGIN_CONFIGURATION);
- if (configuration) this.facets.add(ResourceTypeFacet.CONFIGURATION);
- if (operation) this.facets.add(ResourceTypeFacet.OPERATION);
- if (content) this.facets.add(ResourceTypeFacet.CONTENT);
- if (callTime) this.facets.add(ResourceTypeFacet.CALL_TIME);
+ if (measurement)
+ this.facets.add(ResourceTypeFacet.MEASUREMENT);
+ if (event)
+ this.facets.add(ResourceTypeFacet.EVENT);
+ if (pluginConfiguration)
+ this.facets.add(ResourceTypeFacet.PLUGIN_CONFIGURATION);
+ if (configuration)
+ this.facets.add(ResourceTypeFacet.CONFIGURATION);
+ if (operation)
+ this.facets.add(ResourceTypeFacet.OPERATION);
+ if (content)
+ this.facets.add(ResourceTypeFacet.CONTENT);
+ if (callTime)
+ this.facets.add(ResourceTypeFacet.CALL_TIME);
+ if (support)
+ this.facets.add(ResourceTypeFacet.SUPPORT);
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
index fed3b9e..547b7a5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java
@@ -378,7 +378,7 @@ public class ResourceTypeManagerBean implements ResourceTypeManagerLocal, Resour
query.setParameter("resourceTypeId", resourceTypeId);
List<ResourceFacets> facets = query.getResultList();
if (facets.size() != 1) {
- return new ResourceFacets(resourceTypeId, false, false, false, false, false, false, false);
+ return new ResourceFacets(resourceTypeId, false, false, false, false, false, false, false, false);
}
return facets.get(0);
}
commit dabd99c8860c3ecfa090bac3742adc1d879d3129
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 8 16:53:57 2010 -0500
Updated with schema refactor.
Added a few more samples. Made sample tab a Support Sample tab
dependent on the support facet. Added Summary subtab for AS
resources showing multiple resource type activation.
diff --git a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index 1a75f09..75187b2 100644
--- a/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/etc/samples/perspectives/sample-perspective/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<perspectivePlugin
+<perspective-plugin
apiVersion="1.0"
version="1.0"
description="A Sample Perspective Utilizing Every Extension Point and Filter"
@@ -19,7 +19,7 @@
baseUrl="/rhq-sample-perspective/" />
<!-- replace the coreMenu log with a new one -->
- <menuItem
+ <menu-item
action="remove"
name="logo"
displayName=""
@@ -28,8 +28,8 @@
iconUrl="images/jboss.png">
<position
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
action="add"
name="logo"
displayName=""
@@ -38,42 +38,42 @@
iconUrl="images/jboss.png">
<position
placement="firstChild" />
- </menuItem>
+ </menu-item>
<!-- remove the 'new' menu items from the group menuGroup and move them to the custom menuGroup -->
- <menuItem
+ <menu-item
action="remove"
name="groups.newGroup"
displayName="New Group">
<position
name="groups.groupDefinitions"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
action="remove"
name="groups.newGroupDefinition"
displayName="New Group Definition">
<position
name="groups.newGroup"
placement="after" />
- </menuItem>
+ </menu-item>
- <!-- Add Sample menuItem to Core Menu -->
- <menuItem
+ <!-- Add Sample menu-item to Core Menu -->
+ <menu-item
name="sample"
displayName="Sample">
<position
name="help"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="sample.child1"
displayName="New Group">
<position
name="sample"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="sample.child2"
displayName="Sample Page"
application="sample"
@@ -81,8 +81,8 @@
<position
name="sample.child1"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="sample.child3"
displayName="Random Resource"
application="sample"
@@ -90,8 +90,8 @@
<position
name="sample.child2"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="sample.child4"
displayName="Create EJB3 Admin User"
application="sample"
@@ -100,9 +100,9 @@
name="sample.child3"
placement="after" />
<activators>
- <globalPermission
+ <global-permission
name="MANAGE_INVENTORY" />
- <globalPermission
+ <global-permission
name="MANAGE_SECURITY" />
<inventory>
<resource
@@ -110,8 +110,8 @@
type="JBossAS Server" />
</inventory>
</activators>
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="sample.child5"
displayName="Config and Restart AS"
application="sample"
@@ -124,9 +124,9 @@
<resource
plugin="JBossAS"
type="JBossAS Server">
- <permission
+ <resource-permission
name="CONTROL" />
- <permission
+ <resource-permission
name="CONFIGURE" />
<trait
name="Version Name"
@@ -137,8 +137,8 @@
</resource>
</inventory>
</activators>
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="sample.child1.newGroup"
displayName="New Group"
application="sample"
@@ -148,11 +148,11 @@
name="sample.child1"
placement="firstChild" />
<activators>
- <globalPermission
+ <global-permission
name="MANAGE_INVENTORY" />
</activators>
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="sample.child1.newGroupDefinition"
displayName="New Group Definition"
application="sample"
@@ -162,20 +162,28 @@
name="sample.child1.newGroup"
placement="after" />
<activators>
- <globalPermission
+ <global-permission
name="MANAGE_INVENTORY" />
</activators>
- </menuItem>
+ </menu-item>
+
+ <!-- A tab that shows up whenever the RT implements the Support Facet and user can execute operations -->
<tab
- name="Sample"
- displayName="Sample"
+ name="SampleSupport"
+ displayName="Sample Support"
iconUrl="/images/icons/Favorite_16.png"
application="sample"
url="currentResource.seam">
<position
- name="Inventory"
+ name="Content"
placement="after" />
+ <activators>
+ <facet
+ name="support" />
+ <resource-permission
+ name="CONTROL" />
+ </activators>
</tab>
<!-- a subtab that will only be displayed for Network Adapter Resources -->
@@ -189,11 +197,35 @@
name="Summary.Timeline"
placement="after" />
<activators>
- <resourceType>
+ <resource-type>
<resource
plugin="Platforms"
type="Network Adapter" />
- </resourceType>
+ </resource-type>
+ </activators>
+ </tab>
+
+ <!-- a subtab that will only be displayed for AS Server (4 or 5) Resources -->
+ <tab
+ name="Summary.SampleAS"
+ displayName="Sample-AS4,5"
+ iconUrl="/images/icons/Favorite_16.png"
+ application="sample"
+ url="subtabpage.html">
+ <position
+ name="Summary.Timeline"
+ placement="after" />
+ <activators>
+ <resource-type>
+ <resource
+ plugin="JBossAS"
+ type="JBossAS Server">
+ </resource>
+ <resource
+ plugin="JBossAS5"
+ type="JBossAS Server">
+ </resource>
+ </resource-type>
</activators>
</tab>
@@ -207,4 +239,4 @@
placement="after" />
</tab>
-</perspectivePlugin>
\ No newline at end of file
+</perspective-plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
index b428989..94ec77b 100644
--- a/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<perspectivePlugin
+<perspective-plugin
version="1.0"
apiVersion="2.0"
description="The Core Perspective defining Core UI Elements"
@@ -12,137 +12,124 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- Core Menu -->
- <menuItem
+ <menu-item
name="logo"
displayName=""
url="/"
iconUrl="/images/JBossLogo_small.png">
<position
-
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="overview"
displayName="Overview">
<position
-
name="logo"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="resources"
displayName="Resources">
<position
-
name="overview"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="groups"
displayName="Groups">
<position
-
name="resources"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration"
displayName="Administration">
<position
-
name="groups"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="debug"
displayName="Debug">
- <position
+ <position
name="administration"
placement="after" />
- <activators>
- <debugMode/>
- <superuser/>
- </activators>
- </menuItem>
- <menuItem
+ <activators>
+ <debug-mode />
+ <superuser />
+ </activators>
+ </menu-item>
+ <menu-item
name="help"
displayName="Help">
<position
-
name="debug"
placement="after" />
- </menuItem>
+ </menu-item>
<!-- Core Menu: Overview -->
- <menuItem
+ <menu-item
name="overview.subsystemViews"
displayName="Subsystem Views">
<position
-
name="overview"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="overview.autoDiscoveryQueue"
displayName="Auto Discovery Queue"
url="/rhq/discovery/queue.xhtml">
<position
-
name="overview.subsystemViews"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="overview.dashboard"
displayName="Dashboard"
url="/Dashboard.do">
<position
-
name="overview.autoDiscoveryQueue"
placement="after" />
- </menuItem>
+ </menu-item>
<!-- Core Menu: Resources -->
- <menuItem
+ <menu-item
name="resources.platforms"
displayName="Platforms"
iconUrl="/images/icons/Platform_up_16.png"
url="/ResourceHub.do?resourceCategory=PLATFORM">
<position
-
name="resources"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="resources.servers"
displayName="Servers"
iconUrl="/images/icons/Server_up_16.png"
url="/ResourceHub.do?resourceCategory=SERVER">
<position
-
name="resources.platforms"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="resources.services"
displayName="Services"
iconUrl="/images/icons/Service_up_16.png"
url="/ResourceHub.do?resourceCategory=SERVICE">
<position
-
name="resources.servers"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="resources.favoriteResources"
displayName="Favorite Resources"
feature="resourceFavorites"
iconUrl="/images/icons/Favorite_16.png">
<position
-
name="resources.services"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="resources.recentlyViewedResources"
displayName="Recently Viewed Resources"
feature="resourceRecentlyViewed"
@@ -150,8 +137,8 @@
<position
name="resources.favoriteResources"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="resources.search"
displayName="Search:"
feature="resourceSearch"
@@ -159,11 +146,11 @@
addBreak="true">
<position
name="resources.recentlyViewedResources"
- placement="after"/>
- </menuItem>
+ placement="after" />
+ </menu-item>
<!-- Core Menu: Groups -->
- <menuItem
+ <menu-item
name="groups.compatibleGroups"
displayName="Compatible Groups"
iconUrl="/images/icons/Cluster_up_16.png"
@@ -171,129 +158,125 @@
<position
name="groups"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="groups.mixedGroups"
displayName="Mixed Groups"
iconUrl="/images/icons/Group_up_16.png"
url="/GroupHub.do?groupCategory=MIXED">
<position
-
name="groups.compatibleGroups"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="groups.groupDefinitions"
displayName="Group Definitions"
iconUrl="/images/GroupDefinition_16.png"
url="/rhq/definition/group/list.xhtml">
<position
-
name="groups.mixedGroups"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="groups.newGroup"
displayName="New Group"
url="/resource/group/Inventory.do?mode=new"
addBreak="true">
<position
-
name="groups.groupDefinitions"
- placement="after"/>
- <activators>
- <globalPermission name="MANAGE_INVENTORY" />
- </activators>
- </menuItem>
- <menuItem
+ placement="after" />
+ <activators>
+ <global-permission
+ name="MANAGE_INVENTORY" />
+ </activators>
+ </menu-item>
+ <menu-item
name="groups.newGroupDefinition"
displayName="New Group Definition"
url="/rhq/definition/group/new.xhtml">
<position
-
name="groups.newGroup"
placement="after" />
- <activators>
- <globalPermission name="MANAGE_INVENTORY" />
- </activators>
- </menuItem>
- <menuItem
+ <activators>
+ <global-permission
+ name="MANAGE_INVENTORY" />
+ </activators>
+ </menu-item>
+ <menu-item
name="groups.favoriteGroups"
displayName="Favorite Groups"
feature="groupFavorites"
iconUrl="/images/icons/Favorite_16.png"
addBreak="true">
- <position
+ <position
name="groups.newGroupDefinition"
- placement="after"
- />
- </menuItem>
- <menuItem
+ placement="after" />
+ </menu-item>
+ <menu-item
name="groups.recentlyViewedGroups"
displayName="Recently Viewed Groups"
feature="groupRecentlyViewed"
iconUrl="/images/icons/History_16.png">
- <position
+ <position
name="groups.favoriteGroups"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="groups.search"
displayName="Search:"
feature="groupSearch"
iconUrl="/images/icons/Search_16.png"
addBreak="true">
- <position
+ <position
name="groups.recentlyViewedGroups"
- placement="after"/>
- </menuItem>
+ placement="after" />
+ </menu-item>
<!-- Core Menu: Administration -->
- <menuItem
+ <menu-item
name="administration.security"
displayName="Security">
<position
-
name="administration"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.systemConfiguration"
displayName="System Configuration">
- <position
+ <position
name="administration.security"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.content"
displayName="Content">
<position
name="administration.systemConfiguration"
placement="after" />
- <activators>
- <globalPermission
- name="MANAGE_INVENTORY" />
- </activators>
- </menuItem>
- <menuItem
+ <activators>
+ <global-permission
+ name="MANAGE_INVENTORY" />
+ </activators>
+ </menu-item>
+ <menu-item
name="administration.highAvailability"
displayName="High Availability">
<position
name="administration.content"
placement="after" />
- <activators>
- <globalPermission
- name="MANAGE_INVENTORY" />
- </activators>
- </menuItem>
- <menuItem
+ <activators>
+ <global-permission
+ name="MANAGE_INVENTORY" />
+ </activators>
+ </menu-item>
+ <menu-item
name="administration.reports"
displayName="Reports">
<position
name="administration.highAvailability"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.download"
displayName="Download"
iconUrl="/images/icons/Save_16.png"
@@ -301,72 +284,72 @@
<position
name="administration.reports"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.license"
displayName="License"
url="/admin/license/LicenseAdmin.do?mode=view">
<position
name="administration.download"
placement="after" />
- <activators>
- <globalPermission
- name="MANAGE_SETTINGS" />
- </activators>
- </menuItem>
+ <activators>
+ <global-permission
+ name="MANAGE_SETTINGS" />
+ </activators>
+ </menu-item>
<!-- Core Menu: Debug -->
- <menuItem
+ <menu-item
name="debug.sqlInterface"
displayName="SQL Interface"
url="/admin/test/sql.jsp">
<position
name="debug"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="debug.jpqlHqlInterface"
displayName="JPQL/HQL Interface"
url="/admin/test/hibernate.jsp">
<position
name="debug.sqlInterface"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="debug.hibernateEntityBrowser"
displayName="Hibernate Entity Browser"
url="/admin/test/browser.jsp">
<position
name="debug.jpqlHqlInterface"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="debug.administrativeConsole"
displayName="Administrative Console"
url="/admin/test/control.jsp">
<position
name="debug.hibernateEntityBrowser"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="debug.testEmailConfiguration"
displayName="Test Email Configuration"
url="/admin/test/email.jsp">
<position
name="debug.administrativeConsole"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="debug.testAgentCommunications"
displayName="Test Agent Configurations"
url="/admin/test/agent.jsp">
<position
name="debug.testEmailConfiguration"
placement="after" />
- </menuItem>
+ </menu-item>
<!-- Core Menu: Help -->
- <menuItem
+ <menu-item
name="help.onlineDocumentation"
displayName="Online Documentation"
newWindow="true"
@@ -374,8 +357,8 @@
<position
name="help"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="help.openASupportCase"
displayName="Open a Support Case"
newWindow="true"
@@ -383,8 +366,8 @@
<position
name="help.onlineDocumentation"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="help.about"
displayName="About"
feature="aboutBox"
@@ -392,11 +375,11 @@
addBreak="true">
<position
name="help.openASupportCase"
- placement="after"/>
- </menuItem>
+ placement="after" />
+ </menu-item>
<!-- Core Menu: Overview.Subsystem Views -->
- <menuItem
+ <menu-item
name="overview.subsystemViews.configurationChanges"
displayName="Configuration Changes"
iconUrl="/images/icons/Configure_16.png"
@@ -404,8 +387,8 @@
<position
name="overview.subsystemViews"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="overview.subsystemViews.suspectMetrics"
displayName="Suspect Metrics"
iconUrl="/images/icons/Monitor_failed_16.png"
@@ -413,8 +396,8 @@
<position
name="overview.subsystemViews.configurationChanges"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="overview.subsystemViews.operations"
displayName="Operations"
iconUrl="/images/icons/Operation_16.png"
@@ -422,8 +405,8 @@
<position
name="overview.subsystemViews.suspectMetrics"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="overview.subsystemViews.alerts"
displayName="Alerts"
iconUrl="/images/icons/Flag_blue_16.png"
@@ -431,8 +414,8 @@
<position
name="overview.subsystemViews.operations"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="overview.subsystemViews.alertDefinitions"
displayName="Alert Definitions"
iconUrl="/images/icons/Flag_blue_16.png"
@@ -440,366 +423,444 @@
<position
name="overview.subsystemViews.alerts"
placement="after" />
- </menuItem>
+ </menu-item>
<!-- Core Menu: Administration.Security -->
- <menuItem
+ <menu-item
name="administration.security.users"
displayName="Users"
url="/admin/user/UserAdmin.do?mode=list">
<position
name="administration.security"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.security.roles"
displayName="Roles"
url="/admin/role/RoleAdmin.do?mode=list">
<position
name="administration.security.users"
placement="after" />
- </menuItem>
+ </menu-item>
<!-- Core Menu: administration.systemConfiguration -->
- <menuItem
+ <menu-item
name="administration.systemConfiguration.settings"
displayName="Settings"
url="/admin/config/Config.do?mode=edit">
<position
name="administration.systemConfiguration"
placement="firstChild" />
- <activators>
- <globalPermission
- name="MANAGE_SETTINGS" />
- </activators>
- </menuItem>
- <menuItem
+ <activators>
+ <global-permission
+ name="MANAGE_SETTINGS" />
+ </activators>
+ </menu-item>
+ <menu-item
name="administration.systemConfiguration.plugins"
displayName="Plugins"
url="/rhq/admin/plugin/plugin-list.xhtml">
<position
name="administration.systemConfiguration.settings"
placement="after" />
- <activators>
- <globalPermission
- name="MANAGE_SETTINGS" />
- </activators>
- </menuItem>
- <menuItem
+ <activators>
+ <global-permission
+ name="MANAGE_SETTINGS" />
+ </activators>
+ </menu-item>
+ <menu-item
name="administration.systemConfiguration.templates"
displayName="Templates"
url="/admin/config/EditDefaults.do?mode=monitor&viewMode=all">
<position
-
name="administration.systemConfiguration.plugins"
placement="after" />
- <activators>
- <globalPermission
- name="MANAGE_INVENTORY" />
- </activators>
- </menuItem>
+ <activators>
+ <global-permission
+ name="MANAGE_INVENTORY" />
+ </activators>
+ </menu-item>
<!-- Core Menu: administration.content -->
- <menuItem
+ <menu-item
name="administration.content.contentProviders"
displayName="Content Providers"
url="/rhq/content/listContentProviders.xhtml">
<position
-
name="administration.content"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.content.repositories"
displayName="Repositories"
url="/rhq/content/listRepos.xhtml">
<position
-
name="administration.content.contentProviders"
placement="after" />
- </menuItem>
+ </menu-item>
<!-- Core Menu: administration.highAvailability -->
- <menuItem
+ <menu-item
name="administration.highAvailability.servers"
displayName="Servers"
url="/rhq/ha/listServers.xhtml">
<position
-
name="administration.highAvailability"
placement="firstChild" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.highAvailability.agents"
displayName="Agents"
url="/rhq/ha/listAgents.xhtml">
<position
-
name="administration.highAvailability.servers"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.highAvailability.affinityGroups"
displayName="Affinity Groups"
url="/rhq/ha/listAffinityGroups.xhtml">
<position
-
name="administration.highAvailability.agents"
placement="after" />
- </menuItem>
- <menuItem
+ </menu-item>
+ <menu-item
name="administration.highAvailability.paritionEvents"
displayName="Partition Events"
url="/rhq/ha/listPartitionEvents.xhtml">
<position
-
name="administration.highAvailability.affinityGroups"
placement="after" />
- </menuItem>
+ </menu-item>
<!-- Core Menu: administration.reports -->
- <menuItem
+ <menu-item
name="administration.reports.resourceVersionInventoryReport"
displayName="Servers"
url="/rhq/admin/report/resourceInstallReport.xhtml">
<position
-
name="administration.reports"
placement="firstChild" />
- </menuItem>
-
-
- <!-- Top-level Tabs -->
- <tab name="Summary" displayName="Summary" iconUrl="/images/icons/Service_up_16.png">
- <position
-
- placement="firstChild" />
- </tab>
-
- <tab name="Monitor" displayName="Monitor" iconUrl="/images/icons/Monitor_grey_16.png">
- <position
- name="Summary"
- placement="after" />
- <activators>
- <licenseFeature name="monitoring"/>
- </activators>
- </tab>
-
- <tab name="Inventory" displayName="Inventory" iconUrl="/images/icons/Inventory_grey_16.png">
- <position
- name="Monitor"
- placement="after" />
- </tab>
-
- <tab name="Alert" displayName="Alert" iconUrl="/images/icons/Alert_grey_16.png">
- <position
- name="Inventory"
- placement="after" />
- <activators>
- <licenseFeature name="monitoring"/>
- </activators>
- </tab>
-
- <tab name="Configuration" displayName="Configuration" iconUrl="/images/icons/Configure_grey_16.png">
- <position
-
- name="Alert"
- placement="after" />
- <activators>
- <facet name="configuration"/>
- </activators>
- </tab>
-
- <tab name="Operations" displayName="Operations" iconUrl="/images/icons/Operation_grey_16.png">
- <position
-
- name="Configuration"
- placement="after" />
- <activators>
- <facet name="operation"/>
- </activators>
- </tab>
-
- <tab name="Events" displayName="Events" iconUrl="/images/icons/Events_grey_16.png">
- <position
- name="Operations"
- placement="after" />
- <activators>
- <facet name="event"/>
- </activators>
- </tab>
-
- <tab name="Content" displayName="Content" iconUrl="/images/icons/Content_grey_16.png">
- <position
- name="Events"
- placement="after" />
- <activators>
- <facet name="content"/>
- </activators>
- </tab>
-
- <!-- Summary Subtabs -->
- <tab name="Summary.Overview" displayName="Overview" url="/rhq/resource/summary/overview.xhtml">
- <position
- name="Summary"
- placement="firstChild" />
- </tab>
-
- <tab name="Summary.Timeline" displayName="Timeline" url="/rhq/resource/summary/timeline.xhtml">
- <position
- name="Summary.Overview"
- placement="after" />
- </tab>
-
- <!-- Monitor Subtabs -->
- <tab name="Monitor.Graphs" displayName="Graphs" url="/rhq/resource/monitor/graphs.xhtml">
- <position
-
- name="Monitor"
- placement="firstChild" />
- </tab>
-
- <tab name="Monitor.Tables" displayName="Tables" url="/rhq/resource/monitor/tables.xhtml">
- <position
-
- name="Monitor.Graphs"
- placement="after" />
- </tab>
-
- <tab name="Monitor.Traits" displayName="Traits" url="/rhq/resource/monitor/traits.xhtml">
- <position
-
- name="Monitor.Tables"
- placement="after" />
- </tab>
-
- <tab name="Monitor.Availability" displayName="Availability" url="/rhq/resource/monitor/availabilityHistory.xhtml">
- <position
-
- name="Monitor.Traits"
- placement="after" />
- </tab>
-
- <tab name="Monitor.Schedules" displayName="Schedules" url="/rhq/resource/monitor/schedules.xhtml">
- <position
-
- name="Monitor.Availability"
- placement="after" />
- </tab>
-
- <tab name="Monitor.Response" displayName="Response" url="/rhq/resource/monitor/response.xhtml">
- <position
-
- name="Monitor.Schedules"
- placement="after" />
- <activators>
- <facet name="call_time"/>
- </activators>
- </tab>
-
- <!-- Inventory Subtabs -->
- <tab name="Inventory.Overview" displayName="Overview" url="/rhq/resource/inventory/view.xhtml">
- <position
- name="Inventory"
- placement="firstChild" />
- </tab>
-
- <tab name="Inventory.Connection" displayName="Connection" url="/rhq/resource/inventory/view-connection.xhtml">
- <position
-
- name="Inventory.Overview"
- placement="after" />
- <activators>
- <facet name="plugin_configuration"/>
- </activators>
- </tab>
-
- <tab name="Inventory.Agent" displayName="Agent" url="/rhq/resource/inventory/view-agent.xhtml">
- <position
- name="Inventory.Connection"
- placement="after" />
- </tab>
-
- <!-- Alert Subtabs -->
- <tab name="Alert.Definitions" displayName="Definitions" url="/rhq/resource/alert/listAlertDefinitions.xhtml">
- <position
- name="Alert"
- placement="firstChild" />
- </tab>
-
- <tab name="Alert.History" displayName="History" url="/rhq/resource/alert/listAlertHistory.xhtml">
- <position
- name="Alert.Definitions"
- placement="after" />
- </tab>
-
- <!-- Configuration Subtabs -->
- <tab name="Configuration.Current" displayName="Current" url="/rhq/resource/configuration/view.xhtml">
- <position
- name="Configuration"
- placement="firstChild" />
- </tab>
-
- <tab name="Configuration.History" displayName="History" url="/rhq/resource/configuration/history.xhtml">
- <position
- name="Configuration.Current"
- placement="after" />
- </tab>
-
- <!-- Operations Subtabs -->
- <tab name="Operations.New" displayName="New" url="/rhq/resource/operation/resourceOperationScheduleNew.xhtml">
- <position
- name="Operations"
- placement="firstChild" />
- </tab>
-
- <tab name="Operations.Schedules" displayName="Schedules" url="/rhq/resource/operation/resourceOperationSchedules.xhtml">
- <position
- name="Operations.New"
- placement="after" />
- </tab>
-
- <tab name="Operations.History" displayName="History" url="/rhq/resource/operation/resourceOperationHistory.xhtml">
- <position
- name="Operations.Schedules"
- placement="after" />
- </tab>
-
- <!-- Events Subtabs -->
- <tab name="Events.History" displayName="History" url="/rhq/resource/events/history.xhtml">
- <position
-
- name="Events"
- placement="firstChild" />
- </tab>
-
- <!-- Content Subtabs -->
- <tab name="Content.Deployed" displayName="Deployed" url="/rhq/resource/content/view.xhtml">
- <position
-
- name="Content"
- placement="firstChild" />
- </tab>
-
- <tab name="Content.New" displayName="New" url="/rhq/resource/content/deploy.xhtml">
- <position
-
- name="Content.Deployed"
- placement="after" />
- </tab>
-
- <tab name="Content.Subscriptions" displayName="Subscriptions" url="/rhq/resource/content/subscription.xhtml">
- <position
-
- name="Content.New"
- placement="after" />
- </tab>
-
- <tab name="Content.History" displayName="History" url="/rhq/resource/content/history.xhtml">
- <position
-
- name="Content.Subscriptions"
- placement="after" />
- </tab>
-
-</perspectivePlugin>
+ </menu-item>
+
+
+ <!-- Top-level Tabs -->
+ <tab
+ name="Summary"
+ displayName="Summary"
+ iconUrl="/images/icons/Service_up_16.png">
+ <position
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Monitor"
+ displayName="Monitor"
+ iconUrl="/images/icons/Monitor_grey_16.png">
+ <position
+ name="Summary"
+ placement="after" />
+ <activators>
+ <license-feature
+ name="monitoring" />
+ </activators>
+ </tab>
+
+ <tab
+ name="Inventory"
+ displayName="Inventory"
+ iconUrl="/images/icons/Inventory_grey_16.png">
+ <position
+ name="Monitor"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Alert"
+ displayName="Alert"
+ iconUrl="/images/icons/Alert_grey_16.png">
+ <position
+ name="Inventory"
+ placement="after" />
+ <activators>
+ <license-feature
+ name="monitoring" />
+ </activators>
+ </tab>
+
+ <tab
+ name="Configuration"
+ displayName="Configuration"
+ iconUrl="/images/icons/Configure_grey_16.png">
+ <position
+ name="Alert"
+ placement="after" />
+ <activators>
+ <facet
+ name="configuration" />
+ </activators>
+ </tab>
+
+ <tab
+ name="Operations"
+ displayName="Operations"
+ iconUrl="/images/icons/Operation_grey_16.png">
+ <position
+ name="Configuration"
+ placement="after" />
+ <activators>
+ <facet
+ name="operation" />
+ </activators>
+ </tab>
+
+ <tab
+ name="Events"
+ displayName="Events"
+ iconUrl="/images/icons/Events_grey_16.png">
+ <position
+ name="Operations"
+ placement="after" />
+ <activators>
+ <facet
+ name="event" />
+ </activators>
+ </tab>
+
+ <tab
+ name="Content"
+ displayName="Content"
+ iconUrl="/images/icons/Content_grey_16.png">
+ <position
+ name="Events"
+ placement="after" />
+ <activators>
+ <facet
+ name="content" />
+ </activators>
+ </tab>
+
+ <!-- Summary Subtabs -->
+ <tab
+ name="Summary.Overview"
+ displayName="Overview"
+ url="/rhq/resource/summary/overview.xhtml">
+ <position
+ name="Summary"
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Summary.Timeline"
+ displayName="Timeline"
+ url="/rhq/resource/summary/timeline.xhtml">
+ <position
+ name="Summary.Overview"
+ placement="after" />
+ </tab>
+
+ <!-- Monitor Subtabs -->
+ <tab
+ name="Monitor.Graphs"
+ displayName="Graphs"
+ url="/rhq/resource/monitor/graphs.xhtml">
+ <position
+ name="Monitor"
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Monitor.Tables"
+ displayName="Tables"
+ url="/rhq/resource/monitor/tables.xhtml">
+ <position
+ name="Monitor.Graphs"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Monitor.Traits"
+ displayName="Traits"
+ url="/rhq/resource/monitor/traits.xhtml">
+ <position
+ name="Monitor.Tables"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Monitor.Availability"
+ displayName="Availability"
+ url="/rhq/resource/monitor/availabilityHistory.xhtml">
+ <position
+ name="Monitor.Traits"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Monitor.Schedules"
+ displayName="Schedules"
+ url="/rhq/resource/monitor/schedules.xhtml">
+ <position
+ name="Monitor.Availability"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Monitor.Response"
+ displayName="Response"
+ url="/rhq/resource/monitor/response.xhtml">
+ <position
+ name="Monitor.Schedules"
+ placement="after" />
+ <activators>
+ <facet
+ name="call_time" />
+ </activators>
+ </tab>
+
+ <!-- Inventory Subtabs -->
+ <tab
+ name="Inventory.Overview"
+ displayName="Overview"
+ url="/rhq/resource/inventory/view.xhtml">
+ <position
+ name="Inventory"
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Inventory.Connection"
+ displayName="Connection"
+ url="/rhq/resource/inventory/view-connection.xhtml">
+ <position
+ name="Inventory.Overview"
+ placement="after" />
+ <activators>
+ <facet
+ name="plugin_configuration" />
+ </activators>
+ </tab>
+
+ <tab
+ name="Inventory.Agent"
+ displayName="Agent"
+ url="/rhq/resource/inventory/view-agent.xhtml">
+ <position
+ name="Inventory.Connection"
+ placement="after" />
+ </tab>
+
+ <!-- Alert Subtabs -->
+ <tab
+ name="Alert.Definitions"
+ displayName="Definitions"
+ url="/rhq/resource/alert/listAlertDefinitions.xhtml">
+ <position
+ name="Alert"
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Alert.History"
+ displayName="History"
+ url="/rhq/resource/alert/listAlertHistory.xhtml">
+ <position
+ name="Alert.Definitions"
+ placement="after" />
+ </tab>
+
+ <!-- Configuration Subtabs -->
+ <tab
+ name="Configuration.Current"
+ displayName="Current"
+ url="/rhq/resource/configuration/view.xhtml">
+ <position
+ name="Configuration"
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Configuration.History"
+ displayName="History"
+ url="/rhq/resource/configuration/history.xhtml">
+ <position
+ name="Configuration.Current"
+ placement="after" />
+ </tab>
+
+ <!-- Operations Subtabs -->
+ <tab
+ name="Operations.New"
+ displayName="New"
+ url="/rhq/resource/operation/resourceOperationScheduleNew.xhtml">
+ <position
+ name="Operations"
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Operations.Schedules"
+ displayName="Schedules"
+ url="/rhq/resource/operation/resourceOperationSchedules.xhtml">
+ <position
+ name="Operations.New"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Operations.History"
+ displayName="History"
+ url="/rhq/resource/operation/resourceOperationHistory.xhtml">
+ <position
+ name="Operations.Schedules"
+ placement="after" />
+ </tab>
+
+ <!-- Events Subtabs -->
+ <tab
+ name="Events.History"
+ displayName="History"
+ url="/rhq/resource/events/history.xhtml">
+ <position
+ name="Events"
+ placement="firstChild" />
+ </tab>
+
+ <!-- Content Subtabs -->
+ <tab
+ name="Content.Deployed"
+ displayName="Deployed"
+ url="/rhq/resource/content/view.xhtml">
+ <position
+ name="Content"
+ placement="firstChild" />
+ </tab>
+
+ <tab
+ name="Content.New"
+ displayName="New"
+ url="/rhq/resource/content/deploy.xhtml">
+ <position
+ name="Content.Deployed"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Content.Subscriptions"
+ displayName="Subscriptions"
+ url="/rhq/resource/content/subscription.xhtml">
+ <position
+ name="Content.New"
+ placement="after" />
+ </tab>
+
+ <tab
+ name="Content.History"
+ displayName="History"
+ url="/rhq/resource/content/history.xhtml">
+ <position
+ name="Content.Subscriptions"
+ placement="after" />
+ </tab>
+
+</perspective-plugin>
commit 9173febb0efa335f7a4298cbbe8098983d235269
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Jan 8 16:51:31 2010 -0500
Refactored to use dash-separated elements and camelCase
attributes and type. Now consistent with other rhq schema.
Renamed permission element to resource-permisssion.
Also, added some more doc annotation.
diff --git a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
index 1c96b39..c84594e 100644
--- a/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
+++ b/modules/enterprise/server/xml-schemas/src/main/resources/rhq-serverplugin-perspective.xsd
@@ -29,7 +29,7 @@
</xs:annotation>
<xs:element
- name="perspectivePlugin"
+ name="perspective-plugin"
type="perspective:PerspectivePluginDescriptorType"
substitutionGroup="serverplugin:server-plugin">
<xs:annotation>
@@ -46,6 +46,9 @@
<xs:complexType
name="PerspectivePluginDescriptorType">
+ <xs:annotation>
+ <xs:documentation>The perspective descriptor providing the complete perspective definition.</xs:documentation>
+ </xs:annotation>
<xs:complexContent>
<xs:extension
base="serverplugin:ServerPluginDescriptorType">
@@ -57,19 +60,19 @@
maxOccurs="unbounded">
</xs:element>
<xs:element
- name="globalTask"
+ name="global-task"
type="perspective:GlobalTaskType"
minOccurs="0"
maxOccurs="unbounded">
</xs:element>
<xs:element
- name="resourceTask"
+ name="resource-task"
type="perspective:ResourceTaskType"
minOccurs="0"
maxOccurs="unbounded">
</xs:element>
<xs:element
- name="menuItem"
+ name="menu-item"
type="perspective:MenuItemType"
minOccurs="0"
maxOccurs="unbounded">
@@ -122,505 +125,593 @@
</xs:attribute>
</xs:complexType>
- <xs:complexType name="ExtensionType" abstract="true">
+ <xs:complexType
+ name="ExtensionType"
+ abstract="true">
+ <xs:annotation>
+ <xs:documentation>All extensions extend this type.</xs:documentation>
+ </xs:annotation>
<xs:sequence>
- <xs:element
- name="description"
- type="perspective:DescriptionType"
- minOccurs="0"
- maxOccurs="1">
- <xs:annotation>
- <xs:documentation>An optional verbose description for the extension - may be displayed via a tooltip or
- some other means in the GUI.
+ <xs:element
+ name="description"
+ type="perspective:DescriptionType"
+ minOccurs="0"
+ maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>An optional verbose description for the extension - may be displayed via a tooltip or
+ some other means in the GUI.
</xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute
- name="name"
- type="perspective:NameType"
- use="required">
- <xs:annotation>
- <xs:documentation>
- Internal name for this extension. Unique within extensions of a certain type defined by the perspective.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="displayName"
- type="perspective:DisplayNameType"
- use="required">
- <xs:annotation>
- <xs:documentation>The display name for this extension.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="iconUrl"
- type="xs:anyURI"
- use="optional">
- <xs:annotation>
- <xs:documentation>The request URL for the icon displayed for this extension. If omitted, no icon is
- displayed. Required if displayName is an empty string.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="application"
- type="xs:string"
- use="optional">
- <xs:annotation>
- <xs:documentation>The application servicing the URLs for this extension. Default is root (rhq-portal.war).
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="action"
- type="perspective:ActionType"
- use="optional"
- default="add">
- <xs:annotation>
- <xs:documentation>Add the extension or remove an extension with the given name and position that was
- defined by the Core perspective. For removal, all but the name attribute are ignored. The
- default is add. Note, a Remove followed by an Add can be used to replace an extension from the
- Core perspective.
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+
+ <xs:attribute
+ name="name"
+ type="perspective:NameType"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>Internal name for this extension. Unique within extensions of a certain type defined by
+ the perspective.
</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:anyAttribute/>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="displayName"
+ type="perspective:DisplayNameType"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The display name for this extension.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="iconUrl"
+ type="xs:anyURI"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The request URL for the icon displayed for this extension. If omitted, no icon is
+ displayed. Required if displayName is an empty string.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="application"
+ type="xs:string"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The application servicing the URLs for this extension. Default is root (rhq-portal.war).
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="action"
+ type="perspective:ActionType"
+ use="optional"
+ default="add">
+ <xs:annotation>
+ <xs:documentation>Add the extension or remove an extension with the given name and position that was defined
+ by the Core perspective. For removal, all but the name attribute are ignored. The default is add. Note, a
+ Remove followed by an Add can be used to replace an extension from the Core perspective.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:anyAttribute />
</xs:complexType>
<xs:complexType
name="TaskType">
<xs:complexContent>
- <xs:extension base="perspective:ExtensionType">
- <xs:attribute
- name="url"
- type="xs:anyURI"
- use="required">
- <xs:annotation>
- <xs:documentation>The request URL for this task. Typically kicks off a wizard or similar workflow.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="category"
- type="xs:string"
- use="optional">
- <xs:annotation>
- <xs:documentation>The display category for this task (optional). Tasks with the same category will
- be grouped together in the task pane.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
+ <xs:extension
+ base="perspective:ExtensionType">
+ <xs:attribute
+ name="url"
+ type="xs:anyURI"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The request URL for this task. Typically kicks off a wizard or similar workflow.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="category"
+ type="xs:string"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The display category for this task (optional). Tasks with the same category will be
+ grouped together in the task pane.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
- <xs:complexType
- name="ResourceTaskType">
- <xs:complexContent>
- <xs:extension base="perspective:TaskType">
- <xs:sequence>
- <xs:element
- name="activators"
- type="perspective:ResourceActivatorsType"
- minOccurs="0"
- maxOccurs="1">
- <xs:annotation>
- <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
- order for this resource task to be displayed for a particular Resource or Group page request.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType
- name="GlobalTaskType">
- <xs:complexContent>
- <xs:extension base="perspective:TaskType">
- <xs:sequence>
- <xs:element
- name="activators"
- type="perspective:GlobalActivatorsType"
- minOccurs="0"
- maxOccurs="1">
- <xs:annotation>
- <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
- order for this global task to be displayed for a particular page request.</xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
+ <xs:complexType
+ name="ResourceTaskType">
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:TaskType">
+ <xs:sequence>
+ <xs:element
+ name="activators"
+ type="perspective:ResourceActivatorsType"
+ minOccurs="0"
+ maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
+ order for this resource task to be displayed for a particular Resource or Group page request.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType
+ name="GlobalTaskType">
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:TaskType">
+ <xs:sequence>
+ <xs:element
+ name="activators"
+ type="perspective:GlobalActivatorsType"
+ minOccurs="0"
+ maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
+ order for this global task to be displayed for a particular page request.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
<xs:complexType
name="MenuItemType">
- <xs:complexContent>
- <xs:extension base="perspective:ExtensionType">
- <xs:sequence>
- <xs:element
- name="position"
- type="perspective:PositionType">
- <xs:annotation>
- <xs:documentation>Specifies the position of the menu item.</xs:documentation>
- </xs:annotation>
- </xs:element>
- <xs:element
- name="activators"
- type="perspective:GlobalActivatorsType"
- minOccurs="0"
- maxOccurs="1">
- <xs:annotation>
- <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
- order for this menu item to be displayed for a particular page request.</xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute
- name="url"
- type="xs:anyURI"
- use="optional">
- <xs:annotation>
- <xs:documentation>The request URL for this menu item. Typically kicks off a wizard or similar workflow.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="feature"
- type="perspective:MenuItemFeatureType"
- use="optional">
- <xs:annotation>
- <xs:documentation>A special built-in rendering feature that should be applied when rendering this menu item.
+ <xs:annotation>
+ <xs:documentation>A (core) menu extension that adds or removes a top level or sub-menu item.</xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ExtensionType">
+ <xs:sequence>
+ <xs:element
+ name="position"
+ type="perspective:PositionType">
+ <xs:annotation>
+ <xs:documentation>Specifies the position of the menu item.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element
+ name="activators"
+ type="perspective:GlobalActivatorsType"
+ minOccurs="0"
+ maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
+ order for this menu item to be displayed for a particular page request.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+
+ <xs:attribute
+ name="url"
+ type="xs:anyURI"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The request URL for this menu item. Typically kicks off a wizard or similar
+ workflow.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="feature"
+ type="perspective:MenuItemFeatureType"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>A special built-in rendering feature that should be applied when rendering this menu
+ item.
</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="newWindow"
- type="xs:boolean"
- use="optional"
- default="false">
- <xs:annotation>
- <xs:documentation>If true, the URL should be directed to a new window. Otherwise the content should be
- presented in the current page body.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="addBreak"
- type="xs:boolean"
- use="optional"
- default="false">
- <xs:annotation>
- <xs:documentation>If true, generate a break prior to this menu item.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="newWindow"
+ type="xs:boolean"
+ use="optional"
+ default="false">
+ <xs:annotation>
+ <xs:documentation>If true, the URL should be directed to a new window. Otherwise the content should be
+ presented in the current page body.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="addBreak"
+ type="xs:boolean"
+ use="optional"
+ default="false">
+ <xs:annotation>
+ <xs:documentation>If true, generate a break prior to this menu item.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
</xs:complexType>
<xs:complexType
name="TabType">
- <xs:complexContent>
- <xs:extension base="perspective:ExtensionType">
- <xs:sequence>
- <xs:element
- name="position"
- type="perspective:PositionType">
- <xs:annotation>
- <xs:documentation>Specifies the position of the tab.</xs:documentation>
- </xs:annotation>
- </xs:element>
- <xs:element
- name="activators"
- type="perspective:ResourceActivatorsType"
- minOccurs="0"
- maxOccurs="1">
- <xs:annotation>
- <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
- order for this resource task to be displayed for a particular Resource or Group page request.
- </xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
-
- <xs:attribute
- name="url"
- type="xs:anyURI"
- use="optional">
- <xs:annotation>
- <xs:documentation>The request URL for this tab. Typically kicks off a wizard or similar workflow.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
+ <xs:annotation>
+ <xs:documentation>An extension that adds or removes a resource tab or subtab.</xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ExtensionType">
+ <xs:sequence>
+ <xs:element
+ name="position"
+ type="perspective:PositionType">
+ <xs:annotation>
+ <xs:documentation>Specifies the position of the tab.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element
+ name="activators"
+ type="perspective:ResourceActivatorsType"
+ minOccurs="0"
+ maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>An optional set of activators. If present, all of them must evaluate to true in
+ order for this resource task to be displayed for a particular Resource or Group page request.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+
+ <xs:attribute
+ name="url"
+ type="xs:anyURI"
+ use="optional">
+ <xs:annotation>
+ <xs:documentation>The request URL for this tab. Typically kicks off a wizard or similar workflow.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
</xs:complexType>
- <!-- =========================================== Activators ============================================= -->
- <xs:complexType name="CommonActivatorsType">
+ <!-- =========================================== Activators =============================================
+-->
+ <xs:complexType
+ name="CommonActivatorsType">
+ <xs:annotation>
+ <xs:documentation>Activators common to global and resource activators.</xs:documentation>
+ </xs:annotation>
<xs:sequence>
- <xs:element
- name="debugMode"
- type="perspective:DebugModeActivatorType"
- minOccurs="0"
- maxOccurs="1">
- </xs:element>
- <xs:element
- name="licenseFeature"
- type="perspective:LicenseFeatureActivatorType"
- minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- <xs:element
- name="globalPermission"
- type="perspective:GlobalPermissionActivatorType"
+ <xs:element
+ name="debug-mode"
+ type="perspective:DebugModeActivatorType"
+ minOccurs="0"
+ maxOccurs="1">
+ </xs:element>
+ <xs:element
+ name="license-feature"
+ type="perspective:LicenseFeatureActivatorType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ <xs:element
+ name="global-permission"
+ type="perspective:GlobalPermissionActivatorType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ <xs:element
+ name="superuser"
+ type="perspective:SuperuserActivatorType"
+ minOccurs="0"
+ maxOccurs="1">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType
+ name="GlobalActivatorsType">
+ <xs:annotation>
+ <xs:documentation>If any of the activator conditions evaluate to true then the global activator is active. In
+ other words, there is an implicit OR operation applied. For AND logic it is typical to declare several
+ "activators" elements in the declaring element.</xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:CommonActivatorsType">
+ <xs:sequence>
+ <xs:element
+ name="inventory"
+ type="perspective:InventoryActivatorType"
minOccurs="0"
maxOccurs="unbounded">
- </xs:element>
- <xs:element
- name="superuser"
- type="perspective:SuperuserActivatorType"
- minOccurs="0"
- maxOccurs="1">
- </xs:element>
- </xs:sequence>
- </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
- <xs:complexType name="GlobalActivatorsType">
- <xs:complexContent>
- <xs:extension base="perspective:CommonActivatorsType">
+ <xs:complexType
+ name="ResourceActivatorsType">
+ <xs:annotation>
+ <xs:documentation>If any of the activator conditions evaluate to true then the resource activator is active. In
+ other words, there is an implicit OR operation applied. For AND logic it is typical to declare several
+ "activators" elements in the declaring element. In addition to the activators common to global and resource
+ level activators, several additional resource level activators can be specified. These are evaluated against
+ the resource in context. Facet Activators ensure the specified facet is implemented by the resource type of
+ the resource in context. Resource-permission activators ensure the user has the specified permission on the
+ resource in context. Trait Activators ensure that the specified trait value satisfies the specified pattern
+ for the resource in context. Resource-type Activators can be used if the extension is active for one or more
+ different resource types. In this situation resource-permission and trait activators can be set in a
+ fine-grained way, differing for each resource type, if necessary.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:CommonActivatorsType">
+ <xs:choice>
<xs:sequence>
- <xs:element
- name="inventory"
- type="perspective:InventoryActivatorType"
- minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- </xs:sequence>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name="ResourceActivatorsType">
- <xs:complexContent>
- <xs:extension base="perspective:CommonActivatorsType">
- <xs:choice>
- <xs:sequence>
- <xs:element
- name="facet"
- type="perspective:FacetActivatorType"
- minOccurs="1"
- maxOccurs="unbounded">
- </xs:element>
- <xs:element
- name="resourcePermission"
- type="perspective:ResourcePermissionActivatorType"
- minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- <xs:element
- name="trait"
- type="perspective:TraitActivatorType"
- minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- </xs:sequence>
- <xs:element
- name="resourceType"
- type="perspective:InventoryActivatorType"
- minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- </xs:choice>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name="ActivatorType"/>
-
- <!-- Global Activators -->
- <xs:complexType
- name="LicenseFeatureActivatorType">
- <xs:annotation>
- <xs:documentation>A certain license feature (e.g. monitoring) must be active in order to activate the extension.
- </xs:documentation>
- </xs:annotation>
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- <xs:attribute
- name="name"
- type="perspective:LicenseFeatureType"
- use="required">
- <xs:annotation>
- <xs:documentation>The type of license that must be installed to activate the extension point.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType
- name="DebugModeActivatorType">
- <xs:annotation>
- <xs:documentation>Debug mode must be enabled in the GUI in order to activate the extension.
- </xs:documentation>
- </xs:annotation>
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <!-- Subject Activators -->
- <xs:complexType
- name="GlobalPermissionActivatorType">
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- <xs:attribute
- name="name"
- type="perspective:GlobalPermissionType"
- use="required">
- <xs:annotation>
- <xs:documentation>The required Global permission.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType
- name="InventoryActivatorType">
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- <xs:sequence>
<xs:element
- name="resource"
- type="perspective:ResourceType"
+ name="facet"
+ type="perspective:FacetActivatorType"
minOccurs="1"
maxOccurs="unbounded">
</xs:element>
+ <xs:element
+ name="resource-permission"
+ type="perspective:ResourcePermissionActivatorType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ <xs:element
+ name="trait"
+ type="perspective:TraitActivatorType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
</xs:sequence>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType
- name="SuperuserActivatorType">
- <xs:annotation>
- <xs:documentation>Debug mode must be enabled in the GUI in order to activate the extension.
+ <xs:element
+ name="resource-type"
+ type="perspective:InventoryActivatorType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ </xs:choice>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType
+ name="ActivatorType">
+ <xs:annotation>
+ <xs:documentation>All Activators extend this type.</xs:documentation>
+ </xs:annotation>
+ </xs:complexType>
+
+ <!-- Global Activators
+-->
+ <xs:complexType
+ name="LicenseFeatureActivatorType">
+ <xs:annotation>
+ <xs:documentation>A certain license feature (e.g. monitoring) must be active in order to activate the
+ extension.
</xs:documentation>
- </xs:annotation>
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType
- name="FacetActivatorType">
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- <xs:attribute
- name="name"
- type="perspective:FacetType"
- use="required">
- <xs:annotation>
- <xs:documentation>The facet name.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="name"
+ type="perspective:LicenseFeatureType"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The type of license that must be installed to activate the extension point.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType
+ name="DebugModeActivatorType">
+ <xs:annotation>
+ <xs:documentation>Debug mode must be enabled in the GUI in order to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- Subject Activators
+-->
+ <xs:complexType
+ name="GlobalPermissionActivatorType">
+ <xs:annotation>
+ <xs:documentation>The user must possess the global permission in order to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="name"
+ type="perspective:GlobalPermissionType"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The required Global permission.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType
+ name="InventoryActivatorType">
+ <xs:annotation>
+ <xs:documentation>The user must have in inventory resources as described to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:sequence>
+ <xs:element
+ name="resource"
+ type="perspective:ResourceType"
+ minOccurs="1"
+ maxOccurs="unbounded">
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType
+ name="SuperuserActivatorType">
+ <xs:annotation>
+ <xs:documentation>The user must be superuser in order to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType
+ name="FacetActivatorType">
+ <xs:annotation>
+ <xs:documentation>The resource in context must be of a resource type that implements the specified facet.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="name"
+ type="perspective:FacetType"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The facet name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
<xs:complexType
name="ResourcePermissionActivatorType">
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- <xs:attribute
- name="name"
- type="perspective:ResourcePermissionType"
- use="required">
- <xs:annotation>
- <xs:documentation>The Resource permission name.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
+ <xs:annotation>
+ <xs:documentation>The user must possess the specified resource permission on the relevant resource.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="name"
+ type="perspective:ResourcePermissionType"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The Resource permission name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
</xs:complexType>
<xs:complexType
name="TraitActivatorType">
+ <xs:annotation>
+ <xs:documentation>The relevant resource must satisfy the trait condition to activate the extension.
+ </xs:documentation>
+ </xs:annotation>
<xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- <xs:attribute
- name="name"
- type="xs:string"
- use="required">
- <xs:annotation>
- <xs:documentation>The name of the trait being tested for activation.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="value"
- type="xs:string"
- use="required">
- <xs:annotation>
- <xs:documentation>A Java-style regular expression for the value of the trait.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:attribute
+ name="name"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>The name of the trait being tested for activation.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="value"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>A Java-style regular expression for the value of the trait.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
</xs:complexType>
- <!-- =========================================== Helper Types ============================================= -->
+ <!-- =========================================== Helper Types =============================================
+-->
- <xs:complexType
- name="ResourceType">
- <xs:complexContent>
- <xs:extension base="perspective:ActivatorType">
- <xs:sequence>
- <xs:element
- name="permission"
- type="perspective:ResourcePermissionActivatorType"
- minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- <xs:element
- name="trait"
- type="perspective:TraitActivatorType"
- minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- </xs:sequence>
- <xs:attribute
- name="plugin"
- type="xs:string"
- use="required">
- <xs:annotation>
- <xs:documentation>Plugin for the specified resource type.</xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute
- name="type"
- type="xs:string"
- use="required">
- <xs:annotation>
- <xs:documentation>Resource Type that must be in inventory to activate the extension point.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
+ <xs:complexType
+ name="ResourceType">
+ <xs:annotation>
+ <xs:documentation>Resource level activation definition.</xs:documentation>
+ </xs:annotation>
+ <xs:complexContent>
+ <xs:extension
+ base="perspective:ActivatorType">
+ <xs:sequence>
+ <xs:element
+ name="resource-permission"
+ type="perspective:ResourcePermissionActivatorType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ <xs:element
+ name="trait"
+ type="perspective:TraitActivatorType"
+ minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute
+ name="plugin"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>Plugin for the specified resource type.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute
+ name="type"
+ type="xs:string"
+ use="required">
+ <xs:annotation>
+ <xs:documentation>Resource Type that must be in inventory to activate the extension point.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
<xs:complexType
name="PositionType">
+ <xs:annotation>
+ <xs:documentation>Defines position of the extension in the UI, relative to other extensions.</xs:documentation>
+ </xs:annotation>
<xs:attribute
name="name"
type="perspective:NameType"
@@ -717,72 +808,89 @@
</xs:restriction>
</xs:simpleType>
- <xs:simpleType
- name="ResourcePermissionType">
- <xs:restriction
- base="xs:string">
- <xs:enumeration
- value="CONFIGURE"></xs:enumeration>
- <xs:enumeration
- value="CONTROL"></xs:enumeration>
- <xs:enumeration
- value="CREATE_CHILD_RESOURCE"></xs:enumeration>
- <xs:enumeration
- value="DELETE_RESOURCE"></xs:enumeration>
- <xs:enumeration
- value="MANAGE_ALERTS"></xs:enumeration>
- <xs:enumeration
- value="MANAGE_CONTENT"></xs:enumeration>
- <xs:enumeration
- value="MANAGE_MEASUREMENTS"></xs:enumeration>
- <xs:enumeration
- value="MODIFY_RESOURCE"></xs:enumeration>
- <xs:enumeration
- value="VIEW_RESOURCE"></xs:enumeration>
- </xs:restriction>
- </xs:simpleType>
+ <xs:simpleType
+ name="ResourcePermissionType">
+ <xs:restriction
+ base="xs:string">
+ <xs:enumeration
+ value="CONFIGURE"></xs:enumeration>
+ <xs:enumeration
+ value="CONTROL"></xs:enumeration>
+ <xs:enumeration
+ value="CREATE_CHILD_RESOURCE"></xs:enumeration>
+ <xs:enumeration
+ value="DELETE_RESOURCE"></xs:enumeration>
+ <xs:enumeration
+ value="MANAGE_ALERTS"></xs:enumeration>
+ <xs:enumeration
+ value="MANAGE_CONTENT"></xs:enumeration>
+ <xs:enumeration
+ value="MANAGE_MEASUREMENTS"></xs:enumeration>
+ <xs:enumeration
+ value="MODIFY_RESOURCE"></xs:enumeration>
+ <xs:enumeration
+ value="VIEW_RESOURCE"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
<xs:simpleType
- name="FacetType">
- <xs:restriction
- base="xs:string">
- <xs:enumeration value="measurement" >
- <xs:annotation>
- <xs:documentation>The Resource type defines one or more metrics.</xs:documentation>
- </xs:annotation>
- </xs:enumeration>
- <xs:enumeration value="event" >
- <xs:annotation>
- <xs:documentation>The Resource type defines one or more events.</xs:documentation>
- </xs:annotation>
- </xs:enumeration>
- <xs:enumeration value="plugin_configuration" >
- <xs:annotation>
- <xs:documentation>The Resource type defines one or more plugin configuration (aka connection) properties.</xs:documentation>
- </xs:annotation>
- </xs:enumeration>
- <xs:enumeration value="configuration" >
- <xs:annotation>
- <xs:documentation>The Resource type defines one or more resource configuration properties.</xs:documentation>
- </xs:annotation>
- </xs:enumeration>
- <xs:enumeration value="operation" >
- <xs:annotation>
- <xs:documentation>The Resource type defines one or more operations.</xs:documentation>
- </xs:annotation>
- </xs:enumeration>
- <xs:enumeration value="content" >
- <xs:annotation>
- <xs:documentation>The Resource type defines one or more packages.</xs:documentation>
- </xs:annotation>
- </xs:enumeration>
- <xs:enumeration value="call_time" >
- <xs:annotation>
- <xs:documentation>The Resource type defines one or more call-time metrics.</xs:documentation>
- </xs:annotation>
- </xs:enumeration>
- </xs:restriction>
- </xs:simpleType>
+ name="FacetType">
+ <xs:restriction
+ base="xs:string">
+ <xs:enumeration
+ value="measurement">
+ <xs:annotation>
+ <xs:documentation>The Resource type defines one or more metrics.</xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration
+ value="event">
+ <xs:annotation>
+ <xs:documentation>The Resource type defines one or more events.</xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration
+ value="plugin_configuration">
+ <xs:annotation>
+ <xs:documentation>
+ The Resource type defines one or more plugin configuration (aka connection) properties.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration
+ value="configuration">
+ <xs:annotation>
+ <xs:documentation>
+ The Resource type defines one or more resource configuration properties.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration
+ value="operation">
+ <xs:annotation>
+ <xs:documentation>The Resource type defines one or more operations.</xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration
+ value="content">
+ <xs:annotation>
+ <xs:documentation>The Resource type defines one or more packages.</xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration
+ value="call_time">
+ <xs:annotation>
+ <xs:documentation>The Resource type defines one or more call-time metrics.</xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration
+ value="support">
+ <xs:annotation>
+ <xs:documentation>The Resource type defines support snapshots.</xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
<xs:simpleType
name="PlacementType">
@@ -802,16 +910,16 @@
</xs:restriction>
</xs:simpleType>
- <xs:simpleType
- name="LicenseFeatureType">
- <xs:annotation>
- <xs:documentation>A license type.</xs:documentation>
- </xs:annotation>
- <xs:restriction
- base="xs:string">
- <xs:enumeration
- value="monitoring"></xs:enumeration>
- </xs:restriction>
- </xs:simpleType>
+ <xs:simpleType
+ name="LicenseFeatureType">
+ <xs:annotation>
+ <xs:documentation>A license type.</xs:documentation>
+ </xs:annotation>
+ <xs:restriction
+ base="xs:string">
+ <xs:enumeration
+ value="monitoring"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
</xs:schema>
commit 9980e2da0ae0aa602c0aed214a19dbb4600e6cca
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Fri Jan 8 21:08:18 2010 +0100
Support for deleting empty configuration files from disk.
New constant AugeasTree.PATH_SEPARATOR replaces the use of File.separatorChar.
Abstracted the common code of AugeasTreeLazy and AugeasTreeReal into an abstract base class.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java
index e118601..547f648 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java
@@ -109,10 +109,18 @@ public class ApacheDirectoryComponent implements ResourceComponent<ApacheVirtual
AugeasNode virtualHostNode = parentVirtualHost.getNode(tree);
AugeasNode myNode = getNode(virtualHostNode);
- tree.removeNode(myNode, true);
- tree.save();
- resourceContext.getParentResourceComponent().conditionalRestart();
+ if (myNode != null) {
+ tree.removeNode(myNode, true);
+ tree.save();
+
+ ApacheVirtualHostServiceComponent parentVhost = resourceContext.getParentResourceComponent();
+
+ parentVhost.deleteEmptyFile(tree, myNode);
+ parentVhost.conditionalRestart();
+ } else {
+ log.info("Could find the configuration corresponding to the directory " + resourceContext.getResourceKey() + ". Ignoring.");
+ }
}
/**
@@ -131,6 +139,7 @@ public class ApacheDirectoryComponent implements ResourceComponent<ApacheVirtual
return dir;
}
}
- throw new IllegalStateException("No Directory directive found in the Apache configuration on the configured index.");
+
+ return null;
}
}
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
index 4fdb9b6..0d8556f 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
@@ -662,6 +662,22 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
}
}
+ /**
+ * This method checks whether the supplied node that has been deleted from the tree didn't leave
+ * the file it was contained in empty.
+ * If the file is empty after deleting the node, the file is automatically deleted.
+ * @param tree TODO
+ * @param deletedNode the node that has been deleted from the tree.
+ */
+ public void deleteEmptyFile(AugeasTree tree, AugeasNode deletedNode) {
+ File file = tree.getFile(deletedNode);
+ List<AugeasNode> fileContents = tree.match(file.getAbsolutePath() + AugeasTree.PATH_SEPARATOR + "*");
+
+ if (fileContents.size() == 0) {
+ file.delete();
+ }
+ }
+
// TODO: Move this method to a helper class.
static void addSnmpMetricValueToReport(MeasurementReport report, MeasurementScheduleRequest schedule,
SNMPValue snmpValue, boolean valueIsTimestamp) throws SNMPException {
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
index b65aede..e517d09 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
@@ -179,6 +179,7 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
tree.removeNode(myNode, true);
tree.save();
+ deleteEmptyFile(tree, myNode);
conditionalRestart();
} catch (IllegalStateException e) {
//this means we couldn't find the augeas node for this vhost.
@@ -378,6 +379,10 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
resourceContext.getParentResourceComponent().conditionalRestart();
}
+ public void deleteEmptyFile(AugeasTree tree, AugeasNode deletedNode) {
+ resourceContext.getParentResourceComponent().deleteEmptyFile(tree, deletedNode);
+ }
+
private void collectSnmpMetric(MeasurementReport report, int primaryIndex, SNMPSession snmpSession,
MeasurementScheduleRequest schedule) throws SNMPException {
SNMPValue snmpValue = null;
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/ApacheAugeasTree.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/ApacheAugeasTree.java
index a029aaa..3d10d59 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/ApacheAugeasTree.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/ApacheAugeasTree.java
@@ -48,9 +48,11 @@ import org.rhq.augeas.tree.impl.AugeasTreeLazy;
public class ApacheAugeasTree extends AugeasTreeLazy {
private Map<AugeasNode, List<String>> includes;
+ private List<String> includeGlobs;
- public ApacheAugeasTree(Augeas ag, AugeasModuleConfig moduleConfig) {
+ public ApacheAugeasTree(String serverRootPath, Augeas ag, AugeasModuleConfig moduleConfig) {
super(ag, moduleConfig);
+ this.includeGlobs = initIncludeGlobs(serverRootPath);
}
protected AugeasNode instantiateNode(String fullPath) {
@@ -62,7 +64,6 @@ public class ApacheAugeasTree extends AugeasTreeLazy {
}
public void setIncludes(Map<AugeasNode, List<String>> includes) {
-
this.includes = includes;
}
@@ -92,7 +93,7 @@ public class ApacheAugeasTree extends AugeasTreeLazy {
public List<AugeasNode> matchRelative(AugeasNode node, String expression) throws AugeasTreeException {
try {
- if (expression.indexOf(File.separatorChar) == 0)
+ if (expression.indexOf(PATH_SEPARATOR) == 0)
expression = expression.substring(1);
return parseExpr(node, expression);
@@ -101,6 +102,11 @@ public class ApacheAugeasTree extends AugeasTreeLazy {
}
}
+ @Override
+ protected List<String> getIncludeGlobs() {
+ return includeGlobs;
+ }
+
private int subExpressionIndex(String expr) {
//we have to parse the expression carefully because of the
//potential xpath qualifier that can contain path separators.
@@ -187,13 +193,13 @@ public class ApacheAugeasTree extends AugeasTreeLazy {
private List<AugeasNode> search(AugeasNode nd, String expr) throws Exception {
- String fullExpr = nd.getFullPath() + File.separator + expr;
+ String fullExpr = nd.getFullPath() + PATH_SEPARATOR + expr;
List<AugeasNode> nodes = this.matchInternal(fullExpr);
if (includes.containsKey(nd)) {
List<String> files = includes.get(nd);
for (String fileName : files) {
- List<AugeasNode> nds = this.matchInternal(fileName + File.separator + expr);
+ List<AugeasNode> nds = this.matchInternal(fileName + PATH_SEPARATOR+ expr);
for (AugeasNode node : nds) {
if (!nodes.contains(node))
nodes.add(node);
@@ -208,7 +214,7 @@ public class ApacheAugeasTree extends AugeasTreeLazy {
if (!expression.startsWith(AUGEAS_DATA_PATH))
expression = AUGEAS_DATA_PATH + expression;
- List<String> res = ag.match(expression);
+ List<String> res = getAugeas().match(expression);
List<AugeasNode> nodes = new ArrayList<AugeasNode>();
@@ -217,4 +223,22 @@ public class ApacheAugeasTree extends AugeasTreeLazy {
}
return nodes;
}
+
+ /**
+ * @param serverRootPath
+ * @return
+ */
+ private List<String> initIncludeGlobs(String serverRootPath) {
+ ArrayList<String> ret = new ArrayList<String>();
+
+ for(String glob : getModuleConfig().getIncludedGlobs()) {
+ File f = new File(glob);
+ if (f.isAbsolute()) {
+ ret.add(glob);
+ } else {
+ ret.add(new File(serverRootPath, glob).getPath());
+ }
+ }
+ return ret;
+ }
}
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/AugeasTreeBuilderApache.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/AugeasTreeBuilderApache.java
index 6df9a16..24c2e95 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/AugeasTreeBuilderApache.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/augeas/AugeasTreeBuilderApache.java
@@ -56,8 +56,10 @@ public class AugeasTreeBuilderApache implements AugeasTreeBuilder {
this.ag = component.getAugeas();
+ AugeasConfigurationApache apacheConfig = (AugeasConfigurationApache) config;
AugeasModuleConfig module = config.getModuleByName(name);
- ApacheAugeasTree tree = new ApacheAugeasTree(component.getAugeas(), module);
+
+ ApacheAugeasTree tree = new ApacheAugeasTree(apacheConfig.getServerRootPath(), component.getAugeas(), module);
List<String> incld = module.getConfigFiles();
@@ -67,7 +69,6 @@ public class AugeasTreeBuilderApache implements AugeasTreeBuilder {
String rootPath = incld.get(0);
AugeasNode rootNode = new ApacheAugeasNode(ApacheAugeasTree.AUGEAS_DATA_PATH + rootPath, tree);
- AugeasConfigurationApache apacheConfig = (AugeasConfigurationApache) config;
tree.setRootNode(rootNode);
File rootFile = new File(apacheConfig.getServerRootPath());
// we need to know which files are related to each glob
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/augeas/AugeasProxy.java b/modules/plugins/augeas/src/main/java/org/rhq/augeas/AugeasProxy.java
index 77e9210..a3d1966 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/augeas/AugeasProxy.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/augeas/AugeasProxy.java
@@ -148,7 +148,7 @@ public class AugeasProxy {
try {
tree = augeasTreeBuilder.buildTree(this, config, moduleName, lazy);
} catch (Exception e) {
- throw new AugeasTreeException(e.getMessage());
+ throw new AugeasTreeException("Error building Augeas tree.", e);
}
return tree;
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/AugeasTree.java b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/AugeasTree.java
index 94b787f..6da8526 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/AugeasTree.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/AugeasTree.java
@@ -40,10 +40,15 @@ import org.rhq.augeas.node.AugeasNode;
public interface AugeasTree {
/**
+ * Path separator in the Augeas expressions.
+ */
+ public static final char PATH_SEPARATOR = '/'; //or should this be File.separatorChar instead?
+
+ /**
* All the paths to nodes representing configuration data in Augeas are
* prefixed by this.
*/
- public static final String AUGEAS_DATA_PATH = File.separatorChar + "files";
+ public static final String AUGEAS_DATA_PATH = PATH_SEPARATOR + "files";
/**
* Persists the tree using Augeas to the individual files.
@@ -134,6 +139,12 @@ public interface AugeasTree {
public void setValue(AugeasNode node, String value);
/**
+ * @param node
+ * @return the file in which the configuration represented by the node is defined.
+ */
+ public File getFile(AugeasNode node);
+
+ /**
* @return a summary of an update error obtained from the Augeas library.
*/
public String summarizeAugeasError();
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AbstractAugeasTree.java b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AbstractAugeasTree.java
new file mode 100644
index 0000000..583d6b6
--- /dev/null
+++ b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AbstractAugeasTree.java
@@ -0,0 +1,211 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program 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 General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.augeas.tree.impl;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.augeas.Augeas;
+
+import org.rhq.augeas.config.AugeasModuleConfig;
+import org.rhq.augeas.node.AugeasNode;
+import org.rhq.augeas.tree.AugeasNodeBuffer;
+import org.rhq.augeas.tree.AugeasTree;
+import org.rhq.augeas.tree.AugeasTreeException;
+import org.rhq.augeas.util.Glob;
+
+/**
+ * Abstract base class implementing the basic set of methods of the tree.
+ *
+ * @author Filip Drabek
+ * @author Lukas Krejci
+ */
+public abstract class AbstractAugeasTree implements AugeasTree {
+
+ private static final String[] ERROR_NODES = { "pos", "line", "char", "lens", "message" };
+
+ private Augeas augeas;
+ private AugeasModuleConfig moduleConfig;
+ private AugeasNode rootNode;
+ private AugeasNodeBuffer nodeBuffer;
+
+ protected AbstractAugeasTree(Augeas ag, AugeasModuleConfig moduleConfig) {
+ this.augeas = ag;
+ this.moduleConfig = moduleConfig;
+ this.nodeBuffer = new AugeasNodeBuffer();
+ }
+
+ protected Augeas getAugeas() {
+ return augeas;
+ }
+
+ protected AugeasModuleConfig getModuleConfig() {
+ return moduleConfig;
+ }
+
+ protected AugeasNodeBuffer getNodeBuffer() {
+ return nodeBuffer;
+ }
+
+ public AugeasNode createNode(AugeasNode parentNode, String name, String value, int seq) throws AugeasTreeException {
+ AugeasNode nd = createNode(parentNode.getFullPath() + File.separatorChar + name + "[" + String.valueOf(seq)
+ + "]");
+ nd.setValue(value);
+
+ return nd;
+ }
+
+ public String get(String expr) {
+ return augeas.get(expr);
+ }
+
+ public File getFile(AugeasNode node) {
+ //leave out the initial "/files"
+ String path = node.getPath().substring(AUGEAS_DATA_PATH.length());
+
+ String[] pathSegments = path.split("\\" + PATH_SEPARATOR);
+
+ //TODO will this work under windows?
+ File root = File.listRoots()[0];
+
+ for (String glob : getIncludeGlobs()) {
+ int sepCnt = getSeparatorCount(glob);
+ if (sepCnt < pathSegments.length) {
+ StringBuilder bld = new StringBuilder();
+ for (int i = 0; i < sepCnt + 1; ++i) {
+ bld.append(pathSegments[i]);
+ if (i < sepCnt) {
+ bld.append(PATH_SEPARATOR);
+ }
+ }
+
+ File f = new File(bld.toString());
+
+ if (Glob.matches(root, glob, f)) {
+ return f;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public AugeasNode getNode(String path) throws AugeasTreeException {
+ AugeasNode node = getLoadedNode(path);
+ return node == null ? createNode(path) : node;
+ }
+
+ public AugeasNode getRootNode() {
+ return rootNode;
+ }
+
+ public List<AugeasNode> match(String expression) throws AugeasTreeException {
+ List<String> res = augeas.match(expression);
+
+ List<AugeasNode> nodes = new ArrayList<AugeasNode>();
+
+ for (String name : res) {
+ nodes.add(getNode(name));
+ }
+
+ return nodes;
+ }
+
+ public List<AugeasNode> matchRelative(AugeasNode node, String expression) throws AugeasTreeException {
+ if (rootNode.getChildNodes().isEmpty())
+ throw new AugeasTreeException("Root node has no children.");
+
+ if (node.equals(rootNode)) {
+ List<AugeasNode> nodes = rootNode.getChildNodes();
+ List<AugeasNode> returnNodes = new ArrayList<AugeasNode>();
+ for (AugeasNode nd : nodes) {
+ String tempName = nd.getFullPath() + expression;
+ List<AugeasNode> temp = match(tempName);
+ returnNodes.addAll(temp);
+ }
+ return returnNodes;
+ }
+
+ return match(node.getFullPath() + PATH_SEPARATOR + expression);
+ }
+
+ public void save() {
+ augeas.save();
+ }
+
+ public void setRootNode(AugeasNode node) {
+ this.rootNode = node;
+ }
+
+ public void setValue(AugeasNode node, String value) {
+ augeas.set(node.getFullPath(), value);
+ }
+
+ public String summarizeAugeasError() {
+ String nodePrefix = "/augeas/files";
+ List<String> str = moduleConfig.getIncludedGlobs();
+ StringBuilder builder = new StringBuilder();
+
+ for (String path : str) {
+ String name = nodePrefix + path + File.separatorChar + "error";
+ if (augeas.exists(name)) {
+ builder.append("Error " + augeas.get(name) + '\n');
+ for (String errNd : ERROR_NODES) {
+ String pathToMessage = name + File.separatorChar + errNd;
+ if (augeas.exists(pathToMessage)) {
+ builder.append(errNd).append(" ").append(augeas.get(pathToMessage)).append('\n');
+ }
+ }
+ }
+ }
+
+ return builder.toString();
+ }
+
+ /**
+ * Returns the node on given path or null if it wasn't loaded yet.
+ *
+ * @param path
+ * @return
+ */
+ protected AugeasNode getLoadedNode(String path) {
+ return nodeBuffer.getNode(path);
+ }
+
+ protected List<String> getIncludeGlobs() {
+ return moduleConfig.getIncludedGlobs();
+ }
+
+ private int getSeparatorCount(String path) {
+ int cnt = 0;
+ for (int i = 0; i < path.length(); ++i) {
+ if (path.charAt(i) == PATH_SEPARATOR) {
+ cnt++;
+ }
+ }
+
+ return cnt;
+ }
+}
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeLazy.java b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeLazy.java
index e36bd1b..2c1a818 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeLazy.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeLazy.java
@@ -23,8 +23,6 @@
package org.rhq.augeas.tree.impl;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
import net.augeas.Augeas;
@@ -32,154 +30,46 @@ import net.augeas.Augeas;
import org.rhq.augeas.config.AugeasModuleConfig;
import org.rhq.augeas.node.AugeasNode;
import org.rhq.augeas.node.AugeasNodeLazy;
-import org.rhq.augeas.tree.AugeasNodeBuffer;
-import org.rhq.augeas.tree.AugeasTree;
import org.rhq.augeas.tree.AugeasTreeException;
/**
* Lazy implementation of the augeas tree.
*
* @author Filip Drabek
- *
+ * @author Lukas Krejci
*/
-public class AugeasTreeLazy implements AugeasTree {
- private AugeasModuleConfig moduleConfig;
- protected Augeas ag;
- protected AugeasNode rootNode;
- protected AugeasNodeBuffer nodeBuffer;
- private String[] errorNodes = { "pos", "line", "char", "lens", "message" };
-
+public class AugeasTreeLazy extends AbstractAugeasTree {
+
public AugeasTreeLazy(Augeas ag, AugeasModuleConfig moduleConfig) {
- nodeBuffer = new AugeasNodeBuffer();
- this.moduleConfig = moduleConfig;
- this.ag = ag;
+ super(ag, moduleConfig);
}
protected AugeasNode instantiateNode(String fullPath) {
return new AugeasNodeLazy(fullPath, this);
}
-
- public void save() {
- ag.save();
- }
-
- private AugeasNode getLoadedNode(String path) throws AugeasTreeException {
- if (nodeBuffer.isNodeLoaded(path))
- return nodeBuffer.getNode(path);
-
- throw new AugeasTreeException("Node not found.");
- }
-
- public AugeasNode getNode(String path) throws AugeasTreeException {
- AugeasNode node;
- try {
- node = getLoadedNode(path);
- } catch (AugeasTreeException e) {
- node = createNode(path);
- }
-
- return node;
- }
- public List<AugeasNode> match(String expression) throws AugeasTreeException {
- List<String> res = ag.match(expression);
-
- List<AugeasNode> nodes = new ArrayList<AugeasNode>();
+ public AugeasNode createNode(String fullPath) throws AugeasTreeException {
+ AugeasNode node = getLoadedNode(fullPath);
- for (String name : res) {
- nodes.add(getNode(name));
+ if (node != null) {
+ return node;
}
- return nodes;
- }
-
- public List<AugeasNode> matchRelative(AugeasNode node, String expression) throws AugeasTreeException {
- if (rootNode.getChildNodes().isEmpty())
- throw new AugeasTreeException("Root node has not childs.");
-
- if (node.equals(rootNode)) {
- List<AugeasNode> nodes = rootNode.getChildNodes();
- List<AugeasNode> returnNodes = new ArrayList<AugeasNode>();
- for (AugeasNode nd : nodes) {
- String tempName = nd.getFullPath() + expression;
- List<AugeasNode> temp = match(tempName);
- returnNodes.addAll(temp);
- }
- return returnNodes;
+ List<String> list = getAugeas().match(fullPath);
+ if (!list.isEmpty()) {
+ AugeasNode newNode = instantiateNode(fullPath);
+ getNodeBuffer().addNode(newNode);
+ return newNode;
}
- return match(node.getFullPath() + File.separatorChar + expression);
- }
-
- public AugeasNode createNode(String fullPath) throws AugeasTreeException {
- AugeasNode node = null;
- try {
- node = getLoadedNode(fullPath);
- return node;
- } catch (Exception e) {
- List<String> list = ag.match(fullPath);
- if (!list.isEmpty()){
- AugeasNode newNode = instantiateNode(fullPath);
- nodeBuffer.addNode(newNode);
- return newNode;
- }
- }
- ag.set(fullPath, null);
+ getAugeas().set(fullPath, null);
node = instantiateNode(fullPath);
- nodeBuffer.addNode(node);
+ getNodeBuffer().addNode(node);
return node;
}
- public AugeasNode createNode(AugeasNode parentNode, String name, String value, int seq) throws AugeasTreeException {
- AugeasNode nd = createNode(parentNode.getFullPath() + File.separatorChar + name + "[" + String.valueOf(seq)
- + "]");
- nd.setValue(value);
-
- return nd;
- }
-
- public String get(String expr) {
- return ag.get(expr);
- }
-
- public AugeasNode getRootNode() {
- return rootNode;
- }
-
public void removeNode(AugeasNode node, boolean updateSeq) throws AugeasTreeException {
- int res = ag.remove(node.getFullPath());
- nodeBuffer.removeNode(node, updateSeq, true);
-
- }
-
- public void setValue(AugeasNode node, String value) {
- ag.set(node.getFullPath(), value);
- }
-
- public String summarizeAugeasError() {
-
- String nodePrefix = "/augeas/files";
- List<String> str = moduleConfig.getIncludedGlobs();
- StringBuilder builder = new StringBuilder();
-
- for (String path : str) {
- String name = nodePrefix + path + File.separatorChar + "error";
- if (ag.exists(name)) {
- builder.append("Error " + ag.get(name) + '\n');
- for (String errNd : errorNodes) {
- String pathToMessage = name + File.separatorChar + errNd;
- if (ag.exists(pathToMessage)) {
- builder.append(errNd + " " + ag.get(pathToMessage) + '\n');
- }
- }
- }
- }
-
- return builder.toString();
- }
-
- public void setRootNode(AugeasNode node) {
- this.rootNode = node;
-
+ getAugeas().remove(node.getFullPath());
+ getNodeBuffer().removeNode(node, updateSeq, true);
}
}
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeReal.java b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeReal.java
index 659ec14..0f69296 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeReal.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/augeas/tree/impl/AugeasTreeReal.java
@@ -22,8 +22,6 @@
*/
package org.rhq.augeas.tree.impl;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
import net.augeas.Augeas;
@@ -31,124 +29,48 @@ import net.augeas.Augeas;
import org.rhq.augeas.config.AugeasModuleConfig;
import org.rhq.augeas.node.AugeasNode;
import org.rhq.augeas.node.AugeasNodeReal;
-import org.rhq.augeas.tree.AugeasNodeBuffer;
-import org.rhq.augeas.tree.AugeasTree;
import org.rhq.augeas.tree.AugeasTreeException;
/**
* Eager representation of the Augeas tree.
*
* @author Filip Drabek
- *
+ * @author Lukas Krejci
*/
-public class AugeasTreeReal implements AugeasTree {
- private AugeasModuleConfig moduleConfig;
- private Augeas ag;
- private AugeasNode rootNode;
- private AugeasNodeBuffer nodeBuffer;
- private String[] errorNodes = { "pos", "line", "char", "lens", "message" };
+public class AugeasTreeReal extends AbstractAugeasTree {
public AugeasTreeReal(Augeas ag, AugeasModuleConfig moduleConfig) {
- nodeBuffer = new AugeasNodeBuffer();
- this.moduleConfig = moduleConfig;
- this.ag = ag;
- }
-
- public void save() {
- ag.save();
- }
-
- private AugeasNode getLoadedNode(String path) throws AugeasTreeException {
- if (nodeBuffer.isNodeLoaded(path))
- return nodeBuffer.getNode(path);
-
- throw new AugeasTreeException("Node not found.");
- }
-
- public AugeasNode getNode(String path) throws AugeasTreeException {
- AugeasNode node;
- try {
- node = getLoadedNode(path);
- } catch (AugeasTreeException e) {
- node = createNode(path);
- }
-
- return node;
- }
-
- public List<AugeasNode> match(String expression) throws AugeasTreeException {
- List<String> res = ag.match(expression);
-
- List<AugeasNode> nodes = new ArrayList<AugeasNode>();
-
- for (String name : res) {
- nodes.add(getNode(name));
- }
-
- return nodes;
- }
-
- public List<AugeasNode> matchRelative(AugeasNode node, String expression) throws AugeasTreeException {
- if (rootNode.getChildNodes().isEmpty())
- throw new AugeasTreeException("Root node has not childs.");
-
- if (node.equals(rootNode)) {
- List<AugeasNode> nodes = rootNode.getChildNodes();
- List<AugeasNode> returnNodes = new ArrayList<AugeasNode>();
- for (AugeasNode nd : nodes) {
- String tempName = nd.getFullPath() + expression;
- List<AugeasNode> temp = match(tempName);
- returnNodes.addAll(temp);
- }
- return returnNodes;
- }
-
- return match(node.getFullPath() + File.separatorChar + expression);
+ super(ag, moduleConfig);
}
public AugeasNode createNode(String fullPath) throws AugeasTreeException {
AugeasNode node = null;
- int index = fullPath.lastIndexOf(File.separatorChar);
+ int index = fullPath.lastIndexOf(PATH_SEPARATOR);
if (index != -1) {
String parentPath = fullPath.substring(0, index);
AugeasNode parentNode = getNode(parentPath);
node = new AugeasNodeReal(parentNode, this, fullPath);
} else
- throw new AugeasTreeException("Node can not be created. Parent node does not exist.");
+ throw new AugeasTreeException("Node cannot be created. Parent node does not exist.");
node.setValue(get(fullPath));
- List<AugeasNode> childs = match(fullPath + File.separatorChar + "*");
+ List<AugeasNode> childs = match(fullPath + PATH_SEPARATOR + "*");
for (AugeasNode chd : childs) {
node.addChildNode(chd);
}
- nodeBuffer.addNode(node);
+ getNodeBuffer().addNode(node);
return node;
}
- public AugeasNode createNode(AugeasNode parentNode, String name, String value, int seq) throws AugeasTreeException {
- AugeasNode nd = createNode(parentNode.getFullPath() + File.separatorChar + name + "[" + String.valueOf(seq)
- + "]");
- nd.setValue(value);
-
- return nd;
- }
-
- public String get(String expr) {
- return ag.get(expr);
- }
-
- public AugeasNode getRootNode() {
- return rootNode;
- }
-
public void removeNode(AugeasNode node, boolean updateSeq) throws AugeasTreeException {
int seq = node.getSeq();
- List<AugeasNode> nodes = matchRelative(node.getParentNode(), File.separatorChar + node.getLabel()
+ //TODO lkrejci: why are we doing this here?
+ List<AugeasNode> nodes = matchRelative(node.getParentNode(), PATH_SEPARATOR + node.getLabel()
+ "[position() > " + String.valueOf(seq) + "]");
for (AugeasNode nds : nodes) {
@@ -156,38 +78,7 @@ public class AugeasTreeReal implements AugeasTree {
nds.updateFromParent();
}
- int res = ag.remove(node.getFullPath());
- nodeBuffer.removeNode(node, updateSeq, false);
- }
-
- public void setValue(AugeasNode node, String value) {
- ag.set(node.getFullPath(), value);
- }
-
- public String summarizeAugeasError() {
-
- String nodePrefix = "/augeas/files";
- List<String> str = moduleConfig.getIncludedGlobs();
- StringBuilder builder = new StringBuilder();
-
- for (String path : str) {
- String name = nodePrefix + path + File.separatorChar + "error";
- if (ag.exists(name)) {
- builder.append("Error " + ag.get(name) + '\n');
- for (String errNd : errorNodes) {
- String pathToMessage = name + File.separatorChar + errNd;
- if (ag.exists(pathToMessage)) {
- builder.append(errNd + " " + ag.get(pathToMessage) + '\n');
- }
- }
- }
- }
-
- return builder.toString();
- }
-
- public void setRootNode(AugeasNode node) {
- this.rootNode = node;
-
+ getAugeas().remove(node.getFullPath());
+ getNodeBuffer().removeNode(node, updateSeq, false);
}
}
commit 1e038b2da07ff2bcc4c3dd9b5ab299dd44d70cf4
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Thu Jan 7 16:50:43 2010 -0500
join/leave logic for ads operation facet
diff --git a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
index 43d7689..40ed13e 100644
--- a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
+++ b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
@@ -130,19 +130,46 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
}
public OperationResult invokeOperation(String name, Configuration params) throws Exception {
- OperationResult result = null;
- String foo = name;
+ OperationResult result = null;
if (name.equals("join")) {
result = updateSmbAds(params);
}
+ else if (name.equals("disconnect")) {
+ result = disconnectSmbAds(params);
+ }
+ return result;
+ }
+
+ private OperationResult disconnectSmbAds(Configuration params) throws Exception {
+
+ Configuration resourceConfig = this.loadResourceConfiguration();
+ OperationResult result = new OperationResult();
+
+ String username = resourceConfig.getSimple("username").getStringValue();
+ String password = resourceConfig.getSimple("password").getStringValue();
+
+ if (username == null || password == null) {
+ result.setSimpleResult("Missing required connection parameters");
+ return result;
+ }
+
+ StringBuilder netArgs = new StringBuilder();
+ netArgs.append("ads leave");
+ netArgs.append(SPACE + "-U " + username + "%" + password);
+
+ ProcessExecutionResults netResults = execute(NET_PATH, netArgs.toString());
+ String results = netResults.getCapturedOutput();
+
+ result.setSimpleResult(results);
+
return result;
}
private OperationResult updateSmbAds(Configuration params) throws Exception {
- Configuration resourceConfig = params;
+ Configuration resourceConfig = this.loadResourceConfiguration();
OperationResult result = new OperationResult();
String realm = resourceConfig.getSimple("realm").getStringValue();
commit b0c7db75a41d3ab453fad84612033a567e0e9c14
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Thu Jan 7 15:43:14 2010 -0500
disable display of baselines on detailed chart page for autogroups (fix for https://bugzilla.redhat.com/show_bug.cgi?id=535828)
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java
index 96b0fa0..769a729 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java
@@ -652,7 +652,7 @@ public class ViewChartFormPrepareAction extends MetricDisplayRangeFormPrepareAct
newBLValue = baselineManager.calculateAutoBaseline(subject, schedule.getId(), chartForm.getStartDate()
.getTime(), chartForm.getEndDate().getTime(), false);
} catch (BaselineCreationException e) {
- log.debug("Baseline could not be calculated, possibly " + " due to lack of data", e);
+ log.debug("Baseline could not be calculated, possibly due to lack of data.", e);
}
if (newBLValue != null) {
@@ -666,6 +666,12 @@ public class ViewChartFormPrepareAction extends MetricDisplayRangeFormPrepareAct
postProcessBaselines(request, chartForm);
} else if (chartForm.getMode().equals(ParamConstants.MODE_MON_CHART_SMMR) && (metricId != 0)) {
+ boolean isAutoGroup = (chartForm.getParent() > 0);
+ if (isAutoGroup) {
+ // TODO: Add support for calculating baselines for autogroups.
+ chartForm.setSuppressBaselineSection(true);
+ return;
+ }
MeasurementDefinition definition = definitionManager.getMeasurementDefinition(subject, metricId);
if (definition.getNumericType() != NumericType.DYNAMIC) {
chartForm.setSuppressBaselineSection(true);
@@ -679,7 +685,7 @@ public class ViewChartFormPrepareAction extends MetricDisplayRangeFormPrepareAct
chartForm.getGroupId(), chartForm.getM()[0], chartForm.getStartDate().getTime(), chartForm
.getEndDate().getTime(), false);
} catch (BaselineCreationException e) {
- log.debug("Baseline could not be calculated, possibly " + " due to lack of data", e);
+ log.debug("Baseline could not be calculated, possibly due to lack of data.", e);
}
if (newBaseline != null) {
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/visibility/ChartLayout.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/visibility/ChartLayout.jsp
index 7c96840..4176916 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/visibility/ChartLayout.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/resource/common/monitor/visibility/ChartLayout.jsp
@@ -111,10 +111,12 @@
<tiles:put name="multiResource" value="true"/>
</tiles:insert>
<br>
+ <%--
<tiles:insert definition=".resource.common.monitor.visibility.charts.metric.baselinerangeparams">
<tiles:put name="edit" value="false"/>
</tiles:insert>
<br>
+ --%>
<tiles:insert definition=".resource.common.monitor.visibility.charts.metric.partrsrcs">
<tiles:put name="multiResource" value="true"/>
</tiles:insert>
commit 5495b6c88e8980f72c84e944fd47b3c7a79f23c5
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Jan 7 17:26:57 2010 +0100
Making cron a server and changing its resource key to a reasonable "Cron" instead of the insanity before.
diff --git a/modules/plugins/cron/src/main/java/org/rhq/plugins/cron/CronDiscoveryComponent.java b/modules/plugins/cron/src/main/java/org/rhq/plugins/cron/CronDiscoveryComponent.java
index 676921c..339048e 100644
--- a/modules/plugins/cron/src/main/java/org/rhq/plugins/cron/CronDiscoveryComponent.java
+++ b/modules/plugins/cron/src/main/java/org/rhq/plugins/cron/CronDiscoveryComponent.java
@@ -18,6 +18,10 @@
*/
package org.rhq.plugins.cron;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.plugins.augeas.AugeasConfigurationDiscoveryComponent;
import org.rhq.plugins.platform.PlatformComponent;
@@ -25,5 +29,16 @@ import org.rhq.plugins.platform.PlatformComponent;
* @author Lukas Krejci
*/
public class CronDiscoveryComponent extends AugeasConfigurationDiscoveryComponent<PlatformComponent> {
- //the super class provides everything we need...
+
+ public static final String CRON_RESOURCE_KEY = "Cron";
+
+ @Override
+ protected DiscoveredResourceDetails createResourceDetails(
+ ResourceDiscoveryContext<PlatformComponent> discoveryContext, Configuration pluginConfig) {
+
+ ResourceType resourceType = discoveryContext.getResourceType();
+
+ return new DiscoveredResourceDetails(resourceType, CRON_RESOURCE_KEY, resourceType
+ .getName(), null, resourceType.getDescription(), pluginConfig, null);
+ }
}
diff --git a/modules/plugins/cron/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cron/src/main/resources/META-INF/rhq-plugin.xml
index 483c28e..eac9f8a 100644
--- a/modules/plugins/cron/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cron/src/main/resources/META-INF/rhq-plugin.xml
@@ -69,22 +69,12 @@
<depends plugin="Augeas"/>
- <service name="Cron"
+ <server name="Cron"
description="The cron configuration"
discovery="CronDiscoveryComponent"
class="CronComponent"
singleton="true">
- <runs-inside>
- <parent-resource-type name="Linux" plugin="Platforms"/>
- <parent-resource-type name="Solaris" plugin="Platforms"/>
- <parent-resource-type name="HP-UX" plugin="Platforms"/>
- <parent-resource-type name="AIX" plugin="Platforms"/>
- <parent-resource-type name="FreeBSD" plugin="Platforms"/>
- <parent-resource-type name="Mac OS X" plugin="Platforms"/>
- <parent-resource-type name="Java" plugin="Platforms"/>
- </runs-inside>
-
<plugin-configuration>
<c:simple-property name="augeasModuleName" displayName="Augeas Module Name" default="Cron" required="true" readOnly="true"
description="the name of the Augeas module/lens to use for loading and updating this resource's configuration"/>
@@ -183,6 +173,6 @@ default SELinux security context of the user that created the crontab file.
</resource-configuration>
</service>
- </service>
+ </server>
</plugin>
commit cb578748af575541b7e02d8a37dcc7f001e0f6ce
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Jan 6 16:12:38 2010 -0500
moving join/disconnect to operations tab
diff --git a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
index 38c9678..43d7689 100644
--- a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
+++ b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
@@ -28,6 +28,8 @@ import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.pluginapi.operation.OperationFacet;
+import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.core.system.ProcessExecution;
import org.rhq.core.system.ProcessExecutionResults;
import org.rhq.core.system.SystemInfo;
@@ -38,7 +40,7 @@ import org.rhq.plugins.augeas.helper.AugeasNode;
/**
* TODO
*/
-public class SambaServerComponent extends AugeasConfigurationComponent {
+public class SambaServerComponent extends AugeasConfigurationComponent implements OperationFacet {
static final String ENABLE_RECYCLING = "enableRecycleBin";
static final String AUTHCONFIG_PATH = "/usr/bin/authconfig";
static final String NET_PATH = "/usr/bin/net";
@@ -50,7 +52,6 @@ public class SambaServerComponent extends AugeasConfigurationComponent {
public void start(ResourceContext resourceContext) throws Exception {
this.resourceContext = resourceContext;
super.start(resourceContext);
- updateSmbAds(resourceContext);
}
public void stop() {
@@ -128,24 +129,34 @@ public class SambaServerComponent extends AugeasConfigurationComponent {
return super.toPropertyValue(propDefSimple, augeas, node);
}
- private void updateSmbAds(ResourceContext resourceContext) throws Exception {
+ public OperationResult invokeOperation(String name, Configuration params) throws Exception {
+ OperationResult result = null;
- Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
- Configuration resourceConfig = loadResourceConfiguration();
+ String foo = name;
- String realm = pluginConfig.getSimple("realm").getStringValue();
- String controller = pluginConfig.getSimple("controller").getStringValue();
- String username = pluginConfig.getSimple("username").getStringValue();
- String password = pluginConfig.getSimple("password").getStringValue();
+ if (name.equals("join")) {
+ result = updateSmbAds(params);
+ }
+ return result;
+ }
+
+ private OperationResult updateSmbAds(Configuration params) throws Exception {
+
+ Configuration resourceConfig = params;
+ OperationResult result = new OperationResult();
+ String realm = resourceConfig.getSimple("realm").getStringValue();
+ String controller = resourceConfig.getSimple("controller").getStringValue();
+ String username = resourceConfig.getSimple("username").getStringValue();
+ String password = resourceConfig.getSimple("password").getStringValue();
String workgroup = resourceConfig.getSimple("workgroup").getStringValue();
String idmapuid = resourceConfig.getSimple("idmap uid").getStringValue();
String idmapgid = resourceConfig.getSimple("idmap gid").getStringValue();
String shell = resourceConfig.getSimple("template shell").getStringValue();
if (realm == null || controller == null || username == null || password == null || workgroup == null) {
- // no point in doing anything
- return;
+ result.setSimpleResult("Missing required connection parameters");
+ return result;
}
StringBuilder authArgs = new StringBuilder();
@@ -174,11 +185,16 @@ public class SambaServerComponent extends AugeasConfigurationComponent {
netArgs.append("join");
netArgs.append(SPACE + "-w " + workgroup);
netArgs.append(SPACE + "-S " + controller);
- //TODO is there more secure way to do this.
netArgs.append(SPACE + "-U " + username + "%" + password);
- execute(AUTHCONFIG_PATH, authArgs.toString());
- execute(NET_PATH, netArgs.toString());
+ ProcessExecutionResults authResults = execute(AUTHCONFIG_PATH, authArgs.toString());
+ ProcessExecutionResults netResults = execute(NET_PATH, netArgs.toString());
+
+ String results = authResults.getCapturedOutput() + netResults.getCapturedOutput();
+
+ result.setSimpleResult(results);
+
+ return result;
}
private ProcessExecutionResults execute(String path, String args) throws InvalidPluginConfigurationException {
diff --git a/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml
index 0dd785f..6b3f594 100644
--- a/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/samba/src/main/resources/META-INF/rhq-plugin.xml
@@ -16,12 +16,6 @@
class="SambaServerComponent">
<plugin-configuration>
- <c:group name="Active Server Directory">
- <c:simple-property name="realm" displayName="ADS Realm" required="false"/>
- <c:simple-property name="controller" displayName="Domain Controller" required="false"/>
- <c:simple-property name="username" displayName="ADS username" required="false"/>
- <c:simple-property name="password" type="password" displayName="ADS password" required="false"/>
- </c:group>
<c:group name="Augeas">
<c:simple-property name="augeasModuleName" displayName="Augeas Module Name" default="Samba" required="true" readOnly="true"
@@ -36,6 +30,16 @@
</c:group>
</plugin-configuration>
+ <operation name="join"
+ displayName="Join Active Server Directory"
+ description="Joins the Samba domain member to the Active Server Directory">
+ </operation>
+
+ <operation name="disconnect"
+ displayName="Disconnect Active Server Directory"
+ description="Disconnects the Samba domain member to the Active Server Directory">
+ </operation>
+
<resource-configuration>
<c:group name="Basic Configurations">
@@ -63,6 +67,10 @@
</c:group>
<c:group name="Active Server Directory">
+ <c:simple-property name="realm" displayName="ADS Realm" required="false"/>
+ <c:simple-property name="controller" displayName="Domain Controller" required="false"/>
+ <c:simple-property name="username" displayName="ADS username" required="false"/>
+ <c:simple-property name="password" type="password" displayName="ADS password" required="false"/>
<c:simple-property name="idmap uid" required="false" displayName="Idmap UID range" description="Specifies range of users ids that are allocated for use in mapping Linux users to NT user SIDs"/>
<c:simple-property name="idmap gid" required="false" displayName="Idmap GID range" description="Specifies range of group ids that are allocated for use in mapping Linux groups to NT group SIDs"/>
<c:simple-property name="template shell" required="false" displayName="Template Shell" default="/bin/bash" description="winbindd daemon uses this parameter to fill in the login shell for users"/>
diff --git a/modules/plugins/samba/src/test/java/org/rhq/plugins/samba/SambaComponentTest.java b/modules/plugins/samba/src/test/java/org/rhq/plugins/samba/SambaComponentTest.java
index f36253e..e2894bd 100644
--- a/modules/plugins/samba/src/test/java/org/rhq/plugins/samba/SambaComponentTest.java
+++ b/modules/plugins/samba/src/test/java/org/rhq/plugins/samba/SambaComponentTest.java
@@ -42,6 +42,10 @@ public class SambaComponentTest extends AbstractAugeasConfigurationComponentTest
config.put(new PropertySimple("winbind enum users", null));
config.put(new PropertySimple("winbind enum groups", null));
config.put(new PropertySimple("winbind separator", null));
+ config.put(new PropertySimple("realm", null));
+ config.put(new PropertySimple("controller", null));
+ config.put(new PropertySimple("username", null));
+ config.put(new PropertySimple("password", null));
return config;
}
commit 0b98d169305d80dcb60a30c91011b25f11db08ac
Merge: 9adb290... b9e3538...
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Jan 6 16:05:59 2010 -0500
Merge branch 'master' into linux-config
commit 9adb2903b6f19aaaf09c4b837acaf574409ff998
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Jan 6 17:21:36 2010 +0100
removing the duplicate properties from server config and leaving them only in the vhost config.
diff --git a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
index 72e590e..851aa3b 100644
--- a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
@@ -447,14 +447,6 @@
<c:simple-property name="scheme" required="false"/>
</c:map-property>
</c:list-property>
- &DocumentRoot;
- &DirectoryIndex;
- &DefaultType;
- &AddDefaultCharset;
- &Aliases;
- &ErrorDocuments;
- &ServerAdmin;
- &Timeout;
<c:list-property name="NameVirtualHost" required="false">
<c:description>
A required directive if you want to configure name-based virtual hosts.
@@ -469,14 +461,6 @@
<c:simple-property name="_index" readOnly="true" required="false" description="Helper property to retain the consistent ordering inside Apache configuration files."/>
</c:map-property>
</c:list-property>
- &Options;
- &UseCanonicalName;
- &UseCanonicalPhysicalPort;
- <c:group name="Logging">
- &ErrorLog;
- &CustomLogs;
- </c:group>
-
</resource-configuration>
<service name="Apache Virtual Host" discovery="ApacheVirtualHostServiceDiscoveryComponent" class="ApacheVirtualHostServiceComponent" createDeletePolicy="both">
@@ -669,15 +653,17 @@
&DocumentRoot;
&AddDefaultCharset;
&Aliases;
- &CustomLogs;
&DefaultType;
&DirectoryIndex;
&ErrorDocuments;
- &ErrorLog;
&Timeout;
&Options;
&UseCanonicalName;
&UseCanonicalPhysicalPort;
+ <c:group name="Logging">
+ &ErrorLog;
+ &CustomLogs;
+ </c:group>
</resource-configuration>
<service name="Directory" class="ApacheDirectoryComponent" discovery="ApacheDirectoryDiscoveryComponent" createDeletePolicy="both">
commit 9e2a8eb1da6f48fb7e89826fbc88b3de724d2e13
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Jan 6 11:35:59 2010 +0100
Conditionally restart the apache instance after a config update and child resource create or delete.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java
index 7347dea..e118601 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheDirectoryComponent.java
@@ -53,7 +53,7 @@ public class ApacheDirectoryComponent implements ResourceComponent<ApacheVirtual
public static final String DIRECTIVE_INDEX_PROP = "directiveIndex";
public static final String REGEXP_PROP = "regexp";
- ResourceContext<ApacheVirtualHostServiceComponent> resourceContext;
+ private ResourceContext<ApacheVirtualHostServiceComponent> resourceContext;
public void start(ResourceContext<ApacheVirtualHostServiceComponent> context) throws InvalidPluginConfigurationException, Exception {
resourceContext = context;
@@ -78,25 +78,28 @@ public class ApacheDirectoryComponent implements ResourceComponent<ApacheVirtual
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
ApacheVirtualHostServiceComponent parentVirtualHost = resourceContext.getParentResourceComponent();
-
- AugeasTree tree=null;
- try {
- tree = parentVirtualHost.getServerConfigurationTree();
- ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType().getResourceConfigurationDefinition();
- ApacheAugeasMapping mapping = new ApacheAugeasMapping(tree);
- AugeasNode directoryNode = getNode(tree.getRootNode());
- mapping.updateAugeas(directoryNode,report.getConfiguration(), resourceConfigDef);
- tree.save();
-
- report.setStatus(ConfigurationUpdateStatus.SUCCESS);
- log.info("Apache configuration was updated");
- }catch(Exception e){
- if (tree!=null)
- log.error("Augeas failed to save configuration "+tree.summarizeAugeasError());
- else
- log.error("Augeas failed to save configuration",e);
- report.setStatus(ConfigurationUpdateStatus.FAILURE);
- }
+
+ AugeasTree tree = null;
+ try {
+ tree = parentVirtualHost.getServerConfigurationTree();
+ ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType()
+ .getResourceConfigurationDefinition();
+ ApacheAugeasMapping mapping = new ApacheAugeasMapping(tree);
+ AugeasNode directoryNode = getNode(tree.getRootNode());
+ mapping.updateAugeas(directoryNode, report.getConfiguration(), resourceConfigDef);
+ tree.save();
+
+ report.setStatus(ConfigurationUpdateStatus.SUCCESS);
+ log.info("Apache configuration was updated");
+
+ resourceContext.getParentResourceComponent().finishConfigurationUpdate(report);
+ } catch (Exception e) {
+ if (tree != null)
+ log.error("Augeas failed to save configuration " + tree.summarizeAugeasError());
+ else
+ log.error("Augeas failed to save configuration", e);
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ }
}
@@ -108,6 +111,8 @@ public class ApacheDirectoryComponent implements ResourceComponent<ApacheVirtual
AugeasNode myNode = getNode(virtualHostNode);
tree.removeNode(myNode, true);
tree.save();
+
+ resourceContext.getParentResourceComponent().conditionalRestart();
}
/**
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
index 6c70ef7..4fdb9b6 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheServerComponent.java
@@ -38,7 +38,6 @@ import org.rhq.augeas.node.AugeasNode;
import org.rhq.augeas.tree.AugeasTree;
import org.rhq.augeas.tree.AugeasTreeException;
import org.rhq.augeas.util.Glob;
-import org.rhq.augeas.util.GlobFilter;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.PropertySimple;
@@ -106,6 +105,8 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
public static final String PLUGIN_CONFIG_PROP_VHOST_FILES_MASK = "vhostFilesMask";
public static final String PLUGIN_CONFIG_PROP_VHOST_CREATION_POLICY = "vhostCreationPolicy";
+ public static final String PLUGIN_CONFIG_PROP_RESTART_AFTER_CONFIG_UPDATE = "restartAfterConfigurationUpdate";
+
public static final String PLUGIN_CONFIG_VHOST_IN_SINGLE_FILE_PROP_VALUE = "single-file";
public static final String PLUGIN_CONFIG_VHOST_PER_FILE_PROP_VALUE = "vhost-per-file";
@@ -304,23 +305,26 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
}
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
- AugeasTree tree=null;
+ AugeasTree tree = null;
try {
- tree = getAugeasTree();
- ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType().getResourceConfigurationDefinition();
- ApacheAugeasMapping mapping = new ApacheAugeasMapping(tree);
-
- mapping.updateAugeas(tree.getRootNode(),report.getConfiguration(), resourceConfigDef);
- tree.save();
-
- report.setStatus(ConfigurationUpdateStatus.SUCCESS);
- log.info("Apache configuration was updated");
- }catch(Exception e){
- if (tree!=null)
- log.error("Augeas failed to save configuration "+tree.summarizeAugeasError());
- else
- log.error("Augeas failed to save configuration",e);
- report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ tree = getAugeasTree();
+ ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType()
+ .getResourceConfigurationDefinition();
+ ApacheAugeasMapping mapping = new ApacheAugeasMapping(tree);
+
+ mapping.updateAugeas(tree.getRootNode(), report.getConfiguration(), resourceConfigDef);
+ tree.save();
+
+ log.info("Apache configuration was updated");
+ report.setStatus(ConfigurationUpdateStatus.SUCCESS);
+
+ finishConfigurationUpdate(report);
+ } catch (Exception e) {
+ if (tree != null)
+ log.error("Augeas failed to save configuration " + tree.summarizeAugeasError());
+ else
+ log.error("Augeas failed to save configuration", e);
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
}
}
@@ -447,6 +451,8 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
tree.save();
report.setStatus(CreateResourceStatus.SUCCESS);
+
+ finishChildResourceCreate(report);
} catch (Exception e) {
report.setStatus(CreateResourceStatus.FAILURE);
report.setException(e);
@@ -611,6 +617,51 @@ public class ApacheServerComponent implements AugeasRHQComponent<PlatformCompone
return new ConfigurationTimestamp(config.getAllConfigurationFiles());
}
+ /**
+ * This method is supposed to be called from {@link #updateResourceConfiguration(ConfigurationUpdateReport)}
+ * of this resource and any child resources.
+ *
+ * Based on the plugin configuration of this resource, the Apache instance is either restarted or left as is.
+ *
+ * @param report the report is updated with the error message and status is set to failure if the restart fails.
+ */
+ public void finishConfigurationUpdate(ConfigurationUpdateReport report) {
+ try {
+ conditionalRestart();
+ } catch (Exception e) {
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ report.setErrorMessageFromThrowable(e);
+ }
+ }
+
+ /**
+ * This method is akin to {@link #finishConfigurationUpdate(ConfigurationUpdateReport)} but should
+ * be used in the {@link #createResource(CreateResourceReport)} method.
+ *
+ * @param report the report is updated with the error message and status is set to failure if the restart fails.
+ */
+ public void finishChildResourceCreate(CreateResourceReport report) {
+ try {
+ conditionalRestart();
+ } catch (Exception e) {
+ report.setStatus(CreateResourceStatus.FAILURE);
+ report.setException(e);
+ }
+ }
+
+ /**
+ * Conditionally restarts the server based on the settings in the plugin configuration of the server.
+ *
+ * @throws Exception if the restart fails.
+ */
+ public void conditionalRestart() throws Exception {
+ Configuration pluginConfig = resourceContext.getPluginConfiguration();
+ boolean restart = pluginConfig.getSimple(PLUGIN_CONFIG_PROP_RESTART_AFTER_CONFIG_UPDATE).getBooleanValue();
+ if (restart) {
+ operationsDelegate.invokeOperation("graceful_restart", new Configuration());
+ }
+ }
+
// TODO: Move this method to a helper class.
static void addSnmpMetricValueToReport(MeasurementReport report, MeasurementScheduleRequest schedule,
SNMPValue snmpValue, boolean valueIsTimestamp) throws SNMPException {
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
index a2edeee..b65aede 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceComponent.java
@@ -143,23 +143,26 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
}
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
- AugeasTree tree=null;
+ AugeasTree tree = null;
try {
- tree = getServerConfigurationTree();
- ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType().getResourceConfigurationDefinition();
- ApacheAugeasMapping mapping = new ApacheAugeasMapping(tree);
- AugeasNode virtHostNode = getNode(tree);
- mapping.updateAugeas(virtHostNode,report.getConfiguration(), resourceConfigDef);
- tree.save();
-
- report.setStatus(ConfigurationUpdateStatus.SUCCESS);
- log.info("Apache configuration was updated");
- }catch(Exception e){
- if (tree!=null)
- log.error("Augeas failed to save configuration "+tree.summarizeAugeasError());
- else
- log.error("Augeas failed to save configuration",e);
- report.setStatus(ConfigurationUpdateStatus.FAILURE);
+ tree = getServerConfigurationTree();
+ ConfigurationDefinition resourceConfigDef = resourceContext.getResourceType()
+ .getResourceConfigurationDefinition();
+ ApacheAugeasMapping mapping = new ApacheAugeasMapping(tree);
+ AugeasNode virtHostNode = getNode(tree);
+ mapping.updateAugeas(virtHostNode, report.getConfiguration(), resourceConfigDef);
+ tree.save();
+
+ report.setStatus(ConfigurationUpdateStatus.SUCCESS);
+ log.info("Apache configuration was updated");
+
+ finishConfigurationUpdate(report);
+ } catch (Exception e) {
+ if (tree != null)
+ log.error("Augeas failed to save configuration " + tree.summarizeAugeasError());
+ else
+ log.error("Augeas failed to save configuration", e);
+ report.setStatus(ConfigurationUpdateStatus.FAILURE);
}
}
@@ -175,6 +178,8 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
tree.removeNode(myNode, true);
tree.save();
+
+ conditionalRestart();
} catch (IllegalStateException e) {
//this means we couldn't find the augeas node for this vhost.
//that error can be safely ignored in this situation.
@@ -268,6 +273,8 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
tree.save();
report.setStatus(CreateResourceStatus.SUCCESS);
+
+ resourceContext.getParentResourceComponent().finishChildResourceCreate(report);
} catch (Exception e) {
report.setException(e);
report.setStatus(CreateResourceStatus.FAILURE);
@@ -355,6 +362,22 @@ public class ApacheVirtualHostServiceComponent implements ResourceComponent<Apac
return virtualHosts.get(0);
}
+ /**
+ * @see ApacheServerComponent#finishConfigurationUpdate(ConfigurationUpdateReport)
+ */
+ public void finishConfigurationUpdate(ConfigurationUpdateReport report) {
+ resourceContext.getParentResourceComponent().finishConfigurationUpdate(report);
+ }
+
+ /**
+ * @see ApacheServerComponent#conditionalRestart()
+ *
+ * @throws Exception
+ */
+ public void conditionalRestart() throws Exception {
+ resourceContext.getParentResourceComponent().conditionalRestart();
+ }
+
private void collectSnmpMetric(MeasurementReport report, int primaryIndex, SNMPSession snmpSession,
MeasurementScheduleRequest schedule) throws SNMPException {
SNMPValue snmpValue = null;
diff --git a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
index aaefeb0..72e590e 100644
--- a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
@@ -262,6 +262,15 @@
<c:simple-property name="snmpAgentCommunity" displayName="SNMP Agent Community" default="public"
description="the SNMP community of the Apache SNMP agent (typically 'public')"/>
+ <c:simple-property name="restartAfterConfigurationUpdate" type="boolean" default="true" required="true">
+ <c:description>
+ If set to true, each configuration update of the server or any underlying virtual host or
+ directory is followed by the restart of the Apache instance so that the configuration changes
+ are applied immediatelly. If set to false, you have to manually restart the server (for example
+ using the restart operation in the operations tab) once all the configuration updates are finished.
+ </c:description>
+ </c:simple-property>
+
<!-- Augeas Configuration -->
<c:group name="Augeas Configuraion">
<c:simple-property name="augeasModuleName" displayName="Augeas Module Name" default="Httpd" required="true" readOnly="true"
commit dc34355908a5130a7353c3804ef5429bba9c0d5f
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Jan 6 10:10:35 2010 +0100
Using the default plugin configuration instead of empty configuration as we should.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
index d56b41f..120e422 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/ApacheVirtualHostServiceDiscoveryComponent.java
@@ -58,7 +58,7 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
//first define the root server as one virtual host
ResourceType resourceType = context.getResourceType();
- Configuration mainServerPluginConfig = new Configuration();
+ Configuration mainServerPluginConfig = context.getDefaultPluginConfiguration();
String mainServerUrl = context.getParentResourceContext().getPluginConfiguration().getSimple(ApacheServerComponent.PLUGIN_CONFIG_PROP_URL).getStringValue();
if (mainServerUrl != null && !"null".equals(mainServerUrl)) {
@@ -108,7 +108,7 @@ public class ApacheVirtualHostServiceDiscoveryComponent implements ResourceDisco
String resourceKey = keyBuilder.toString();
- Configuration pluginConfiguration = new Configuration();
+ Configuration pluginConfiguration = context.getDefaultPluginConfiguration();
Address address = HttpdAddressUtility.getVirtualHostSampleAddress(ag, firstAddress, serverName);
if (address != null) {
commit 82bee8d0e5e4c15db781cee88b07147043a18381
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Tue Jan 5 22:06:09 2010 +0100
Correctly determine the URL of vhosts defined as _default_.
diff --git a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
index 9e1341c..29fd4f3 100644
--- a/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
+++ b/modules/plugins/apache/src/main/java/org/rhq/plugins/apache/util/HttpdAddressUtility.java
@@ -146,7 +146,7 @@ public class HttpdAddressUtility {
addr.host = serverAddr.host;
} else {
String host = hostPort[0];
- if ("*".equals(host)) {
+ if ("*".equals(host) || "_default_".equals(host)) {
Address serverAddr = getMainServerSampleAddress(ag);
if (serverAddr == null) return null;
host = serverAddr.host;
commit 264ae38f71d0fdd1fa97b7b927af18e4ee4890f0
Author: Ian P. Springer <ips(a)jetengine.springer.net>
Date: Tue Jan 5 16:19:11 2010 -0500
set conn props correctly dusring discovery so metrics can be collected successfully (fix for https://jira.jboss.org/jira/browse/JOPR-399)
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java
index 6f580f5..5e7df32 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java
@@ -27,8 +27,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.net.URLDecoder;
-import java.io.UnsupportedEncodingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -44,8 +42,8 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
import org.rhq.plugins.jmx.ObjectNameQueryUtility;
/**
- * JON plugin discovery component for Tomcat connectors. The bulk of the discovery is performed by the super class. This
- * class exists to work with the bean attribute values once they were read.
+ * Plugin discovery component for JBoss Web (embedded Tomcat) connectors. The bulk of the discovery is performed by the
+ * super class. This class exists to work with the bean attribute values once they have been read.
*
* @author Jason Dobies
* @author Ian Springer
@@ -53,8 +51,6 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
private final Log log = LogFactory.getLog(this.getClass());
- private static final String LOCAL_IP = "0.0.0.0";
-
// MBeanResourceDiscoveryComponent Overridden Methods --------------------------------------------
@Override
@@ -62,16 +58,14 @@ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDisco
Set<DiscoveredResourceDetails> resourceDetails = super.discoverResources(context);
/*
- * Get the connectors, pull the schema from them and set them later.
- * jk-8009 JBoss 3.2, 4.0 (AJP connector)
- * http-0.0.0.0-8080 JBoss 3.2, 4.0, 4.2 (http + https connector)
- * ajp-0.0.0.0-9009 JBoss 4.2 (AJP connector)
+ * Lookup all jboss.web:type=GlobalRequestProcessor,* MBeans in order to associate them later with the
+ * corresponding jboss.web:type=Connector,* primary connector MBeans.
*/
EmsConnection connection = context.getParentResourceComponent().getEmsConnection();
ObjectNameQueryUtility queryUtility = new ObjectNameQueryUtility("jboss.web:type=GlobalRequestProcessor,name=%name%");
List<EmsBean> beans = connection.queryBeans(queryUtility.getTranslatedQuery());
- // We can't populate the name and schema in the plugin config if the GlobalRequestProcessor MBeans aren't
+ // We can't populate the name and scheme in the plugin config if the GlobalRequestProcessor MBeans aren't
// deployed yet, so just abort and try again the next time the PC calls us.
if (beans.size() != resourceDetails.size()) {
if (log.isDebugEnabled())
@@ -87,10 +81,11 @@ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDisco
for (EmsBean bean : beans) {
EmsBeanName eName = bean.getBeanName();
- // There are a two possible formats for the value of the 'name' key property. When parsing, it's important
+ // There are three possible formats for the value of the 'name' key property. When parsing, it's important
// to remember that the hostname can potentially contain a '-'. Note, %2F is a URL-encoded '/'.
- // 1) http-foo-bar.example.com-8080
- // 2) http-foo-bar.example.com%2F192.168.10.11-8080
+ // 1) jk-8009 (jk connectors in JBoss 3.2 only, due to what I think is a bug)
+ // 2) http-192.168.10.11-8080
+ // 3) http-foo-bar.example.com%2F192.168.10.11-8080
String oName = eName.getKeyProperty("name");
int firstDashIndex = oName.indexOf('-');
@@ -98,20 +93,10 @@ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDisco
String remainder = oName.substring(firstDashIndex + 1);
int lastDashIndex = remainder.lastIndexOf('-');
- String host = remainder.substring(0, lastDashIndex);
String port = remainder.substring(lastDashIndex + 1);
-
schemeMap.put(port, scheme);
-
- try {
- host = URLDecoder.decode(host, "UTF-8");
- }
- catch (UnsupportedEncodingException e) {
- log.error("Failed to decode host portion of GlobalRequestProcessor name: " + oName, e);
- continue;
- }
-
- addressPresentMap.put(port, host.contains("/"));
+ boolean addressPresent = (lastDashIndex != -1);
+ addressPresentMap.put(port, addressPresent);
}
// The address may be read with %2F at the start of it. Parse that out before returning the resources.
@@ -120,43 +105,39 @@ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDisco
Configuration pluginConfiguration = resource.getPluginConfiguration();
String dirtyAddress = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS).getStringValue();
- String port = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_PORT).getStringValue();
- boolean portHasAddress = (Boolean.TRUE.equals(addressPresentMap.get(port)));
+ String cleanAddress;
if (dirtyAddress.startsWith("%2F")) {
- String cleanAddress = dirtyAddress.substring(3);
-
- // Update the plugin configuration property for address or remove it if not needed
- if (portHasAddress) {
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, cleanAddress));
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, "-"));
- } else {
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, ""));
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, ""));
- }
+ cleanAddress = dirtyAddress.substring(3);
// The resource key contains the address, so update that too
String dirtyResourceKey = resource.getResourceKey();
String cleanResourceKey = dirtyResourceKey.replace(dirtyAddress, cleanAddress);
resource.setResourceKey(cleanResourceKey);
- String resourceName = resource.getResourceName();
- if (!cleanAddress.equals(LOCAL_IP)) {
- resourceName = resourceName.replace("(", " (" + cleanAddress + ":");
- resource.setResourceName(resourceName);
- }
- } else { // Address not dirty
- if (portHasAddress) {
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, "-"));
- } else {
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, ""));
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, ""));
- }
+ } else {
+ cleanAddress = dirtyAddress;
}
+ // Add the address to the Resource name (e.g. "Tomcat Connector (127.0.0.1:8080)").
+ String resourceName = resource.getResourceName();
+ resourceName = resourceName.replace("(", "(" + cleanAddress + ":");
+ resource.setResourceName(resourceName);
+
+ String port = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_PORT).getStringValue();
+
String scheme = schemeMap.get(port);
pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_SCHEMA, scheme));
- // if (log.isDebugEnabled())
- log.debug("Found a connector: " + scheme + "-" + dirtyAddress + ":" + port);
+
+ // Update the "address" and "dash" plugin config props, or remove them if not needed.
+ if (addressPresentMap.containsKey(port)) {
+ pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, cleanAddress));
+ pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, "-"));
+ } else {
+ pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, ""));
+ pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, ""));
+ }
+
+ log.debug("Found a JBoss Web connector: " + scheme + "-" + cleanAddress + ":" + port);
}
return resourceDetails;
diff --git a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
index c12c10f..fa7bdc1 100644
--- a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
@@ -336,7 +336,7 @@
default="jboss.web:address=%address%,port=%port%,type=Connector"/>
<c:simple-property name="port" type="string" description="Port this connector listens on." readOnly="true"/>
<c:simple-property name="address" type="string" description="Address this connector listens on." readOnly="true"/>
- <c:simple-property name="schema" type="string" description="The protocol schema (jk, ajp, http)." default="http"/>
+ <c:simple-property name="schema" displayName="Scheme" type="string" description="The scheme of the protocol used by this connector (e.g. jk, ajp, http, https)." default="http"/>
</c:group>
<c:group name="advanced" displayName="Advanced" hiddenByDefault="true">
<c:simple-property name="nameTemplate" default="Tomcat Connector ({port})"/>
14 years, 3 months
[rhq] Branch 'linux-config' - modules/enterprise
by Jay Shaughnessy
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java | 6 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java | 33 ++++++++--
2 files changed, 32 insertions(+), 7 deletions(-)
New commits:
commit 16f0613e65135a12f748fed01bdc8455473167b6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Jan 28 18:43:37 2010 -0500
More work for the search value escaping
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index ec06f74..67ab54b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -369,7 +369,7 @@ public final class CriteriaQueryGenerator {
* Double escape backslashes if they are not treated as string literals by the db vendor
* http://opensource.atlassian.com/projects/hibernate/browse/HHH-2674
*/
- formattedValue = QueryUtility.escapeSearchParameter(formattedValue);
+ formattedValue = QueryUtility.handleDoubleEscaping(formattedValue);
if (wantsFuzzyMatching) {
// append '%' onto edges that don't already have '%' explicitly set from the caller
@@ -378,7 +378,9 @@ public final class CriteriaQueryGenerator {
}
value = formattedValue;
}
- LOG.debug("Bind: (" + critField.getKey() + ", " + value + ")");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Bind: (" + critField.getKey() + ", " + value + ")");
+ }
query.setParameter(critField.getKey(), value);
}
if (null != this.authorizationPermsFragment) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
index 64f0d4c..7f8ab50 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/QueryUtility.java
@@ -27,6 +27,8 @@ import org.rhq.core.db.DatabaseTypeFactory;
public class QueryUtility {
private static String ESCAPE_CHARACTER = null;
+ private static String ESCAPED_PERCENT = null;
+ private static String ESCAPED_UNDERSCORE = null;
/**
* Given the settings for the current DatabaseType, properly handle escaping special SQL characters.
@@ -39,13 +41,14 @@ public class QueryUtility {
return null;
}
- boolean handleEscapedBackslash = "\\\\".equals(getEscapeCharacter());
-
- if (handleEscapedBackslash) {
- value = ((String) value).replaceAll("\\_", "\\\\_");
- value = ((String) value).replaceAll("\\%", "\\\\%");
+ if (null == ESCAPED_UNDERSCORE) {
+ ESCAPED_UNDERSCORE = getEscapeCharacter() + "_";
+ ESCAPED_PERCENT = getEscapeCharacter() + "%";
}
+ value = value.replaceAll("_", ESCAPED_UNDERSCORE);
+ value = value.replaceAll("%", ESCAPED_PERCENT);
+
return value;
}
@@ -78,4 +81,24 @@ public class QueryUtility {
return ESCAPE_CHARACTER;
}
+ /**
+ * If the current DatabaseType requires double escaping then ensure it is set correctly. This may be useful
+ * if the search string has been constructed outside of QueryUtil.formatSearchParameter(String).
+ *
+ * @param value single escaped search string value
+ * @return The double escaped string
+ */
+ public static String handleDoubleEscaping(String value) {
+ if (null == ESCAPE_CHARACTER) {
+ ESCAPE_CHARACTER = DatabaseTypeFactory.getDefaultDatabaseType().getEscapeCharacter();
+ }
+
+ if ("\\\\".equals(ESCAPE_CHARACTER)) {
+ value = value.replaceAll("\\\\_", ESCAPED_UNDERSCORE);
+ value = value.replaceAll("\\\\%", ESCAPED_PERCENT);
+ }
+
+ return value;
+ }
+
}
14 years, 3 months