/*
* 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.coregui.client.bundle.deploy;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentStatus;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.components.wizard.WizardStep;
import org.rhq.coregui.client.gwt.GWTServiceLookup;
/**
* @author Jay Shaughnessy
*
*/
public class BundleDeployWizard extends AbstractBundleDeployWizard {
private Bundle bundle;
// Deployment of specified bundle
public BundleDeployWizard(Bundle bundle) {
this.setInitialDeployment(true);
this.setBundleId(bundle.getId());
this.bundle = bundle;
List<WizardStep> steps = init();
steps.add(new GetDestinationStep(this));
steps.add(new SelectBundleVersionStep(this));
steps.add(new GetDeploymentConfigStep(this));
steps.add(new GetDeploymentInfoStep(this));
steps.add(new DeployStep(this));
}
// Redeploy to existing destination
public BundleDeployWizard(BundleDestination destination) {
if (null == destination) {
throw new IllegalArgumentException("destination is null");
}
this.setInitialDeployment(false);
this.setBundleId(destination.getBundle().getId());
this.setDestination(destination);
List<WizardStep> steps = init();
steps.add(new SelectBundleVersionStep(this));
steps.add(new GetDeploymentConfigStep(this));
steps.add(new GetDeploymentInfoStep(this));
steps.add(new DeployStep(this));
}
public Bundle getBundle() {
return bundle;
}
private List<WizardStep> init() {
setWindowTitle(MSG.view_bundle_deployWizard_title());
setTitle(MSG.view_bundle_bundleDeployment());
ArrayList<WizardStep> steps = new ArrayList<WizardStep>();
setSteps(steps);
return steps;
}
public void cancel() {
// delete a newly created deployment but only if it's status is failure and it has
// no deployments. This should be rare, or maybe impossible, but in an odd case that
// the deployment fails and they user wants to Cancel as opposed to Finish, let's
// clean up as best as possible.
if ((null != getNewDeployment()) && (0 < getNewDeployment().getId())) {
BundleDeploymentCriteria c = new BundleDeploymentCriteria();
c.addFilterId(getNewDeployment().getId());
c.fetchResourceDeployments(true);
GWTServiceLookup.getBundleService().findBundleDeploymentsByCriteria(c, //
new AsyncCallback<PageList<BundleDeployment>>() {
public void onSuccess(PageList<BundleDeployment> newDeploymentList) {
if (!newDeploymentList.isEmpty()) {
BundleDeployment newDeployment = newDeploymentList.get(0);
boolean isFailedToLaunch = BundleDeploymentStatus.FAILURE.equals(newDeployment.getStatus())
|| BundleDeploymentStatus.PENDING.equals(newDeployment.getStatus());
boolean hasNoResourceDeployments = ((null == newDeployment.getResourceDeployments()) || newDeployment
.getResourceDeployments().isEmpty());
// go ahead and delete it if it hasn't really done anything but get created.
// otherwise, let folks inspect via the ui and take further action.
// if the deployment can't be deleted then don't try to delete the destination,
// it's now in use by the deployment
if (isFailedToLaunch && hasNoResourceDeployments) {
GWTServiceLookup.getBundleService().deleteBundleDeployment(newDeployment.getId(), //
new AsyncCallback<Void>() {
public void onSuccess(Void voidReturn) {
deleteNewDestination();
}
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(
MSG.view_bundle_deployWizard_error_1(), caught);
}
});
}
}
}
public void onFailure(Throwable caught) {
// should not really get here
CoreGUI.getErrorHandler().handleError(MSG.view_bundle_deployWizard_error_1(), caught);
deleteNewDestination();
}
});
} else {
deleteNewDestination();
}
}
private void deleteNewDestination() {
if (this.isNewDestination() && (null != this.getDestination())) {
GWTServiceLookup.getBundleService().deleteBundleDestination(this.getDestination().getId(), //
new AsyncCallback<Void>() {
public void onSuccess(Void voidReturn) {
CoreGUI.refresh();
}
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_bundle_deployWizard_error_2(), caught);
}
});
}
}
}