[rhq] Branch 'rhq-on-as7' - 10 commits - .classpath modules/core modules/enterprise modules/plugins

mazz mazz at fedoraproject.org
Tue Aug 7 16:02:29 UTC 2012


 .classpath                                                                                                                      |    1 
 modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java                                         |   42 +++--
 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java |    1 
 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/AncestryUtil.java         |    2 
 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java   |    6 
 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java   |   84 +++++++---
 modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/advisoryInfo-plain.xhtml                                          |    3 
 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StatusManagerBean.java                              |   29 ++-
 modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerOperationsDelegate.java                      |   77 ++++++---
 modules/plugins/jboss-as-5/src/test/java/org/rhq/plugins/jbossas5/itest/ApplicationServerComponentTest.java                     |   28 +++
 modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ModuleOptionsComponent.java                           |    2 
 modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleFlashRecoveryAreaComponent.java                               |   83 +++++++++
 modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleTablespaceComponent.java                                      |   83 +++++++++
 modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml                                                               |   42 ++++-
 14 files changed, 417 insertions(+), 66 deletions(-)

New commits:
commit 4f19e4d88fd0d499c9dd49893b0dadead07155d8
Author: Jay Shaughnessy <jshaughn at redhat.com>
Date:   Tue Aug 7 11:26:27 2012 -0400

    [Bug 846375 - Resource list views should have name field as initial sort and limit ancestry to client side sorting only]
    - Apply default initial sort on Name field for resource list views (using ResourceSearchView)
      - note, updated constructor chaining to be more efficient while adding
        default sort behavior. Removed an unused constructor.
    - Disable server-side sorting on Ancestry since sorting on the encoded
      value is not useful to the end user.  Allow client-side sorting when all
      rows are fetched, this gives the desired alpha sort on the display value.

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/AncestryUtil.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/AncestryUtil.java
index 0313b46..15e7bc3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/AncestryUtil.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/AncestryUtil.java
@@ -66,6 +66,8 @@ public abstract class AncestryUtil {
         ancestryField = new ListGridField(AncestryUtil.RESOURCE_ANCESTRY, CoreGUI.getMessages().common_title_ancestry());
         ancestryField.setAlign(Alignment.LEFT);
         ancestryField.setCellAlign(Alignment.LEFT);
+        // sorting on the encoded db value is not useful, limit to client sorting when we have all of the values
+        ancestryField.setCanSortClientOnly(true);
         setupAncestryListGridFieldCellFormatter(ancestryField);
         setupAncestryListGridFieldHover(ancestryField);
         return ancestryField;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
index 9bb1dfa..55271c6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
@@ -52,6 +52,7 @@ import org.rhq.core.domain.measurement.AvailabilityType;
 import org.rhq.core.domain.resource.Resource;
 import org.rhq.core.domain.resource.ResourceCategory;
 import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageControl;
 import org.rhq.core.domain.util.PageList;
 import org.rhq.enterprise.gui.coregui.client.CoreGUI;
 import org.rhq.enterprise.gui.coregui.client.ImageManager;
@@ -250,6 +251,11 @@ public class ResourceDatasource extends RPCDataSource<Resource, ResourceCriteria
         Log.debug(" *** ResourceCriteria Search String: " + getFilter(request, "search", String.class));
         criteria.setSearchExpression(getFilter(request, "search", String.class));
 
+        // filter out unsortable fields (i.e. fields sorted client-side only)
+        PageControl pageControl = getPageControl(request);
+        pageControl.removeOrderingField(AncestryUtil.RESOURCE_ANCESTRY);
+        criteria.setPageControl(pageControl);
+
         return criteria;
     }
 
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
index ed0a1ca..0e59b6d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
@@ -18,13 +18,38 @@
  */
 package org.rhq.enterprise.gui.coregui.client.inventory.resource;
 
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.AVAILABILITY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.CATEGORY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.CTIME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.DESCRIPTION;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.ITIME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.KEY;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.LOCATION;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.MODIFIER;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.MTIME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.NAME;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.PLUGIN;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.TYPE;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.VERSION;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.List;
+
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.smartgwt.client.data.Criteria;
 import com.smartgwt.client.data.Record;
 import com.smartgwt.client.data.SortSpecifier;
+import com.smartgwt.client.types.SortDirection;
 import com.smartgwt.client.widgets.events.DoubleClickEvent;
 import com.smartgwt.client.widgets.events.DoubleClickHandler;
-import com.smartgwt.client.widgets.grid.*;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.HoverCustomizer;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
 import org.rhq.core.domain.authz.Permission;
 import org.rhq.core.domain.criteria.ResourceCriteria;
 import org.rhq.core.domain.measurement.AvailabilityType;
@@ -34,7 +59,15 @@ import org.rhq.core.domain.search.SearchSubsystem;
 import org.rhq.enterprise.gui.coregui.client.CoreGUI;
 import org.rhq.enterprise.gui.coregui.client.LinkManager;
 import org.rhq.enterprise.gui.coregui.client.components.ReportExporter;
-import org.rhq.enterprise.gui.coregui.client.components.table.*;
+import org.rhq.enterprise.gui.coregui.client.components.table.EscapedHtmlCellFormatter;
+import org.rhq.enterprise.gui.coregui.client.components.table.IconField;
+import org.rhq.enterprise.gui.coregui.client.components.table.RecordExtractor;
+import org.rhq.enterprise.gui.coregui.client.components.table.ResourceAuthorizedTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.ResourceCategoryCellFormatter;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
+import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
 import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
 import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
 import org.rhq.enterprise.gui.coregui.client.report.DriftComplianceReportResourceSearchView;
@@ -45,15 +78,9 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
 import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
 import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.List;
-
-import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.*;
-
 /**
- * The list view for {@link Resource}s.
+ * The list view for {@link Resource}s. If not specified a default title is assigned.  If not specified the list will
+ * be initially sorted by resource name, ascending. 
  *
  * @author Jay Shaughnessy
  * @author Greg Hinkle
@@ -62,6 +89,8 @@ import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceD
 public class ResourceSearchView extends Table {
 
     private static final String DEFAULT_TITLE = MSG.common_title_resources();
+    private static final SortSpecifier[] DEFAULT_SORT_SPECIFIER = new SortSpecifier[] { new SortSpecifier("name",
+        SortDirection.ASCENDING) };
 
     private List<ResourceSelectListener> selectListeners = new ArrayList<ResourceSelectListener>();
 
@@ -71,23 +100,21 @@ public class ResourceSearchView extends Table {
      * A list of all Resources in the system.
      */
     public ResourceSearchView(String locatorId) {
-        this(locatorId, null);
-    }
-
-    public ResourceSearchView(String locatorId, String title, String[] excludeFields) {
-        this(locatorId, null, title, null, excludeFields);
+        this(locatorId, null, null, null, null, false);
     }
 
     /**
      * A Resource list filtered by a given criteria.
      */
     public ResourceSearchView(String locatorId, Criteria criteria) {
-        this(locatorId, criteria, DEFAULT_TITLE);
+        this(locatorId, criteria, null, null, null, false);
     }
 
+    /**
+     * A Resource list filtered by a given criteria and optionally exportable
+     */
     public ResourceSearchView(String locatorId, Criteria criteria, boolean exportable) {
-        this(locatorId, criteria);
-        this.exportable = exportable;
+        this(locatorId, criteria, null, null, null, exportable);
     }
 
     /**
@@ -96,7 +123,7 @@ public class ResourceSearchView extends Table {
      * @param headerIcons 24x24 icon(s) to be displayed in the header
      */
     public ResourceSearchView(String locatorId, Criteria criteria, String title, String... headerIcons) {
-        this(locatorId, criteria, title, null, null, headerIcons);
+        this(locatorId, criteria, title, null, null, false, headerIcons);
     }
 
     /**
@@ -106,7 +133,22 @@ public class ResourceSearchView extends Table {
      */
     public ResourceSearchView(String locatorId, Criteria criteria, String title, SortSpecifier[] sortSpecifier,
         String[] excludeFields, String... headerIcons) {
-        super(locatorId, title, criteria, sortSpecifier, excludeFields);
+
+        this(locatorId, criteria, title, sortSpecifier, excludeFields, false, headerIcons);
+    }
+
+    /**
+     * A Resource list filtered by a given criteria with the given title and optionally exportable.
+     *
+     * @param headerIcons 24x24 icon(s) to be displayed in the header
+     */
+    public ResourceSearchView(String locatorId, Criteria criteria, String title, SortSpecifier[] sortSpecifier,
+        String[] excludeFields, boolean exportable, String... headerIcons) {
+
+        super(locatorId, (null == title) ? DEFAULT_TITLE : title, criteria,
+            (null == sortSpecifier) ? DEFAULT_SORT_SPECIFIER : sortSpecifier, excludeFields);
+
+        this.exportable = exportable;
 
         for (String headerIcon : headerIcons) {
             addHeaderIcon(headerIcon);
@@ -309,7 +351,7 @@ public class ResourceSearchView extends Table {
     }
 
     private void addExportAction() {
-        addTableAction("Export",  MSG.common_button_reports_export(), new TableAction() {
+        addTableAction("Export", MSG.common_button_reports_export(), new TableAction() {
             @Override
             public boolean isEnabled(ListGridRecord[] selection) {
                 return true;


commit 135324195003afba28652c960cb3d81e81e59702
Author: Jay Shaughnessy <jshaughn at redhat.com>
Date:   Tue Aug 7 11:17:11 2012 -0400

    Add new scripting api module to eclipse source path

diff --git a/.classpath b/.classpath
index e67c6a5..4e9fd9d 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="modules/common/ant-bundle/src/main/java"/>
+	<classpathentry kind="src" path="modules/enterprise/scripting/api/src/main/java"/>
 	<classpathentry kind="src" path="modules/cli-tests/src/main/java"/>
 	<classpathentry kind="src" path="modules/helpers/jeeGen/src/main/java"/>
 	<classpathentry kind="src" path="modules/helpers/bundleGen/src/main/java"/>


commit 8b82335602cd4567d98d40a414187df037bc79a6
Author: Simeon Pinder <spinder at fulliautomatix.conchfritter.com>
Date:   Tue Aug 7 11:05:07 2012 -0400

     [BZ 839552] passed in the wrong configuration when overriding behavior for SecurityDomain as7 nodes.

diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ModuleOptionsComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ModuleOptionsComponent.java
index d486542..a4dccd0 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ModuleOptionsComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ModuleOptionsComponent.java
@@ -474,7 +474,7 @@ public class ModuleOptionsComponent extends BaseComponent implements Configurati
     public void updateResourceConfiguration(ConfigurationUpdateReport report) {
         //determine the component
         ResourceType resourceType = context.getResourceType();
-        ConfigurationDefinition configDef = resourceType.getPluginConfigurationDefinition();
+        ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
         Set<ResourceType> nodeParentTypes = context.getResourceType().getParentResourceTypes();
         ResourceType parentType = (ResourceType) nodeParentTypes.toArray()[0];
         ResourceType grandParentType = (ResourceType) parentType.getParentResourceTypes().toArray()[0];


commit a429d4ae9d44555f2d82e5b5da607579b43903ce
Author: Lukas Krejci <lkrejci at redhat.com>
Date:   Tue Aug 7 15:54:18 2012 +0200

    [BZ 846269] - AS5's shutdown operation doesn't require availability to be up.

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 5ac0413..60fa42d 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
@@ -54,6 +54,29 @@ import org.rhq.core.system.SystemInfo;
  * @author Jay Shaughnessy
  */
 public class ApplicationServerOperationsDelegate {
+    
+    private static class ExecutionFailedException extends Exception {
+
+        private static final long serialVersionUID = 1L;
+
+        @SuppressWarnings("unused")
+        public ExecutionFailedException() {
+        }
+
+        public ExecutionFailedException(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public ExecutionFailedException(String message) {
+            super(message);
+        }
+
+        @SuppressWarnings("unused")
+        public ExecutionFailedException(Throwable cause) {
+            super(cause);
+        }       
+    }
+    
     /**
      * max amount of time to wait for server to show as unavailable after
      * executing stop - in milliseconds
@@ -303,28 +326,30 @@ public class ApplicationServerOperationsDelegate {
      * @return The result of the shutdown operation - is successful
      */
     private OperationResult shutDown() {
-        AvailabilityType avail = this.serverComponent.getAvailability();
-        if (avail == AvailabilityType.DOWN) {
-            OperationResult result = new OperationResult();
-            result.setErrorMessage("The server is already shut down.");
-            return result;
-        }
-
         Configuration pluginConfig = serverComponent.getResourceContext().getPluginConfiguration();
         ApplicationServerShutdownMethod shutdownMethod = Enum.valueOf(ApplicationServerShutdownMethod.class,
             pluginConfig.getSimple(ApplicationServerPluginConfigurationProperties.SHUTDOWN_METHOD_CONFIG_PROP)
                 .getStringValue());
-        String resultMessage = ApplicationServerShutdownMethod.JMX.equals(shutdownMethod) ? shutdownViaJmx()
-            : shutdownViaScript();
-
-        avail = waitForServerToShutdown();
+        String errorMessage = null;
+        String resultMessage = null;
+        try {
+            resultMessage = ApplicationServerShutdownMethod.JMX.equals(shutdownMethod) ? shutdownViaJmx()
+                : shutdownViaScript();
+        } catch (ExecutionFailedException e) {
+            errorMessage = e.getMessage();
+        }
+        
+        AvailabilityType avail = waitForServerToShutdown();
         OperationResult result;
         if (avail == AvailabilityType.UP) {
             result = new OperationResult();
             result.setErrorMessage("The server failed to shut down.");
         } else {
-            return new OperationResult(resultMessage);
+            result = new OperationResult();
+            result.setSimpleResult(resultMessage);
+            result.setErrorMessage(errorMessage);
         }
+        
         return result;
     }
 
@@ -333,7 +358,7 @@ public class ApplicationServerOperationsDelegate {
      *
      * @return success message if no errors are encountered
      */
-    private String shutdownViaScript() {
+    private String shutdownViaScript() throws ExecutionFailedException {
         File shutdownScriptFile = getShutdownScriptPath();
         validateScriptFile(shutdownScriptFile,
             ApplicationServerPluginConfigurationProperties.SHUTDOWN_SCRIPT_CONFIG_PROP);
@@ -378,8 +403,8 @@ public class ApplicationServerOperationsDelegate {
         logExecutionResults(results);
 
         if (results.getError() != null) {
-            throw new RuntimeException("Error executing shutdown script while stopping AS instance. Exit code ["
-                + results.getExitCode() + "]", results.getError());
+            throw new ExecutionFailedException("Error executing shutdown script while stopping AS instance. Exit code ["
+                + results.getExitCode() + "]: " + results.getError().getMessage(), results.getError());
         }
 
         return "The server has been shut down.";
@@ -397,7 +422,7 @@ public class ApplicationServerOperationsDelegate {
      *
      * @return success message if no errors are encountered
      */
-    private String shutdownViaJmx() {
+    private String shutdownViaJmx() throws ExecutionFailedException {
         Configuration pluginConfig = serverComponent.getResourceContext().getPluginConfiguration();
         String mbeanName = pluginConfig.getSimple(
             ApplicationServerPluginConfigurationProperties.SHUTDOWN_MBEAN_CONFIG_PROP).getStringValue();
@@ -406,7 +431,7 @@ public class ApplicationServerOperationsDelegate {
 
         EmsConnection connection = this.serverComponent.getEmsConnection();
         if (connection == null) {
-            throw new RuntimeException("Can not connect to the server");
+            throw new ExecutionFailedException("Can not connect to the server");
         }
         EmsBean bean = connection.getBean(mbeanName);
         EmsOperation operation = bean.getOperation(operationName);
@@ -422,14 +447,18 @@ public class ApplicationServerOperationsDelegate {
          * method, we'd need a clever way for the user to specify parameters
          * anyway.
          */
-        List<EmsParameter> params = operation.getParameters();
-        int count = params.size();
-        if (count == 0)
-            operation.invoke(new Object[0]);
-        else { // overloaded operation
-            operation.invoke(new Object[] { 0 }); // return code of 0
+        try {
+            List<EmsParameter> params = operation.getParameters();
+            int count = params.size();
+            if (count == 0)
+                operation.invoke(new Object[0]);
+            else { // overloaded operation
+                operation.invoke(new Object[] { 0 }); // return code of 0
+            }
+        } catch (RuntimeException e) {
+            throw new ExecutionFailedException("Shutting down the server using JMX failed: " + e.getMessage(), e);
         }
-
+        
         return "The server has been shut down.";
     }
 
diff --git a/modules/plugins/jboss-as-5/src/test/java/org/rhq/plugins/jbossas5/itest/ApplicationServerComponentTest.java b/modules/plugins/jboss-as-5/src/test/java/org/rhq/plugins/jbossas5/itest/ApplicationServerComponentTest.java
index 2bc7f47..6d60b85 100644
--- a/modules/plugins/jboss-as-5/src/test/java/org/rhq/plugins/jbossas5/itest/ApplicationServerComponentTest.java
+++ b/modules/plugins/jboss-as-5/src/test/java/org/rhq/plugins/jbossas5/itest/ApplicationServerComponentTest.java
@@ -24,6 +24,8 @@ package org.rhq.plugins.jbossas5.itest;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
 
 import java.io.File;
 import java.util.Arrays;
@@ -50,6 +52,7 @@ import org.rhq.core.pc.inventory.InventoryManager;
 import org.rhq.core.pc.inventory.ResourceContainer;
 import org.rhq.core.pluginapi.configuration.ListPropertySimpleWrapper;
 import org.rhq.core.pluginapi.configuration.MapPropertySimpleWrapper;
+import org.rhq.core.pluginapi.operation.OperationResult;
 import org.rhq.core.pluginapi.util.FileUtils;
 import org.rhq.core.pluginapi.util.StartScriptConfiguration;
 import org.rhq.core.system.ProcessInfo;
@@ -197,9 +200,32 @@ public class ApplicationServerComponentTest extends AbstractJBossAS5PluginTest {
         avail = getAvailability(getServerResource());
         assertEquals(avail, AvailabilityType.DOWN);
 
+        //change the plugin config to shutdown via JMX
+        Configuration pluginConfig = getServerResource().getPluginConfiguration();
+        pluginConfig.getSimple("shutdownMethod").setValue("JMX");
+        restartServerResourceComponent();
+        
+        //invoke the shutdown operation again and assert that it actually ran and generated some error message.
+        OperationResult operationResult = invokeOperation(getServerResource(), SHUTDOWN_OPERATION_NAME, null);
+        avail = getAvailability(getServerResource());        
+        assertEquals(avail, AvailabilityType.DOWN);
+        assertNotNull(operationResult.getErrorMessage());
+        
+        //ok, now try the same with the script shutdown method
+        pluginConfig = getServerResource().getPluginConfiguration();
+        pluginConfig.getSimple("shutdownMethod").setValue("SCRIPT");
+        restartServerResourceComponent();
+        
+        //invoke the shutdown operation again and assert that it actually ran
+        operationResult = invokeOperation(getServerResource(), SHUTDOWN_OPERATION_NAME, null);
+        avail = getAvailability(getServerResource());        
+        assertEquals(avail, AvailabilityType.DOWN);
+        assertNull(operationResult.getErrorMessage());
+        assertEquals(operationResult.getSimpleResult(), "The server has been shut down.");
+        
         // Before restarting it, add some stuff to the 'startScriptEnv' and 'startScriptArgs' props so we can verify
         // they are used correctly by the Start op.
-        Configuration pluginConfig = getServerResource().getPluginConfiguration();
+        pluginConfig = getServerResource().getPluginConfiguration();
         StartScriptConfiguration startScriptConfig = new StartScriptConfiguration(pluginConfig);
 
         // Add a var to the start script env.


commit 8d587dca3a0dc0cfa23872766c38c5a0a8620f35
Author: Jay Shaughnessy <jshaughn at redhat.com>
Date:   Mon Aug 6 15:08:20 2012 -0400

    [Bug 828428 - org.rhq.enterprise.server.cloud.instance.CacheConsistencyManagerBean ERROR ORA-01795: maximum number of expressions in a list is 1000]
    This time the problem is 1000 or more agents on a server (with status <> 0).
    Batch the updates to avoid the Oracle limitation.

diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StatusManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StatusManagerBean.java
index dfd1990..9658dd1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StatusManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StatusManagerBean.java
@@ -95,13 +95,28 @@ public class StatusManagerBean implements StatusManagerLocal {
         List<Integer> agentIds = selectQuery.getResultList();
 
         if (agentIds.size() > 0) {
-            /* 
-             * note: not worried about size of the in clause, because the number of
-             * agents per server will be reasonable, say, 50-150
-             */
-            Query updateQuery = entityManager.createNamedQuery(Agent.QUERY_UPDATE_CLEAR_STATUS_BY_IDS);
-            updateQuery.setParameter("agentIds", agentIds);
-            updateQuery.executeUpdate();
+
+            // handle the oracle 1000 member IN clause issue
+            final int ORACLE_BATCH_SIZE = 1000;
+
+            int numAgents = agentIds.size();
+            int batches = (numAgents / ORACLE_BATCH_SIZE) + 1;
+
+            // iterate over the agent ids when we have more than 1000 of them
+            for (int batch = 0; batch < batches; ++batch) {
+                int fromIndex = batch * ORACLE_BATCH_SIZE;
+                int toIndex = fromIndex + ORACLE_BATCH_SIZE;
+                if (toIndex > numAgents) // don't run over the end of the list
+                    toIndex = numAgents;
+                List<Integer> agentIdBatch = agentIds.subList(fromIndex, toIndex);
+
+                if (fromIndex == toIndex)
+                    continue;
+
+                Query updateQuery = entityManager.createNamedQuery(Agent.QUERY_UPDATE_CLEAR_STATUS_BY_IDS);
+                updateQuery.setParameter("agentIds", agentIdBatch);
+                int numUpdated = updateQuery.executeUpdate();
+            }
         }
 
         return agentIds;


commit c105e92faffd5ab5d50fc04786a4ea1486341973
Author: Richard Hensman <richard at onevisionconsulting.co.uk>
Date:   Thu Jul 19 21:44:44 2012 +0100

    Add support for monitoring Flash Recovery Areas to the Oracle plugin

diff --git a/modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleFlashRecoveryAreaComponent.java b/modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleFlashRecoveryAreaComponent.java
new file mode 100644
index 0000000..0446d7f
--- /dev/null
+++ b/modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleFlashRecoveryAreaComponent.java
@@ -0,0 +1,83 @@
+/*
+ * 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.plugins.oracle;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+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.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.util.jdbc.JDBCUtil;
+import org.rhq.plugins.database.AbstractDatabaseComponent;
+import org.rhq.plugins.database.DatabaseQueryUtility;
+
+/**
+ * Oracle Flash Recovery Area Component.
+ * 
+ * @author Richard Hensman
+ */
+public class OracleFlashRecoveryAreaComponent extends AbstractDatabaseComponent implements MeasurementFacet {
+
+    private static final String SQL_AVAILABLE = "SELECT COUNT(*) FROM v$recovery_file_dest WHERE name = ?";
+    private static final String SQL_VALUES =
+        "SELECT space_limit spaceLimit, space_used spaceUsed, space_reclaimable spaceReclaimable, number_of_files numberOfFiles, (space_used/space_limit) usedPercent " +
+        "FROM v$recovery_file_dest WHERE name = ?";
+
+
+    private static Log log = LogFactory.getLog(OracleFlashRecoveryAreaComponent.class);
+
+    public AvailabilityType getAvailability() {
+        PreparedStatement statement = null;
+        ResultSet resultSet = null;
+        try {
+            statement = getConnection().prepareStatement(SQL_AVAILABLE);
+            statement.setString(1, this.resourceContext.getResourceKey());
+            resultSet = statement.executeQuery();
+            if (resultSet.next() && (resultSet.getInt(1) == 1)) {
+                return AvailabilityType.UP;
+            }
+        } catch (SQLException e) {
+            log.debug("unable to query", e);
+        } finally {
+            JDBCUtil.safeClose(statement, resultSet);
+        }
+
+        return AvailabilityType.DOWN;
+    }
+
+    public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+        Map<String, Double> values = DatabaseQueryUtility.getNumericQueryValues(this, SQL_VALUES,
+                this.resourceContext.getResourceKey());
+        for (MeasurementScheduleRequest request : metrics) {
+            Double d = values.get(request.getName().toUpperCase(Locale.US));
+            if (d != null) {
+                report.addData(new MeasurementDataNumeric(request, d));
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
index 8ef56cb..d8606e1 100644
--- a/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
@@ -610,14 +610,31 @@
             <c:simple-property name="description" default="Oracle Tablespace"/>
          </plugin-configuration>
 
-         <!-- Space used in the tablespace (database blocks) -->
          <metric property="usedSpace" displayName="Used Space" description="Space used in the tablespace (database blocks)" displayType="summary"/>
-         <!-- Total size of the tablespace (database blocks) -->
          <metric property="totalSize" displayName="Total Size" description="Total size of the tablespace (database blocks)" displayType="summary"/>
-         <!-- Percentage of the tablespace used -->
          <metric property="usedPercent" displayName="Used Percent" description="Percentage of the tablespace used" displayType="summary" units="percentage"/>
 
       </service>
+      
+      <service name="Oracle Flash Recovery Areas"
+         discovery="org.rhq.plugins.database.CustomTableRowDiscoveryComponent"
+         class="org.rhq.plugins.oracle.OracleFlashRecoveryAreaComponent">
+
+         <plugin-configuration>
+            <c:simple-property name="table" default="V$RECOVERY_FILE_DEST"/>
+            <c:simple-property name="metricQuery" default="SELECT {key} FROM V$RECOVERY_FILE_DEST"/>
+            <c:simple-property name="keyColumn" default="name"/>
+            <c:simple-property name="name" default="{key}"/>
+            <c:simple-property name="description" default="Oracle Flash Recovery Areas"/>
+         </plugin-configuration>
+
+         <metric property="spaceLimit" displayName="Space Limit" description="Flash Recovery Area space limit (database blocks)" displayType="summary"/>
+         <metric property="spaceUsed" displayName="Space Used" description="Space used in the Flash Recovery Area (database blocks)" displayType="summary"/>
+         <metric property="spaceReclaimable" displayName="Space Reclaimable" description="Space reclaimable in the Flash Recovery Area (database blocks)" displayType="summary"/>
+         <metric property="numberOfFiles" displayName="Number Of Files" description="Number of files in the Flash Recovery Area" displayType="summary"/>
+         <metric property="usedPercent" displayName="Used Percent" description="Percentage of the Flash Recovery Area used" displayType="summary" units="percentage"/>
+
+      </service>
 
    </server>
 


commit d9b912412eb4da78f6b2cd1b5d969eb4b80d419d
Author: Richard Hensman <richard at onevisionconsulting.co.uk>
Date:   Wed Jul 18 15:09:10 2012 +0100

    Add support for monitoring table spaces to the Oracle plugin

diff --git a/modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleTablespaceComponent.java b/modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleTablespaceComponent.java
new file mode 100644
index 0000000..e99787b
--- /dev/null
+++ b/modules/plugins/oracle/src/main/java/org/rhq/plugins/oracle/OracleTablespaceComponent.java
@@ -0,0 +1,83 @@
+/*
+ * 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.plugins.oracle;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+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.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.util.jdbc.JDBCUtil;
+import org.rhq.plugins.database.AbstractDatabaseComponent;
+import org.rhq.plugins.database.DatabaseQueryUtility;
+
+/**
+ * Oracle Tablespace Component.
+ * 
+ * @author Richard Hensman
+ */
+public class OracleTablespaceComponent extends AbstractDatabaseComponent implements MeasurementFacet {
+
+    private static final String SQL_AVAILABLE = "SELECT COUNT(*) FROM dba_tablespaces WHERE tablespace_name = ?";
+    private static final String SQL_VALUES =
+        "SELECT USED_SPACE usedSpace, TABLESPACE_SIZE totalSize, (USED_PERCENT/100) usedPercent " +
+        "FROM dba_tablespace_usage_metrics where tablespace_name = ?";
+
+
+    private static Log log = LogFactory.getLog(OracleTablespaceComponent.class);
+
+    public AvailabilityType getAvailability() {
+        PreparedStatement statement = null;
+        ResultSet resultSet = null;
+        try {
+            statement = getConnection().prepareStatement(SQL_AVAILABLE);
+            statement.setString(1, this.resourceContext.getResourceKey());
+            resultSet = statement.executeQuery();
+            if (resultSet.next() && (resultSet.getInt(1) == 1)) {
+                return AvailabilityType.UP;
+            }
+        } catch (SQLException e) {
+            log.debug("unable to query", e);
+        } finally {
+            JDBCUtil.safeClose(statement, resultSet);
+        }
+
+        return AvailabilityType.DOWN;
+    }
+
+    public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+        Map<String, Double> values = DatabaseQueryUtility.getNumericQueryValues(this, SQL_VALUES,
+                this.resourceContext.getResourceKey());
+        for (MeasurementScheduleRequest request : metrics) {
+            Double d = values.get(request.getName().toUpperCase(Locale.US));
+            if (d != null) {
+                report.addData(new MeasurementDataNumeric(request, d));
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
index 00f0284..8ef56cb 100644
--- a/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
@@ -593,8 +593,29 @@
             <c:simple-property name="description" default="Oracle User"/>
          </plugin-configuration>
 
-          <metric property="connections" displayName="Total Connections" displayType="summary"/>
-          <metric property="active" displayName="Active Connections" displayType="summary"/>
+         <metric property="connections" displayName="Total Connections" displayType="summary"/>
+         <metric property="active" displayName="Active Connections" displayType="summary"/>
+
+      </service>
+
+      <service name="Oracle Tablespaces"
+         discovery="org.rhq.plugins.database.CustomTableRowDiscoveryComponent"
+         class="org.rhq.plugins.oracle.OracleTablespaceComponent">
+
+         <plugin-configuration>
+            <c:simple-property name="table" default="DBA_TABLESPACES"/>
+            <c:simple-property name="metricQuery" default="SELECT {key} FROM DBA_TABLESPACES"/>
+            <c:simple-property name="keyColumn" default="tablespace_name"/>
+            <c:simple-property name="name" default="{key}"/>
+            <c:simple-property name="description" default="Oracle Tablespace"/>
+         </plugin-configuration>
+
+         <!-- Space used in the tablespace (database blocks) -->
+         <metric property="usedSpace" displayName="Used Space" description="Space used in the tablespace (database blocks)" displayType="summary"/>
+         <!-- Total size of the tablespace (database blocks) -->
+         <metric property="totalSize" displayName="Total Size" description="Total size of the tablespace (database blocks)" displayType="summary"/>
+         <!-- Percentage of the tablespace used -->
+         <metric property="usedPercent" displayName="Used Percent" description="Percentage of the tablespace used" displayType="summary" units="percentage"/>
 
       </service>
 


commit 9eaed9d9df2554c6b14e0da635fc528475dc323c
Author: John Sanda <jsanda at redhat.com>
Date:   Mon Aug 6 12:38:46 2012 -0400

    [BZ 838861] Handle empty zip file on java 7
    
    Since an exception is not thrown when closing a ZipOutputStream on an
    empty zip file in Java 7, I have added logic to check whether or not the
    zip file has any content. sendChangeSetContentToServer is called only if
    the content file is non-empty. The logging logic has been updated as
    well so that we only log an error message when failing to close the
    output stream only when the content file is non-empty. This keeps the
    logging clean and consistent across Java 6 and 7.

diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java
index 59d3054..266b666 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java
@@ -1,20 +1,25 @@
 package org.rhq.core.pc.drift;
 
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 import org.rhq.common.drift.ChangeSetReader;
 import org.rhq.common.drift.FileEntry;
 import org.rhq.common.drift.Headers;
 import org.rhq.core.domain.drift.DriftFile;
 import org.rhq.core.util.stream.StreamUtil;
 
-import java.io.*;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
 public class DriftFilesSender implements Runnable {
 
     private Log log = LogFactory.getLog(DriftFilesSender.class);
@@ -52,6 +57,7 @@ public class DriftFilesSender implements Runnable {
     @Override
     public void run() {
         ZipOutputStream stream = null;
+        int numContentFiles = 0;
         try {
             if (log.isInfoEnabled()) {
                 log.info("Preparing to send content to server for " + defToString());
@@ -89,6 +95,7 @@ public class DriftFilesSender implements Runnable {
                         log.debug("Adding " + file.getPath() + " to " + contentFileName);
                     }
                     addFileToContentZipFile(stream, driftFile, file);
+                    ++numContentFiles;
                 }
             } else {
                 Map<String, FileEntry> fileEntries = createSnapshotIndex();
@@ -106,15 +113,18 @@ public class DriftFilesSender implements Runnable {
                             log.debug("Adding " + file.getPath() + " to " + contentFileName);
                         }
                         addFileToContentZipFile(stream, driftFile, file);
+                        ++numContentFiles;
                     }
                 }
             }
 
+            if (numContentFiles > 0) {
+                driftClient.sendChangeSetContentToServer(resourceId, headers.getDriftDefinitionName(), zipFile);
+            }
+
             stream.close();
             stream = null;
 
-            driftClient.sendChangeSetContentToServer(resourceId, headers.getDriftDefinitionName(), zipFile);
-
             if (log.isInfoEnabled()) {
                 long endTime = System.currentTimeMillis();
                 log.info("Finished submitting request to send content to server in " + (endTime - startTime) +
@@ -122,7 +132,19 @@ public class DriftFilesSender implements Runnable {
             }
 
         } catch (IOException e) {
-            log.error("Failed to send drift files.", e);
+            if (numContentFiles > 0) {
+                // Only log an error message if the content zip file is not empty. With
+                // Java 6, closing an empty ZipOutputStream causes an exception which we
+                // can ignore. On Java 7 however, no exception is thrown when closing an
+                // empty ZipOutputStream. This check keeps the error reporting logic
+                // consistent across Java 6 and 7 such that we only log an error message
+                // when we fail to close the output stream when the content zip file is
+                // not empty. See https://bugzilla.redhat.com/show_bug.cgi?id=838681 for
+                // more info.
+                //
+                // jsanda
+                log.error("Failed to send drift files.", e);
+            }
         } finally {
             if (stream != null) {
                 try {


commit 8cc6f70d479c30abbb9ce2d55a9b8c2174d6fbab
Author: mtho11 <mikecthompson at gmail.com>
Date:   Fri Aug 3 15:02:56 2012 -0700

    [BZ 826224 Creation of Compatible Group fails with value too long for type character when a description is entered which is longer then 100 characters] Group names limited now to 100 chars to match DB.

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java
index ee49f4e..143c159 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupCreateStep.java
@@ -75,6 +75,7 @@ public class GroupCreateStep extends AbstractWizardStep {
             TextItem name = new TextItem("name", MSG.common_title_name());
             name.setRequired(true);
             name.setWidth(300);
+            name.setLength(100);
             name.addChangedHandler(new ChangedHandler() {
                 @Override
                 public void onChanged(ChangedEvent changedEvent) {


commit bf2c62949e5ae74ea35aaed6499640765a86577d
Author: Mike Thompson <mithomps at redhat.com>
Date:   Fri Aug 3 07:28:36 2012 -0700

    [BZ 841045 advisoryInfo-plain.xhtml is missing parameters on the repo-plain.xhtml link] applied patch from jlivings.

diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/advisoryInfo-plain.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/advisoryInfo-plain.xhtml
index c672d16..7590610 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/advisoryInfo-plain.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/advisoryInfo-plain.xhtml
@@ -24,7 +24,10 @@
    <ui:define name="breadcrumbs">
       <h:outputLink value="listContentProviders-plain.xhtml">
          ${msg["contentprovider.list.breadcrumb"]}
+         <f:param name="mode" value="view" />
+         <f:param name="id" value="#{param.id}" />
       </h:outputLink>
+
       &gt;
       <h:outputLink value="repo-plain.xhtml">
          ${msg["repo.list.breadcrumb"]}




More information about the rhq-commits mailing list