/* * RHQ Management Platform * Copyright (C) 2005-2014 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.coregui.client.inventory.common.detail.operation.schedule; import java.util.Comparator; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.TreeSet; import com.smartgwt.client.data.DSRequest; 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.criteria.Criteria; 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.coregui.client.gwt.GWTServiceLookup; import org.rhq.coregui.client.gwt.OperationGWTServiceAsync; import org.rhq.coregui.client.inventory.groups.detail.operation.schedule.GroupOperationScheduleDataSource; import org.rhq.coregui.client.util.RPCDataSource; import org.rhq.coregui.client.util.RecordUtility; /** * @author Ian Springer */ public abstract class AbstractOperationScheduleDataSource<T extends OperationSchedule> extends RPCDataSource<T, Criteria> { 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 SUBJECT_ID = "subjectId"; public static final String DESCRIPTION = "description"; public static final String NEXT_FIRE_TIME = "nextFireTime"; public static final String TIMEOUT = "timeout"; public static final String JOB_TRIGGER = "jobTrigger"; // 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"; } public static abstract class RequestProperty { public static final String PARAMETERS = "parameters"; } 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, MSG .dataSource_operationSchedule_field_id()); idField.setPrimaryKey(true); idField.setCanEdit(false); fields.add(idField); DataSourceTextField operationNameField = createTextField(Field.OPERATION_NAME, MSG .dataSource_operationSchedule_field_operationName(), null, 100, true); // sort the op def names in the drop down TreeSet<OperationDefinition> operationDefinitions = new TreeSet<OperationDefinition>( new Comparator<OperationDefinition>() { public int compare(OperationDefinition o1, OperationDefinition o2) { return o1.getDisplayName().compareTo(o2.getDisplayName()); } }); operationDefinitions.addAll(this.resourceType.getOperationDefinitions()); LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>(); for (OperationDefinition operationDefinition : operationDefinitions) { valueMap.put(operationDefinition.getName(), operationDefinition.getDisplayName()); } operationNameField.setValueMap(valueMap); fields.add(operationNameField); DataSourceTextField operationDisplayNameField = createTextField(Field.OPERATION_DISPLAY_NAME, MSG .dataSource_operationSchedule_field_operationDisplayName(), null, 100, true); fields.add(operationDisplayNameField); DataSourceField subjectField = new DataSourceField(Field.SUBJECT, FieldType.ANY, MSG.common_title_owner()); subjectField.setCanEdit(false); fields.add(subjectField); DataSourceTextField descriptionField = createTextField(Field.DESCRIPTION, MSG .dataSource_operationSchedule_field_description(), null, 100, false); fields.add(descriptionField); DataSourceDateTimeField nextFireTimeField = new DataSourceDateTimeField(Field.NEXT_FIRE_TIME, MSG .dataSource_operationSchedule_field_nextFireTime()); nextFireTimeField.setCanEdit(false); fields.add(nextFireTimeField); DataSourceIntegerField timeoutField = createIntegerField(Field.TIMEOUT, MSG .dataSource_operationSchedule_field_timeout(), 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)); Subject subject = new Subject(); subject.setName(from.getAttribute(Field.SUBJECT)); subject.setId(from.getAttributeAsInt(Field.SUBJECT_ID)); to.setSubject(subject); Configuration parameters = (Configuration) from.getAttributeAsObject(Field.PARAMETERS); Integer timeout = RecordUtility.getAttributeAsInteger(from, Field.TIMEOUT); if (timeout != null) { if (parameters == null) { parameters = new Configuration(); } parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, timeout)); } 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)); 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()); to.setAttribute(Field.SUBJECT, from.getSubject().getName()); to.setAttribute(Field.SUBJECT_ID, from.getSubject().getId()); 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 = jobTriggerRecord.getAttributeAsLong(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; } protected void addRequestPropertiesToRecord(DSRequest request, Record record) { Configuration parameters = (Configuration) request .getAttributeAsObject(GroupOperationScheduleDataSource.RequestProperty.PARAMETERS); record.setAttribute(GroupOperationScheduleDataSource.Field.PARAMETERS, parameters); } /** * All data sources extending this type do not use the normal criteria object to query. * So this just returns null. */ @Override protected Criteria getFetchCriteria(DSRequest request) { return null; } }