package org.zend.php.zendserver.deployment.debug.ui.contributions;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.php.internal.core.project.PHPNature;
import org.eclipse.php.internal.server.core.Server;
import org.eclipse.ui.PlatformUI;
import org.zend.php.server.core.utils.ServerUtils;
import org.zend.php.server.ui.actions.IDragAndDropContribution;
import org.zend.php.zendserver.deployment.core.DeploymentNature;
import org.zend.php.zendserver.deployment.core.debugger.IDeploymentHelper;
import org.zend.php.zendserver.deployment.core.descriptor.DescriptorContainerManager;
import org.zend.php.zendserver.deployment.core.descriptor.IDeploymentDescriptor;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorContainer;
import org.zend.php.zendserver.deployment.core.descriptor.ProjectType;
import org.zend.php.zendserver.deployment.debug.core.config.LaunchUtils;
import org.zend.php.zendserver.deployment.debug.ui.Activator;
import org.zend.php.zendserver.deployment.debug.ui.config.DeploymentHandler;
@SuppressWarnings("restriction")
public class DeployProjectContribution implements IDragAndDropContribution {
public void performAction(final Server server, final IProject project) {
if (!PlatformUI.getWorkbench().saveAllEditors(true)) {
return;
}
Job job = new Job("Deployment") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
if (!hasDeploymentNature(project)) {
enableDeployment(project);
}
DeploymentHandler handler = new DeploymentHandler();
IDeploymentHelper defaultHelper = LaunchUtils
.createDefaultHelper(ServerUtils.getTarget(server)
.getId(), project);
if (handler.openNoConfigDeploymentWizard(defaultHelper,
project) != IStatus.OK) {
return Status.CANCEL_STATUS;
}
} catch (CoreException e) {
Activator.log(e);
return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
e.getMessage(), e);
}
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
public boolean isAvailable(Server server) {
return ServerUtils.getTarget(server) != null;
}
public boolean isSupported(Server server, IProject project) {
return isAvailable(server) && hasPHPNature(project)
&& !(hasDeploymentNature(project) && isLibrary(project));
}
private boolean hasDeploymentNature(IProject project) {
try {
return project.getNature(DeploymentNature.ID) != null;
} catch (CoreException e) {
Activator.log(e);
}
return false;
}
private boolean hasPHPNature(IProject project) {
try {
return project.getNature(PHPNature.ID) != null;
} catch (CoreException e) {
Activator.log(e);
}
return false;
}
private void enableDeployment(IProject project) throws CoreException {
IProjectDescription desc = project.getDescription();
String[] natures = desc.getNatureIds();
String[] nnatures = new String[natures.length + 1];
System.arraycopy(natures, 0, nnatures, 0, natures.length);
nnatures[natures.length] = DeploymentNature.ID;
desc.setNatureIds(nnatures);
project.setDescription(desc, new NullProgressMonitor());
}
private boolean isLibrary(IProject project) {
IDescriptorContainer container = DescriptorContainerManager
.getService().openDescriptorContainer(project);
IDeploymentDescriptor desc = container.getDescriptorModel();
return desc.getType() == ProjectType.LIBRARY;
}
}