blob: 82d90ba8e86ca488987587ffdbfc4dcd79123c8f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on Apr 1, 2004
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package org.eclipse.jst.j2ee.internal.deploy;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPluginResourceHandler;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.common.internal.emf.utilities.CommandContext;
import org.eclipse.wst.common.internal.emf.utilities.ICommand;
import org.eclipse.wst.common.internal.emf.utilities.ICommandContext;
import org.eclipse.wst.server.core.IRuntime;
/**
* @author cbridgha
*
* To change the template for this generated type comment go to Window - Preferences - Java - Code
* Generation - Code and Comments
*/
public class J2EEDeployOperation extends AbstractDataModelOperation {
private Object[] selection;
private IStatus multiStatus;
private IProject currentProject;
/**
*
*/
public J2EEDeployOperation(Object[] deployableObjects) {
super();
selection = deployableObjects;
// TODO Auto-generated constructor stub
}
public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
// TODO Auto-generated method stub
return null;
}
public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
*/
public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
DeployerRegistry reg = DeployerRegistry.instance();
List modules = getSelectedModules(selection);
monitor.beginTask(J2EEPluginResourceHandler.J2EEDeployOperation_UI_0, modules.size());
for (int i = 0; i < modules.size(); i++) {
EnterpriseArtifactEdit edit = null;
try {
edit = (EnterpriseArtifactEdit) modules.get(i);
EObject module = edit.getDeploymentDescriptorRoot();
IProject proj = ProjectUtilities.getProject(module);
IRuntime runtime = null;
try {
runtime = J2EEProjectUtilities.getServerRuntime(proj);
}
catch (CoreException e) {
J2EEPlugin.getDefault().getLog().log(e.getStatus());
}
if (runtime == null)
continue;
List visitors = reg.getDeployModuleExtensions(module, runtime);
deploy(visitors, module, monitor);
monitor.worked(1);
} finally {
if (edit != null)
edit.dispose();
}
}
return getMultiStatus();
}
/**
* @param visitors
* @param module
*/
private void deploy(List visitors, EObject module, IProgressMonitor monitor) {
IProject proj = ProjectUtilities.getProject(module);
for (int i = 0; i < visitors.size(); i++) {
if (!(visitors.get(i) instanceof IConfigurationElement))
continue;
ICommand dep = null;
try {
dep = (ICommand) ((IConfigurationElement) visitors.get(i)).createExecutableExtension(DeployerRegistryReader.DEPLOYER_CLASS);
} catch (Exception e) {
e.printStackTrace();
continue;
}
ICommandContext ctx = new CommandContext(monitor, null, module.eResource().getResourceSet());
if (dep == null) continue;
dep.init(selection);
monitor.setTaskName(J2EEPluginResourceHandler.getString(J2EEPluginResourceHandler.J2EEDeployOperation_1_UI_, new Object[]{proj.getName(), dep.getClass().getName()}));
try {
dep.execute(proj, null, ctx);
addOKStatus(dep.getClass().getName());
} catch (CoreException ex) {
Logger.getLogger().logError(ex);
monitor.setCanceled(true);
Throwable statusException = (ex.getStatus().getException() != null) ? ex.getStatus().getException() : ex;
addErrorStatus(ex.getStatus(), dep.getClass().getName(), statusException);
continue;
}
}
}
/**
* @param proj
* @param name
*/
private void addOKStatus(String DeployerName) {
IStatus statusLocal = new Status(IStatus.OK, " ", IStatus.OK, (J2EEPluginResourceHandler.getString("J2EEDeployOperation_2_UI_", new Object[]{DeployerName})), null); //$NON-NLS-1$ //$NON-NLS-2$
//TODO
getMultiStatus().add(statusLocal);
}
/**
* @param exceptionStatus
* @param proj
* @param name
*/
private void addErrorStatus(IStatus exceptionStatus, String DeployerName, Throwable ex) {
Throwable mainCause = null;
if (exceptionStatus instanceof MultiStatus) {
IStatus[] stati = ((MultiStatus) exceptionStatus).getChildren();
for (int i = 0; 1 < stati.length; i++) {
addErrorStatus(stati[i], DeployerName, stati[i].getException());
}
}
mainCause = (ex.getCause() != null) ? ex.getCause() : ex;
//String errorNotes = (mainCause != null && mainCause.getMessage() != null) ? mainCause.getMessage() : "";
String message = J2EEPluginResourceHandler.bind(J2EEPluginResourceHandler.J2EEDeployOperation_3_UI_,DeployerName, ""); //$NON-NLS-1$
IStatus statusLocal = new Status(IStatus.ERROR, J2EEPlugin.getPlugin().getPluginID(), IStatus.ERROR, message, mainCause); //$NON-NLS-1$
getMultiStatus().add(statusLocal);
}
private IStatus getMainStatus(IProject proj) {
IStatus aStatus = new MultiStatus(J2EEPlugin.getPlugin().getPluginID(), IStatus.OK, J2EEPluginResourceHandler.getString(J2EEPluginResourceHandler.J2EEDeployOperation_4_UI_, new Object[]{proj.getName()}), null);
return aStatus;
}
/**
* @return Returns the multiStatus.
*/
public MultiStatus getMultiStatus() {
if (multiStatus == null)
multiStatus = getMainStatus(currentProject);
return (MultiStatus)multiStatus;
}
/**
* @param multiStatus
* The multiStatus to set.
*/
public void setMultiStatus(IStatus newStatus) {
this.multiStatus = newStatus;
}
protected List getSelectedModules(Object[] mySelections) {
List modules = new ArrayList();
List components = new ArrayList();
for (int i = 0; i < mySelections.length; i++) {
Object object = mySelections[i];
if (object instanceof EObject) {
object = ProjectUtilities.getProject(object);
currentProject = (IProject)object;
}
if (object instanceof IProject) {
currentProject = (IProject)object;
IVirtualComponent component = ComponentCore.createComponent((IProject)object);
EnterpriseArtifactEdit edit = null;
edit = (EnterpriseArtifactEdit)ComponentUtilities.getArtifactEditForRead(component);
if (components.contains(edit)) {
if (edit != null)
edit.dispose();
continue;
}
// Order Ears first...
if (J2EEProjectUtilities.isEARProject(component.getProject())) {
modules.add(0, edit);
components.add(0,component);
}
else {
modules.add(edit);
components.add(component);
}
}
}
return modules;
}
}