modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java | 6 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java | 134 +++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java | 55 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java | 109 ---- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java | 8 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java | 256 ++++++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java | 10 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java | 88 +++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java | 254 --------- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java | 88 --- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java | 6 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java | 18 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java | 6 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java | 5 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java | 34 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java | 29 + modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 28 + modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java | 11 26 files changed, 667 insertions(+), 522 deletions(-)
New commits: commit 09b2f640e9eda9b96ac37c1d44891c18da5e48e9 Author: Ian Springer ian.springer@redhat.com Date: Wed Jan 26 16:45:47 2011 -0500
partial impl of resource and group op history delete, as well as group op schedule/unschedule
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java index 42cb182..6160158 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java @@ -35,7 +35,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message.Option; import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/** - * Provides convienence methods that loads permissions and notifies you via a callback when done. + * Provides convenience methods that loads permissions and notifies you via a callback when done. * If an error occurs, the error will be logged in the message center. * This stores the last error received, in case a caller wants more information on failures. * diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java index 7a45f5a..dc3b8f5 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java @@ -5,11 +5,9 @@ import com.smartgwt.client.data.Record; import com.smartgwt.client.widgets.grid.CellFormatter; import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.core.domain.auth.Subject; -import org.rhq.enterprise.gui.coregui.client.ImageManager; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource;
/** - * Formats a {@link org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource.SubjectRecord} + * Formats a {@link org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDataSource.SubjectRecord} * (the SmartGWT {@link Record} representation of a {@link Subject}). * * @author Ian Springer diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java index 7cfb393..071bff3 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java @@ -686,6 +686,10 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements }
protected void deleteSelectedRecords() { + deleteSelectedRecords(null); + } + + protected void deleteSelectedRecords(DSRequest requestProperties) { ListGrid listGrid = getListGrid(); final int selectedRecordCount = listGrid.getSelection().length; final List<String> deletedRecordNames = new ArrayList<String>(selectedRecordCount); @@ -704,11 +708,12 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements .widget_recordEditor_info_recordsDeletedDetailed(String.valueOf(deletedRecordNames.size()), getDataTypeNamePlural(), deletedRecordNames.toString())); CoreGUI.getMessageCenter().notify(message); + refresh(); } } // TODO: Print error messages for failures or partial failures. } - }, null); + }, requestProperties); }
protected String getDataTypeName() { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java index a23a8d1..194c921 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java @@ -46,6 +46,8 @@ public interface OperationGWTService extends RemoteService { PageList<GroupOperationHistory> findGroupOperationHistoriesByCriteria(GroupOperationHistoryCriteria criteria) throws RuntimeException;
+ void deleteOperationHistory(int operationHistoryId, boolean deleteEvenIfInProgress) throws RuntimeException; + List<DisambiguationReport<ResourceOperationLastCompletedComposite>> findRecentCompletedOperations(int resourceId, PageControl pageControl) throws RuntimeException;
@@ -57,8 +59,12 @@ public interface OperationGWTService extends RemoteService {
int scheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule) throws RuntimeException;
+ int scheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException; + void unscheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule) throws RuntimeException;
+ void unscheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException; + void scheduleResourceOperation(int resourceId, String operationName, Configuration parameters, String description, int timeout, String cronString) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java new file mode 100644 index 0000000..5ddebb5 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java @@ -0,0 +1,134 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-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.inventory.common.detail.operation.history; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.DSRequest; +import com.smartgwt.client.data.DSResponse; +import com.smartgwt.client.data.DataSourceField; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.data.fields.DataSourceTextField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import org.rhq.core.domain.operation.OperationHistory; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync; +import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; + +import java.util.Date; +import java.util.List; + +/** + * @author Greg Hinkle + * @author Ian Springer + */ +public abstract class AbstractOperationHistoryDataSource<T extends OperationHistory> extends RPCDataSource<T> { + + private T currentOperationHistory; + + public static abstract class Field { + public static final String ID = "id"; + public static final String OPERATION_NAME = "operationName"; + public static final String RESOURCE = "resource"; + public static final String STATUS = "status"; + public static final String STARTED_TIME = "startedTime"; + public static final String CREATED_TIME = "createdTime"; + public static final String DURATION = "duration"; + public static final String SUBJECT = "subject"; + public static final String OPERATION_DEFINITION = "operationDefinition"; + public static final String ERROR_MESSAGE = "errorMessage"; + public static final String PARAMETERS = "parameters"; + } + + protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService(); + + public AbstractOperationHistoryDataSource() { + List<DataSourceField> fields = addDataSourceFields(); + addFields(fields); + } + + @Override + protected void executeRemove(Record recordToRemove, DSRequest request, DSResponse response) { + final OperationHistory operationHistoryToRemove = copyValues(recordToRemove); + Boolean forceValue = request.getAttributeAsBoolean("force"); + boolean force = ((forceValue != null) && forceValue); + operationService.deleteOperationHistory(operationHistoryToRemove.getId(), force, new AsyncCallback<Void>() { + public void onSuccess(Void result) { + return; + } + + public void onFailure(Throwable caught) { + throw new RuntimeException("Failed to delete " + operationHistoryToRemove + ".", caught); + } + }); + } + + @Override + protected List<DataSourceField> addDataSourceFields() { + List<DataSourceField> fields = super.addDataSourceFields(); + + /* + DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID); + idField.setPrimaryKey(true); + fields.add(idField); + */ + + DataSourceTextField nameField = new DataSourceTextField(Field.OPERATION_NAME); + fields.add(nameField); + + /* + DataSourceTextField resourceField = new DataSourceTextField(Field.RESOURCE); + fields.add(resourceField); + + DataSourceTextField statusField = new DataSourceTextField(Field.STATUS); + fields.add(statusField); + + DataSourceTextField startedField = new DataSourceTextField(Field.STARTED_TIME); + startedField.setType(FieldType.DATETIME); + fields.add(startedField); + */ + + return fields; + } + + @Override + public T copyValues(Record from) { + return this.currentOperationHistory; + } + + @Override + public ListGridRecord copyValues(T from) { + this.currentOperationHistory = from; + + ListGridRecord record = new ListGridRecord(); + + record.setAttribute(Field.ID, from.getId()); + record.setAttribute(Field.CREATED_TIME, from.getCreatedTime()); + record.setAttribute(Field.STARTED_TIME, new Date(from.getStartedTime())); + record.setAttribute(Field.DURATION, from.getDuration()); + record.setAttribute(Field.SUBJECT, from.getSubjectName()); + record.setAttribute(Field.OPERATION_DEFINITION, from.getOperationDefinition()); + record.setAttribute(Field.OPERATION_NAME, from.getOperationDefinition().getDisplayName()); + record.setAttribute(Field.ERROR_MESSAGE, from.getErrorMessage()); + record.setAttribute(Field.STATUS, from.getStatus().name()); + record.setAttribute(Field.PARAMETERS, from.getParameters()); + + return record; + } + +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java index bc22921..a010a23 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List;
import com.smartgwt.client.data.Criteria; +import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.DateDisplayFormat; @@ -40,6 +41,7 @@ import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import org.rhq.core.domain.operation.OperationRequestStatus; import org.rhq.enterprise.gui.coregui.client.ImageManager; +import org.rhq.enterprise.gui.coregui.client.components.table.TableAction; import org.rhq.enterprise.gui.coregui.client.components.table.TableSection; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow; @@ -48,48 +50,77 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow; * @author Greg Hinkle * @author John Mazzitelli */ -public abstract class AbstractOperationHistoryListView extends TableSection<OperationHistoryDataSource> { +public abstract class AbstractOperationHistoryListView extends TableSection<AbstractOperationHistoryDataSource> {
private static final String HEADER_ICON = "subsystems/control/Operation_24.png";
- public AbstractOperationHistoryListView(String locatorId, OperationHistoryDataSource dataSource, String title) { + public AbstractOperationHistoryListView(String locatorId, AbstractOperationHistoryDataSource dataSource, String title) { super(locatorId, title); setDataSource(dataSource); setHeaderIcon(HEADER_ICON); }
- public AbstractOperationHistoryListView(String locatorId, OperationHistoryDataSource dataSource, String title, + public AbstractOperationHistoryListView(String locatorId, AbstractOperationHistoryDataSource dataSource, String title, Criteria criteria) { super(locatorId, title, criteria); setDataSource(dataSource); }
+ protected abstract boolean hasControlPermission(); + @Override protected void configureTable() { super.configureTable();
List<ListGridField> fields = createFields(); setListGridFields(fields.toArray(new ListGridField[fields.size()])); + + addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), getDeleteConfirmMessage(), + new TableAction() { + public boolean isEnabled(ListGridRecord[] selection) { + int count = selection.length; + return (count >= 1 && hasControlPermission()); + } + + public void executeAction(ListGridRecord[] selection, Object actionValue) { + deleteSelectedRecords(); + } + }); + + // TODO: i18n + addTableAction(extendLocatorId("ForceDelete"), "Force Delete", getDeleteConfirmMessage(), + new TableAction() { + public boolean isEnabled(ListGridRecord[] selection) { + int count = selection.length; + return (count >= 1 && hasControlPermission()); + } + + public void executeAction(ListGridRecord[] selection, Object actionValue) { + DSRequest requestProperties = new DSRequest(); + requestProperties.setAttribute("force", true); + deleteSelectedRecords(requestProperties); + } + }); }
protected List<ListGridField> createFields() { List<ListGridField> fields = new ArrayList<ListGridField>();
- ListGridField idField = new ListGridField(OperationHistoryDataSource.Field.ID, MSG.common_title_id()); + ListGridField idField = new ListGridField(AbstractOperationHistoryDataSource.Field.ID, MSG.common_title_id()); idField.setWidth(38); fields.add(idField);
- ListGridField opNameField = new ListGridField(OperationHistoryDataSource.Field.OPERATION_NAME, + ListGridField opNameField = new ListGridField(AbstractOperationHistoryDataSource.Field.OPERATION_NAME, MSG.dataSource_operationHistory_operationName()); opNameField.setWidth("34%"); fields.add(opNameField);
- ListGridField subjectField = new ListGridField(OperationHistoryDataSource.Field.SUBJECT, + ListGridField subjectField = new ListGridField(AbstractOperationHistoryDataSource.Field.SUBJECT, MSG.common_title_user()); subjectField.setWidth("33%"); fields.add(subjectField);
- ListGridField statusField = new ListGridField(OperationHistoryDataSource.Field.STATUS, + ListGridField statusField = new ListGridField(AbstractOperationHistoryDataSource.Field.STATUS, MSG.common_title_status()); statusField.setAlign(Alignment.CENTER); statusField.setCellAlign(Alignment.CENTER); @@ -97,7 +128,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper statusField.setHoverCustomizer(new HoverCustomizer() { @Override public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) { - String statusStr = record.getAttribute(OperationHistoryDataSource.Field.STATUS); + String statusStr = record.getAttribute(AbstractOperationHistoryDataSource.Field.STATUS); OperationRequestStatus status = OperationRequestStatus.valueOf(statusStr); switch (status) { case SUCCESS: { @@ -127,7 +158,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper @Override public void onRecordClick(RecordClickEvent event) { Record record = event.getRecord(); - String statusStr = record.getAttribute(OperationHistoryDataSource.Field.STATUS); + String statusStr = record.getAttribute(AbstractOperationHistoryDataSource.Field.STATUS); OperationRequestStatus status = OperationRequestStatus.valueOf(statusStr); if (status == OperationRequestStatus.FAILURE) { final Window winModal = new LocatableWindow(AbstractOperationHistoryListView.this @@ -155,7 +186,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper htmlPane.setMargin(10); htmlPane.setDefaultWidth(500); htmlPane.setDefaultHeight(400); - String errorMsg = record.getAttribute(OperationHistoryDataSource.Field.ERROR_MESSAGE); + String errorMsg = record.getAttribute(AbstractOperationHistoryDataSource.Field.ERROR_MESSAGE); if (errorMsg == null) { errorMsg = MSG.common_status_failed(); } @@ -168,7 +199,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper statusField.setWidth(44); fields.add(statusField);
- ListGridField startedTimeField = new ListGridField(OperationHistoryDataSource.Field.STARTED_TIME, + ListGridField startedTimeField = new ListGridField(AbstractOperationHistoryDataSource.Field.STARTED_TIME, MSG.dataSource_operationHistory_startedTime()); startedTimeField.setType(ListGridFieldType.DATE); startedTimeField.setDateFormatter(DateDisplayFormat.TOLOCALESTRING); @@ -182,7 +213,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper
@Override protected String getDetailsLinkColumnName() { - return OperationHistoryDataSource.Field.OPERATION_NAME; + return AbstractOperationHistoryDataSource.Field.OPERATION_NAME; }
} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java deleted file mode 100644 index c320d10..0000000 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2005-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.inventory.common.detail.operation.history; - -import com.smartgwt.client.data.DataSourceField; -import com.smartgwt.client.data.Record; -import com.smartgwt.client.data.fields.DataSourceTextField; -import com.smartgwt.client.widgets.grid.ListGridRecord; -import org.rhq.core.domain.operation.OperationHistory; -import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; -import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync; -import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; - -import java.util.Date; -import java.util.List; - -/** - * @author Greg Hinkle - */ -public abstract class OperationHistoryDataSource<T extends OperationHistory> extends RPCDataSource<T> { - - public static abstract class Field { - public static final String ID = "id"; - public static final String OPERATION_NAME = "operationName"; - public static final String RESOURCE = "resource"; - public static final String STATUS = "status"; - public static final String STARTED_TIME = "startedTime"; - public static final String CREATED_TIME = "createdTime"; - public static final String DURATION = "duration"; - public static final String SUBJECT = "subject"; - public static final String OPERATION_DEFINITION = "operationDefinition"; - public static final String ERROR_MESSAGE = "errorMessage"; - public static final String PARAMETERS = "parameters"; - } - - protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService(); - - public OperationHistoryDataSource() { - List<DataSourceField> fields = addDataSourceFields(); - addFields(fields); - } - - @Override - protected List<DataSourceField> addDataSourceFields() { - List<DataSourceField> fields = super.addDataSourceFields(); - - /* - DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID); - idField.setPrimaryKey(true); - fields.add(idField); - */ - - DataSourceTextField nameField = new DataSourceTextField(Field.OPERATION_NAME); - fields.add(nameField); - - /* - DataSourceTextField resourceField = new DataSourceTextField(Field.RESOURCE); - fields.add(resourceField); - - DataSourceTextField statusField = new DataSourceTextField(Field.STATUS); - fields.add(statusField); - - DataSourceTextField startedField = new DataSourceTextField(Field.STARTED_TIME); - startedField.setType(FieldType.DATETIME); - fields.add(startedField); - */ - - return fields; - } - - @Override - public T copyValues(Record from) { - throw new UnsupportedOperationException("OperationHistory is read only."); - } - - @Override - public ListGridRecord copyValues(T from) { - ListGridRecord record = new ListGridRecord(); - record.setAttribute(Field.ID, from.getId()); - record.setAttribute(Field.CREATED_TIME, from.getCreatedTime()); - record.setAttribute(Field.STARTED_TIME, new Date(from.getStartedTime())); - record.setAttribute(Field.DURATION, from.getDuration()); - record.setAttribute(Field.SUBJECT, from.getSubjectName()); - record.setAttribute(Field.OPERATION_DEFINITION, from.getOperationDefinition()); - record.setAttribute(Field.OPERATION_NAME, from.getOperationDefinition().getDisplayName()); - record.setAttribute(Field.ERROR_MESSAGE, from.getErrorMessage()); - record.setAttribute(Field.STATUS, from.getStatus().name()); - record.setAttribute(Field.PARAMETERS, from.getParameters()); - - return record; - } - -} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java index 9d5c382..09fc8d2 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java @@ -98,11 +98,11 @@ public class ResourceOperationHistoryDetailsView extends LocatableVLayout implem
OperationRequestStatus status = operationHistory.getStatus();
- StaticTextItem operationItem = new StaticTextItem(OperationHistoryDataSource.Field.OPERATION_NAME, MSG + StaticTextItem operationItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.OPERATION_NAME, MSG .view_operationHistoryDetails_operation()); operationItem.setValue(definition.getDisplayName());
- StaticTextItem submittedItem = new StaticTextItem(OperationHistoryDataSource.Field.STARTED_TIME, MSG + StaticTextItem submittedItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.STARTED_TIME, MSG .view_operationHistoryDetails_dateSubmitted()); submittedItem.setValue(new Date(operationHistory.getStartedTime()));
@@ -115,13 +115,13 @@ public class ResourceOperationHistoryDetailsView extends LocatableVLayout implem completedItem.setValue(new Date(operationHistory.getStartedTime() + operationHistory.getDuration())); }
- StaticTextItem requesterItem = new StaticTextItem(OperationHistoryDataSource.Field.SUBJECT, MSG + StaticTextItem requesterItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.SUBJECT, MSG .view_operationHistoryDetails_requestor()); requesterItem.setValue(operationHistory.getSubjectName());
LinkItem errorLinkItem = null;
- StaticTextItem statusItem = new StaticTextItem(OperationHistoryDataSource.Field.STATUS, MSG + StaticTextItem statusItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.STATUS, MSG .view_operationHistoryDetails_status()); String icon = ImageManager.getFullImagePath(ImageManager.getOperationResultsIcon(status)); statusItem.setValue("<img src='" + icon + "'/>"); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java new file mode 100644 index 0000000..20b84fa --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java @@ -0,0 +1,256 @@ +/* + * RHQ Management Platform + * Copyright 2010, Red Hat Middleware LLC, and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * 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.inventory.common.detail.operation.schedule; + +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Set; + +import com.smartgwt.client.data.DataSourceField; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.data.fields.DataSourceDateTimeField; +import com.smartgwt.client.data.fields.DataSourceIntegerField; +import com.smartgwt.client.data.fields.DataSourceTextField; +import com.smartgwt.client.types.FieldType; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.common.JobTrigger; +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.PropertySimple; +import org.rhq.core.domain.operation.OperationDefinition; +import org.rhq.core.domain.operation.bean.OperationSchedule; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync; +import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; + +/** + * @author Ian Springer + */ +public abstract class AbstractOperationScheduleDataSource<T extends OperationSchedule> extends RPCDataSource<T> { + + public static abstract class Field { + public static final String ID = "id"; + public static final String JOB_NAME = "jobName"; + public static final String JOB_GROUP = "jobGroup"; + public static final String OPERATION_NAME = "operationName"; + public static final String OPERATION_DISPLAY_NAME = "operationDisplayName"; + public static final String PARAMETERS = "parameters"; + public static final String SUBJECT = "subject"; + public static final String DESCRIPTION = "description"; + public static final String NEXT_FIRE_TIME = "nextFireTime"; + public static final String TIMEOUT = "timeout"; + + // job trigger fields + public static final String START_TIME = "startTime"; + public static final String REPEAT_INTERVAL = "repeatInterval"; + public static final String REPEAT_COUNT = "repeatCount"; + public static final String END_TIME = "endTime"; + public static final String CRON_EXPRESSION = "cronExpression"; + } + + protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService(); + + private ResourceType resourceType; + + public AbstractOperationScheduleDataSource(ResourceType resourceType) { + super(); + this.resourceType = resourceType; + List<DataSourceField> fields = addDataSourceFields(); + addFields(fields); + } + + // TODO: i18n + @Override + protected List<DataSourceField> addDataSourceFields() { + List<DataSourceField> fields = super.addDataSourceFields(); + + DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, "ID"); + idField.setPrimaryKey(true); + idField.setCanEdit(false); + fields.add(idField); + + DataSourceTextField operationNameField = createTextField(Field.OPERATION_NAME, "Operation Name", null, 100, + true); + fields.add(operationNameField); + + DataSourceTextField operationDisplayNameField = createTextField(Field.OPERATION_DISPLAY_NAME, "Operation", null, + 100, true); + fields.add(operationDisplayNameField); + + Set<OperationDefinition> operationDefinitions = this.resourceType.getOperationDefinitions(); + LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>(); + for (OperationDefinition operationDefinition : operationDefinitions) { + valueMap.put(operationDefinition.getName(), operationDefinition.getDisplayName()); + } + operationNameField.setValueMap(valueMap); + + DataSourceField subjectField = new DataSourceField(Field.SUBJECT, FieldType.ANY, "Owner"); + subjectField.setCanEdit(false); + fields.add(subjectField); + + DataSourceTextField descriptionField = createTextField(Field.DESCRIPTION, "Notes", null, 100, false); + fields.add(descriptionField); + + DataSourceDateTimeField nextFireTimeField = new DataSourceDateTimeField(Field.NEXT_FIRE_TIME, + "Next Scheduled Execution"); + nextFireTimeField.setCanEdit(false); + fields.add(nextFireTimeField); + + DataSourceIntegerField timeoutField = createIntegerField(Field.TIMEOUT, "Timeout (in seconds)", 30, null, false); + fields.add(timeoutField); + + return fields; + } + + protected abstract T createOperationSchedule(); + + @Override + public T copyValues(Record from) { + T to = createOperationSchedule(); + + to.setId(from.getAttributeAsInt(Field.ID)); + to.setJobName(from.getAttribute(Field.JOB_NAME)); + to.setJobGroup(from.getAttribute(Field.JOB_GROUP)); + SubjectRecord subjectRecord = (SubjectRecord) from.getAttributeAsRecord(Field.SUBJECT); + to.setSubject(subjectRecord.toSubject()); + Configuration parameters = (Configuration) from.getAttributeAsObject(Field.PARAMETERS); + to.setParameters(parameters); + to.setOperationName(from.getAttribute(Field.OPERATION_NAME)); + to.setOperationDisplayName(from.getAttribute(Field.OPERATION_DISPLAY_NAME)); + to.setDescription(from.getAttribute(Field.DESCRIPTION)); + to.setNextFireTime(from.getAttributeAsDate(Field.NEXT_FIRE_TIME)); + if (parameters != null) { + parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, from.getAttributeAsInt(Field.TIMEOUT))); + } + + to.setJobTrigger(createJobTrigger(from.getAttributeAsRecord("jobTrigger"))); + + return to; + } + + @Override + public ListGridRecord copyValues(T from) { + ListGridRecord to = new ListGridRecord(); + + to.setAttribute(Field.ID, from.getId()); + to.setAttribute(Field.JOB_NAME, from.getJobName()); + to.setAttribute(Field.JOB_GROUP, from.getJobGroup()); + SubjectRecord subjectRecord = new SubjectRecord(from.getSubject()); + to.setAttribute(Field.SUBJECT, subjectRecord); + Configuration parameters = from.getParameters(); + to.setAttribute(Field.PARAMETERS, parameters); + to.setAttribute(Field.OPERATION_NAME, from.getOperationName()); + to.setAttribute(Field.OPERATION_DISPLAY_NAME, from.getOperationDisplayName()); + to.setAttribute(Field.DESCRIPTION, from.getDescription()); + to.setAttribute(Field.NEXT_FIRE_TIME, from.getNextFireTime()); + to.setAttribute(Field.TIMEOUT, (parameters != null) ? + parameters.getSimpleValue(OperationDefinition.TIMEOUT_PARAM_NAME, null) : null); + + JobTrigger jobTrigger = from.getJobTrigger(); + Record jobTriggerRecord = new ListGridRecord(); + jobTriggerRecord.setAttribute(Field.START_TIME, jobTrigger.getStartDate()); + jobTriggerRecord.setAttribute(Field.REPEAT_INTERVAL, jobTrigger.getRepeatInterval()); + jobTriggerRecord.setAttribute(Field.REPEAT_COUNT, jobTrigger.getRepeatCount()); + jobTriggerRecord.setAttribute(Field.END_TIME, jobTrigger.getEndDate()); + jobTriggerRecord.setAttribute(Field.CRON_EXPRESSION, jobTrigger.getCronExpression()); + to.setAttribute("jobTrigger", jobTriggerRecord); + + return to; + } + + public JobTrigger createJobTrigger(Record jobTriggerRecord) { + JobTrigger jobTrigger; + + String cronExpression = jobTriggerRecord.getAttribute(Field.CRON_EXPRESSION); + if (cronExpression != null) { + jobTrigger = JobTrigger.createCronTrigger(cronExpression); + } else { + // calendar mode + Date startTime = jobTriggerRecord.getAttributeAsDate(Field.START_TIME); + Long repeatInterval = (Long)jobTriggerRecord.getAttributeAsObject(Field.REPEAT_INTERVAL); + Integer repeatCount = jobTriggerRecord.getAttributeAsInt(Field.REPEAT_COUNT); + Date endTime = jobTriggerRecord.getAttributeAsDate(Field.END_TIME); + + if (startTime != null) { + // LATER + + if (repeatInterval != null) { + // LATER AND REPEAT + + if (repeatCount != null) { + jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, repeatCount); + } else { + jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, endTime); + } + } else { + // LATER ONCE + + jobTrigger = JobTrigger.createLaterTrigger(startTime); + } + } else { + // NOW + if (repeatInterval != null) { + // NOW AND REPEAT + + if (repeatCount != null) { + jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, repeatCount); + } else { + jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, endTime); + } + } else { + // NOW ONCE + + jobTrigger = JobTrigger.createNowTrigger(); + } + } + } + + return jobTrigger; + } + + public static class SubjectRecord extends ListGridRecord { + static final String FIELD_ID = "id"; + static final String FIELD_NAME = "name"; + + public SubjectRecord(Subject subject) { + setAttribute(FIELD_ID, subject.getId()); + setAttribute(FIELD_NAME, subject.getName()); + } + + public int getId() { + return getAttributeAsInt(FIELD_ID); + } + + public String getName() { + return getAttribute(FIELD_NAME); + } + + public Subject toSubject() { + Subject subject = new Subject(); + subject.setId(getId()); + subject.setName(getName()); + return subject; + } + } + +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java index db32a81..bc27926 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java @@ -72,7 +72,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor private Configuration parameters; private EnhancedDynamicForm notesForm;
- public AbstractOperationScheduleDetailsView(String locatorId, OperationScheduleDataSource dataSource, + public AbstractOperationScheduleDetailsView(String locatorId, AbstractOperationScheduleDataSource dataSource, ResourceType resourceType, int scheduleId) { super(locatorId, dataSource, scheduleId, "Scheduled Operation", null);
@@ -140,11 +140,11 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor List<FormItem> notesFields = new ArrayList<FormItem>();
if (!isNewRecord()) { - StaticTextItem nextFireTimeItem = new StaticTextItem(OperationScheduleDataSource.Field.NEXT_FIRE_TIME); + StaticTextItem nextFireTimeItem = new StaticTextItem(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME); notesFields.add(nextFireTimeItem); }
- TextItem timeoutItem = new TextItem(OperationScheduleDataSource.Field.TIMEOUT, "Timeout (in seconds)"); + TextItem timeoutItem = new TextItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout (in seconds)"); notesFields.add(timeoutItem);
TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes"); @@ -175,8 +175,8 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor protected Record createNewRecord() { Record record = super.createNewRecord(); Subject sessionSubject = UserSessionManager.getSessionSubject(); - OperationScheduleDataSource.SubjectRecord subjectRecord = - new OperationScheduleDataSource.SubjectRecord(sessionSubject); + AbstractOperationScheduleDataSource.SubjectRecord subjectRecord = + new AbstractOperationScheduleDataSource.SubjectRecord(sessionSubject); record.setAttribute(ResourceOperationScheduleDataSource.Field.SUBJECT, subjectRecord); return record; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java new file mode 100644 index 0000000..3819b4a --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java @@ -0,0 +1,88 @@ +/* + * RHQ Management Platform + * Copyright 2010, Red Hat Middleware LLC, and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * 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.inventory.common.detail.operation.schedule; + +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.rhq.enterprise.gui.coregui.client.components.table.SubjectRecordCellFormatter; +import org.rhq.enterprise.gui.coregui.client.components.table.TableAction; +import org.rhq.enterprise.gui.coregui.client.components.table.TableSection; + +/** + * @author Ian Springer + */ +public abstract class AbstractOperationScheduleListView extends TableSection<AbstractOperationScheduleDataSource> { + + public AbstractOperationScheduleListView(String locatorId, AbstractOperationScheduleDataSource dataSource, String title) { + super(locatorId, title); + + setDataSource(dataSource); + } + + protected abstract boolean hasControlPermission(); + + @Override + protected void configureTable() { + super.configureTable(); + + ListGridField operationField = new ListGridField(AbstractOperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME, 180); + + ListGridField subjectField = new ListGridField(AbstractOperationScheduleDataSource.Field.SUBJECT, 110); + subjectField.setCellFormatter(new SubjectRecordCellFormatter()); + + //ListGridField jobTriggerField = new ListGridField(OperationScheduleDataSource.Field.JOB_TRIGGER, 300); + + ListGridField nextFireTimeField = new ListGridField(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME, + "Next Scheduled Execution", 190); + + ListGridField descriptionField = new ListGridField(AbstractOperationScheduleDataSource.Field.DESCRIPTION); + + setListGridFields(operationField, subjectField, nextFireTimeField, descriptionField); + + addTableAction(extendLocatorId("New"), MSG.common_button_new(), new TableAction() { + public boolean isEnabled(ListGridRecord[] selection) { + return hasControlPermission(); + } + + public void executeAction(ListGridRecord[] selection, Object actionValue) { + newDetails(); + } + }); + + addTableAction(extendLocatorId("Unschedule"), MSG.common_button_delete(), getDeleteConfirmMessage(), + new TableAction() { + public boolean isEnabled(ListGridRecord[] selection) { + int count = selection.length; + return ((count >= 1) && hasControlPermission()); + } + + public void executeAction(ListGridRecord[] selection, Object actionValue) { + deleteSelectedRecords(); + } + }); + } + + @Override + protected String getDetailsLinkColumnName() { + return AbstractOperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME; + } + +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java deleted file mode 100644 index 3813b98..0000000 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * RHQ Management Platform - * Copyright 2010, Red Hat Middleware LLC, and individual contributors - * as indicated by the @author tags. See the copyright.txt file in the - * distribution for a full listing of individual contributors. - * - * 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.inventory.common.detail.operation.schedule; - -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Set; - -import com.smartgwt.client.data.DataSourceField; -import com.smartgwt.client.data.Record; -import com.smartgwt.client.data.fields.DataSourceDateTimeField; -import com.smartgwt.client.data.fields.DataSourceIntegerField; -import com.smartgwt.client.data.fields.DataSourceTextField; -import com.smartgwt.client.types.FieldType; -import com.smartgwt.client.widgets.grid.ListGridRecord; - -import org.rhq.core.domain.auth.Subject; -import org.rhq.core.domain.common.JobTrigger; -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.configuration.PropertySimple; -import org.rhq.core.domain.operation.OperationDefinition; -import org.rhq.core.domain.operation.bean.OperationSchedule; -import org.rhq.core.domain.resource.ResourceType; -import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; -import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync; -import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; - -/** - * @author Ian Springer - */ -public abstract class OperationScheduleDataSource<T extends OperationSchedule> extends RPCDataSource<T> { - - public static abstract class Field { - public static final String ID = "id"; - public static final String JOB_NAME = "jobName"; - public static final String JOB_GROUP = "jobGroup"; - public static final String OPERATION_NAME = "operationName"; - public static final String OPERATION_DISPLAY_NAME = "operationDisplayName"; - public static final String PARAMETERS = "parameters"; - public static final String SUBJECT = "subject"; - public static final String DESCRIPTION = "description"; - public static final String NEXT_FIRE_TIME = "nextFireTime"; - public static final String TIMEOUT = "timeout"; - - // job trigger fields - public static final String START_TIME = "startTime"; - public static final String REPEAT_INTERVAL = "repeatInterval"; - public static final String REPEAT_COUNT = "repeatCount"; - public static final String END_TIME = "endTime"; - public static final String CRON_EXPRESSION = "cronExpression"; - } - - protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService(); - - private ResourceType resourceType; - - public OperationScheduleDataSource(ResourceType resourceType) { - super(); - this.resourceType = resourceType; - List<DataSourceField> fields = addDataSourceFields(); - addFields(fields); - } - - // TODO: i18n - @Override - protected List<DataSourceField> addDataSourceFields() { - List<DataSourceField> fields = super.addDataSourceFields(); - - DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, "ID"); - idField.setPrimaryKey(true); - idField.setCanEdit(false); - fields.add(idField); - - DataSourceTextField operationNameField = createTextField(Field.OPERATION_NAME, "Operation Name", null, 100, - true); - fields.add(operationNameField); - - DataSourceTextField operationDisplayNameField = createTextField(Field.OPERATION_DISPLAY_NAME, "Operation", null, - 100, true); - fields.add(operationDisplayNameField); - - Set<OperationDefinition> operationDefinitions = this.resourceType.getOperationDefinitions(); - LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>(); - for (OperationDefinition operationDefinition : operationDefinitions) { - valueMap.put(operationDefinition.getName(), operationDefinition.getDisplayName()); - } - operationNameField.setValueMap(valueMap); - - DataSourceField subjectField = new DataSourceField(Field.SUBJECT, FieldType.ANY, "Owner"); - subjectField.setCanEdit(false); - fields.add(subjectField); - - DataSourceTextField descriptionField = createTextField(Field.DESCRIPTION, "Notes", null, 100, false); - fields.add(descriptionField); - - DataSourceDateTimeField nextFireTimeField = new DataSourceDateTimeField(Field.NEXT_FIRE_TIME, - "Next Scheduled Execution"); - nextFireTimeField.setCanEdit(false); - fields.add(nextFireTimeField); - - DataSourceIntegerField timeoutField = createIntegerField(Field.TIMEOUT, "Timeout (in seconds)", 30, null, false); - fields.add(timeoutField); - - return fields; - } - - protected abstract T createOperationSchedule(); - - @Override - public T copyValues(Record from) { - T to = createOperationSchedule(); - - to.setId(from.getAttributeAsInt(Field.ID)); - to.setJobName(from.getAttribute(Field.JOB_NAME)); - to.setJobGroup(from.getAttribute(Field.JOB_GROUP)); - SubjectRecord subjectRecord = (SubjectRecord) from.getAttributeAsRecord(Field.SUBJECT); - to.setSubject(subjectRecord.toSubject()); - Configuration parameters = (Configuration) from.getAttributeAsObject(Field.PARAMETERS); - to.setParameters(parameters); - to.setOperationName(from.getAttribute(Field.OPERATION_NAME)); - to.setOperationDisplayName(from.getAttribute(Field.OPERATION_DISPLAY_NAME)); - to.setDescription(from.getAttribute(Field.DESCRIPTION)); - to.setNextFireTime(from.getAttributeAsDate(Field.NEXT_FIRE_TIME)); - if (parameters != null) { - parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, from.getAttributeAsInt(Field.TIMEOUT))); - } - - to.setJobTrigger(createJobTrigger(from.getAttributeAsRecord("jobTrigger"))); - - return to; - } - - @Override - public ListGridRecord copyValues(T from) { - ListGridRecord to = new ListGridRecord(); - - to.setAttribute(Field.ID, from.getId()); - to.setAttribute(Field.JOB_NAME, from.getJobName()); - to.setAttribute(Field.JOB_GROUP, from.getJobGroup()); - SubjectRecord subjectRecord = new SubjectRecord(from.getSubject()); - to.setAttribute(Field.SUBJECT, subjectRecord); - to.setAttribute(Field.PARAMETERS, from.getParameters()); - to.setAttribute(Field.OPERATION_NAME, from.getOperationName()); - to.setAttribute(Field.OPERATION_DISPLAY_NAME, from.getOperationDisplayName()); - to.setAttribute(Field.DESCRIPTION, from.getDescription()); - to.setAttribute(Field.NEXT_FIRE_TIME, from.getNextFireTime()); - to.setAttribute(Field.TIMEOUT, from.getParameters().getSimpleValue(OperationDefinition.TIMEOUT_PARAM_NAME, null)); - - JobTrigger jobTrigger = from.getJobTrigger(); - Record jobTriggerRecord = new ListGridRecord(); - jobTriggerRecord.setAttribute(Field.START_TIME, jobTrigger.getStartDate()); - jobTriggerRecord.setAttribute(Field.REPEAT_INTERVAL, jobTrigger.getRepeatInterval()); - jobTriggerRecord.setAttribute(Field.REPEAT_COUNT, jobTrigger.getRepeatCount()); - jobTriggerRecord.setAttribute(Field.END_TIME, jobTrigger.getEndDate()); - jobTriggerRecord.setAttribute(Field.CRON_EXPRESSION, jobTrigger.getCronExpression()); - to.setAttribute("jobTrigger", jobTriggerRecord); - - return to; - } - - public JobTrigger createJobTrigger(Record jobTriggerRecord) { - JobTrigger jobTrigger; - - String cronExpression = jobTriggerRecord.getAttribute(Field.CRON_EXPRESSION); - if (cronExpression != null) { - jobTrigger = JobTrigger.createCronTrigger(cronExpression); - } else { - // calendar mode - Date startTime = jobTriggerRecord.getAttributeAsDate(Field.START_TIME); - Long repeatInterval = (Long)jobTriggerRecord.getAttributeAsObject(Field.REPEAT_INTERVAL); - Integer repeatCount = jobTriggerRecord.getAttributeAsInt(Field.REPEAT_COUNT); - Date endTime = jobTriggerRecord.getAttributeAsDate(Field.END_TIME); - - if (startTime != null) { - // LATER - - if (repeatInterval != null) { - // LATER AND REPEAT - - if (repeatCount != null) { - jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, repeatCount); - } else { - jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, endTime); - } - } else { - // LATER ONCE - - jobTrigger = JobTrigger.createLaterTrigger(startTime); - } - } else { - // NOW - if (repeatInterval != null) { - // NOW AND REPEAT - - if (repeatCount != null) { - jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, repeatCount); - } else { - jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, endTime); - } - } else { - // NOW ONCE - - jobTrigger = JobTrigger.createNowTrigger(); - } - } - } - - return jobTrigger; - } - - public static class SubjectRecord extends ListGridRecord { - static final String FIELD_ID = "id"; - static final String FIELD_NAME = "name"; - - public SubjectRecord(Subject subject) { - setAttribute(FIELD_ID, subject.getId()); - setAttribute(FIELD_NAME, subject.getName()); - } - - public int getId() { - return getAttributeAsInt(FIELD_ID); - } - - public String getName() { - return getAttribute(FIELD_NAME); - } - - public Subject toSubject() { - Subject subject = new Subject(); - subject.setId(getId()); - subject.setName(getName()); - return subject; - } - } - -} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java deleted file mode 100644 index 3d8fd6d..0000000 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * RHQ Management Platform - * Copyright 2010, Red Hat Middleware LLC, and individual contributors - * as indicated by the @author tags. See the copyright.txt file in the - * distribution for a full listing of individual contributors. - * - * 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.inventory.common.detail.operation.schedule; - -import com.smartgwt.client.widgets.grid.ListGridField; -import com.smartgwt.client.widgets.grid.ListGridRecord; - -import org.rhq.enterprise.gui.coregui.client.components.table.SubjectRecordCellFormatter; -import org.rhq.enterprise.gui.coregui.client.components.table.TableAction; -import org.rhq.enterprise.gui.coregui.client.components.table.TableSection; - -/** - * @author Ian Springer - */ -public abstract class OperationScheduleListView extends TableSection<OperationScheduleDataSource> { - - public OperationScheduleListView(String locatorId, OperationScheduleDataSource dataSource, String title) { - super(locatorId, title); - - setDataSource(dataSource); - } - - protected abstract boolean hasControlPermission(); - - @Override - protected void configureTable() { - super.configureTable(); - - ListGridField operationField = new ListGridField(OperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME, 180); - - ListGridField subjectField = new ListGridField(OperationScheduleDataSource.Field.SUBJECT, 110); - subjectField.setCellFormatter(new SubjectRecordCellFormatter()); - - //ListGridField jobTriggerField = new ListGridField(OperationScheduleDataSource.Field.JOB_TRIGGER, 300); - - ListGridField nextFireTimeField = new ListGridField(OperationScheduleDataSource.Field.NEXT_FIRE_TIME, - "Next Scheduled Execution", 190); - - ListGridField descriptionField = new ListGridField(OperationScheduleDataSource.Field.DESCRIPTION); - - setListGridFields(operationField, subjectField, nextFireTimeField, descriptionField); - - addTableAction(extendLocatorId("New"), MSG.common_button_new(), new TableAction() { - public boolean isEnabled(ListGridRecord[] selection) { - return hasControlPermission(); - } - - public void executeAction(ListGridRecord[] selection, Object actionValue) { - newDetails(); - } - }); - - addTableAction(extendLocatorId("Unschedule"), MSG.common_button_delete(), getDeleteConfirmMessage(), - new TableAction() { - public boolean isEnabled(ListGridRecord[] selection) { - int count = selection.length; - return ((count >= 1) && hasControlPermission()); - } - - public void executeAction(ListGridRecord[] selection, Object actionValue) { - deleteSelectedRecords(); - } - }); - } - - @Override - protected String getDetailsLinkColumnName() { - return OperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME; - } - -} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java index d02949a..ff90336 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java @@ -27,16 +27,16 @@ import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria; import org.rhq.core.domain.operation.GroupOperationHistory; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.gui.coregui.client.CoreGUI; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.OperationHistoryDataSource; +import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryDataSource;
import java.util.Arrays;
/** * @author Ian Springer */ -public class GroupOperationHistoryDataSource extends OperationHistoryDataSource<GroupOperationHistory> { +public class GroupOperationHistoryDataSource extends AbstractOperationHistoryDataSource<GroupOperationHistory> {
- public static abstract class Field extends OperationHistoryDataSource.Field { + public static abstract class Field extends AbstractOperationHistoryDataSource.Field { public static final String GROUP = "group"; }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java index 9206e4f..887e313 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java @@ -23,7 +23,6 @@ import com.smartgwt.client.data.Criteria; import com.smartgwt.client.widgets.Canvas; import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite; import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryListView; -import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.history.ResourceOperationHistoryDataSource;
/** * @author Ian Springer @@ -33,17 +32,15 @@ public class GroupOperationHistoryListView extends AbstractOperationHistoryListV private ResourceGroupComposite groupComposite;
public GroupOperationHistoryListView(String locatorId, ResourceGroupComposite groupComposite) { - super(locatorId, new ResourceOperationHistoryDataSource(), null, + super(locatorId, new GroupOperationHistoryDataSource(), null, new Criteria(GroupOperationHistoryDataSource.CriteriaField.GROUP_ID, String.valueOf(groupComposite.getResourceGroup().getId()))); this.groupComposite = groupComposite; }
@Override - protected void configureTable() { - super.configureTable(); - - // TODO: Add Delete button. + protected boolean hasControlPermission() { + return this.groupComposite.getResourcePermission().isControl(); }
@Override diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java index d104eb2..7603a45 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java @@ -26,7 +26,7 @@ import com.smartgwt.client.data.Record; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.operation.bean.GroupOperationSchedule; import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource; +import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDataSource;
import java.util.List;
@@ -36,7 +36,7 @@ import java.util.List; * * @author Ian Springer */ -public class GroupOperationScheduleDataSource extends OperationScheduleDataSource<GroupOperationSchedule> { +public class GroupOperationScheduleDataSource extends AbstractOperationScheduleDataSource<GroupOperationSchedule> {
private ResourceGroupComposite groupComposite;
@@ -74,8 +74,8 @@ public class GroupOperationScheduleDataSource extends OperationScheduleDataSourc Configuration parameters = (Configuration) request.getAttributeAsObject("parameters"); recordToAdd.setAttribute(Field.PARAMETERS, parameters); final GroupOperationSchedule scheduleToAdd = copyValues(recordToAdd); - // TODO - /*operationService.scheduleResourceOperation(scheduleToAdd, new AsyncCallback<Integer>() { + + operationService.scheduleGroupOperation(scheduleToAdd, new AsyncCallback<Integer>() { public void onSuccess(Integer scheduleId) { scheduleToAdd.setId(scheduleId); sendSuccessResponse(request, response, scheduleToAdd); @@ -84,22 +84,22 @@ public class GroupOperationScheduleDataSource extends OperationScheduleDataSourc public void onFailure(Throwable caught) { throw new RuntimeException("Failed to add " + scheduleToAdd, caught); } - });*/ + }); }
@Override protected void executeRemove(Record recordToRemove, final DSRequest request, final DSResponse response) { final GroupOperationSchedule scheduleToRemove = copyValues(recordToRemove); - // TODO - /*operationService.unscheduleResourceOperation(scheduleToRemove, new AsyncCallback<Void>() { + + operationService.unscheduleGroupOperation(scheduleToRemove, new AsyncCallback<Void>() { public void onSuccess(Void result) { sendSuccessResponse(request, response, scheduleToRemove); }
public void onFailure(Throwable caught) { - throw new RuntimeException(caught); + throw new RuntimeException("Failed to remove " + scheduleToRemove, caught); } - });*/ + }); }
} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java index f3b376b..f2183af 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java @@ -21,15 +21,12 @@ package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.operation.
import com.smartgwt.client.widgets.Canvas; import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDetailsView; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleListView; -import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource; +import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleListView;
/** * @author Ian Springer */ -public class GroupOperationScheduleListView extends OperationScheduleListView { +public class GroupOperationScheduleListView extends AbstractOperationScheduleListView {
private static final String TITLE = null;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java index 447ec17..ca53ba0 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java @@ -23,22 +23,19 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse;
-import com.smartgwt.client.data.Record; import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria; -import org.rhq.core.domain.operation.OperationHistory; import org.rhq.core.domain.operation.ResourceOperationHistory; -import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.gui.coregui.client.CoreGUI; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.OperationHistoryDataSource; +import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryDataSource;
/** * @author Ian Springer */ -public class ResourceOperationHistoryDataSource extends OperationHistoryDataSource<ResourceOperationHistory> { +public class ResourceOperationHistoryDataSource extends AbstractOperationHistoryDataSource<ResourceOperationHistory> {
- public static abstract class Field extends OperationHistoryDataSource.Field { + public static abstract class Field extends AbstractOperationHistoryDataSource.Field { public static final String RESOURCE = "resource"; }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java index 086b39d..3b0f747 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java @@ -40,10 +40,8 @@ public class ResourceOperationHistoryListView extends AbstractOperationHistoryLi }
@Override - protected void configureTable() { - super.configureTable(); - - // TODO: Add Delete button. + protected boolean hasControlPermission() { + return this.resourceComposite.getResourcePermission().isControl(); }
@Override diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java index c122bfb..0950a70 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java @@ -30,14 +30,14 @@ import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.operation.bean.ResourceOperationSchedule; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.composite.ResourceComposite; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource; +import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDataSource;
/** * A DataSource for {@link ResourceOperationSchedule}s for a given {@link Resource}. * * @author Ian Springer */ -public class ResourceOperationScheduleDataSource extends OperationScheduleDataSource<ResourceOperationSchedule> { +public class ResourceOperationScheduleDataSource extends AbstractOperationScheduleDataSource<ResourceOperationSchedule> {
private ResourceComposite resourceComposite;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java index 70f2c18..483f97d 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java @@ -1,9 +1,7 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule;
-import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDetailsView; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource;
/** * diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java index 0e362f0..1f37161 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java @@ -22,13 +22,12 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operatio import com.smartgwt.client.widgets.Canvas;
import org.rhq.core.domain.resource.composite.ResourceComposite; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleListView; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDetailsView; +import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleListView;
/** * @author Ian Springer */ -public class ResourceOperationScheduleListView extends OperationScheduleListView { +public class ResourceOperationScheduleListView extends AbstractOperationScheduleListView {
private static final String TITLE = null;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java index af46041..81ebb94 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java @@ -19,7 +19,9 @@ */ package org.rhq.enterprise.gui.coregui.client.report.operation;
+import java.util.EnumSet; import java.util.List; +import java.util.Set;
import com.smartgwt.client.types.Alignment; import com.smartgwt.client.widgets.Canvas; @@ -27,11 +29,14 @@ import com.smartgwt.client.widgets.grid.CellFormatter; 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.Resource; import org.rhq.enterprise.gui.coregui.client.LinkManager; +import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener; +import org.rhq.enterprise.gui.coregui.client.PermissionsLoader; import org.rhq.enterprise.gui.coregui.client.components.view.ViewName; +import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryDataSource; import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryListView; -import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.OperationHistoryDataSource; import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.ResourceOperationHistoryDetailsView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.history.ResourceOperationHistoryDataSource;
@@ -42,8 +47,27 @@ public class SubsystemOperationHistoryListView extends AbstractOperationHistoryL
public static final ViewName VIEW_ID = new ViewName("RecentOperations", MSG.common_title_recent_operations());
+ private Set<Permission> globalPermissions; + public SubsystemOperationHistoryListView(String locatorId) { super(locatorId, new ResourceOperationHistoryDataSource(), VIEW_ID.getTitle()); + + this.globalPermissions = EnumSet.noneOf(Permission.class); + loadGlobalPermissions(); + } + + @Override + protected boolean hasControlPermission() { + loadGlobalPermissions(); + return this.globalPermissions.contains(Permission.MANAGE_INVENTORY); + } + + private void loadGlobalPermissions() { + new PermissionsLoader().loadExplicitGlobalPermissions(new PermissionsLoadedListener() { + public void onPermissionsLoaded(Set<Permission> permissions) { + globalPermissions = permissions; + } + }); }
@Override @@ -52,14 +76,14 @@ public class SubsystemOperationHistoryListView extends AbstractOperationHistoryL
for (ListGridField field : fields) { String fieldName = field.getName(); - if (fieldName.equals(OperationHistoryDataSource.Field.OPERATION_NAME) || - fieldName.equals(OperationHistoryDataSource.Field.SUBJECT) || - fieldName.equals(OperationHistoryDataSource.Field.STARTED_TIME)) { + if (fieldName.equals(AbstractOperationHistoryDataSource.Field.OPERATION_NAME) || + fieldName.equals(AbstractOperationHistoryDataSource.Field.SUBJECT) || + fieldName.equals(AbstractOperationHistoryDataSource.Field.STARTED_TIME)) { field.setWidth("25%"); } }
- ListGridField resourceField = new ListGridField(OperationHistoryDataSource.Field.RESOURCE, + ListGridField resourceField = new ListGridField(AbstractOperationHistoryDataSource.Field.RESOURCE, MSG.common_title_resource()); resourceField.setAlign(Alignment.LEFT); resourceField.setCellAlign(Alignment.LEFT); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java index 5fc3c0d..7a9b1a9 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java @@ -45,6 +45,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
/** * @author Greg Hinkle + * @author Ian Springer */ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements OperationGWTService {
@@ -71,6 +72,14 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O } }
+ public void deleteOperationHistory(int operationHistoryId, boolean deleteEvenIfInProgress) { + try { + operationManager.deleteOperationHistory(getSessionSubject(), operationHistoryId, deleteEvenIfInProgress); + } catch (RuntimeException e) { + throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + } + } + public void invokeResourceOperation(int resourceId, String operationName, Configuration parameters, String description, int timeout) throws RuntimeException { try { @@ -101,6 +110,15 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O } }
+ public int scheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException { + try { + return operationManager.scheduleGroupOperation(getSessionSubject(), groupOperationSchedule); + } catch (RuntimeException e) { + e.printStackTrace(); + throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + } + } + public void unscheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule) throws RuntimeException { try { @@ -112,6 +130,17 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O } }
+ public void unscheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) + throws RuntimeException { + try { + operationManager.unscheduleGroupOperation(getSessionSubject(), groupOperationSchedule.getJobId() + .toString(), groupOperationSchedule.getGroup().getId()); + } catch (RuntimeException e) { + e.printStackTrace(); + throw new RuntimeException(ThrowableUtil.getAllMessages(e)); + } + } + /** Find recently completed operations, disambiguate them and return that list. * */ diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java index 45f7832..efe8cc4 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java @@ -66,6 +66,7 @@ import org.rhq.core.domain.operation.ResourceOperationHistory; import org.rhq.core.domain.operation.ResourceOperationScheduleEntity; import org.rhq.core.domain.operation.ScheduleJobId; import org.rhq.core.domain.operation.bean.GroupOperationSchedule; +import org.rhq.core.domain.operation.bean.OperationSchedule; import org.rhq.core.domain.operation.bean.ResourceOperationSchedule; import org.rhq.core.domain.operation.composite.GroupOperationLastCompletedComposite; import org.rhq.core.domain.operation.composite.GroupOperationScheduleComposite; @@ -179,6 +180,30 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan } }
+ public int scheduleGroupOperation(Subject subject, GroupOperationSchedule schedule) throws ScheduleException { + JobTrigger jobTrigger = schedule.getJobTrigger(); + Trigger trigger = convertToTrigger(jobTrigger); + try { + List<Resource> executionOrderResources = schedule.getExecutionOrder(); + int[] executionOrderResourceIds; + if (executionOrderResources == null) { + executionOrderResourceIds = null; + } else { + executionOrderResourceIds = new int[executionOrderResources.size()]; + for (int i = 0, executionOrderResourcesSize = executionOrderResources.size(); i < executionOrderResourcesSize; i++) { + Resource executionOrderResource = executionOrderResources.get(i); + executionOrderResourceIds[i] = executionOrderResource.getId(); + } + } + GroupOperationSchedule groupOperationSchedule = scheduleGroupOperation(subject, schedule + .getGroup().getId(), executionOrderResourceIds, schedule.getHaltOnFailure(), + schedule.getOperationName(), schedule.getParameters(), trigger, schedule.getDescription()); + return groupOperationSchedule.getId(); + } catch (SchedulerException e) { + throw new ScheduleException(e); + } + } + public ResourceOperationSchedule scheduleResourceOperation(Subject subject, int resourceId, String operationName, Configuration parameters, Trigger trigger, String notes) throws SchedulerException { Resource resource = getResourceIfAuthorized(subject, resourceId); @@ -557,7 +582,10 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan } }
+ Integer entityId = getOperationScheduleEntityId(jobDetail); + GroupOperationSchedule sched = new GroupOperationSchedule(); + sched.setId(entityId); sched.setJobName(jobDetail.getName()); sched.setJobGroup(jobDetail.getGroup()); sched.setGroup(group); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java index a48a385..846b54d 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java @@ -74,6 +74,17 @@ public interface OperationManagerLocal { int scheduleResourceOperation(Subject subject, ResourceOperationSchedule schedule);
/** + * Schedules a Resource group operation for execution. + * + * @param subject the user who is asking to schedule the job + * @param schedule the information describing the operation to be scheduled along with the schedule to be used + * + * @return the id of the {@link org.rhq.core.domain.operation.GroupOperationScheduleEntity} created to track the + * scheduled operation + */ + int scheduleGroupOperation(Subject subject, GroupOperationSchedule schedule) throws ScheduleException; + + /** * Schedules an operation for execution on the given resource. * * @param subject the user who is asking to schedule the job
rhq-commits@lists.fedorahosted.org