.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...
+ </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/ente...
@@ -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>(a)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>(a)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/...
+
<
developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/etc...
+ </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...
</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/plug...
+
<
developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/mod...
+ </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})"/>