modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java | 11 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java | 160 ++++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java | 46 ++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java | 6 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java | 33 - modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java | 12 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java | 12 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java | 24 + modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java | 186 +++++----- 9 files changed, 359 insertions(+), 131 deletions(-)
New commits: commit 73bff1bdd0a1ea3c5efca7af2f6b886c235d53a9 Author: Ian Springer ian.springer@redhat.com Date: Thu Oct 28 18:58:38 2010 -0400
implement Metric Templates view and hook into the new Resource Types view; still need to add the "Update Existing Resources" checkbox
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java index d7c2180..43d51a2 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/ResourceTypeTreeView.java @@ -47,7 +47,6 @@ import org.rhq.enterprise.gui.coregui.client.LinkManager; import org.rhq.enterprise.gui.coregui.client.ViewId; import org.rhq.enterprise.gui.coregui.client.ViewPath; import org.rhq.enterprise.gui.coregui.client.alert.definitions.TemplateAlertDefinitionsView; -import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane; import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton; import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository; import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.TypesLoadedCallback; @@ -221,13 +220,11 @@ public class ResourceTypeTreeView extends LocatableVLayout implements Bookmarkab }); }
- private void editMetricTemplate(int resourceTypeId) { - // TODO: convert this to GWT + private void editMetricTemplate(int resourceTypeId) { Layout metricCanvas = getMetricTemplateCanvas(); - FullHTMLPane jspPage = new FullHTMLPane(extendLocatorId("MetricTemplate"), - "/admin/platform/monitor/Config.do?nomenu=true&mode=configure&id=" - + resourceTypeId + "&type=" + resourceTypeId); - prepareSubCanvas(metricCanvas, jspPage, true); + TemplateSchedulesView templateSchedulesView = new TemplateSchedulesView(extendLocatorId("MetricTemplate"), + resourceTypeId); + prepareSubCanvas(metricCanvas, templateSchedulesView, true); switchToCanvas(ResourceTypeTreeView.this, metricCanvas); }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java new file mode 100644 index 0000000..bad1853 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesDataSource.java @@ -0,0 +1,160 @@ +/* + * RHQ Management Platform + * Copyright (C) 2010 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package org.rhq.enterprise.gui.coregui.client.admin.templates; + +import java.util.List; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.Criteria; +import com.smartgwt.client.data.DSRequest; +import com.smartgwt.client.data.DSResponse; +import com.smartgwt.client.data.DataSourceField; +import com.smartgwt.client.data.fields.DataSourceIntegerField; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.rhq.core.domain.common.EntityContext; +import org.rhq.core.domain.criteria.MeasurementScheduleCriteria; +import org.rhq.core.domain.measurement.composite.MeasurementScheduleComposite; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.gwt.MeasurementDataGWTServiceAsync; +import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleCompositeDataSource; +import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleListView; +import org.rhq.enterprise.gui.coregui.client.util.message.Message; + +/** + * A DataSource for reading and updating the default metric schedules for a particular ResourceType. + * + * @author Ian Springer + */ +public class TemplateSchedulesDataSource extends AbstractMeasurementScheduleCompositeDataSource { + private MeasurementDataGWTServiceAsync measurementService = GWTServiceLookup.getMeasurementDataService(); + private int resourceTypeId; + + public TemplateSchedulesDataSource(int resourceTypeId) { + this.resourceTypeId = resourceTypeId; + } + + @Override + protected List<DataSourceField> addDataSourceFields() { + List<DataSourceField> fields = super.addDataSourceFields(); + + DataSourceField resourceGroupIdField = new DataSourceIntegerField( + MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID, "Resource Type Id"); + resourceGroupIdField.setHidden(true); + fields.add(resourceGroupIdField); + + return fields; + } + + @Override + protected void executeFetch(DSRequest request, DSResponse response) { + super.executeFetch(request, response); + + } + + @Override + protected EntityContext getEntityContext(DSRequest request) { + Criteria requestCriteria = request.getCriteria(); + Integer typeId = requestCriteria.getAttributeAsInt(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID); + return EntityContext.forTemplate(typeId); + } + + @Override + public ListGridRecord copyValues(MeasurementScheduleComposite from) { + ListGridRecord record = super.copyValues(from); + record.setAttribute(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID, this.resourceTypeId); + return record; + } + + @Override + protected void enableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, + final int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) { + final String s = (measurementDefinitionIds.length > 1) ? "s" : ""; + this.measurementService.enableMeasurementTemplates(measurementDefinitionIds, + new AsyncCallback<Void>() { + @Override + public void onFailure(Throwable throwable) { + CoreGUI.getErrorHandler().handleError( + "Failed to enable collection of metric" + s + " " + measurementDefinitionDisplayNames + + " by default for ResourceType with id [" + resourceTypeId + "].", throwable); + } + + @Override + public void onSuccess(Void aVoid) { + CoreGUI.getMessageCenter().notify( + new Message("Enabled collection of selected metric" + s + ".", "Enabled collection of metric" + + s + " " + measurementDefinitionDisplayNames + " by default for ResourceType with id [" + + resourceTypeId + "].", Message.Severity.Info)); + measurementScheduleListView.refresh(); + } + }); + } + + @Override + protected void disableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, + int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) { + final String s = (measurementDefinitionIds.length > 1) ? "s" : ""; + this.measurementService.disableSchedulesForCompatibleGroup(this.resourceTypeId, measurementDefinitionIds, + new AsyncCallback<Void>() { + @Override + public void onFailure(Throwable throwable) { + CoreGUI.getErrorHandler().handleError( + "Failed to disable collection of metric" + s + " " + measurementDefinitionDisplayNames + + " by default for ResourceType with id [" + resourceTypeId + "].", throwable); + } + + @Override + public void onSuccess(Void aVoid) { + CoreGUI.getMessageCenter().notify( + new Message("Disabled collection of selected metric" + s + ".", "Disabled collection of metric" + + s + " " + measurementDefinitionDisplayNames + " by default for ResourceType with id [" + + resourceTypeId + "].", Message.Severity.Info)); + measurementScheduleListView.refresh(); + } + }); + } + + @Override + protected void updateSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, + int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames, + final long collectionInterval) { + final String s = (measurementDefinitionIds.length > 1) ? "s" : ""; + this.measurementService.updateMeasurementTemplates(measurementDefinitionIds, collectionInterval, + new AsyncCallback<Void>() { + @Override + public void onFailure(Throwable throwable) { + CoreGUI.getErrorHandler().handleError( + "Failed to set collection interval to " + (collectionInterval / 1000) + " seconds for metric" + + s + " " + measurementDefinitionDisplayNames + " by default for ResourceType with id [" + + resourceTypeId + "].", throwable); + } + + @Override + public void onSuccess(Void aVoid) { + CoreGUI.getMessageCenter().notify( + new Message("Updated collection intervals of selected metric" + s + ".", + "Collection interval for metric" + s + " " + measurementDefinitionDisplayNames + + " by default for ResourceType with id [" + resourceTypeId + "] set to " + + (collectionInterval / 1000) + " seconds.", Message.Severity.Info)); + measurementScheduleListView.refresh(); + } + }); + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java new file mode 100644 index 0000000..648ae40 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java @@ -0,0 +1,46 @@ +/* + * RHQ Management Platform + * Copyright (C) 2010 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package org.rhq.enterprise.gui.coregui.client.admin.templates; + +import com.smartgwt.client.data.Criteria; + +import org.rhq.core.domain.criteria.MeasurementScheduleCriteria; +import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleListView; + +/** + * A view for viewing and updating the default metric schedules ("metric templates") for a particular ResourceType. + * + * @author Ian Springer + */ +public class TemplateSchedulesView extends AbstractMeasurementScheduleListView { + private static final String TITLE = "Template Metric Collection Schedules"; + + private static final String[] EXCLUDED_FIELD_NAMES = new String[] { MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID }; + + public TemplateSchedulesView(String locatorId, int resourceTypeId) { + super(locatorId, TITLE, new TemplateSchedulesDataSource(resourceTypeId), createCriteria(resourceTypeId), + EXCLUDED_FIELD_NAMES); + } + + private static Criteria createCriteria(int resourceTypeId) { + Criteria criteria = new Criteria(); + criteria.addCriteria(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID, resourceTypeId); + return criteria; + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java index c6c44d8..ea64488 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java @@ -80,6 +80,12 @@ public interface MeasurementDataGWTService extends RemoteService {
void updateSchedulesForCompatibleGroup(int resourceGroupId, int[] measurementDefinitionIds, long collectionInterval);
+ void enableMeasurementTemplates(int[] measurementDefinitionIds); + + void disableMeasurementTemplates(int[] measurementDefinitionIds); + + void updateMeasurementTemplates(int[] measurementDefinitionIds, long collectionInterval); + PageList<MeasurementDataTrait> findTraitsByCriteria(MeasurementDataTraitCriteria criteria);
} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java index 1f7da77..cac8051 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleCompositeDataSource.java @@ -20,10 +20,8 @@ package org.rhq.enterprise.gui.coregui.client.inventory.common;
import java.util.ArrayList; import java.util.List; -import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback; -import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.DataSourceField; @@ -116,31 +114,7 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends }); }
- protected EntityContext getEntityContext(DSRequest request) { - EntityContext entityContext = null; - - Criteria requestCriteria = request.getCriteria(); - if (requestCriteria != null) { - Map values = requestCriteria.getValues(); - for (Object key : values.keySet()) { - String fieldName = (String) key; - if (fieldName.equals(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_ID)) { - Integer resourceId = (Integer) values.get(fieldName); - entityContext = EntityContext.forResource(resourceId); - } else if (fieldName.equals(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_GROUP_ID)) { - Integer groupId = (Integer) values.get(fieldName); - entityContext = EntityContext.forGroup(groupId); - } - // TODO: Add support for other fields we need to filter by (e.g. resourceTypeId for metric templates). - } - } - - if (entityContext == null) { - throw new IllegalStateException("No support criteria fields were found."); - } - - return entityContext; - } + protected abstract EntityContext getEntityContext(DSRequest request);
@Override public MeasurementScheduleComposite copyValues(ListGridRecord from) { @@ -161,8 +135,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends record.setAttribute(MeasurementScheduleCriteria.SORT_FIELD_ENABLED, from.getCollectionEnabled()); record.setAttribute(MeasurementScheduleCriteria.SORT_FIELD_INTERVAL, from.getCollectionInterval());
- // TODO: resourceId and resourceGroupId (in subclasses) - return record; }
@@ -170,7 +142,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends int[] ids = getMeasurementDefinitionIds(measurementScheduleListView); List<String> displayNames = getMeasurementDefinitionDisplayNames(measurementScheduleListView); enableSchedules(measurementScheduleListView, ids, displayNames); - measurementScheduleListView.refresh(); }
protected abstract void enableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, @@ -180,7 +151,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends int[] ids = getMeasurementDefinitionIds(measurementScheduleListView); List<String> displayNames = getMeasurementDefinitionDisplayNames(measurementScheduleListView); disableSchedules(measurementScheduleListView, ids, displayNames); - measurementScheduleListView.refresh(); }
protected abstract void disableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, @@ -190,7 +160,6 @@ public abstract class AbstractMeasurementScheduleCompositeDataSource extends int[] ids = getMeasurementDefinitionIds(measurementScheduleListView); List<String> displayNames = getMeasurementDefinitionDisplayNames(measurementScheduleListView); updateSchedules(measurementScheduleListView, ids, displayNames, interval); - measurementScheduleListView.refresh(); }
private int[] getMeasurementDefinitionIds(AbstractMeasurementScheduleListView measurementScheduleListView) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java index 79a9b2a..0ba35d0 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesDataSource.java @@ -84,7 +84,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat }
@Override - protected void enableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, + protected void enableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, final int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) { final String s = (measurementDefinitionIds.length > 1) ? "s" : ""; this.measurementService.enableSchedulesForCompatibleGroup(this.resourceGroupId, measurementDefinitionIds, @@ -102,13 +102,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat new Message("Enabled collection of selected metric" + s + ".", "Enabled collection of metric" + s + " " + measurementDefinitionDisplayNames + " for Resource group with id [" + resourceGroupId + "].", Message.Severity.Info)); - + measurementScheduleListView.refresh(); } }); }
@Override - protected void disableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, + protected void disableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) { final String s = (measurementDefinitionIds.length > 1) ? "s" : ""; this.measurementService.disableSchedulesForCompatibleGroup(this.resourceGroupId, measurementDefinitionIds, @@ -126,13 +126,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat new Message("Disabled collection of selected metric" + s + ".", "Disabled collection of metric" + s + " " + measurementDefinitionDisplayNames + " for Resource group with id [" + resourceGroupId + "].", Message.Severity.Info)); - + measurementScheduleListView.refresh(); } }); }
@Override - protected void updateSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, + protected void updateSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames, final long collectionInterval) { final String s = (measurementDefinitionIds.length > 1) ? "s" : ""; @@ -153,7 +153,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat "Collection interval for metric" + s + " " + measurementDefinitionDisplayNames + " for Resource group with id [" + resourceGroupId + "] set to " + (collectionInterval / 1000) + " seconds.", Message.Severity.Info)); - + measurementScheduleListView.refresh(); } }); } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java index ac7c8dd..7d631ba 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesDataSource.java @@ -77,7 +77,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat }
@Override - protected void enableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, + protected void enableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) { this.measurementService.enableSchedulesForResource(this.resourceId, measurementDefinitionIds, new AsyncCallback<Void>() { @@ -93,13 +93,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat CoreGUI.getMessageCenter().notify( new Message("Enabled collection of metrics " + measurementDefinitionDisplayNames + " for Resource with id [" + resourceId + "].", Message.Severity.Info)); - + measurementScheduleListView.refresh(); } }); }
@Override - protected void disableSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, + protected void disableSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames) { this.measurementService.disableSchedulesForResource(this.resourceId, measurementDefinitionIds, new AsyncCallback<Void>() { @@ -115,13 +115,13 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat CoreGUI.getMessageCenter().notify( new Message("Disabled collection of metrics " + measurementDefinitionDisplayNames + " for Resource with id [" + resourceId + "].", Message.Severity.Info)); - + measurementScheduleListView.refresh(); } }); }
@Override - protected void updateSchedules(AbstractMeasurementScheduleListView measurementScheduleListView, + protected void updateSchedules(final AbstractMeasurementScheduleListView measurementScheduleListView, int[] measurementDefinitionIds, final List<String> measurementDefinitionDisplayNames, final long collectionInterval) { this.measurementService.updateSchedulesForResource(this.resourceId, measurementDefinitionIds, @@ -140,7 +140,7 @@ public class SchedulesDataSource extends AbstractMeasurementScheduleCompositeDat new Message("Collection interval for metrics " + measurementDefinitionDisplayNames + " for Resource with id [" + resourceId + "] set to " + (collectionInterval / 1000) + " seconds.", Message.Severity.Info)); - + measurementScheduleListView.refresh(); } }); } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java index 8f5c9be..9073af2 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java @@ -199,6 +199,30 @@ public class MeasurementDataGWTServiceImpl extends AbstractGWTServiceImpl implem } }
+ public void enableMeasurementTemplates(int[] measurementDefinitionIds) { + try { + scheduleManager.enableMeasurementTemplates(getSessionSubject(), measurementDefinitionIds); + } catch (RuntimeException e) { + throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + } + } + + public void disableMeasurementTemplates(int[] measurementDefinitionIds) { + try { + scheduleManager.disableMeasurementTemplates(getSessionSubject(), measurementDefinitionIds); + } catch (RuntimeException e) { + throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + } + } + + public void updateMeasurementTemplates(int[] measurementDefinitionIds, long collectionInterval) { + try { + scheduleManager.updateMeasurementTemplates(getSessionSubject(), measurementDefinitionIds, collectionInterval); + } catch (RuntimeException e) { + throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + } + } + public PageList<MeasurementDataTrait> findTraitsByCriteria(MeasurementDataTraitCriteria criteria) { try { return SerialUtility.prepare(dataManager.findTraitsByCriteria(getSessionSubject(), criteria), diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java index 4053a25..ccd65bc 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -53,6 +53,7 @@ import org.rhq.core.db.SQLServerDatabaseType; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.common.EntityContext; +import org.rhq.core.domain.criteria.MeasurementDefinitionCriteria; import org.rhq.core.domain.criteria.MeasurementScheduleCriteria; import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.measurement.DataType; @@ -173,7 +174,7 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage /** * Return a list of MeasurementSchedules for the given ids * - * @param ids PrimaryKeys of the schedules searched + * @param scheduleIds PrimaryKeys of the schedules searched * * @return a list of Schedules */ @@ -1179,92 +1180,117 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage pc.addDefaultOrderingField("definition.displayName");
// check authorization up front, so that criteria-based queries can run without authz checks - if (context.type == EntityContext.Type.Resource) { - if (authorizationManager.canViewResource(subject, context.resourceId) == false) { - throw new PermissionException("User [" + subject.getName() - + "] does not have permission to view measurement schedules for resource[id=" + context.resourceId - + "]"); - } - } else if (context.type == EntityContext.Type.ResourceGroup) { - if (authorizationManager.canViewGroup(subject, context.groupId) == false) { - throw new PermissionException("User [" + subject.getName() - + "] does not have permission to view measurement schedules for resourceGroup[id=" - + context.groupId + "]"); - } - } else if (context.type == EntityContext.Type.AutoGroup) { - if (authorizationManager.canViewAutoGroup(subject, context.parentResourceId, context.resourceTypeId) == false) { - throw new PermissionException("User [" + subject.getName() - + "] does not have permission to view measurement schedules for autoGroup[parentResourceId=" - + context.parentResourceId + ", resourceTypeId=" + context.resourceTypeId + "]"); - } - } - - // general criteria setup - MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria(); - //criteria.addFilterDefinitionIds(measurementDefinitionIds); - if (context.type == EntityContext.Type.Resource) { - criteria.addFilterResourceId(context.resourceId); - } else if (context.type == EntityContext.Type.ResourceGroup) { - criteria.addFilterResourceGroupId(context.groupId); - } else if (context.type == EntityContext.Type.AutoGroup) { - criteria.addFilterAutoGroupParentResourceId(context.parentResourceId); - criteria.addFilterAutoGroupResourceTypeId(context.resourceTypeId); + switch (context.type) { + case Resource: + if (authorizationManager.canViewResource(subject, context.resourceId) == false) { + throw new PermissionException("User [" + subject.getName() + + "] does not have permission to view measurement schedules for resource[id=" + + context.resourceId + + "]"); + } + break; + case ResourceGroup: + if (authorizationManager.canViewGroup(subject, context.groupId) == false) { + throw new PermissionException("User [" + subject.getName() + + "] does not have permission to view measurement schedules for resourceGroup[id=" + + context.groupId + "]"); + } + break; + case AutoGroup: + if (authorizationManager.canViewAutoGroup(subject, context.parentResourceId, context.resourceTypeId) == + false) { + throw new PermissionException("User [" + subject.getName() + + "] does not have permission to view measurement schedules for autoGroup[parentResourceId=" + + context.parentResourceId + ", resourceTypeId=" + context.resourceTypeId + "]"); + } + break; } - criteria.setPageControl(pc); // for primary return list, use passed PageControl
- // get the core definitions - CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria); - ; - generator.alterProjection(" distinct measurementschedule.definition "); - CriteriaQueryRunner<MeasurementDefinition> queryRunner = new CriteriaQueryRunner(criteria, generator, - entityManager); - PageList<MeasurementDefinition> definitions = queryRunner.execute(); - - // reset paging -- remove ordering, add group by - criteria.setPageControl(PageControl.getUnlimitedInstance()); - generator.setGroupByClause(" measurementschedule.definition.id "); - - // get the interval results - generator.alterProjection("" // - + " measurementschedule.definition.id, " // - + " min(measurementschedule.interval), " // - + " max(measurementschedule.interval) "); - Query query = generator.getQuery(entityManager); - List<Object[]> definitionIntervalResults = query.getResultList(); - - // get the enabled results - criteria.addFilterEnabled(true); - generator.alterProjection(" measurementschedule.definition.id, count(measurementschedule.id) "); - query = generator.getQuery(entityManager); - List<Object[]> definitionEnabledResults = query.getResultList(); - - // generate intermediate maps + PageList<MeasurementDefinition> definitions; Map<Integer, Long> definitionIntervalMap = new HashMap<Integer, Long>(); - for (Object[] nextInterval : definitionIntervalResults) { - int definitionId = (Integer) nextInterval[0]; - long minInterval = (Long) nextInterval[1]; - long maxInterval = (Long) nextInterval[2]; - - long interval = (minInterval != maxInterval) ? 0 : minInterval; - definitionIntervalMap.put(definitionId, interval); - } - int size = getResourceCount(context); Map<Integer, Boolean> definitionEnabledMap = new HashMap<Integer, Boolean>(); - for (Object[] nextEnabled : definitionEnabledResults) { - int definitionId = (Integer) nextEnabled[0]; - long enabledCount = (Long) nextEnabled[1]; - - Boolean enabled = null; - if (enabledCount == size) { - enabled = true; - } else if (enabledCount == 0) { - enabled = false; + if (context.type == EntityContext.Type.ResourceTemplate) { + MeasurementDefinitionCriteria criteria = new MeasurementDefinitionCriteria(); + criteria.addFilterResourceTypeId(context.resourceTypeId); + + CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria); + CriteriaQueryRunner<MeasurementDefinition> queryRunner = new CriteriaQueryRunner(criteria, generator, + entityManager); + definitions = queryRunner.execute(); + for (MeasurementDefinition definition : definitions) { + definitionIntervalMap.put(definition.getId(), definition.getDefaultInterval()); + definitionEnabledMap.put(definition.getId(), definition.isDefaultOn()); } + } else { + // Do general criteria setup. + MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria(); + //criteria.addFilterDefinitionIds(measurementDefinitionIds); + switch (context.type) { + case Resource: + criteria.addFilterResourceId(context.resourceId); + break; + case ResourceGroup: + criteria.addFilterResourceGroupId(context.groupId); + break; + case AutoGroup: + criteria.addFilterAutoGroupParentResourceId(context.parentResourceId); + criteria.addFilterAutoGroupResourceTypeId(context.resourceTypeId); + break; + } + criteria.setPageControl(pc); // for primary return list, use passed PageControl + + // Get the core definitions. + CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria); + + generator.alterProjection(" distinct measurementschedule.definition "); + CriteriaQueryRunner<MeasurementDefinition> queryRunner = new CriteriaQueryRunner(criteria, generator, + entityManager); + definitions = queryRunner.execute(); + + // Reset paging -- remove ordering, add group by. + criteria.setPageControl(PageControl.getUnlimitedInstance()); + generator.setGroupByClause(" measurementschedule.definition.id "); + + // Get the interval results. + generator.alterProjection("" // + + " measurementschedule.definition.id, " // + + " min(measurementschedule.interval), " // + + " max(measurementschedule.interval) "); + Query query = generator.getQuery(entityManager); + List<Object[]> definitionIntervalResults = query.getResultList(); + + // Get the enabled results. + criteria.addFilterEnabled(true); + generator.alterProjection(" measurementschedule.definition.id, count(measurementschedule.id) "); + query = generator.getQuery(entityManager); + List<Object[]> definitionEnabledResults = query.getResultList(); + + // Generate intermediate maps for intervals and enabled values. + for (Object[] nextInterval : definitionIntervalResults) { + int definitionId = (Integer) nextInterval[0]; + long minInterval = (Long) nextInterval[1]; + long maxInterval = (Long) nextInterval[2]; + + long interval = (minInterval != maxInterval) ? 0 : minInterval; + definitionIntervalMap.put(definitionId, interval); + } + int size = getResourceCount(context); + for (Object[] nextEnabled : definitionEnabledResults) { + int definitionId = (Integer) nextEnabled[0]; + long enabledCount = (Long) nextEnabled[1]; + + Boolean enabled = null; + if (enabledCount == size) { + enabled = true; + } else if (enabledCount == 0) { + enabled = false; + }
- definitionEnabledMap.put(definitionId, enabled); + definitionEnabledMap.put(definitionId, enabled); + } }
- // finally merge everything together + // Finally, merge everything together. List<MeasurementScheduleComposite> composites = new ArrayList<MeasurementScheduleComposite>(); for (MeasurementDefinition next : definitions) { int definitionId = next.getId();
rhq-commits@lists.fedorahosted.org