/******************************************************************************* * Copyright (c) 2009 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 * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.server.ui; import java.net.MalformedURLException; import java.net.URL; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.php.internal.server.PHPServerUIMessages; import org.eclipse.php.internal.server.core.Server; import org.eclipse.php.internal.server.core.manager.ServersManager; import org.eclipse.php.internal.ui.wizards.CompositeFragment; import org.eclipse.php.internal.ui.wizards.IControlHandler; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; /** * Wizard page to set the server install directory. */ @SuppressWarnings("restriction") public class ServerCompositeFragment extends CompositeFragment { protected Text name; protected Text url; protected Combo combo; private Text webroot; /** * ServerCompositeFragment * * @param parent * the parent composite * @param wizard * the wizard handle */ public ServerCompositeFragment(Composite parent, IControlHandler handler, boolean isForEditing) { super(parent, handler, isForEditing); createDescription(); } protected void createDescription() { setDisplayName(PHPServerUIMessages.getString("ServerCompositeFragment.server")); //$NON-NLS-1$ setDescription(PHPServerUIMessages.getString("ServerCompositeFragment.specifyInformation")); //$NON-NLS-1$ controlHandler.setDescription(getDescription()); setImageDescriptor(ServersPluginImages.DESC_WIZ_SERVER); controlHandler.setImageDescriptor(getImageDescriptor()); switch (controlHandler.getKind()) { case WIZARD: { setTitle(PHPServerUIMessages.getString("ServerCompositeFragment.newPhpServer")); //$NON-NLS-1$ break; } case EDITOR: { setTitle(PHPServerUIMessages.getString("ServerCompositeFragment.phpServer")); //$NON-NLS-1$ break; } default: break; } controlHandler.setTitle(getTitle()); } /** * Override the super setData to handle only Server types. * * @throws IllegalArgumentException * if the given object is not a {@link Server} */ public void setData(Object server) throws IllegalArgumentException { if (server != null && !(server instanceof Server)) { throw new IllegalArgumentException("The given object is not a Server"); //$NON-NLS-1$ } super.setData(server); init(); validate(); } public Server getServer() { return (Server) getData(); } /** * Provide a wizard page to change the Server's installation directory. */ protected void createContents(Composite parent) { Composite nameGroup = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, true); layout = new GridLayout(); layout.numColumns = 2; nameGroup.setLayout(layout); nameGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label label = new Label(nameGroup, SWT.NONE); label.setText(PHPServerUIMessages.getString("ServerCompositeFragment.nameLabel")); //$NON-NLS-1$ GridData data = new GridData(); label.setLayoutData(data); name = new Text(nameGroup, SWT.BORDER); data = new GridData(GridData.FILL_HORIZONTAL); name.setLayoutData(data); name.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { getServer().setName(name.getText()); validate(); } }); createURLGroup(parent); init(); validate(); Dialog.applyDialogFont(parent); name.forceFocus(); } protected void init() { Server server = getServer(); if (name == null || server == null) return; if (getServer().getName() != null) { boolean nameSet = false; String serverName = getServer().getName(); String orgName = serverName; if (!isForEditing()) { for (int i = 0; i < 10; i++) { boolean ok = checkServerName(serverName); if (ok) { name.setText(serverName); getServer().setName(serverName); ; nameSet = true; break; } serverName = orgName + " (" + Integer.toString(i + 2) + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } if (!nameSet) { name.setText(""); //$NON-NLS-1$ getServer().setName(""); //$NON-NLS-1$ } } else { name.setText(serverName); } } else { name.setText(""); //$NON-NLS-1$ } if (getServer().getDocumentRoot() != null) { webroot.setText(getServer().getDocumentRoot()); } String baseURL = getServer().getBaseURL(); if (!baseURL.equals("")) { //$NON-NLS-1$ url.setText(baseURL); try { URL originalURL = new URL(baseURL); int port = originalURL.getPort(); getServer().setPort(String.valueOf(port)); } catch (Exception e) { setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.enterValidURL"), //$NON-NLS-1$ IMessageProvider.ERROR); } } else { baseURL = "http://" + server.getHost(); //$NON-NLS-1$ url.setText(baseURL); try { getServer().setBaseURL(baseURL); URL createdURL = new URL(baseURL); int port = createdURL.getPort(); getServer().setPort(String.valueOf(port)); } catch (Exception e) { setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.enterValidURL"), //$NON-NLS-1$ IMessageProvider.ERROR); } } } public void validate() { if (getServer() == null) { setMessage("", IMessageProvider.ERROR); //$NON-NLS-1$ return; } setMessage(getDescription(), IMessageProvider.NONE); String urlStr = url.getText(); if (urlStr != null && !urlStr.trim().equals("")) { //$NON-NLS-1$ boolean ok = checkServerUrl(urlStr); if (!ok) { setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.duplicateServerUrl"), //$NON-NLS-1$ IMessageProvider.ERROR); } } try { URL url = new URL(urlStr); if (url.getPath() != null && url.getPath().length() != 0) { urlStr = null; } } catch (MalformedURLException e1) { // in case of Malformed URL - reset urlStr = null; } if (urlStr == null || urlStr.equals("")) { //$NON-NLS-1$ setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.enterValidURL"), IMessageProvider.ERROR); //$NON-NLS-1$ return; } try { URL baseURL = new URL(urlStr); String host = baseURL.getHost(); if (host.trim().length() == 0) { setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.serverURLEmpty"), //$NON-NLS-1$ IMessageProvider.ERROR); } int port = baseURL.getPort(); getServer().setHost(host); getServer().setPort(String.valueOf(port)); } catch (Exception e) { setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.enterValidURL"), IMessageProvider.ERROR); //$NON-NLS-1$ return; } String serverName = getServer().getName(); if (serverName == null || serverName.trim().equals("")) { //$NON-NLS-1$ setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.missingServerName"), //$NON-NLS-1$ IMessageProvider.ERROR); } else { boolean ok = checkServerName(serverName); if (!ok) { setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.duplicateServerName"), //$NON-NLS-1$ IMessageProvider.ERROR); } } String webrootStr = webroot.getText().trim(); if (webrootStr.length() != 0 && !new Path(webrootStr).toFile().exists()) { setMessage(PHPServerUIMessages.getString("ServerCompositeFragment.webrootNotExists"), //$NON-NLS-1$ IMessageProvider.ERROR); } controlHandler.update(); } protected void createURLGroup(Composite parent) { // Main composite Composite urlGroupComposite = new Composite(parent, SWT.NONE); GridLayout sLayout = new GridLayout(); urlGroupComposite.setLayout(sLayout); GridData sGridData = new GridData(SWT.FILL, SWT.FILL, true, true); urlGroupComposite.setLayoutData(sGridData); Group group = new Group(urlGroupComposite, SWT.NONE); group.setFont(urlGroupComposite.getFont()); GridLayout layout = new GridLayout(3, false); group.setLayout(layout); GridData data = new GridData(GridData.FILL_HORIZONTAL); group.setLayoutData(data); group.setText(PHPServerUIMessages.getString("ServerCompositeFragment.serverProperties")); //$NON-NLS-1$ Label urlLabel = new Label(group, SWT.None); urlLabel.setText(PHPServerUIMessages.getString("ServerCompositeFragment.baseURL")); //$NON-NLS-1$ url = new Text(group, SWT.BORDER); GridData layoutData = new GridData(GridData.FILL_HORIZONTAL); layoutData.horizontalSpan = 2; url.setLayoutData(layoutData); url.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (getServer() != null) { String urlStr = url.getText(); try { getServer().setBaseURL(urlStr); } catch (MalformedURLException e1) { // ignore } } validate(); } }); Label labelRoot = new Label(group, SWT.None); labelRoot.setText(PHPServerUIMessages.getString("ServerCompositeFragment.localWebRoot")); //$NON-NLS-1$ labelRoot.setLayoutData(new GridData()); webroot = new Text(group, SWT.BORDER); webroot.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); webroot.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (getServer() != null) { String webrootStr = webroot.getText(); getServer().setDocumentRoot(webrootStr); } validate(); } }); Button browseButton = new Button(group, SWT.PUSH); browseButton.setText(PHPServerUIMessages.getString("ServerCompositeFragment.browse")); //$NON-NLS-1$ browseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(getShell()); if (!"".equals(webroot.getText())) { //$NON-NLS-1$ String initialDir = webroot.getText(); dialog.setFilterPath(initialDir); } String result = dialog.open(); if (result != null) webroot.setText(result.toString()); } }); } private boolean checkServerName(String name) { name = name.trim(); Server[] allServers = ServersManager.getServers(); if (allServers != null) { int size = allServers.length; for (int i = 0; i < size; i++) { Server server = allServers[i]; if (name.equals(server.getName()) && !getServer().getUniqueId().equals(server.getUniqueId())) return false; } } return true; } private boolean checkServerUrl(String url) { url = url.trim(); Server[] allServers = ServersManager.getServers(); if (allServers != null) { int size = allServers.length; for (int i = 0; i < size; i++) { Server server = allServers[i]; if (url.equals(server.getBaseURL()) && !getServer().getUniqueId().equals(server.getUniqueId())) return false; } } return true; } /** * Saves the IServerWorkingCopy. */ public boolean performOk() { return true; } }