modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
| 15 +
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
| 2
modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml
| 15 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
| 12 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java
| 83 ++++++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
| 34 +++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
| 21 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
| 6
10 files changed, 175 insertions(+), 17 deletions(-)
New commits:
commit 1b567f2f9eb2e81f86dbedf60cf85b42283aea05
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Thu Sep 26 22:36:43 2013 +0200
api checks: Adding back the org.rhq.enterprise.server.measurement.MeasurementAggregate
see the commit c2a609f48 for more details.
diff --git a/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml
b/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml
index 40508c6..488adc3 100644
--- a/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml
+++ b/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml
@@ -41,4 +41,19 @@
<justification>Adding a method to a remote API interface is safe. This is newly
implemented functionality.</justification>
</difference>
+ <difference>
+
<className>org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote</className>
+ <differenceType>7006</differenceType> <!-- method return type changed
-->
+ <method>org.rhq.core.domain.measurement.MeasurementAggregate
getAggregate(org.rhq.core.domain.auth.Subject, int, long, long)</method>
+ <to>org.rhq.enterprise.server.measurement.MeasurementAggregate</to>
+ <justification>In RHQ 4.8 the MeasurementAggregate class was moved from server
jar module to core domain module. This change is not backward compatible with Java clients
using the remote EJB API. The breaking change was introduced by commit 2f6e74080e2299 the
backward compatible change was introduced by c2a609f48d5f36.</justification>
+ </difference>
+
+ <difference>
+
<className>org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote</className>
+ <differenceType>7012</differenceType> <!-- method added to an
interface -->
+ <method>org.rhq.core.domain.measurement.MeasurementAggregate
getMeasurementAggregate(org.rhq.core.domain.auth.Subject, int, long, long)</method>
+ <justification>Adding a method to a remote API interface is safe. This is
method is added in order to deprecate the getAggregate. For more details see the previous
intentional change.</justification>
+ </difference>
+
</differences>
commit c2a609f48d5f364310060d031069495679b69c6f
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Thu Sep 26 22:32:46 2013 +0200
Adding back the org.rhq.enterprise.server.measurement.MeasurementAggregate because of
the JON 3.2 backward compatibility breakage (for EJB remote clients). This contains also
adding a new method, deprecating the old method and the added class so that it can be
removed in the next major release.
diff --git
a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
index dbd03ae..e07fb65 100644
---
a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
+++
b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
@@ -258,7 +258,7 @@ public class MeasurementDataManagerBeanTest extends AbstractEJB3Test
{
dataManager.mergeMeasurementReport(report);
waitForRawInserts();
- MeasurementAggregate actual = dataManager.getAggregate(getOverlord(),
dynamicSchedule.getId(),
+ MeasurementAggregate actual = dataManager.getMeasurementAggregate(getOverlord(),
dynamicSchedule.getId(),
beginTime.getMillis(), endTime.getMillis());
MeasurementAggregate expected = new MeasurementAggregate(1.1, divide((1.1 + 2.2 +
3.3 + 4.4 + 5.5 + 6.6), 6),
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
index 97dd33f..70a0e60 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
@@ -347,7 +347,7 @@ public class StorageNodeManagerBean implements
StorageNodeManagerLocal, StorageN
// find the aggregates and enrich the result instance
if (!scheduleIdsMap.isEmpty()) {
if ((scheduleId = scheduleIdsMap.get(METRIC_TOKENS)) != null) {
- MeasurementAggregate tokensAggregate =
measurementManager.getAggregate(subject, scheduleId, beginTime,
+ MeasurementAggregate tokensAggregate =
measurementManager.getMeasurementAggregate(subject, scheduleId, beginTime,
endTime);
result.setTokens(tokensAggregate);
}
@@ -369,7 +369,7 @@ public class StorageNodeManagerBean implements
StorageNodeManagerLocal, StorageN
result.setTotalDiskUsedPercentage(totalDiskUsedPercentageAggregateWithUnits);
}
if ((scheduleId = scheduleIdsMap.get(METRIC_FREE_DISK_TO_DATA_RATIO)) !=
null) {
- MeasurementAggregate freeDiskToDataRatioAggregate =
measurementManager.getAggregate(subject,
+ MeasurementAggregate freeDiskToDataRatioAggregate =
measurementManager.getMeasurementAggregate(subject,
scheduleId, beginTime, endTime);
result.setFreeDiskToDataSizeRatio(freeDiskToDataRatioAggregate);
}
@@ -383,17 +383,17 @@ public class StorageNodeManagerBean implements
StorageNodeManagerLocal, StorageN
}
if ((scheduleId = scheduleIdsMap.get(METRIC_KEY_CACHE_SIZE)) != null) {
updateAggregateTotal(totalDiskUsedAggregate,
- measurementManager.getAggregate(subject, scheduleId, beginTime,
endTime));
+ measurementManager.getMeasurementAggregate(subject, scheduleId,
beginTime, endTime));
}
if ((scheduleId = scheduleIdsMap.get(METRIC_ROW_CACHE_SIZE)) != null) {
updateAggregateTotal(totalDiskUsedAggregate,
- measurementManager.getAggregate(subject, scheduleId, beginTime,
endTime));
+ measurementManager.getMeasurementAggregate(subject, scheduleId,
beginTime, endTime));
}
if ((scheduleId = scheduleIdsMap.get(METRIC_TOTAL_COMMIT_LOG_SIZE)) != null)
{
updateAggregateTotal(totalDiskUsedAggregate,
- measurementManager.getAggregate(subject, scheduleId, beginTime,
endTime));
+ measurementManager.getMeasurementAggregate(subject, scheduleId,
beginTime, endTime));
}
if (totalDiskUsedAggregate.getMax() > 0) {
StorageNodeLoadComposite.MeasurementAggregateWithUnits
totalDiskUsedAggregateWithUnits = new
StorageNodeLoadComposite.MeasurementAggregateWithUnits(
@@ -539,7 +539,7 @@ public class StorageNodeManagerBean implements
StorageNodeManagerLocal, StorageN
private StorageNodeLoadComposite.MeasurementAggregateWithUnits
getMeasurementAggregateWithUnits(Subject subject,
int schedId, MeasurementUnits units, long beginTime, long endTime) {
- MeasurementAggregate measurementAggregate =
measurementManager.getAggregate(subject, schedId, beginTime,
+ MeasurementAggregate measurementAggregate =
measurementManager.getMeasurementAggregate(subject, schedId, beginTime,
endTime);
StorageNodeLoadComposite.MeasurementAggregateWithUnits
measurementAggregateWithUnits = new
StorageNodeLoadComposite.MeasurementAggregateWithUnits(
measurementAggregate, units);
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java
new file mode 100644
index 0000000..7acc5f6
--- /dev/null
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.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.enterprise.server.measurement;;
+
+import java.io.Serializable;
+
+/**
+ * Simple Java Bean to hold aggregate values
+ *
+ * @author <a href="mailto:heiko.rupp@redhat.com">Heiko W.
Rupp</a>
+ * @deprecated As of release RHQ 4.8, replaced by {@link
org.rhq.core.domain.measurement.MeasurementAggregate}. Use this class from core domain
instead.
+ */
+public class MeasurementAggregate implements Serializable {
+
+ static final long serialVersionUID = 5673395371271765240L;
+
+ Double min;
+ Double avg;
+ Double max;
+
+ public MeasurementAggregate() {
+ }
+
+ public MeasurementAggregate(Double min, Double avg, Double max) {
+ this.min = (min != null) ? min : Double.NaN;
+ this.avg = (avg != null) ? avg : Double.NaN;
+ this.max = (max != null) ? max : Double.NaN;
+ }
+
+ public Double getMin() {
+ return min;
+ }
+
+ public void setMin(Double min) {
+ this.min = min;
+ }
+
+ public Double getAvg() {
+ return avg;
+ }
+
+ public void setAvg(Double avg) {
+ this.avg = avg;
+ }
+
+ public Double getMax() {
+ return max;
+ }
+
+ public void setMax(Double max) {
+ this.max = max;
+ }
+
+ @Override
+ public String toString() {
+ return "Min: " + min + ", Max: " + max + ", Avg: "
+ avg;
+ }
+
+ /**
+ * Return true if the aggregate has "no real data" I.e. when all values are
Not A Number.
+ *
+ * @return
+ */
+ public boolean isEmpty() {
+ return min.isNaN() && avg.isNaN() && max.isNaN();
+ }
+}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
index 3504cdc..1470337 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
@@ -480,7 +480,7 @@ public class MeasurementBaselineManagerBean implements
MeasurementBaselineManage
throw new BaselineCreationException("Baseline calculation is only valid
for a dynamic measurement");
}
- MeasurementAggregate agg = dataManager.getAggregate(subjectManager.getOverlord(),
schedule.getId(), startDate,
+ MeasurementAggregate agg =
dataManager.getMeasurementAggregate(subjectManager.getOverlord(), schedule.getId(),
startDate,
endDate);
// attach the entity, so we can find the baseline
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
index c481c6e..618bcc7 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
@@ -373,7 +373,7 @@ public class MeasurementChartsManagerBean implements
MeasurementChartsManagerLoc
summary.setCollectionType(collectionType);
if (!narrowed) {
- MeasurementAggregate compositeHighLow = dataManager.getAggregate(subject,
schedule.getId(), begin, end);
+ MeasurementAggregate compositeHighLow =
dataManager.getMeasurementAggregate(subject, schedule.getId(), begin, end);
if (compositeHighLow.isEmpty()) {
summary.setValuesPresent(false);
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
index 19c5ecf..ee679f1 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
@@ -605,9 +605,41 @@ public class MeasurementDataManagerBean implements
MeasurementDataManagerLocal,
log.debug(callingMethod + ": " + stats.toString());
}
+ @Deprecated
@Override
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
- public MeasurementAggregate getAggregate(Subject subject, int scheduleId, long
startTime, long endTime) {
+ public org.rhq.enterprise.server.measurement.MeasurementAggregate
getAggregate(Subject subject, int scheduleId, long startTime, long endTime) {
+ MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria();
+ criteria.addFilterId(scheduleId);
+ criteria.fetchResource(true);
+
+ PageList<MeasurementSchedule> schedules =
measurementScheduleManager.findSchedulesByCriteria(
+ subjectManager.getOverlord(), criteria);
+ if (schedules.isEmpty()) {
+ throw new MeasurementException("Could not fine MeasurementSchedule with
the id[" + scheduleId + "]");
+ }
+ MeasurementSchedule schedule = schedules.get(0);
+
+ if (authorizationManager.canViewResource(subject, schedule.getResource().getId())
== false) {
+ throw new PermissionException("User[" + subject.getName()
+ + "] does not have permission to view schedule[id=" +
scheduleId + "]");
+ }
+
+ if (schedule.getDefinition().getDataType() != DataType.MEASUREMENT) {
+ throw new IllegalArgumentException(schedule + " is not about numerical
values. Can't compute aggregates");
+ }
+
+ if (startTime > endTime) {
+ throw new IllegalArgumentException("Start date " + startTime +
" is not before " + endTime);
+ }
+
+ MetricsServer metricsServer = storageClientManager.getMetricsServer();
+ AggregateNumericMetric summary = metricsServer.getSummaryAggregate(scheduleId,
startTime, endTime);
+
+ return new
org.rhq.enterprise.server.measurement.MeasurementAggregate(summary.getMin(),
summary.getAvg(), summary.getMax());
+ }
+
+ public MeasurementAggregate getMeasurementAggregate(Subject subject, int scheduleId,
long startTime, long endTime) {
MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria();
criteria.addFilterId(scheduleId);
criteria.fetchResource(true);
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
index 116c82a..1a049c3 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
@@ -51,8 +51,27 @@ public interface MeasurementDataManagerRemote {
*
* @throws FetchException if the schedule does not reference numerical data or if the
user is not allowed to view
* the {@link Resource} corresponding to this scheduleId
+ * @deprecated class {@link
org.rhq.enterprise.server.measurement.MeasurementAggregate} has been deprecated
+ * since RHQ 4.8, therefore this method was deprecated as well and
+ * replaced by {@link
#getMeasurementAggregate(org.rhq.core.domain.auth.Subject,int,long,long)}
*/
- MeasurementAggregate getAggregate(Subject subject, int scheduleId, long startTime,
long endTime);
+ org.rhq.enterprise.server.measurement.MeasurementAggregate getAggregate(Subject
subject, int scheduleId, long startTime, long endTime);
+
+ /**
+ * Get the aggregate values of the numerical values for a given schedule. This can
only provide aggregates for data
+ * in the "live" table
+ *
+ * @param subject the user requesting the aggregate
+ * @param scheduleId the id of the {@link MeasurementSchedule} for which this
aggregate is being requested
+ * @param start the start time
+ * @param end the end time
+ *
+ * @return MeasurementAggregate bean with the data
+ *
+ * @throws FetchException if the schedule does not reference numerical data or if the
user is not allowed to view
+ * the {@link Resource} corresponding to this scheduleId
+ */
+ MeasurementAggregate getMeasurementAggregate(Subject subject, int scheduleId, long
startTime, long endTime);
/**
* Return all known trait data for the passed schedule, defined by resourceId and
definitionId
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
index d5ca8dc..fb927ec 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
@@ -162,7 +162,7 @@ public class MetricHandlerBean extends AbstractRestBean {
MeasurementSchedule schedule = obtainSchedule(scheduleId, false,
DataType.MEASUREMENT);
- MeasurementAggregate aggr = dataManager.getAggregate(caller, scheduleId,
startTime, endTime);
+ MeasurementAggregate aggr = dataManager.getMeasurementAggregate(caller,
scheduleId, startTime, endTime);
MetricAggregate res = new MetricAggregate(scheduleId,
aggr.getMin(),aggr.getAvg(),aggr.getMax());
int definitionId = schedule.getDefinition().getId();
@@ -387,7 +387,7 @@ public class MetricHandlerBean extends AbstractRestBean {
List<List<MeasurementDataNumericHighLowComposite>> listList =
dataManager.findDataForContext(caller,
EntityContext.forResource(sched.getResource().getId()),definitionId,startTime,endTime,dataPoints);
if (!listList.isEmpty()) {
- MeasurementAggregate measurementAggregate =
dataManager.getAggregate(caller,scheduleId,startTime,endTime);
+ MeasurementAggregate measurementAggregate =
dataManager.getMeasurementAggregate(caller,scheduleId,startTime,endTime);
List<MeasurementDataNumericHighLowComposite> list =
listList.get(0);
MetricAggregate res = new
MetricAggregate(scheduleId,measurementAggregate.getMin(),measurementAggregate.getAvg(),measurementAggregate.getMax());
boolean isHtml = mediaType.equals(MediaType.TEXT_HTML_TYPE);
@@ -552,7 +552,7 @@ public class MetricHandlerBean extends AbstractRestBean {
List<MetricAggregate> ret = new
ArrayList<MetricAggregate>(schedules.size());
for (MeasurementSchedule schedule: schedules) {
- MeasurementAggregate aggr =
dataManager.getAggregate(caller,schedule.getId(),startTime,endTime);
+ MeasurementAggregate aggr =
dataManager.getMeasurementAggregate(caller,schedule.getId(),startTime,endTime);
MetricAggregate res = new MetricAggregate(schedule.getId(),
aggr.getMin(),aggr.getAvg(),aggr.getMax());
if (includeDataPoints) {
commit 0d40ad930ba3248614e366f28f0a98ad8c98f136
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Thu Sep 26 22:32:11 2013 +0200
[BZ 967542] - UI shows confusing units when editing Availability Duration alert
condition type - The table with listed conditions should now display the same number-unit
tuple as the popup dialog.
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
index ce95963..6d75a27 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
@@ -28,6 +28,7 @@ import org.rhq.core.domain.alert.AlertConditionCategory;
import org.rhq.core.domain.alert.AlertConditionOperator;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.core.domain.measurement.composite.MeasurementNumericValueAndUnits;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.Messages;
import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
@@ -93,9 +94,17 @@ public class AlertFormatUtility {
}
str.append(" For ");
- // value is stored in seconds but should be presented in minutes
- String value = String.valueOf(Integer.valueOf(condition.getOption()) / 60);
- String formatted = MeasurementConverterClient.format(value,
MeasurementUnits.MINUTES);
+ long longValue = Long.valueOf(condition.getOption());
+ MeasurementNumericValueAndUnits valueWithUnits;
+ if (longValue % 3600 == 0) {
+ valueWithUnits = MeasurementConverterClient.fit((double) longValue,
MeasurementUnits.SECONDS,
+ MeasurementUnits.HOURS, MeasurementUnits.HOURS);
+ } else {
+ valueWithUnits = MeasurementConverterClient.fit((double) longValue,
MeasurementUnits.SECONDS,
+ MeasurementUnits.MINUTES, MeasurementUnits.MINUTES);
+ }
+ String formatted =
MeasurementConverterClient.format(String.valueOf(valueWithUnits.getValue()),
+ valueWithUnits.getUnits());
str.append(formatted);
str.append("]");