/* * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.guvnor.client.packages; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.drools.guvnor.client.common.FormStylePopup; import org.drools.guvnor.client.common.GenericCallback; import org.drools.guvnor.client.common.LoadingPopup; import org.drools.guvnor.client.common.PrettyFormLayout; import org.drools.guvnor.client.common.RulePackageSelector; import org.drools.guvnor.client.explorer.ExplorerNodeConfig; import org.drools.guvnor.client.messages.Constants; import org.drools.guvnor.client.resources.Images; import org.drools.guvnor.client.rpc.PackageConfigData; import org.drools.guvnor.client.rpc.RepositoryServiceAsync; import org.drools.guvnor.client.rpc.RepositoryServiceFactory; import org.drools.guvnor.client.rpc.SnapshotDiffs; import org.drools.guvnor.client.rpc.SnapshotInfo; import org.drools.guvnor.client.util.Format; import org.drools.guvnor.client.util.TabOpener; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * This is the new snapshot view. * @author Michael Neale * */ public class SnapshotView extends Composite { private static Constants constants = GWT.create( Constants.class ); private static Images images = GWT.create( Images.class ); public static final String LATEST_SNAPSHOT = "LATEST"; private PackageConfigData parentConf; private SnapshotInfo snapInfo; private Command close; private final SnapshotDiffView diffGrid; private ListBox box = new ListBox(); public SnapshotView(SnapshotInfo snapInfo, PackageConfigData parentPackage, Command closeSnap) { VerticalPanel vert = new VerticalPanel(); this.snapInfo = snapInfo; this.parentConf = parentPackage; this.close = closeSnap; PrettyFormLayout head = new PrettyFormLayout(); head.addHeader( images.snapshot(), header() ); vert.add( head ); vert.add( infoPanel() ); diffGrid = new SnapshotDiffView(); vert.add( diffGrid ); vert.setWidth( "100%" ); initWidget( vert ); } private Widget header() { FlexTable ft = new FlexTable(); ft.setWidget( 0, 0, new Label( constants.ViewingSnapshot() ) ); ft.setWidget( 0, 1, new HTML( "<b>" + this.snapInfo.name + "</b>" ) ); ft.getFlexCellFormatter().setHorizontalAlignment( 0, 0, HasHorizontalAlignment.ALIGN_RIGHT ); ft.setWidget( 1, 0, new Label( constants.ForPackage() ) ); ft.setWidget( 1, 1, new Label( this.parentConf.name ) ); ft.getFlexCellFormatter().setHorizontalAlignment( 1, 0, HasHorizontalAlignment.ALIGN_RIGHT ); HTML dLink = new HTML( "<a href='" + PackageBuilderWidget.getDownloadLink( this.parentConf ) + "' target='_blank'>" + constants.clickHereToDownloadBinaryOrCopyURLForDeploymentAgent() + "</a>" ); ft.setWidget( 2, 0, new Label( constants.DeploymentURL() ) ); ft.setWidget( 2, 1, dLink ); ft.getFlexCellFormatter().setHorizontalAlignment( 2, 0, HasHorizontalAlignment.ALIGN_RIGHT ); ft.setWidget( 3, 0, new Label( constants.SnapshotCreatedOn() ) ); ft.setWidget( 3, 1, new Label( parentConf.lastModified.toLocaleString() ) ); ft.getFlexCellFormatter().setHorizontalAlignment( 4, 0, HasHorizontalAlignment.ALIGN_RIGHT ); ft.setWidget( 4, 0, new Label( constants.CommentColon() ) ); ft.setWidget( 4, 1, new Label( parentConf.checkinComment ) ); ft.getFlexCellFormatter().setHorizontalAlignment( 4, 0, HasHorizontalAlignment.ALIGN_RIGHT ); HorizontalPanel actions = new HorizontalPanel(); actions.add( getDeleteButton( this.snapInfo.name, this.parentConf.name ) ); actions.add( getCopyButton( this.snapInfo.name, this.parentConf.name ) ); ft.setWidget( 5, 0, actions ); ft.setWidget( 6, 0, getCompareWidget( this.parentConf.name, this.snapInfo.name ) ); ft.getFlexCellFormatter().setHorizontalAlignment( 4, 0, HasHorizontalAlignment.ALIGN_RIGHT ); ft.getFlexCellFormatter().setColSpan( 5, 0, 2 ); return ft; } private Widget getCompareWidget(final String packageName, final String snapshotName) { HorizontalPanel hPanel = new HorizontalPanel(); hPanel.add( new Label( "Compare to:" ) ); RepositoryServiceFactory.getService().listSnapshots( this.parentConf.name, new GenericCallback<SnapshotInfo[]>() { public void onSuccess(SnapshotInfo[] info) { for ( int i = 0; i < info.length; i++ ) { if ( !snapshotName.equals( info[i].name ) ) { box.addItem( info[i].name ); } } } } ); hPanel.add( box ); Button button = new Button( "Compare" ); button.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { RepositoryServiceFactory.getService().compareSnapshots( packageName, snapshotName, box.getItemText( box.getSelectedIndex() ), new GenericCallback<SnapshotDiffs>() { public void onSuccess(SnapshotDiffs diff) { diffGrid.showDiffs( diff ); } } ); } } ); hPanel.add( button ); return hPanel; } private Button getDeleteButton(final String snapshotName, final String pkgName) { Button btn = new Button( constants.Delete() ); btn.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { if ( Window.confirm( Format.format( constants.SnapshotDeleteConfirm(), snapshotName, pkgName ) ) ) { RepositoryServiceFactory.getService().copyOrRemoveSnapshot( pkgName, snapshotName, true, null, new GenericCallback<java.lang.Void>() { public void onSuccess(Void v) { close.execute(); Window.alert( constants.SnapshotWasDeleted() ); } } ); } } } ); return btn; } private Button getCopyButton(final String snapshotName, final String packageName) { final RepositoryServiceAsync serv = RepositoryServiceFactory.getService(); Button btn = new Button( constants.Copy() ); btn.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { serv.listSnapshots( packageName, new GenericCallback<SnapshotInfo[]>() { public void onSuccess(final SnapshotInfo[] snaps) { final FormStylePopup copy = new FormStylePopup( images.snapshot(), Format.format( constants.CopySnapshotText(), snapshotName ) ); final List<RadioButton> options = new ArrayList<RadioButton>(); VerticalPanel vert = new VerticalPanel(); for ( int i = 0; i < snaps.length; i++ ) { // cant copy onto to itself... if ( !snaps[i].name.equals( snapshotName ) ) { RadioButton existing = new RadioButton( "snapshotNameGroup", snaps[i].name ); //NON-NLS options.add( existing ); vert.add( existing ); } } HorizontalPanel newNameHorizontalPanel = new HorizontalPanel(); final TextBox newNameTextBox = new TextBox(); final String newNameText = constants.NEW() + ": "; final RadioButton newNameRadioButton = new RadioButton( "snapshotNameGroup", newNameText ); newNameHorizontalPanel.add( newNameRadioButton ); newNameTextBox.setEnabled( false ); newNameRadioButton.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { newNameTextBox.setEnabled( true ); } } ); newNameHorizontalPanel.add( newNameTextBox ); options.add( newNameRadioButton ); vert.add( newNameHorizontalPanel ); copy.addAttribute( constants.ExistingSnapshots(), vert ); Button ok = new Button( constants.OK() ); copy.addAttribute( "", ok ); ok.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { boolean oneButtonIsSelected = false; for ( RadioButton rb : options ) { if ( rb.getValue() ) { oneButtonIsSelected = true; break; } } if ( !oneButtonIsSelected ) { Window.alert( constants.YouHaveToEnterOrChoseALabelNameForTheSnapshot() ); return; } if ( newNameRadioButton.getValue() ) { if ( checkUnique( snaps, newNameTextBox.getText() ) ) { serv.copyOrRemoveSnapshot( packageName, snapshotName, false, newNameTextBox.getText(), new GenericCallback<java.lang.Void>() { public void onSuccess(Void v) { copy.hide(); Window.alert( Format.format( constants.CreatedSnapshot0ForPackage1(), newNameTextBox.getText(), packageName ) ); } } ); } } else { for ( RadioButton rb : options ) { if ( rb.getValue() ) { final String newName = rb.getText(); serv.copyOrRemoveSnapshot( packageName, snapshotName, false, newName, new GenericCallback<java.lang.Void>() { public void onSuccess(Void v) { copy.hide(); Window.alert( Format.format( constants.Snapshot0ForPackage1WasCopiedFrom2(), newName, packageName, snapshotName ) ); } } ); } } } } private boolean checkUnique(SnapshotInfo[] snaps, String name) { for ( SnapshotInfo sn : snaps ) { if ( sn.name.equals( name ) ) { Window.alert( constants.PleaseEnterANonExistingSnapshotName() ); return false; } } return true; } } ); copy.show(); } } ); } } ); return btn; } private Widget infoPanel() { return packageTree(); } protected Widget packageTree() { Map<TreeItem, String> itemWidgets = new HashMap<TreeItem, String>(); Tree root = new Tree(); root.setAnimationEnabled( true ); TreeItem pkg = ExplorerNodeConfig.getPackageItemStructure( parentConf.name, snapInfo.uuid, itemWidgets ); pkg.setUserObject( snapInfo ); root.addItem( pkg ); ScrollPanel packagesTreeItemPanel = new ScrollPanel( root ); root.addSelectionHandler( new SelectionHandler<TreeItem>() { public void onSelection(SelectionEvent<TreeItem> event) { Object uo = event.getSelectedItem().getUserObject(); if ( uo instanceof Object[] ) { Object o = ((Object[]) uo)[0]; showAssetList( (String[]) o ); } else if ( uo instanceof SnapshotInfo ) { SnapshotInfo s = (SnapshotInfo) uo; TabOpener tabOpener = TabOpener.getInstance(); tabOpener.openPackageEditor( s.uuid, null ); } } } ); return packagesTreeItemPanel; } protected void showAssetList(final String[] assetTypes) { String key = this.snapInfo.uuid; for ( int i = 0; i < assetTypes.length; i++ ) { key = key + assetTypes[i]; } TabOpener tabOpener = TabOpener.getInstance(); tabOpener.openSnapshotAssetList( snapInfo.name, snapInfo.uuid, assetTypes, key ); } public static void showNewSnapshot(final Command refreshCmd) { final FormStylePopup pop = new FormStylePopup( images.snapshot(), constants.NewSnapshot() ); final RulePackageSelector sel = new RulePackageSelector(); pop.addAttribute( constants.ForPackage(), sel ); Button ok = new Button( constants.OK() ); pop.addAttribute( "", ok ); pop.show(); ok.addClickHandler( new ClickHandler() { public void onClick(ClickEvent event) { pop.hide(); String pkg = sel.getSelectedPackage(); PackageBuilderWidget.showSnapshotDialog( pkg, refreshCmd ); } } ); } public static void rebuildBinaries() { if ( Window.confirm( constants.SnapshotRebuildWarning() ) ) { LoadingPopup.showMessage( constants.RebuildingSnapshotsPleaseWaitThisMayTakeSomeTime() ); RepositoryServiceFactory.getService().rebuildSnapshots( new GenericCallback<java.lang.Void>() { public void onSuccess(Void v) { LoadingPopup.close(); Window.alert( constants.SnapshotsWereRebuiltSuccessfully() ); } } ); } } }