modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
| 32 +
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/composite/ResourceGroupComposite.java
| 225 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
| 82 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupConfigurationUpdatesPortlet.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupOperationsPortlet.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
| 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
| 55 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
| 36 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/GeneralProperties.java
| 23 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
| 10
modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_16.png
|binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_24.png
|binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_16.png
|binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_24.png
|binary
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ResourceGroupUIBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
| 7
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
| 17
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
| 128 +++--
18 files changed, 399 insertions(+), 228 deletions(-)
New commits:
commit daec885053b6679e4bb6a80c7c8dc86c75868a4b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 30 16:01:50 2012 -0400
[Bug 807671 - Count of number of children and descendants in compatible group list
view goes wrong if a member resource is disabled]
The first pass at handling group avail given the latest avail changes
tried to maintain the old mechanism for determining the group avail. This
ended up not covering all of the cases. So, the double/ratio approach has
been completely scrapped and the mechanism now full incorporates
disabled group members. Now:
- group list views include a disabled member count and icon (note, the count columns
are not 50% wider to accommodate).
- new group avail icons and badged group icons have been put in place for disabled
- group availability is now determined differenty, see
http://rhq-project.org/display/RHQ/Design-Availability+Checking#Design-Av...
for details.
- group composite queries incur a slight perf hit as they now return two
additional counts (although they are no longer called on to perform AVG functions).
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
index dcc3740..00ea27b 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
@@ -238,7 +238,7 @@ public class ResourceGroup extends Group {
public static final String QUERY_NATIVE_FIND_FILTERED_MEMBER = "" //
+ " SELECT "
- + " ( SELECT COUNT(eresAvail.ID) " // the count of all
explicit members
+ + " ( SELECT COUNT(eresAvail.ID) " // total explicit
members
+ " FROM rhq_resource_avail eresAvail "
+ " INNER JOIN rhq_resource eres "
+ " ON eresAvail.resource_id = eres.id "
@@ -247,17 +247,27 @@ public class ResourceGroup extends Group {
+ " WHERE expMap.resource_group_id = rg.id "
+ " ) as explicitCount, "
+ "" //
- + " ( SELECT COUNT(eresAvail.ID) " // the count of UP
explicit members
+ + " ( SELECT COUNT(eresAvail.ID) " // DOWN explicit
members
+ " FROM rhq_resource_avail eresAvail "
+ " INNER JOIN rhq_resource eres "
+ " ON eresAvail.resource_id = eres.id "
+ " INNER JOIN rhq_resource_group_res_exp_map expMap "
+ " ON eres.id = expMap.resource_id "
+ " WHERE expMap.resource_group_id = rg.id "
- + " AND eresAvail.availability_type = 1 "
+ + " AND eresAvail.availability_type = 0 "
+ " ) as explicitAvail, "
+ "" //
- + " ( SELECT COUNT(iresAvail.ID) " // the count of all
implicit members
+ + " ( SELECT COUNT(eresAvail.ID) " // DISABLED
explicit members
+ + " FROM rhq_resource_avail eresAvail "
+ + " INNER JOIN rhq_resource eres "
+ + " ON eresAvail.resource_id = eres.id "
+ + " INNER JOIN rhq_resource_group_res_exp_map expMap "
+ + " ON eres.id = expMap.resource_id "
+ + " WHERE expMap.resource_group_id = rg.id "
+ + " AND eresAvail.availability_type = 3 "
+ + " ) as explicitAvail, "
+ + "" //
+ + " ( SELECT COUNT(iresAvail.ID) " // total implicit
members
+ " FROM rhq_resource_avail iresAvail "
+ " INNER JOIN rhq_resource ires "
+ " ON iresAvail.resource_id = ires.id "
@@ -266,14 +276,24 @@ public class ResourceGroup extends Group {
+ " WHERE impMap.resource_group_id = rg.id "
+ " ) as implicitCount, "
+ "" //
- + " ( SELECT COUNT(iresAvail.ID) " // the count of UP
implicit members
+ + " ( SELECT COUNT(iresAvail.ID) " // DOWN implicit
members
+ + " FROM rhq_resource_avail iresAvail "
+ + " INNER JOIN rhq_resource ires "
+ + " ON iresAvail.resource_id = ires.id "
+ + " INNER JOIN rhq_resource_group_res_imp_map impMap "
+ + " ON ires.id = impMap.resource_id "
+ + " WHERE impMap.resource_group_id = rg.id "
+ + " AND iresAvail.availability_type = 0 "
+ + " ) as implicitAvail, "
+ + "" //
+ + " ( SELECT COUNT(iresAvail.ID) " // DISABLED
implicit members
+ " FROM rhq_resource_avail iresAvail "
+ " INNER JOIN rhq_resource ires "
+ " ON iresAvail.resource_id = ires.id "
+ " INNER JOIN rhq_resource_group_res_imp_map impMap "
+ " ON ires.id = impMap.resource_id "
+ " WHERE impMap.resource_group_id = rg.id "
- + " AND iresAvail.availability_type = 1 "
+ + " AND iresAvail.availability_type = 3 "
+ " ) as implicitAvail, "
+ "" //
+ " rg.id as groupId, "
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/composite/ResourceGroupComposite.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/composite/ResourceGroupComposite.java
index 3906d4e..85a3fab 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/composite/ResourceGroupComposite.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/composite/ResourceGroupComposite.java
@@ -32,25 +32,28 @@ import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
/**
- * @author Greg Hinkle
+ * @author Jay Shaughnessy
* @author Ian Springer
- * @author Joseph Marques
*/
public class ResourceGroupComposite implements Serializable {
+ public enum GroupAvailabilityType {
+ EMPTY, UP, DOWN, WARN, DISABLED
+ };
+
private static final long serialVersionUID = 1L;
////JAXB Needs no args constructor and final fields make that difficult.
- private Double implicitAvail;
- private Double explicitAvail;
private ResourceGroup resourceGroup;
private GroupCategory category;
- private long implicitUp;
+ private long implicitCount;
private long implicitDown;
- private long explicitUp;
+ private long implicitDisabled;
+ private long explicitCount;
private long explicitDown;
+ private long explicitDisabled;
private ResourceFacets resourceFacets;
@@ -61,63 +64,46 @@ public class ResourceGroupComposite implements Serializable {
public ResourceGroupComposite() {
}
- public ResourceGroupComposite(Long explicitUp, Long explicitDown, Long implicitUp,
Long implicitDown,
- ResourceGroup resourceGroup) {
- this(explicitUp + explicitDown, //
- (double) explicitUp / (explicitUp + explicitDown), //
- implicitUp + implicitDown, //
- (double) implicitUp / (implicitUp + implicitDown), //
- resourceGroup, null, new ResourcePermission());
- }
+ // Constructor used in Hibernate Query, see ResourceGroupManagerBean
+ public ResourceGroupComposite(Long explicitCount, Long explicitDown, Long
explicitDisabled, Long implicitCount,
+ Long implicitDown, Long implicitDisabled, ResourceGroup resourceGroup) {
- public ResourceGroupComposite(Long explicitCount, Double explicitAvailability, Long
implicitCount,
- Double implicitAvailability, ResourceGroup resourceGroup) {
- this(explicitCount, explicitAvailability, implicitCount, implicitAvailability,
resourceGroup, null,
- new ResourcePermission());
+ this(explicitCount, explicitDown, explicitDisabled, implicitCount, implicitDown,
implicitDisabled,
+ resourceGroup, null, new ResourcePermission());
}
- public ResourceGroupComposite(Long explicitCount, Double explicitAvailability, Long
implicitCount,
- Double implicitAvailability, ResourceGroup resourceGroup, Number measure, Number
inventory, Number control,
- Number alert, Number event, Number configureRead, Number configureWrite, Number
content,
+ // Constructor used in Hibernate Query, see ResourceGroupManagerBean
+ public ResourceGroupComposite(Long explicitCount, Long explicitDown, Long
explicitDisabled, Long implicitCount,
+ Long implicitDown, Long implicitDisabled, ResourceGroup resourceGroup, Number
measure, Number inventory,
+ Number control, Number alert, Number event, Number configureRead, Number
configureWrite, Number content,
Number createChildResources, Number deleteResources, Number drift) {
- this(explicitCount, explicitAvailability, implicitCount, implicitAvailability,
resourceGroup, null,
- new ResourcePermission(measure.intValue() > 0, inventory.intValue() >
0, control.intValue() > 0, alert
- .intValue() > 0, event.intValue() > 0, configureRead.intValue()
> 0, configureWrite.intValue() > 0,
- content.intValue() > 0, createChildResources.intValue() > 0,
deleteResources.intValue() > 0, drift
- .intValue() > 0));
+
+ this(explicitCount, explicitDown, explicitDisabled, implicitCount, implicitDown,
implicitDisabled,
+ resourceGroup, null, new ResourcePermission(measure.intValue() > 0,
inventory.intValue() > 0,
+ control.intValue() > 0, alert.intValue() > 0, event.intValue() >
0, configureRead.intValue() > 0,
+ configureWrite.intValue() > 0, content.intValue() > 0,
createChildResources.intValue() > 0,
+ deleteResources.intValue() > 0, drift.intValue() > 0));
}
- public ResourceGroupComposite(Long explicitCount, Double explicitAvailability, Long
implicitCount,
- Double implicitAvailability, ResourceGroup resourceGroup, ResourceFacets facets)
{
- this(explicitCount, explicitAvailability, implicitCount, implicitAvailability,
resourceGroup, facets,
- new ResourcePermission());
+ public ResourceGroupComposite(Long explicitCount, Long explicitDown, Long
explicitDisabled, Long implicitCount,
+ Long implicitDown, Long implicitDisabled, ResourceGroup resourceGroup,
ResourceFacets facets) {
+
+ this(explicitCount, explicitDown, explicitDisabled, implicitCount, implicitDown,
implicitDisabled,
+ resourceGroup, facets, new ResourcePermission());
}
// Private constructor that all public constructors delegate to
- public ResourceGroupComposite(Long explicitCount, Double explicitAvailability, Long
implicitCount,
- Double implicitAvailability, ResourceGroup resourceGroup, ResourceFacets facets,
ResourcePermission permissions) {
- long expCount = (explicitCount == null ? 0 : explicitCount);
- double expAvail = (explicitAvailability == null ? 0 : explicitAvailability);
- long impCount = (implicitCount == null ? 0 : implicitCount);
- double impAvail = (implicitAvailability == null ? 0 : implicitAvailability);
-
- explicitUp = Math.round(expCount * expAvail);
- explicitDown = expCount - explicitUp;
- if (explicitUp + explicitDown > 0) {
- // keep explicitAvail null if there are no explicit resources in the group
- explicitAvail = expAvail;
- } else {
- explicitAvail = null;
- }
+ public ResourceGroupComposite(Long explicitCount, Long explicitDown, Long
explicitDisabled, Long implicitCount,
+ Long implicitDown, Long implicitDisabled, ResourceGroup resourceGroup,
ResourceFacets facets,
+ ResourcePermission permissions) {
- implicitUp = Math.round(impCount * impAvail);
- implicitDown = impCount - implicitUp;
- if (implicitUp + implicitDown > 0) {
- // keep implicitAvail null if there are no implicit resources in the group
- implicitAvail = impAvail;
- } else {
- implicitAvail = null;
- }
+ this.implicitCount = implicitCount;
+ this.implicitDown = implicitDown;
+ this.implicitDisabled = implicitDisabled;
+
+ this.explicitCount = explicitCount;
+ this.explicitDown = explicitDown;
+ this.explicitDisabled = explicitDisabled;
this.resourceGroup = resourceGroup;
@@ -134,12 +120,36 @@ public class ResourceGroupComposite implements Serializable {
this.resourcePermission = permissions;
}
- public Double getImplicitAvail() {
- return this.implicitAvail;
+ public long getImplicitCount() {
+ return implicitCount;
}
- public Double getExplicitAvail() {
- return this.explicitAvail;
+ public long getImplicitDown() {
+ return implicitDown;
+ }
+
+ public long getImplicitDisabled() {
+ return implicitDisabled;
+ }
+
+ public long getImplicitUpAndUnknown() {
+ return implicitCount - implicitDown - implicitDisabled;
+ }
+
+ public long getExplicitCount() {
+ return explicitCount;
+ }
+
+ public long getExplicitDown() {
+ return explicitDown;
+ }
+
+ public long getExplicitDisabled() {
+ return explicitDisabled;
+ }
+
+ public long getExplicitUpAndUnknown() {
+ return explicitCount - explicitDown - explicitDisabled;
}
public ResourceGroup getResourceGroup() {
@@ -150,32 +160,60 @@ public class ResourceGroupComposite implements Serializable {
return this.category;
}
- public long getImplicitUp() {
- return this.implicitUp;
+ /**
+ * Returns the explicit group availability determined with the following algorithm,
evaluated top to bottom:
+ * <pre>
+ * empty group = EMPTY
+ * allDown = DOWN
+ * someDown = WARN
+ * someDisabled = DISABLED
+ * otherwise = UP (all members UP or UNKNOWN)
+ * </pre>
+ *
+ * @return the group availability type, null for an empty group
+ */
+ public GroupAvailabilityType getExplicitAvailabilityType() {
+ return getAvailabilityType(true);
}
- public long getImplicitDown() {
- return this.implicitDown;
+ /**
+ * Returns the implicit group availability determined with the following algorithm,
evaluated top to bottom:
+ * <pre>
+ * empty group = EMPTY
+ * allDown = DOWN
+ * someDown = WARN
+ * someDisabled = DISABLED
+ * otherwise = UP (all members UP or UNKNOWN)
+ * </pre>
+ *
+ * @return the group availability type, null for an empty group
+ */
+ public GroupAvailabilityType getImplicitAvailabilityType() {
+ return getAvailabilityType(false);
}
- public long getExplicitUp() {
- return this.explicitUp;
- }
+ private GroupAvailabilityType getAvailabilityType(boolean isExplicit) {
+ long count = isExplicit ? explicitCount : implicitCount;
+ long down = isExplicit ? explicitDown : implicitDown;
+ long disabled = isExplicit ? explicitDisabled : implicitDisabled;
- public long getExplicitDown() {
- return this.explicitDown;
- }
+ if (0 == count) {
+ return GroupAvailabilityType.EMPTY;
+ }
- // remove once the old UI is killed, for now this is still needed
- @Deprecated
- public String getExplicitFormatted() {
- return getAlignedAvailabilityResults(getExplicitUp(), getExplicitDown());
- }
+ if (down == count) {
+ return GroupAvailabilityType.DOWN;
+ }
- // remove once the old UI is killed, for now this is still needed
- @Deprecated
- public String getImplicitFormatted() {
- return getAlignedAvailabilityResults(getImplicitUp(), getImplicitDown());
+ if (down > 0) {
+ return GroupAvailabilityType.WARN;
+ }
+
+ if (disabled > 0) {
+ return GroupAvailabilityType.DISABLED;
+ }
+
+ return GroupAvailabilityType.UP;
}
@XmlTransient
@@ -207,10 +245,28 @@ public class ResourceGroupComposite implements Serializable {
// remove once the old UI is killed, for now this is still needed
@Deprecated
- private String getAlignedAvailabilityResults(long up, long down) {
+ public Double getExplicitAvail() {
+ return 0 == explicitCount ? null : (1.0 - (explicitDown / explicitCount));
+ }
+
+ // remove once the old UI is killed, for now this is still needed
+ @Deprecated
+ public String getExplicitFormatted() {
+ return getAlignedAvailabilityResults(getExplicitUpAndUnknown() +
getExplicitDisabled(), getExplicitDown());
+ }
+
+ // remove once the old UI is killed, for now this is still needed
+ @Deprecated
+ public String getImplicitFormatted() {
+ return getAlignedAvailabilityResults(getImplicitUpAndUnknown() +
getImplicitDisabled(), getImplicitDown());
+ }
+
+ // remove once the old UI is killed, for now this is still needed
+ @Deprecated
+ private String getAlignedAvailabilityResults(long up, long notUp) {
StringBuilder results = new StringBuilder();
results.append("<table width=\"120px\"><tr>");
- if (up == 0 && down == 0) {
+ if (up == 0 && notUp == 0) {
results.append(getColumn(false, "<img src=\""
+
"/coregui/images/subsystems/availability/availability_grey_16.png" +
"\" /> 0"));
results.append(getColumn(true));
@@ -221,13 +277,13 @@ public class ResourceGroupComposite implements Serializable {
+
"/coregui/images/subsystems/availability/availability_green_16.png" +
"\" />", up));
}
- if (up > 0 && down > 0) {
+ if (up > 0 && notUp > 0) {
results.append(getColumn(true)); // , " / ")); // use a
vertical separator image if we want a separator
}
- if (down > 0) {
+ if (notUp > 0) {
results.append(getColumn(false, " <img src=\""
- +
"/coregui/images/subsystems/availability/availability_red_16.png" +
"\" />", down));
+ +
"/coregui/images/subsystems/availability/availability_red_16.png" +
"\" />", notUp));
} else {
results.append(getColumn(false,
" <img
src=\"/coregui/images/blank.png\" width=\"16px\"
height=\"16px\" />"));
@@ -261,8 +317,9 @@ public class ResourceGroupComposite implements Serializable {
public String toString() {
return "ResourceGroupComposite[name="
+ this.resourceGroup.getName() //
- + ", implicit[up/down/avail=," + this.implicitUp + "/" +
this.implicitDown + "/" + this.implicitAvail + "]"
- + ", explicit[up/down/avail=," + this.explicitUp + "/" +
this.explicitDown + "/" + this.explicitAvail + "]"
- + ", facets=" + ((this.resourceFacets == null) ? "none" :
this.resourceFacets.getFacets()) + "]";
+ + ", implicit[count/down/disabled=," + this.implicitCount +
"/" + this.implicitDown + "/"
+ + this.implicitDisabled + "]" + ",
explicit[count/down/disabled=," + this.explicitCount + "/"
+ + this.explicitDown + "/" + this.explicitDisabled + "]" +
", facets="
+ + ((this.resourceFacets == null) ? "none" :
this.resourceFacets.getFacets()) + "]";
}
}
\ No newline at end of file
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
index 3aed726..f1be523 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ImageManager.java
@@ -14,6 +14,7 @@ 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.resource.group.GroupCategory;
+import
org.rhq.core.domain.resource.group.composite.ResourceGroupComposite.GroupAvailabilityType;
/**
* Provides an API to obtain links to images and icons, thus avoiding hardcoding image
URLs throughout client code.
@@ -281,40 +282,43 @@ public class ImageManager {
}
/**
- * Returns the group icon badged with availability icon. Avails is the
- * percentage of resources in the group that are UP. If avails is 0, it is
- * red (no resources are available), if it is 1, it is green (all resources
- * are available), if it is between 0 and 1, it is yellow.
- *
- * If avails is null, this means there are no resources in the group. In that
- * case, this method returns the "UP" badged icon.
- *
+ * Returns the group icon badged with availability icon. Group avail
+ * badging is determined in the following way, in order:
+ * allDown = red
+ * someDown = yellow
+ * someDisabled = orange
+ * otherwise = green
+ *
* @param groupType the type of group
- * @param avails percentage of resources that are UP
* @return the group badge icon
*/
- public static String getGroupIcon(GroupCategory groupType, Double avails) {
- return getGroupIcon(groupType, avails, "16");
+ public static String getGroupIcon(GroupCategory groupType, GroupAvailabilityType
groupAvailType) {
+ return getGroupIcon(groupType, groupAvailType, "16");
}
- public static String getGroupLargeIcon(GroupCategory groupType, Double avails) {
- return getGroupIcon(groupType, avails, "24");
+ /**
+ * @see #getGroupIcon(GroupCategory, GroupAvailabilityType)
+ */
+ public static String getGroupLargeIcon(GroupCategory groupType, GroupAvailabilityType
groupAvailType) {
+ return getGroupIcon(groupType, groupAvailType, "24");
}
- private static String getGroupIcon(GroupCategory groupType, Double avails, String
size) {
+ /**
+ * @see #getGroupIcon(GroupCategory, GroupAvailabilityType)
+ */
+ private static String getGroupIcon(GroupCategory groupType, GroupAvailabilityType
groupAvailType, String size) {
String category = groupType == GroupCategory.COMPATIBLE ? "Cluster" :
"Group";
- if (avails == null) {
+ switch (groupAvailType) {
+ case EMPTY:
return "types/" + category + "_up_" + size +
".png";
- }
-
- double val = avails.doubleValue();
-
- if (val == 0.0d) {
+ case DOWN:
return "types/" + category + "_down_" + size +
".png";
- } else if (val > 0.0d && val < 1.0d) {
+ case WARN:
return "types/" + category + "_warning_" + size +
".png";
- } else {
+ case DISABLED:
+ return "types/" + category + "_disabled_" + size +
".png";
+ default:
return "types/" + category + "_up_" + size +
".png";
}
}
@@ -368,28 +372,26 @@ public class ImageManager {
}
/**
- * Returns the large availability icon based on the given percentage.
- * Avails is the percentage of availabilities that are UP. If avails is 0, it is
- * red (nothing is available), if it is 1, it is green (everything is available),
- * if it is between 0 and 1, it is yellow.
- *
- * If avails is null, the icon will be the unknown/grey form.
- *
- * @param avails percentage of availabilities that are UP
- * @return the large availability icon
+ * Returns the large availability icon based on group availability. Determined in the
following way, in order:
+ * empty = grey
+ * allDown = red
+ * someDown = yellow
+ * someDisabled = orange
+ * otherwise = green
+ *
+ * @return the large avail icon
*/
- public static String getAvailabilityGroupLargeIcon(Double avails) {
- if (avails == null) {
+ public static String getAvailabilityGroupLargeIcon(GroupAvailabilityType
groupAvailType) {
+ switch (groupAvailType) {
+ case EMPTY:
return "subsystems/availability/availability_grey_24.png";
- }
-
- double val = avails.doubleValue();
-
- if (val == 0.0d) {
+ case DOWN:
return "subsystems/availability/availability_red_24.png";
- } else if (val > 0.0d && val < 1.0d) {
+ case WARN:
return "subsystems/availability/availability_yellow_24.png";
- } else {
+ case DISABLED:
+ return "subsystems/availability/availability_orange_24.png";
+ default:
return "subsystems/availability/availability_green_24.png";
}
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupConfigurationUpdatesPortlet.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupConfigurationUpdatesPortlet.java
index fe19915..e693f5c 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupConfigurationUpdatesPortlet.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupConfigurationUpdatesPortlet.java
@@ -325,7 +325,7 @@ public class GroupConfigurationUpdatesPortlet extends LocatableVLayout
implement
ResourceGroup emptyGroup = new ResourceGroup("");
emptyGroup.setId(-1);
Long zero = new Long(0);
- groupComposite = new ResourceGroupComposite(zero, zero, zero,
zero, emptyGroup);
+ groupComposite = new ResourceGroupComposite(zero, zero, zero,
zero, zero, zero, emptyGroup);
groupHistoryTable = new
GroupConfigurationHistoryCriteriaTable(extendLocatorId("Table"),
groupComposite);
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupOperationsPortlet.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupOperationsPortlet.java
index 7bb6d08..e8e7719 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupOperationsPortlet.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/groups/GroupOperationsPortlet.java
@@ -177,7 +177,7 @@ public class GroupOperationsPortlet extends LocatableVLayout
implements CustomSe
ResourceGroup emptyGroup = new ResourceGroup("");
emptyGroup.setId(-1);
Long zero = new Long(0);
- groupComposite = new ResourceGroupComposite(zero, zero, zero,
zero, emptyGroup);
+ groupComposite = new ResourceGroupComposite(zero, zero, zero,
zero, zero, zero, emptyGroup);
groupOperations = new
GroupOperationsCriteriaHistoryListView(locatorId,
new GroupOperationsCriteriaDataSource(portletConfig), null,
criteria, groupComposite);
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
index e2f37f6..5586f13 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
@@ -227,7 +227,8 @@ public class FavoritesButton extends LocatableIMenuButton {
MenuItem item = new MenuItem(String.valueOf(groupId));
item.setTitle(group.getName());
- item.setIcon(ImageManager.getGroupIcon(group.getGroupCategory(),
groupComposite.getImplicitAvail()));
+ item.setIcon(ImageManager.getGroupIcon(group.getGroupCategory(),
+ groupComposite.getImplicitAvailabilityType()));
item.addClickHandler(new
com.smartgwt.client.widgets.menu.events.ClickHandler() {
public void onClick(MenuItemClickEvent event) {
@@ -295,7 +296,8 @@ public class FavoritesButton extends LocatableIMenuButton {
MenuItem item = new MenuItem(String.valueOf(groupId));
item.setTitle(group.getName());
- item.setIcon(ImageManager.getGroupIcon(group.getGroupCategory(),
groupComposite.getImplicitAvail()));
+ item.setIcon(ImageManager.getGroupIcon(group.getGroupCategory(),
+ groupComposite.getImplicitAvailabilityType()));
item.addClickHandler(new
com.smartgwt.client.widgets.menu.events.ClickHandler() {
public void onClick(MenuItemClickEvent event) {
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
index bdf2cb1..d334cd7 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java
@@ -39,6 +39,7 @@ import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
+import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
@@ -162,13 +163,15 @@ public class ResourceGroupCompositeDataSource extends
RPCDataSource<ResourceGrou
rg.setResourceType(rt);
}
- Long explicitUp = Long.valueOf(from.getAttribute("explicitUp"));
+ Long explicitCount = Long.valueOf(from.getAttribute("explicitCount"));
Long explicitDown = Long.valueOf(from.getAttribute("explicitDown"));
- Long implicitUp = Long.valueOf(from.getAttribute("implicitUp"));
+ Long explicitDisabled =
Long.valueOf(from.getAttribute("explicitDisabled"));
+ Long implicitCount = Long.valueOf(from.getAttribute("implicitCount"));
Long implicitDown = Long.valueOf(from.getAttribute("implicitDown"));
+ Long implicitDisabled =
Long.valueOf(from.getAttribute("implicitDisabled"));
- ResourceGroupComposite composite = new ResourceGroupComposite(explicitUp,
explicitDown, implicitUp,
- implicitDown, rg);
+ ResourceGroupComposite composite = new ResourceGroupComposite(explicitCount,
explicitDown, explicitDisabled,
+ implicitCount, implicitDown, implicitDisabled, rg);
return composite;
}
@@ -182,10 +185,12 @@ public class ResourceGroupCompositeDataSource extends
RPCDataSource<ResourceGrou
record.setAttribute(DESCRIPTION.propertyName(),
from.getResourceGroup().getDescription());
record.setAttribute(CATEGORY.propertyName(),
from.getResourceGroup().getGroupCategory().name());
- record.setAttribute("explicitUp",
String.valueOf(from.getExplicitUp()));
+ record.setAttribute("explicitCount",
String.valueOf(from.getExplicitCount()));
record.setAttribute("explicitDown",
String.valueOf(from.getExplicitDown()));
- record.setAttribute("implicitUp",
String.valueOf(from.getImplicitUp()));
+ record.setAttribute("explicitDisabled",
String.valueOf(from.getExplicitDisabled()));
+ record.setAttribute("implicitCount",
String.valueOf(from.getImplicitCount()));
record.setAttribute("implicitDown",
String.valueOf(from.getImplicitDown()));
+ record.setAttribute("implicitDisabled",
String.valueOf(from.getImplicitDisabled()));
record.setAttribute(AVAIL_CHILDREN.propertyName(), getExplicitFormatted(from));
record.setAttribute(AVAIL_DESCENDANTS.propertyName(),
getImplicitFormatted(from));
@@ -200,36 +205,48 @@ public class ResourceGroupCompositeDataSource extends
RPCDataSource<ResourceGrou
}
private String getExplicitFormatted(ResourceGroupComposite from) {
- return getAlignedAvailabilityResults(from.getExplicitUp(),
from.getExplicitDown());
+ return getAlignedAvailabilityResults(from.getExplicitCount(),
from.getExplicitUpAndUnknown(),
+ from.getExplicitDown(), from.getExplicitDisabled());
}
private String getImplicitFormatted(ResourceGroupComposite from) {
- return getAlignedAvailabilityResults(from.getImplicitUp(),
from.getImplicitDown());
+ return getAlignedAvailabilityResults(from.getImplicitCount(),
from.getImplicitUpAndUnknown(),
+ from.getImplicitDown(), from.getImplicitDisabled());
}
- private String getAlignedAvailabilityResults(long up, long down) {
+ private String getAlignedAvailabilityResults(long total, long up, long down, long
disabled) {
StringBuilder results = new StringBuilder();
- results.append("<table width=\"120px\"><tr>");
- if (up == 0 && down == 0) {
+
+ results.append("<table width=\"180px\"><tr>");
+ if (0 == total) {
results.append(getColumn(false,
"<img src=\"" +
ImageManager.getFullImagePath(ImageManager.getAvailabilityIcon(null)) + "\"
/> 0"));
results.append(getColumn(true));
results.append(getColumn(false));
+
} else {
if (up > 0) {
+ String imagePath = ImageManager.getFullImagePath(ImageManager
+ .getAvailabilityIconFromAvailType(AvailabilityType.UP));
+ results.append(getColumn(false, " <img src=\"" +
imagePath + "\" />", up));
+ } else {
results.append(getColumn(false,
- " <img src=\"" +
ImageManager.getFullImagePath(ImageManager.getAvailabilityIcon(Boolean.TRUE))
- + "\" />", up));
- }
-
- if (up > 0 && down > 0) {
- results.append(getColumn(true)); // , " / ")); // use a
vertical separator image if we want a separator
+ " <img src=\"/images/blank.png\"
width=\"16px\" height=\"16px\" />"));
}
if (down > 0) {
+ String imagePath = ImageManager.getFullImagePath(ImageManager
+ .getAvailabilityIconFromAvailType(AvailabilityType.DOWN));
+ results.append(getColumn(false, " <img src=\"" +
imagePath + "\" />", down));
+ } else {
results.append(getColumn(false,
- " <img src=\"" +
ImageManager.getFullImagePath(ImageManager.getAvailabilityIcon(Boolean.FALSE))
- + "\" />", down));
+ " <img src=\"/images/blank.png\"
width=\"16px\" height=\"16px\" />"));
+ }
+
+ if (disabled > 0) {
+ String imagePath = ImageManager.getFullImagePath(ImageManager
+ .getAvailabilityIconFromAvailType(AvailabilityType.DISABLED));
+ results.append(getColumn(false, " <img src=\"" +
imagePath + "\" />", disabled));
} else {
results.append(getColumn(false,
" <img src=\"/images/blank.png\"
width=\"16px\" height=\"16px\" />"));
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
index 77bf39a..6b1a9a9 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
@@ -18,11 +18,29 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.groups;
+import static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.AVAIL_CHILDREN;
+import static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.AVAIL_DESCENDANTS;
+import static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.CATEGORY;
+import static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.DESCRIPTION;
+import static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.NAME;
+import static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.PLUGIN;
+import static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.TYPE;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.widgets.events.*;
-import com.smartgwt.client.widgets.grid.*;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.events.CloseClickEvent;
+import com.smartgwt.client.widgets.events.CloseClickHandler;
+import com.smartgwt.client.widgets.events.DoubleClickEvent;
+import com.smartgwt.client.widgets.events.DoubleClickHandler;
+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.resource.group.GroupCategory;
import org.rhq.core.domain.search.SearchSubsystem;
@@ -30,7 +48,11 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.PopupWindow;
-import org.rhq.enterprise.gui.coregui.client.components.table.*;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.AuthorizedTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.IconField;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.wizard.GroupCreateWizard;
@@ -39,8 +61,6 @@ 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 static
org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupDataSourceField.*;
-
/**
* @author Greg Hinkle
* @author Joseph Marques
@@ -74,7 +94,7 @@ public class ResourceGroupListView extends
Table<ResourceGroupCompositeDataSourc
setDataSource(datasource);
}
- public ResourceGroupListView(String locatorId, Criteria criteria ){
+ public ResourceGroupListView(String locatorId, Criteria criteria) {
super(locatorId, null, criteria);
final ResourceGroupCompositeDataSource datasource =
ResourceGroupCompositeDataSource.getInstance();
@@ -144,14 +164,14 @@ public class ResourceGroupListView extends
Table<ResourceGroupCompositeDataSourc
pluginNameField.setWidth("8%");
ListGridField availabilityChildrenField = new
ListGridField(AVAIL_CHILDREN.propertyName(),
- AVAIL_CHILDREN.title(), 110); // 110 due to the html in
ResourceGroupCompositeDataSource.getAlignedAvailabilityResults
+ AVAIL_CHILDREN.title(), 170); // 170 due to the html in
ResourceGroupCompositeDataSource.getAlignedAvailabilityResults
availabilityChildrenField.setCanSortClientOnly(true);
availabilityChildrenField.setCanGroupBy(false);
availabilityChildrenField.setWrap(false);
availabilityChildrenField.setAlign(Alignment.CENTER);
ListGridField availabilityDescendantsField = new
ListGridField(AVAIL_DESCENDANTS.propertyName(),
- AVAIL_DESCENDANTS.title(), 110); // 110 due to the html in
ResourceGroupCompositeDataSource.getAlignedAvailabilityResults
+ AVAIL_DESCENDANTS.title(), 170); // 110 due to the html in
ResourceGroupCompositeDataSource.getAlignedAvailabilityResults
availabilityDescendantsField.setCanSortClientOnly(true);
availabilityDescendantsField.setCanGroupBy(false);
availabilityDescendantsField.setWrap(false);
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/GeneralProperties.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/GeneralProperties.java
index 472d7f8..af036ac 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/GeneralProperties.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/GeneralProperties.java
@@ -18,12 +18,16 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail;
+import java.util.ArrayList;
+import java.util.List;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.layout.HLayout;
+
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.GroupDefinition;
import org.rhq.core.domain.resource.group.ResourceGroup;
@@ -42,9 +46,6 @@ import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* A canvas that shows basic information/properties on a specific group.
*
@@ -58,7 +59,7 @@ public class GeneralProperties extends LocatableVLayout {
private boolean isAutoGroup;
public GeneralProperties(String locatorId, ResourceGroupComposite groupComposite,
ResourceGroupTitleBar titleBar,
- boolean isAutoGroup) {
+ boolean isAutoGroup) {
super(locatorId);
this.groupComposite = groupComposite;
this.titleBar = titleBar;
@@ -114,8 +115,8 @@ public class GeneralProperties extends LocatableVLayout {
titleBar.displayGroupName(newName);
CoreGUI.getMessageCenter().notify(
- new
Message(MSG.view_group_summary_nameUpdateSuccessful(String.valueOf(group
- .getId()), oldName, newName),
Message.Severity.Info));
+ new
Message(MSG.view_group_summary_nameUpdateSuccessful(
+ String.valueOf(group.getId()), oldName, newName),
Message.Severity.Info));
}
});
}
@@ -147,7 +148,7 @@ public class GeneralProperties extends LocatableVLayout {
formItems.add(typeItem);
StaticTextItem countItem = new StaticTextItem("memberCount",
MSG.view_group_summary_memberCount());
- long memberCount = this.groupComposite.getImplicitUp() +
this.groupComposite.getImplicitDown();
+ long memberCount = this.groupComposite.getImplicitCount();
countItem.setValue(memberCount);
formItems.add(countItem);
@@ -201,8 +202,8 @@ public class GeneralProperties extends LocatableVLayout {
FormItem recursiveItem;
if (isEditable) {
- CheckboxEditableFormItem editableRecursiveItem = new
CheckboxEditableFormItem("recursive", MSG
- .view_group_summary_recursive());
+ CheckboxEditableFormItem editableRecursiveItem = new
CheckboxEditableFormItem("recursive",
+ MSG.view_group_summary_recursive());
editableRecursiveItem.setValueEditedHandler(new ValueEditedHandler() {
public void editedValue(Object newValue) {
boolean isRecursive = ((newValue != null) && (Boolean)
newValue);
@@ -239,8 +240,8 @@ public class GeneralProperties extends LocatableVLayout {
formItems.add(lastModifiedByItem);
if (isDynaGroup) {
- StaticTextItem groupDefinitionItem = new
StaticTextItem("groupDefinition", MSG
- .view_group_summary_groupDefinition());
+ StaticTextItem groupDefinitionItem = new
StaticTextItem("groupDefinition",
+ MSG.view_group_summary_groupDefinition());
GroupDefinition groupDefinition = group.getGroupDefinition();
String groupDefinitionUrl =
LinkManager.getGroupDefinitionLink(groupDefinition.getId());
String groupDefinitionName =
StringUtility.escapeHtml(groupDefinition.getName());
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
index 669da75..b423670 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
@@ -35,6 +35,7 @@ import org.rhq.core.domain.criteria.ResourceGroupCriteria;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
+import
org.rhq.core.domain.resource.group.composite.ResourceGroupComposite.GroupAvailabilityType;
import org.rhq.core.domain.tagging.Tag;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
@@ -270,10 +271,11 @@ public class ResourceGroupTitleBar extends LocatableVLayout {
this.title.markForRedraw();
}
- private void setGroupIcons(ResourceGroupComposite groupComposite) {
- Double avails = groupComposite.getExplicitAvail();
- this.badge.setSrc(ImageManager.getGroupLargeIcon(this.group.getGroupCategory(),
avails));
-
this.availabilityImage.setSrc(ImageManager.getAvailabilityGroupLargeIcon(avails));
+ private void setGroupIcons(ResourceGroupComposite composite) {
+ GroupAvailabilityType groupAvailType = composite.getExplicitAvailabilityType();
+
+ this.badge.setSrc(ImageManager.getGroupLargeIcon(this.group.getGroupCategory(),
groupAvailType));
+
this.availabilityImage.setSrc(ImageManager.getAvailabilityGroupLargeIcon(groupAvailType));
}
private void updateFavoriteButton() {
diff --git
a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_16.png
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_16.png
new file mode 100644
index 0000000..9b4c638
Binary files /dev/null and
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_16.png
differ
diff --git
a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_24.png
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_24.png
new file mode 100644
index 0000000..b7a173a
Binary files /dev/null and
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Cluster_disabled_24.png
differ
diff --git
a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_16.png
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_16.png
new file mode 100644
index 0000000..6843f68
Binary files /dev/null and
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_16.png
differ
diff --git
a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_24.png
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_24.png
new file mode 100644
index 0000000..cce9b4b
Binary files /dev/null and
b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Group_disabled_24.png
differ
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ResourceGroupUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ResourceGroupUIBean.java
index b2cda55..9ad5969 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ResourceGroupUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/group/ResourceGroupUIBean.java
@@ -67,7 +67,7 @@ public class ResourceGroupUIBean {
public ResourceGroupUIBean(ResourceGroupComposite resourceGroupComposite, Subject
subject) {
this.resourceGroup = resourceGroupComposite.getResourceGroup();
- this.upCount = resourceGroupComposite.getExplicitUp();
+ this.upCount = resourceGroupComposite.getExplicitUpAndUnknown();
this.downCount = resourceGroupComposite.getExplicitDown();
this.count = upCount + downCount;
this.availability = resourceGroupComposite.getExplicitAvail();
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index d29eaac..8c37ac4 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -87,7 +87,6 @@ import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
-import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceError;
@@ -625,13 +624,11 @@ public class ConfigurationManagerBean implements
ConfigurationManagerLocal, Conf
ResourceGroupComposite groupComposite =
this.resourceGroupManager.getResourceGroupComposite(subject, groupId);
// if the group is empty (has no members) the availability will be null
- if (groupComposite.getExplicitAvail() == null) {
+ if (0 == groupComposite.getExplicitCount()) {
return new HashMap<Integer, Configuration>();
}
- AvailabilityType availability = (groupComposite.getExplicitAvail() == 1) ?
AvailabilityType.UP
- : AvailabilityType.DOWN;
- if (availability == AvailabilityType.DOWN)
+ if (groupComposite.getExplicitDown() > 0)
throw new Exception("Current group Resource configuration for " +
groupId
+ " cannot be calculated, because one or more of this group's
member Resources are DOWN.");
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
index 75894ad..cd710ac 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
@@ -400,9 +400,20 @@ public class AvailabilityManagerBean implements
AvailabilityManagerLocal, Availa
} else if (context.type == EntityContext.Type.ResourceGroup) {
ResourceGroupComposite composite =
resourceGroupManager.getResourceGroupComposite(subject,
context.groupId);
- Double firstAvailability = composite.getExplicitAvail();
- newFirstAvailabilityType = firstAvailability == null ? null
- : (firstAvailability == 1.0 ? AvailabilityType.UP :
AvailabilityType.DOWN);
+ switch (composite.getExplicitAvailabilityType()) {
+ case EMPTY:
+ newFirstAvailabilityType = null;
+ break;
+ case DOWN:
+ case WARN:
+ newFirstAvailabilityType = AvailabilityType.DOWN;
+ break;
+ case DISABLED:
+ newFirstAvailabilityType = AvailabilityType.DISABLED;
+ break;
+ default:
+ newFirstAvailabilityType = AvailabilityType.UP;
+ }
} else {
// March 20, 2009: we only support the "summary area" for
resources and resourceGroups to date
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 d808969..e3e243e 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
@@ -241,6 +241,15 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
clearImplicitResources(groupId);
makeImplicitMirrorExplicit(groupId);
}
+
+ if (updateMembership) {
+ try {
+ setResourceType(groupId);
+ } catch (ResourceGroupDeleteException e) {
+ throw new ResourceGroupNotFoundException(e.getMessage());
+ }
+ }
+
return newlyAttachedGroup;
}
@@ -433,6 +442,11 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void addResourcesToGroup(Subject subject, int groupId, int[] resourceIds) {
+
+ addResourcesToGroup(subject, groupId, resourceIds, true);
+ }
+
+ private void addResourcesToGroup(Subject subject, int groupId, int[] resourceIds,
boolean setType) {
Integer[] ids = ArrayUtils.wrapInArray(resourceIds);
if (ids == null || ids.length == 0) {
return;
@@ -448,6 +462,14 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
addResourcesToGroupImplicit(subject, groupId, batchIds, true, isRecursive);
addResourcesToGroupExplicit(subject, groupId, batchIds, isRecursive);
}
+
+ if (setType) {
+ try {
+ setResourceType(groupId);
+ } catch (ResourceGroupDeleteException e) {
+ throw new ResourceGroupNotFoundException(e.getMessage());
+ }
+ }
}
private void addResourcesToGroupExplicit(Subject subject, Integer groupId,
List<Integer> resourceIds,
@@ -571,6 +593,11 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void removeResourcesFromGroup(Subject subject, int groupId, int[] resourceIds)
{
+
+ removeResourcesFromGroup(subject, groupId, resourceIds, true);
+ }
+
+ private void removeResourcesFromGroup(Subject subject, int groupId, int[]
resourceIds, boolean setType) {
Integer[] ids = ArrayUtils.wrapInArray(resourceIds);
if (ids == null || ids.length == 0) {
return;
@@ -584,6 +611,14 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
removeResourcesFromGroup_helper(subject, groupId, batchIdArray,
isRecursive);
}
+
+ if (setType) {
+ try {
+ setResourceType(groupId);
+ } catch (ResourceGroupDeleteException e) {
+ throw new ResourceGroupNotFoundException(e.getMessage());
+ }
+ }
}
private void removeResourcesFromGroup_helper(Subject subject, Integer groupId,
Integer[] resourceIds,
@@ -1156,18 +1191,14 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
try {
while (rs.next()) {
long explicitCount = rs.getLong(1);
- long explicitUpCount = rs.getLong(2);
- //double explicitAvail = rs.getDouble(2);
- long implicitCount = rs.getLong(3);
- long implicitUpCount = rs.getLong(4);
- //double implicitAvail = rs.getDouble(4);
- // In the past we had only DOWN/0 and UP/1 avails/ordinal and and the
avails were just averages.
- // Now we have DISABLED and UNKNOWN. So group avail is done
differently, instead of an indication
- // of UP vs DOWN it is now UP vs NOT UP (not up is every other
avail).
- double explicitAvail = (explicitCount > 0) ? (explicitUpCount /
explicitCount) : 0D;
- double implicitAvail = (implicitCount > 0) ? (implicitUpCount /
implicitCount) : 0D;
+ long explicitDown = rs.getLong(2);
+ long explicitDisabled = rs.getLong(3);
+ long implicitCount = rs.getLong(4);
+ long implicitDown = rs.getLong(5);
+ long implicitDisabled = rs.getLong(6);
int groupKey = rs.getInt(5);
- Object[] next = new Object[] { explicitCount, explicitAvail,
implicitCount, implicitAvail, groupKey };
+ Object[] next = new Object[] { explicitCount, explicitDown,
explicitDisabled, implicitCount,
+ implicitDown, implicitDisabled, groupKey };
rawResults.add(next);
}
} finally {
@@ -1208,9 +1239,11 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
int i = 0;
for (Object[] row : rawResults) {
long explicitCount = (Long) row[0];
- double explicitAvail = (Double) row[1];
- long implicitCount = (Long) row[2];
- double implicitAvail = (Double) row[3];
+ long explicitDown = (Long) row[1];
+ long explicitDisabled = (Long) row[2];
+ long implicitCount = (Long) row[3];
+ long implicitDown = (Long) row[4];
+ long implicitDisabled = (Long) row[5];
ResourceGroup group = groupMap.get(groupIds.get(i++));
ResourceType type = group.getResourceType();
ResourceFacets facets;
@@ -1221,8 +1254,8 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
// compatible group
facets = resourceTypeManager.getResourceFacets(type.getId());
}
- ResourceGroupComposite composite = new ResourceGroupComposite(explicitCount,
explicitAvail, implicitCount,
- implicitAvail, group, facets);
+ ResourceGroupComposite composite = new ResourceGroupComposite(explicitCount,
explicitDown,
+ explicitDisabled, implicitCount, implicitDown, implicitDisabled, group,
facets);
Set<Permission> perms =
authorizationManager.getImplicitGroupPermissions(subject, group.getId());
composite.setResourcePermission(new ResourcePermission(perms));
results.add(composite);
@@ -1294,13 +1327,14 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
List<Integer> newMembers = ArrayUtils.wrapInList(resourceIds); // members
needing addition
newMembers.removeAll(currentMembers);
if (newMembers.size() > 0) {
- addResourcesToGroup(subjectManager.getOverlord(), groupId,
ArrayUtils.unwrapCollection(newMembers));
+ addResourcesToGroup(subjectManager.getOverlord(), groupId,
ArrayUtils.unwrapCollection(newMembers), false);
}
List<Integer> extraMembers = new ArrayList<Integer>(currentMembers);
// members needing removal
extraMembers.removeAll(ArrayUtils.wrapInList(resourceIds));
if (extraMembers.size() > 0) {
- removeResourcesFromGroup(subjectManager.getOverlord(), groupId,
ArrayUtils.unwrapCollection(extraMembers));
+ removeResourcesFromGroup(subjectManager.getOverlord(), groupId,
ArrayUtils.unwrapCollection(extraMembers),
+ false);
}
// As a result of the membership change ensure that the group type is set
correctly.
@@ -1362,17 +1396,25 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
throw new PermissionException("You do not have permission to view this
resource group");
}
+ // Could do this with two GROUP BY queries but we'll go with one RT to the db
and hope that's best, despite
+ // all the subselects.
String queryString = "SELECT \n" //
- + " (SELECT count(er) "
+ + " (SELECT count(er) " // Total explicit
+ " FROM ResourceGroup g JOIN g.explicitResources er where g.id =
:groupId),\n"
- + " (SELECT count(er) "
+ + " (SELECT count(er) " // DOWN explicit
+ " FROM ResourceGroup g JOIN g.explicitResources er where g.id =
:groupId"
- + " AND er.currentAvailability.availabilityType = 1 ),\n"
- + " (SELECT count(ir) "
+ + " AND er.currentAvailability.availabilityType = 0 ),\n"
+ + " (SELECT count(er) " // DISABLED explicit
+ + " FROM ResourceGroup g JOIN g.explicitResources er where g.id =
:groupId"
+ + " AND er.currentAvailability.availabilityType = 3 ),\n"
+ + " (SELECT count(ir) " // Total implicit
+ " FROM ResourceGroup g JOIN g.implicitResources ir where g.id =
:groupId),\n"
- + " (SELECT count(ir) "
+ + " (SELECT count(ir) " // DOWN implicit
+ + " FROM ResourceGroup g JOIN g.implicitResources ir where g.id =
:groupId"
+ + " AND ir.currentAvailability.availabilityType = 0 ), g
\n"
+ + " (SELECT count(ir) " // DISABLED implicit
+ " FROM ResourceGroup g JOIN g.implicitResources ir where g.id =
:groupId"
- + " AND ir.currentAvailability.availabilityType = 1 ), g
\n"
+ + " AND ir.currentAvailability.availabilityType = 3 ), g
\n"
+ "FROM ResourceGroup g where g.id = :groupId";
Query query = entityManager.createQuery(queryString);
@@ -1399,19 +1441,19 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
ResourceGroupComposite composite = null;
if (((Number) data[2]).longValue() > 0) {
long explicitCount = ((Number) data[0]).longValue();
- long explicitUpCount = ((Number) data[1]).longValue();
- long implicitCount = ((Number) data[2]).longValue();
- long implicitUpCount = ((Number) data[3]).longValue();
+ long explicitDownCount = ((Number) data[1]).longValue();
+ long explicitDisabledCount = ((Number) data[2]).longValue();
+ long implicitCount = ((Number) data[3]).longValue();
+ long implicitDownCount = ((Number) data[4]).longValue();
+ long implicitDisabledCount = ((Number) data[5]).longValue();
// In the past we had only DOWN/0 and UP/1 avails/ordinal and and the avails
were just averages.
- // Now we have DISABLED and UNKNOWN. So group avail is done differently,
instead of an indication
- // of UP vs DOWN it is now UP vs NOT UP (not up is every other avail).
- double explicitAvail = (explicitCount > 0) ? (explicitUpCount /
explicitCount) : 0D;
- double implicitAvail = (implicitCount > 0) ? (implicitUpCount /
implicitCount) : 0D;
+ // Now we have DISABLED and UNKNOWN. So group avail is done differently,
instead of a ratio of
+ // of UP vs DOWN it is now handled with counts. This is handled in the
composite.
- composite = new ResourceGroupComposite(explicitCount, explicitAvail,
implicitCount, implicitAvail, group,
- facets);
+ composite = new ResourceGroupComposite(explicitCount, explicitDownCount,
explicitDisabledCount,
+ implicitCount, implicitDownCount, implicitDisabledCount, group, facets);
} else {
- composite = new ResourceGroupComposite(0L, 0.0, 0L, 0.0, group, facets);
+ composite = new ResourceGroupComposite(0L, 0L, 0L, 0L, 0L, 0L, group,
facets);
}
return composite;
@@ -1483,14 +1525,10 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
* 2) It can not be a candidate for filtering
* 3) It must be sorted by using the zero-based positional ordinal within the
projection
*
- * This method offers 4 new aggregates that you can sort on. The
+ * This method offers 2 new aggregates that you can sort on. The
*
* explicitCount (ordinal 0) - the count of the number of children in the group
- * explicitAvail (ordinal 1) - decimal percentage representing the number of UP
children relative to the total
- * number of children in the group
* implicitCount (ordinal 2) - the count of the number of descendents in the group
- * implicitAvail (ordinal 3) - decimal percentage representing the number of UP
descendents relative to the total
- * number of descendents in the group
*/
public PageList<ResourceGroupComposite>
findResourceGroupCompositesByCriteria(Subject subject,
ResourceGroupCriteria criteria) {
@@ -1504,9 +1542,11 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
compositeProjection = ""
+ " new
org.rhq.core.domain.resource.group.composite.ResourceGroupComposite( "
+ " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN
res.currentAvailability avail ) AS explicitCount," // explicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM
%alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitAvail,"
// explicit member availability
+ + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 0 ) AS explicitUpCount,"
// explicit member count with DOWN avail
+ + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 3 ) AS explicitUpCount,"
// explicit member count with DISABLED avail
+ " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN
res.currentAvailability avail ) AS implicitCount," // implicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM
%alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitAvail,"
// implicit member availability
+ + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 0 ) AS implicitUpCount,"
// implicit member count with DOWN avail
+ + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 3 ) AS implicitUpCount,"
// implicit member count with DISABLED avail
+ " %alias% ) "; // ResourceGroup
break;
case ROLE_OWNED:
@@ -1514,9 +1554,11 @@ public class ResourceGroupManagerBean implements
ResourceGroupManagerLocal, Reso
compositeProjection = ""
+ " new
org.rhq.core.domain.resource.group.composite.ResourceGroupComposite( "
+ " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN
res.currentAvailability avail ) AS explicitCount," // explicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM
%alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitAvail,"
// explicit member availability
+ + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 0 ) AS explicitUpCount,"
// explicit member count with DOWN avail
+ + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 3 ) AS explicitUpCount,"
// explicit member count with DISABLED avail
+ " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN
res.currentAvailability avail ) AS implicitCount," // implicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM
%alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitAvail,"
// implicit member availability
+ + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 0 ) AS implicitUpCount,"
// implicit member count with DOWN avail
+ + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN
res.currentAvailability avail WHERE avail.availabilityType = 3 ) AS implicitUpCount,"
// implicit member count with DISABLED avail
+ " %alias%, " // ResourceGroup
+ " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s
JOIN r.permissions p WHERE s.id = %subjectId% AND p = 8 ), " // MANAGE_MEASUREMENTS
+ " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s
JOIN r.permissions p WHERE s.id = %subjectId% AND p = 4 ), " // MODIFY_RESOURCE