package org.zend.php.zendserver.deployment.ui;
import java.net.MalformedURLException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.php.internal.debug.core.debugger.DebuggerSettingsManager;
import org.eclipse.php.internal.debug.core.debugger.IDebuggerSettings;
import org.eclipse.php.internal.debug.core.debugger.IDebuggerSettingsWorkingCopy;
import org.eclipse.php.internal.debug.core.zend.debugger.ZendDebuggerConfiguration;
import org.eclipse.php.internal.debug.core.zend.debugger.ZendDebuggerSettingsConstants;
import org.eclipse.php.internal.server.core.Server;
import org.eclipse.php.internal.server.core.manager.ServersManager;
import org.eclipse.php.server.core.types.IServerType;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.zend.php.notifications.util.NotificationsHelper;
import org.zend.php.server.ui.types.LocalZendServerType;
import org.zend.php.zendserver.deployment.core.targets.TargetsManagerService;
import org.zend.php.zendserver.deployment.core.targets.ZendServerManager;
import org.zend.php.zendserver.deployment.debug.core.DebugUtils;
import org.zend.php.zendserver.deployment.ui.notifications.AddingLocalZendServerNotification;
import org.zend.sdklib.manager.DetectionException;
import org.zend.sdklib.target.IZendTarget;
import org.zend.webapi.core.WebApiClient;
import org.zend.webapi.core.WebApiException;
import org.zend.webapi.core.connection.auth.BasicCredentials;
import org.zend.webapi.core.connection.auth.WebApiCredentials;
import org.zend.webapi.core.connection.data.VhostDetails;
import org.zend.webapi.core.connection.data.VhostInfo;
import org.zend.webapi.core.connection.data.VhostsList;
@SuppressWarnings("restriction")
public class AddLocalZendServerJob extends Job {
public AddLocalZendServerJob() {
super(Messages.AddLocalZendServerJob_JobName);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask(Messages.AddLocalZendServerJob_AddingServer_TaskName, IProgressMonitor.UNKNOWN);
try {
Server server = null;
try {
server = ZendServerManager.getInstance().getLocalZendServer();
} catch (DetectionException ex) {
String message = Messages.AddLocalZendServerJob_NoLocalInstallationFound_Message;
Activator.logError(message, ex);
notifyWarning(message);
return Status.CANCEL_STATUS;
}
server.setAttribute(IServerType.TYPE, LocalZendServerType.ID);
IZendTarget zendTarget = TargetsManagerService.INSTANCE.getTargetManager().getExistingLocalhost();
if (zendTarget == null) {
monitor.subTask(Messages.AddLocalZendServerJob_DetectingWebAPIKeys);
LocalTargetDetector detector = new LocalTargetDetector();
detector.detect();
zendTarget = detector.getFinalTarget();
}
if (zendTarget == null) {
String message = Messages.AddLocalZendServerJob_NoLocalTargetFound_Message;
Activator.logError(message);
notifyWarning(message);
return Status.CANCEL_STATUS;
}
monitor.subTask(Messages.AddLocalZendServerJob_UpdatingServerProperties);
if (!isUnique(server.getName())) {
server.setName(getNewName(server.getName()));
}
if (server.getBaseURL() == "" || server.getDocumentRoot() == "") { //$NON-NLS-1$ //$NON-NLS-2$
try {
VhostInfo defaultVHostInfo = null;
WebApiCredentials credentials = new BasicCredentials(zendTarget.getKey(),
zendTarget.getSecretKey());
WebApiClient apiClient = new WebApiClient(credentials, zendTarget.getHost().toString());
apiClient.setServerType(zendTarget.getServerType());
VhostsList vhostsList = apiClient.vhostGetStatus();
for (VhostInfo vhostInfo : vhostsList.getVhosts()) {
if (!vhostInfo.isDefaultVhost())
continue;
defaultVHostInfo = vhostInfo;
}
if (server.getBaseURL() == "" && defaultVHostInfo != null) { //$NON-NLS-1$
// server base URL has not been read from
// the configuration
String baseUrl = "http://localhost:" + Integer.toString(defaultVHostInfo.getPort()); //$NON-NLS-1$
server.setBaseURL(baseUrl);
}
if (server.getDocumentRoot() == "" && defaultVHostInfo != null) { //$NON-NLS-1$
// server document root folder has not been read
// from
// the configuration
VhostDetails vhostDetails = apiClient.vhostGetDetails(defaultVHostInfo.getId());
String documentRoot = vhostDetails.getExtendedInfo().getDocRoot();
server.setDocumentRoot(documentRoot);
}
} catch (MalformedURLException | WebApiException ex) {
String message = Messages.AddLocalZendServerJob_CouldNotObtainAllProperties_Message;
Activator.logError(message, ex);
notifyWarning(message);
return Status.CANCEL_STATUS;
}
}
monitor.subTask(Messages.AddLocalZendServerJob_DetectingDebuggerSettings);
// Detect debugger type if Web API is enabled
String debuggerId = DebugUtils.getDebuggerId(zendTarget);
server.setDebuggerId(debuggerId);
// Set up best match IP (localhost only) if it is Zend Debugger
if (ZendDebuggerConfiguration.ID.equals(debuggerId)) {
DebuggerSettingsManager debuggerSettingsManager = DebuggerSettingsManager.INSTANCE;
IDebuggerSettings debuggerSettings = debuggerSettingsManager.findSettings(server.getUniqueId(),
server.getDebuggerId());
IDebuggerSettingsWorkingCopy debuggerSettingsWorkingCopy = debuggerSettingsManager
.fetchWorkingCopy(debuggerSettings);
debuggerSettingsWorkingCopy.setAttribute(ZendDebuggerSettingsConstants.PROP_CLIENT_IP, "127.0.0.1"); //$NON-NLS-1$
debuggerSettingsManager.save(debuggerSettingsWorkingCopy);
debuggerSettingsManager.dropWorkingCopy(debuggerSettingsWorkingCopy);
}
monitor.subTask(Messages.AddLocalZendServerJob_SavingConfiguration);
ServersManager.addServer(server);
if (ServersManager.getServers().length == 2) {
// There is only an empty server and detected local Zend
// Server
ServersManager.setDefaultServer(null, server);
}
ServersManager.save();
ZendServerManager.setupPathMapping(server);
showPhpServersView();
notify(Messages.AddLocalZendServerJob_AddingServerSucceeded_Title,
Messages.AddLocalZendServerJob_ServerAdded_message,
AddingLocalZendServerNotification.NotificationTypes.INFORMATION);
return Status.OK_STATUS;
} finally {
monitor.done();
}
}
private boolean isUnique(String name) {
return ServersManager.getServer(name) == null;
}
private String getNewName(String name) {
int suffix = 1;
String newName = name + ' ' + suffix;
while (!isUnique(newName)) {
newName = name + ' ' + suffix;
suffix++;
}
return newName;
}
private void showPhpServersView() {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
try {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.showView("org.zend.php.server.ui.views.ServersView"); //$NON-NLS-1$
} catch (PartInitException e) {
Activator.log(e);
}
}
});
}
private void notifyWarning(String message) {
notify(Messages.AddLocalZendServerJob_AddingServerFailed_Title, message,
AddingLocalZendServerNotification.NotificationTypes.WARNING);
}
private void notify(String label, String message, AddingLocalZendServerNotification.NotificationTypes type) {
AddingLocalZendServerNotification notification = new AddingLocalZendServerNotification(type);
notification.setDescription(message);
notification.setLabel(label);
NotificationsHelper.notify(notification);
}
}