/* * RHQ Management Platform * Copyright (C) 2005-2011 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.coregui.client.inventory.resource.detail; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.TitleOrientation; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.HeaderItem; import com.smartgwt.client.widgets.form.fields.SpacerItem; import com.smartgwt.client.widgets.form.fields.StaticTextItem; import org.rhq.core.domain.measurement.DataType; import org.rhq.core.domain.measurement.DisplayType; import org.rhq.core.domain.measurement.MeasurementDataTrait; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.core.domain.util.ResourceTypeUtility; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.components.form.EditableFormItem; import org.rhq.coregui.client.components.form.EnhancedDynamicForm; import org.rhq.coregui.client.components.form.SimpleEditableFormItem.ValueEditedHandler; import org.rhq.coregui.client.components.form.StringLengthValidator; import org.rhq.coregui.client.components.table.TimestampCellFormatter; import org.rhq.coregui.client.gwt.GWTServiceLookup; import org.rhq.coregui.client.gwt.ResourceGWTServiceAsync; import org.rhq.coregui.client.inventory.resource.AncestryUtil; import org.rhq.coregui.client.inventory.resource.ResourceDataSourceField; import org.rhq.coregui.client.inventory.resource.type.ResourceTypeRepository; import org.rhq.coregui.client.util.message.Message; /** * The Resource Summary>Overview tab - Resource general properties + summary traits. * * @author Greg Hinkle * @author Ian Springer */ public class OverviewForm extends EnhancedDynamicForm { private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService(); private ResourceComposite resourceComposite; private boolean headerEnabled = true; private boolean displayCondensed = false; private final ResourceTitleBar titleBar; public OverviewForm(ResourceComposite resourceComposite, ResourceTitleBar titleBar) { super(); this.resourceComposite = resourceComposite; this.titleBar = titleBar; } @Override protected void onDraw() { super.onDraw(); setLeft("10%"); setWidth("80%"); if (isDisplayCondensed()) { //setPadding(5); setColWidths(150, 220, 150, 220); setWidth("45%"); this.setAlign(Alignment.LEFT); } if (this.resourceComposite != null) { setResource(this.resourceComposite); } } public void setResource(ResourceComposite resourceComposite) { this.resourceComposite = resourceComposite; Resource resource = resourceComposite.getResource(); // Load metric defs. ResourceTypeRepository.Cache.getInstance().getResourceTypes(resource.getResourceType().getId(), EnumSet.of(ResourceTypeRepository.MetadataType.measurements), new ResourceTypeRepository.TypeLoadedCallback() { public void onTypesLoaded(ResourceType type) { buildForm(type); loadTraitValues(); } }); } private void loadTraitValues() { final Resource resource = resourceComposite.getResource(); GWTServiceLookup.getMeasurementDataService().findCurrentTraitsForResource(resource.getId(), DisplayType.SUMMARY, new AsyncCallback<List<MeasurementDataTrait>>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_summaryOverviewForm_error_traitsLoadFailure(resource.toString()), caught); } public void onSuccess(List<MeasurementDataTrait> result) { for (MeasurementDataTrait trait : result) { String formItemId = buildFormItemIdFromTraitDisplayName(trait.getName()); FormItem item = getItem(formItemId); if (item != null) { setValue(formItemId, trait.getValue()); } } markForRedraw(); } }); } private static String buildFormItemIdFromTraitDisplayName(String traitName) { return traitName.replaceAll("\\.", "_").replaceAll(" ", "__"); } private void buildForm(ResourceType type) { StringLengthValidator notEmptyOrNullValidator = new StringLengthValidator(1, null, false); //StringLengthValidator notNullValidator = new StringLengthValidator(null, null, false); List<FormItem> formItems = new ArrayList<FormItem>(); if (isHeaderEnabled()) {//conditionally display header HeaderItem headerItem = new HeaderItem("header", MSG.view_summaryOverviewForm_header_summary()); headerItem.setValue(MSG.view_summaryOverviewForm_header_summary()); formItems.add(headerItem); } // Type StaticTextItem typeItem = new StaticTextItem("type", MSG.view_summaryOverviewForm_field_type()); typeItem.setTooltip(MSG.common_title_plugin() + ": " + type.getPlugin() + "\n<br>" + MSG.common_title_type() + ": " + ResourceTypeUtility.displayName(type)); typeItem.setValue(AncestryUtil.getFormattedType(type)); formItems.add(typeItem); final Resource resource = this.resourceComposite.getResource(); // Key StaticTextItem keyItem = new StaticTextItem(ResourceDataSourceField.KEY.propertyName(), ResourceDataSourceField.KEY.title()); keyItem.setAttribute(OUTPUT_AS_HTML_ATTRIBUTE, true); keyItem.setValue(resource.getResourceKey()); formItems.add(keyItem); boolean modifiable = this.resourceComposite.getResourcePermission().isInventory(); // Name final FormItem nameItem = (modifiable) ? new EditableFormItem() : new StaticTextItem(); nameItem.setName("name"); nameItem.setTitle(MSG.view_summaryOverviewForm_field_name()); nameItem.setValue(resource.getName()); nameItem.setAttribute(OUTPUT_AS_HTML_ATTRIBUTE, true); if (nameItem instanceof EditableFormItem) { EditableFormItem togglableNameItem = (EditableFormItem) nameItem; togglableNameItem.setValidators(notEmptyOrNullValidator); togglableNameItem.setValueEditedHandler(new ValueEditedHandler() { public void editedValue(Object newValue) { final String newName = newValue.toString(); final String oldName = resource.getName(); if (newName.equals(oldName)) { return; } resource.setName(newName); OverviewForm.this.resourceService.updateResource(resource, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_summaryOverviewForm_error_nameChangeFailure(String.valueOf(resource.getId()), oldName, newName), caught); // We failed to update it on the Server, so change back the Resource and the form item to // the original value. resource.setName(oldName); nameItem.setValue(oldName); } public void onSuccess(Void result) { titleBar.displayResourceName(newName); CoreGUI.getMessageCenter().notify( new Message(MSG.view_summaryOverviewForm_message_nameChangeSuccess( String.valueOf(resource.getId()), oldName, newName), Message.Severity.Info)); } }); } }); } formItems.add(nameItem); // Description final FormItem descriptionItem = (modifiable) ? new EditableFormItem() : new StaticTextItem(); descriptionItem.setName("description"); descriptionItem.setTitle(MSG.common_title_description()); descriptionItem.setValue(resource.getDescription()); descriptionItem.setAttribute(OUTPUT_AS_HTML_ATTRIBUTE, true); if (descriptionItem instanceof EditableFormItem) { EditableFormItem togglableDescriptionItem = (EditableFormItem) descriptionItem; togglableDescriptionItem.setValueEditedHandler(new ValueEditedHandler() { public void editedValue(Object newValue) { final String newDescription = newValue != null ? newValue.toString() : ""; final String oldDescription = resource.getDescription(); if (newDescription.equals(oldDescription)) { return; } resource.setDescription(newDescription); OverviewForm.this.resourceService.updateResource(resource, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_summaryOverviewForm_error_descriptionChangeFailure( String.valueOf(resource.getId()), oldDescription, newDescription), caught); // We failed to update it on the Server, so change back the Resource and the form item to // the original value. resource.setDescription(oldDescription); descriptionItem.setValue(oldDescription); } public void onSuccess(Void result) { CoreGUI.getMessageCenter().notify( new Message(MSG.view_summaryOverviewForm_message_nameChangeSuccess( String.valueOf(resource.getId()), oldDescription, newDescription), Message.Severity.Info)); } }); } }); } formItems.add(descriptionItem); // Location final FormItem locationItem = (modifiable) ? new EditableFormItem() : new StaticTextItem(); locationItem.setName("location"); locationItem.setTitle(MSG.view_summaryOverviewForm_field_location()); locationItem.setValue(resource.getLocation()); locationItem.setAttribute(OUTPUT_AS_HTML_ATTRIBUTE, true); if (locationItem instanceof EditableFormItem) { EditableFormItem togglableLocationItem = (EditableFormItem) locationItem; togglableLocationItem.setValueEditedHandler(new ValueEditedHandler() { public void editedValue(Object newValue) { final String newLocation = newValue != null ? newValue.toString() : ""; final String oldLocation = resource.getLocation(); if (newLocation.equals(oldLocation)) { return; } resource.setLocation(newLocation); OverviewForm.this.resourceService.updateResource(resource, new AsyncCallback<Void>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( MSG.view_summaryOverviewForm_error_locationChangeFailure( String.valueOf(resource.getId()), oldLocation, newLocation), caught); // We failed to update it on the Server, so change back the Resource and the form item to // the original value. resource.setLocation(oldLocation); locationItem.setValue(oldLocation); } public void onSuccess(Void result) { CoreGUI.getMessageCenter() .notify( new Message(MSG.view_summaryOverviewForm_message_nameChangeSuccess( String.valueOf(resource.getId()), oldLocation, newLocation), Message.Severity.Info)); } }); } }); } formItems.add(locationItem); // Version StaticTextItem versionItem = new StaticTextItem("version", MSG.view_summaryOverviewForm_field_version()); String version = (resource.getVersion() != null) ? resource.getVersion() : "<i>" + MSG.common_label_none() + "</i>"; versionItem.setValue(version); formItems.add(versionItem); // Timestamps StaticTextItem ctimeItem = new StaticTextItem(ResourceDataSourceField.CTIME.propertyName(), ResourceDataSourceField.CTIME.title()); String ctime = TimestampCellFormatter.format(resource.getCtime()); ctimeItem.setValue(ctime); formItems.add(ctimeItem); StaticTextItem itimeItem = new StaticTextItem(ResourceDataSourceField.ITIME.propertyName(), ResourceDataSourceField.ITIME.title()); String itime = TimestampCellFormatter.format(resource.getItime()); itimeItem.setValue(itime); formItems.add(itimeItem); StaticTextItem mtimeItem = new StaticTextItem(ResourceDataSourceField.MTIME.propertyName(), ResourceDataSourceField.MTIME.title()); String mtime = TimestampCellFormatter.format(resource.getMtime()); mtimeItem.setValue(mtime); formItems.add(mtimeItem); StaticTextItem modifierItem = new StaticTextItem(ResourceDataSourceField.MODIFIER.propertyName(), ResourceDataSourceField.MODIFIER.title()); modifierItem.setValue(resource.getModifiedBy()); formItems.add(modifierItem); // Traits List<MeasurementDefinition> summaryTraitDefs = new ArrayList<MeasurementDefinition>(); for (MeasurementDefinition measurementDef : type.getMetricDefinitions()) { if (measurementDef.getDataType() == DataType.TRAIT && measurementDef.getDisplayType() == DisplayType.SUMMARY) { summaryTraitDefs.add(measurementDef); } } Collections.sort(summaryTraitDefs, new Comparator<MeasurementDefinition>() { public int compare(MeasurementDefinition md1, MeasurementDefinition md2) { return Integer.valueOf(md1.getDisplayOrder()).compareTo(md2.getDisplayOrder()); } }); for (MeasurementDefinition trait : summaryTraitDefs) { String formItemId = buildFormItemIdFromTraitDisplayName(trait.getDisplayName()); StaticTextItem formItem = new StaticTextItem(formItemId, trait.getDisplayName()); formItem.setTooltip(trait.getDescription()); formItems.add(formItem); // item.setValue("?"); } // SectionItem section = new SectionItem("Summary", "Summary"); // section.setTitle("Summary"); // section.setDefaultValue("Summary"); // section.setCanCollapse(true); // section.setCellStyle("HidablePlainSectionHeader"); // section.setItemIds(itemIds.toArray(new String[itemIds.size()])); // formItems.add(0, section); if (!isDisplayCondensed()) { formItems.add(new SpacerItem()); } setItems(formItems.toArray(new FormItem[formItems.size()])); this.setTitleAlign(Alignment.LEFT); this.setTitleOrientation(TitleOrientation.LEFT); this.setWrapItemTitles(false); } public void loadData() { // TODO: Reload the ResourceComposite too. loadTraitValues(); markForRedraw(); } public boolean isHeaderEnabled() { return headerEnabled; } public void setHeaderEnabled(boolean headerEnabled) { this.headerEnabled = headerEnabled; } public boolean isDisplayCondensed() { return displayCondensed; } public void setDisplayCondensed(boolean displayCondensed) { this.displayCondensed = displayCondensed; } }