/*
* RHQ Management Platform
* Copyright 2011, 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.coregui.client.drift;
import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
import static org.rhq.coregui.client.components.table.TimestampCellFormatter.DATE_TIME_FORMAT_FULL;
import java.util.LinkedHashMap;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.LinkItem;
import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftDetails;
import org.rhq.core.domain.drift.DriftFileStatus;
import org.rhq.core.domain.drift.FileDiffReport;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.PopupWindow;
import org.rhq.coregui.client.components.table.TimestampCellFormatter;
import org.rhq.coregui.client.drift.util.DiffUtility;
import org.rhq.coregui.client.gwt.DriftGWTServiceAsync;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
import org.rhq.coregui.client.util.enhanced.EnhancedVLayout;
/**
* @author Jay Shaughnessy
*/
public class DriftDetailsView extends EnhancedVLayout {
private String driftId;
public DriftDetailsView(String driftId) {
super();
this.driftId = driftId;
setMembersMargin(10);
}
@Override
protected void onDraw() {
super.onDraw();
show(this.driftId);
}
private void show(final String driftId) {
final DriftGWTServiceAsync driftService = GWTServiceLookup.getDriftService();
driftService.getDriftDetails(driftId, new AsyncCallback<DriftDetails>() {
@Override
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError("Failed to load drift details for drift id: " + driftId, caught);
}
@Override
public void onSuccess(final DriftDetails details) {
show(details);
}
});
}
protected void show(DriftDetails driftDetails) {
for (Canvas child : getMembers()) {
removeMember(child);
child.destroy();
}
addMember(createChangeSetForm(driftDetails.getDrift()));
DynamicForm driftForm = new DynamicForm();
driftForm.setIsGroup(true);
driftForm.setGroupTitle(MSG.view_tabs_common_drift());
driftForm.setWrapItemTitles(false);
driftForm.setNumCols(4);
SpacerItem spacer = new SpacerItem();
StaticTextItem id = new StaticTextItem("id", MSG.common_title_id());
id.setValue(driftDetails.getDrift().getId());
StaticTextItem path = new StaticTextItem("path", MSG.common_title_path());
path.setValue(driftDetails.getDrift().getPath());
StaticTextItem timestamp = new StaticTextItem("timestamp", MSG.common_title_timestamp());
timestamp.setValue(TimestampCellFormatter.format(driftDetails.getDrift().getCtime(), DATE_TIME_FORMAT_FULL));
StaticTextItem category = new StaticTextItem("category", MSG.common_title_category());
LinkedHashMap<String, String> catIconsMap = new LinkedHashMap<String, String>(3);
catIconsMap.put(DriftDataSource.CATEGORY_ICON_ADD, DriftDataSource.CATEGORY_ICON_ADD);
catIconsMap.put(DriftDataSource.CATEGORY_ICON_CHANGE, DriftDataSource.CATEGORY_ICON_CHANGE);
catIconsMap.put(DriftDataSource.CATEGORY_ICON_REMOVE, DriftDataSource.CATEGORY_ICON_REMOVE);
LinkedHashMap<String, String> catValueMap = new LinkedHashMap<String, String>(3);
catValueMap.put(DriftDataSource.CATEGORY_ICON_ADD, MSG.view_drift_category_fileAdded());
catValueMap.put(DriftDataSource.CATEGORY_ICON_CHANGE, MSG.view_drift_category_fileChanged());
catValueMap.put(DriftDataSource.CATEGORY_ICON_REMOVE, MSG.view_drift_category_fileRemoved());
category.setValueMap(catValueMap);
category.setValueIcons(catIconsMap);
category.setShowIcons(true);
StaticTextItem oldFile = new StaticTextItem("oldFile", MSG.view_drift_table_oldFile());
FormItem oldFileLink = null;
StaticTextItem newFile = new StaticTextItem("newFile", MSG.view_drift_table_newFile());
FormItem newFileLink = null;
if (driftDetails.isBinaryFile()) {
switch (driftDetails.getDrift().getCategory()) {
case FILE_ADDED:
category.setValue(DriftDataSource.CATEGORY_ICON_ADD);
oldFile.setValue(MSG.common_label_none());
oldFileLink = spacer;
newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
newFileLink = spacer;
break;
case FILE_CHANGED:
category.setValue(DriftDataSource.CATEGORY_ICON_CHANGE);
oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
oldFileLink = spacer;
newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
newFileLink = spacer;
break;
case FILE_REMOVED:
category.setValue(DriftDataSource.CATEGORY_ICON_REMOVE);
oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
oldFileLink = spacer;
newFile.setValue(MSG.common_label_none());
newFileLink = spacer;
break;
}
driftForm.setItems(id, spacer, path, spacer, category, spacer, timestamp, spacer, oldFile, oldFileLink,
newFile, newFileLink);
} else {
FormItem viewDiffLink = spacer;
switch (driftDetails.getDrift().getCategory()) {
case FILE_ADDED:
category.setValue(DriftDataSource.CATEGORY_ICON_ADD);
oldFile.setValue(MSG.common_label_none());
oldFileLink = spacer;
newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
newFileLink = createViewFileLink(driftDetails.getDrift().getNewDriftFile().getHashId(), driftDetails
.getDrift().getPath(), driftDetails.getChangeSet().getVersion(), driftDetails.getNewFileStatus());
break;
case FILE_CHANGED:
category.setValue(DriftDataSource.CATEGORY_ICON_CHANGE);
oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(), driftDetails
.getDrift().getPath(), driftDetails.getPreviousChangeSet().getVersion(),
driftDetails.getOldFileStatus());
newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
newFileLink = createViewFileLink(driftDetails.getDrift().getNewDriftFile().getHashId(), driftDetails
.getDrift().getPath(), driftDetails.getChangeSet().getVersion(), driftDetails.getNewFileStatus());
if (driftDetails.getNewFileStatus() == LOADED && driftDetails.getOldFileStatus() == LOADED) {
viewDiffLink = createViewDiffLink(driftDetails.getDrift(), driftDetails.getPreviousChangeSet()
.getVersion());
}
break;
case FILE_REMOVED:
category.setValue(DriftDataSource.CATEGORY_ICON_REMOVE);
oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(), driftDetails
.getDrift().getPath(), driftDetails.getChangeSet().getVersion(), driftDetails.getOldFileStatus());
newFile.setValue(MSG.common_label_none());
newFileLink = spacer;
break;
}
driftForm.setItems(id, spacer, path, spacer, category, spacer, timestamp, spacer, oldFile, oldFileLink,
newFile, newFileLink, spacer, spacer, spacer, viewDiffLink);
}
addMember(driftForm);
}
private DynamicForm createChangeSetForm(Drift<?, ?> drift) {
DynamicForm changeSetForm = new DynamicForm();
changeSetForm.setIsGroup(true);
changeSetForm.setGroupTitle(MSG.view_drift_table_snapshot());
changeSetForm.setWrapItemTitles(false);
DriftChangeSet<?> changeSet = drift.getChangeSet();
StaticTextItem changeSetId = new StaticTextItem("changeSetId", MSG.common_title_id());
changeSetId.setValue(changeSet.getId());
StaticTextItem changeSetCategory = new StaticTextItem("changeSetCategory", MSG.common_title_category());
changeSetCategory.setValue(changeSet.getCategory().name());
StaticTextItem changeSetVersion = new StaticTextItem("changeSetVersion", MSG.common_title_version());
changeSetVersion.setValue(changeSet.getVersion());
StaticTextItem changeSetDriftHandling = new StaticTextItem("changeSetDriftHandling",
MSG.view_drift_table_driftHandlingMode());
changeSetDriftHandling.setValue(DriftDefinitionDataSource.getDriftHandlingModeDisplayName(changeSet
.getDriftHandlingMode()));
changeSetForm.setItems(changeSetId, changeSetCategory, changeSetVersion, changeSetDriftHandling);
return changeSetForm;
}
protected FormItem createViewFileLink(String hash, String path, int version, DriftFileStatus status) {
if (status == LOADED) {
return createViewFileLink(hash, path, version);
}
StaticTextItem item = new StaticTextItem(hash + "_fileLink");
item.setShowTitle(false);
item.setValue("(file not ready for viewing)");
return item;
}
private LinkItem createViewFileLink(final String hash, final String path, final int version) {
LinkItem link = new LinkItem(hash + "_fileLink");
link.setShowTitle(false);
link.setLinkTitle("(view)");
link.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
GWTServiceLookup.getDriftService().getDriftFileBits(hash, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
try {
throw caught;
} catch (Throwable r) {
CoreGUI.getErrorHandler().handleError("Failed to load file", r);
}
}
@Override
public void onSuccess(String contents) {
Window fileViewer = createFileViewer(contents, path, version);
fileViewer.show();
}
});
}
});
return link;
}
private Window createFileViewer(String contents, String path, int version) {
VLayout layout = new VLayout();
DynamicForm form = new DynamicForm();
form.setWidth100();
form.setHeight100();
TextAreaItem textArea = new TextAreaItem();
textArea.setShowTitle(false);
textArea.setColSpan(2);
textArea.setValue(contents);
textArea.setWidth("*");
textArea.setHeight("*");
form.setItems(textArea);
layout.addMember(form);
PopupWindow window = new PopupWindow(layout);
window.setIsModal(false);
window.setTitle(path + ":" + version);
return window;
}
private LinkItem createViewDiffLink(final Drift<?, ?> drift, final int oldVersion) {
LinkItem viewDiffLink = new LinkItem("viewDiff");
viewDiffLink.setLinkTitle("(view diff)");
viewDiffLink.setShowTitle(false);
viewDiffLink.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
GWTServiceLookup.getDriftService().generateUnifiedDiff(drift, new AsyncCallback<FileDiffReport>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError("Failed to generate diff.", caught);
}
public void onSuccess(FileDiffReport diffReport) {
int newVersion = drift.getChangeSet().getVersion();
String diffContents = DiffUtility.formatAsHtml(diffReport.getDiff(), oldVersion, newVersion);
Window window = DiffUtility.createDiffViewerWindow(diffContents, drift.getPath(), oldVersion,
newVersion);
window.show();
}
});
}
});
return viewDiffLink;
}
}