package org.zend.php.zendserver.deployment.debug.ui.wizards; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.php.internal.server.core.Server; import org.eclipse.php.internal.server.core.manager.ServersManager; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Text; import org.zend.php.server.core.utils.ServerUtils; import org.zend.php.server.ui.IAddServerListener; import org.zend.php.server.ui.ServersCombo; import org.zend.php.zendserver.deployment.core.debugger.IDeploymentHelper; import org.zend.php.zendserver.deployment.core.utils.DeploymentUtils; import org.zend.php.zendserver.deployment.debug.core.config.DeploymentHelper; 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.Messages; import org.zend.php.zendserver.deployment.debug.ui.listeners.IStatusChangeListener; import org.zend.sdklib.manager.TargetsManager; import org.zend.sdklib.target.IZendTarget; public class ConfigurationBlock extends AbstractBlock { private static final String EMPTY_STRING = ""; //$NON-NLS-1$ private ServersCombo targetsCombo = new ServersCombo(ServersCombo.DEPLOYMENT_FILTER, true, false); private Text baseUrl; private Button ignoreFailures; private Button developmentMode; private Button warnUpdate; private Text applicationNameText; private IRunnableContext context; private String description; private String projectName; private List<String> bannedNames; private List<IDeployWizardContribution> contributions; public ConfigurationBlock(IStatusChangeListener listener, String projectName, IRunnableContext context, String description) { super(listener); this.context = context; this.description = description; this.bannedNames = LaunchUtils.getBannedNames(); this.projectName = projectName; } /* * (non-Javadoc) * * @see org.zend.php.zendserver.deployment.debug.ui.wizards.AbstractBlock# * createContents(org.eclipse.swt.widgets.Composite, boolean) */ public Composite createContents(final Composite parent, final boolean resizeShell) { super.createContents(parent, resizeShell); getContainer().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, false)); createDeployCombo(getContainer()); baseUrl = createLabelWithText(Messages.configurationPage_baseURL, EMPTY_STRING, getContainer(), false); applicationNameText = createLabelWithText( Messages.ConfigurationBlock_ApplicationNameLabel, EMPTY_STRING, getContainer(), false); developmentMode = createLabelWithCheckbox( Messages.ConfigurationBlock_DevelopmentModeLabel, null, getContainer()); Link devModeDesc = new Link(getContainer(), SWT.None); devModeDesc.setText(Messages.ConfigurationBlock_DevelopmentModeDesc); FontData fontData = devModeDesc.getFont().getFontData()[0]; Font font = new Font(parent.getDisplay(), new FontData( fontData.getName(), fontData.getHeight(), SWT.ITALIC)); devModeDesc.setFont(font); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.widthHint = 400; devModeDesc.setLayoutData(gd); devModeDesc.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { org.eclipse.swt.program.Program.launch(e.text); } }); warnUpdate = createLabelWithCheckbox( Messages.ConfigurationBlock_WarnUpdatingLabel, null, getContainer()); ignoreFailures = createLabelWithCheckbox( Messages.configurationPage_ignoreFailures, Messages.configurationPage_ignoreFailuresTooltip, getContainer()); contributions = getContributions(); for (IDeployWizardContribution contribution : contributions) { contribution .initialize(context, projectName, listener, description); contribution.createExtraSection(getContainer()); } return getContainer(); } /* * (non-Javadoc) * * @see org.zend.php.zendserver.deployment.debug.ui.wizards.AbstractBlock# * initializeFields * (org.zend.php.zendserver.deployment.core.debugger.IDeploymentHelper) */ public void initializeFields(IDeploymentHelper helper) { String targetId = helper.getTargetId(); if (targetId != null) { targetsCombo.selectByTarget(targetId); } developmentMode.setSelection(helper.isDevelopmentModeEnabled()); warnUpdate.setSelection(helper.isWarnUpdate()); ignoreFailures.setSelection(helper.isIgnoreFailures()); applicationNameText.setText(helper.getAppName()); if (helper.getBaseURL() != null) { baseUrl.setText(helper.getBaseURL().toString()); } else { IZendTarget defaultTarget = targetsCombo.getSelectedTarget(); if (defaultTarget != null) { URL targetUrl = defaultTarget.getDefaultServerURL(); try { URL url = new URL(targetUrl.getProtocol(), targetUrl.getHost(), targetUrl.getPort(), "/" //$NON-NLS-1$ + helper.getAppName()); baseUrl.setText(url.toString()); } catch (MalformedURLException e) { Activator.log(e); } } } for (IDeployWizardContribution c : contributions) { c.initializeFields(helper); } } public void clear() { baseUrl.setText(EMPTY_STRING); ignoreFailures.setSelection(true); applicationNameText.clearSelection(); } /* * (non-Javadoc) * * @see org.zend.php.zendserver.deployment.debug.ui.wizards.AbstractBlock# * validatePage() */ public IStatus validatePage() { if (getTarget() == null) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.configurationPage_ValidationError_TargetLocation); } if (baseUrl != null && baseUrl.getText().isEmpty()) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.ConfigurationBlock_UrlEmptyError); } URL baseUrl = null; try { baseUrl = getBaseURL(); if (TargetsManager.isLocalhost(baseUrl.getHost())) { IPath file = new Path(baseUrl.getFile()); if (file.segmentCount() > 0) { if (bannedNames.contains(file.segment(0))) { return new Status( IStatus.ERROR, Activator.PLUGIN_ID, Messages.ConfigurationBlock_LocalAppConflictErrorMessage); } } } String url = baseUrl.toString(); if (url.contains(" ") || url.contains("\t")) { //$NON-NLS-1$ //$NON-NLS-2$ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.ConfigurationBlock_UrlWhitespacesError); } } catch (MalformedURLException e) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.configurationPage_ValidationError_BaseUrl); } for (IDeployWizardContribution c : contributions) { IStatus status = c.validate(); if (status.getSeverity() != IStatus.OK) { return status; } } return new Status(IStatus.OK, Activator.PLUGIN_ID, description); } /* * (non-Javadoc) * * @see * org.zend.php.zendserver.deployment.debug.ui.wizards.AbstractBlock#getHelper * () */ public IDeploymentHelper getHelper() { DeploymentHelper helper = new DeploymentHelper(); URL baseUrl = null; try { baseUrl = getBaseURL(); } catch (MalformedURLException e) { // ignore, handled later } if (baseUrl != null) { helper.setBaseURL(baseUrl.toString()); } if (getTarget() != null) { helper.setTargetId(getTarget().getId()); helper.setTargetHost(getTarget().getHost().getHost()); } helper.setAppName(applicationNameText.getText()); helper.setIgnoreFailures(ignoreFailures.getSelection()); helper.setDefaultServer(isDefaultServer()); helper.setOperationType(IDeploymentHelper.DEPLOY); if (warnUpdate.isEnabled()) { helper.setWarnUpdate(warnUpdate.getSelection()); } else { helper.setWarnUpdate(false); } helper.setDevelopmentMode(developmentMode.getSelection()); Map<String, String> extraAttributes = new HashMap<String, String>(); for (IDeployWizardContribution c : contributions) { extraAttributes.putAll(c.getExtraAttributes()); } helper.setExtraAtttributes(extraAttributes); return helper; } public void setBaseURLEnabled(boolean value) { baseUrl.setEnabled(value); } public void setDeployComboEnabled(boolean value) { targetsCombo.setEnabled(value); } public void setIgnoreFailuresEnabled(boolean value) { ignoreFailures.setEnabled(value); } public void setApplicationNameEnabled(boolean value) { applicationNameText.setEnabled(value); } public void setWarnUpdateEnabled(boolean value) { warnUpdate.setEnabled(value); } public void setDevelopmentModeEnabled(boolean value) { developmentMode.setEnabled(value); } /* * (non-Javadoc) * * @see * org.zend.php.zendserver.deployment.debug.ui.wizards.AbstractBlock#setEnabled * (boolean) */ public void setEnabled(boolean enabled) { super.setEnabled(enabled); setBaseURLEnabled(enabled); setDeployComboEnabled(enabled); setIgnoreFailuresEnabled(enabled); setApplicationNameEnabled(enabled); setWarnUpdateEnabled(enabled); setDevelopmentModeEnabled(enabled); } private URL getBaseURL() throws MalformedURLException { if (baseUrl.getText().isEmpty()) { return null; } URL result = new URL(baseUrl.getText()); return result; } private boolean isDefaultServer() { URL baseUrl = null; try { baseUrl = getBaseURL(); } catch (MalformedURLException e) { // ignore, handled later } if (getTarget() != null) { URL targetUrl = getTarget().getHost(); if (baseUrl != null && baseUrl.getHost().equals(targetUrl.getHost())) { return true; } } return false; } private IZendTarget getTarget() { return targetsCombo.getSelectedTarget(); } private void createDeployCombo(Composite container) { targetsCombo.setLabel(Messages.configurationPage_DeployTo); targetsCombo.setTooltip(Messages.configurationPage_DeployToTooltip); targetsCombo.createControl(container); targetsCombo.getCombo().addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { changeHost(targetsCombo.getSelectedTarget()); listener.statusChanged(validatePage()); } }); targetsCombo.setListener(new IAddServerListener() { public void serverAdded(String name) { changeHost(targetsCombo.getSelectedTarget()); listener.statusChanged(validatePage()); } }); } private void changeHost(IZendTarget target) { URL serverBaseUrl = DeploymentUtils.getServerBaseURL(target); URL oldUrl = null; try { oldUrl = getBaseURL(); } catch (MalformedURLException e) { // ignore, handled later } try { URL updatedUrl = null; if (oldUrl == null) { updatedUrl = new URL(serverBaseUrl.getProtocol(), serverBaseUrl.getHost(), serverBaseUrl.getPort(), '/' + applicationNameText.getText()); } else { updatedUrl = new URL(serverBaseUrl.getProtocol(), serverBaseUrl.getHost(), serverBaseUrl.getPort(), oldUrl.getFile()); } baseUrl.setText(updatedUrl.toString()); } catch (MalformedURLException e) { Activator.log(e); } } private List<IDeployWizardContribution> getContributions() { IConfigurationElement[] elements = Platform.getExtensionRegistry() .getConfigurationElementsFor( Activator.WIZARD_CONTRIBUTION_EXTENSION); List<IDeployWizardContribution> result = new ArrayList<IDeployWizardContribution>(); for (IConfigurationElement element : elements) { if ("wizardContribution".equals(element.getName())) { //$NON-NLS-1$ try { Object contribution = element .createExecutableExtension("class"); //$NON-NLS-1$ if (contribution instanceof IDeployWizardContribution) { result.add((IDeployWizardContribution) contribution); } } catch (CoreException e) { Activator.log(e); } } } return result; } private String updateURL(IZendTarget target, String applicationUrl) { try { URL serverBaseUrl = DeploymentUtils.getServerBaseURL(target); URL oldUrl = new URL(applicationUrl); URL updatedUrl = new URL(serverBaseUrl.getProtocol(), serverBaseUrl.getHost(), serverBaseUrl.getPort(), oldUrl.getFile()); return updatedUrl.toString(); } catch (MalformedURLException e) { Activator.log(e); } return applicationUrl; } }