| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.sling.ide.eclipse.ui.wizards; |
| |
| import static org.apache.sling.ide.eclipse.ui.internal.SlingLaunchpadCombo.ValidationFlag.SKIP_SERVER_STARTED; |
| |
| |
| import org.apache.sling.ide.eclipse.core.ISlingLaunchpadConfiguration; |
| import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer; |
| import org.apache.sling.ide.eclipse.core.SlingLaunchpadConfigurationDefaults; |
| import org.apache.sling.ide.eclipse.ui.internal.Activator; |
| import org.apache.sling.ide.eclipse.ui.internal.SlingLaunchpadCombo; |
| 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.jface.layout.GridDataFactory; |
| import org.eclipse.jface.wizard.WizardPage; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.swt.events.KeyListener; |
| 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.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.wst.server.core.IRuntime; |
| import org.eclipse.wst.server.core.IRuntimeType; |
| import org.eclipse.wst.server.core.IServer; |
| import org.eclipse.wst.server.core.IServerType; |
| import org.eclipse.wst.server.core.IServerWorkingCopy; |
| import org.eclipse.wst.server.core.ServerCore; |
| |
| public class SetupServerWizardPage extends WizardPage { |
| |
| private static final String RUNTIME_TYPE_LAUNCHPAD = "org.apache.sling.ide.launchpadRuntimeType"; |
| |
| private static final String SERVER_TYPE_LAUNCHPAD = "org.apache.sling.ide.launchpadServer"; |
| |
| private static final int HORIZONTAL_INDENT = 10; |
| |
| private Button useExistingServer; |
| private SlingLaunchpadCombo existingServerCombo; |
| private Button setupNewServer; |
| private Text newServerName; |
| private Text newServerHostnameName; |
| private Text newServerPort; |
| private Text newServerUsername; |
| private Text newServerPassword; |
| private Text newServerDebugPort; |
| |
| private IServer server; |
| |
| private Button startExistingServerButton; |
| |
| private Button skipServerConfiguration; |
| |
| private ISlingLaunchpadConfiguration config; |
| |
| public SetupServerWizardPage(AbstractNewSlingApplicationWizard parent) { |
| super("chooseArchetypePage"); |
| setTitle("Select or Create Server"); |
| setDescription("This step defines which server to use with the new project."); |
| setImageDescriptor(parent.getLogo()); |
| config = parent.getDefaultConfig(); |
| } |
| |
| @Override |
| public AbstractNewSlingApplicationWizard getWizard() { |
| return (AbstractNewSlingApplicationWizard) super.getWizard(); |
| } |
| |
| public void createControl(Composite parent) { |
| Composite container = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| container.setLayout(layout); |
| layout.numColumns = 3; |
| layout.verticalSpacing = 9; |
| layout.marginBottom = 10; |
| |
| GridDataFactory singleRowGridDataFactory = GridDataFactory.swtDefaults().align(SWT.LEFT, SWT.CENTER) |
| .span(layout.numColumns, 1); |
| |
| useExistingServer = new Button(container, SWT.RADIO); |
| useExistingServer.setText("Add to existing server"); |
| singleRowGridDataFactory.applyTo(useExistingServer); |
| |
| Label existingServerLabel = new Label(container, SWT.NONE); |
| GridData locationLabelData = new GridData(); |
| locationLabelData.horizontalIndent = HORIZONTAL_INDENT; |
| existingServerLabel.setLayoutData(locationLabelData); |
| existingServerLabel.setText("Location:"); |
| existingServerLabel.setEnabled(true); |
| |
| existingServerCombo = new SlingLaunchpadCombo(container, null); |
| existingServerCombo.getWidget().addModifyListener(new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| dialogChanged(); |
| } |
| }); |
| existingServerCombo.refreshRepositoryList(new NullProgressMonitor()); |
| existingServerCombo.getWidget().setEnabled(true); |
| |
| { |
| startExistingServerButton = new Button(container, SWT.CHECK); |
| GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1); |
| gd.horizontalIndent = HORIZONTAL_INDENT; |
| startExistingServerButton.setLayoutData(gd); |
| startExistingServerButton.setText("Start server after project creation (if server not yet started)."); |
| startExistingServerButton.setSelection(true); |
| } |
| |
| skipServerConfiguration = new Button(container, SWT.RADIO); |
| skipServerConfiguration.setText("Don't deploy on a server"); |
| singleRowGridDataFactory.applyTo(skipServerConfiguration); |
| |
| setupNewServer = new Button(container, SWT.RADIO); |
| setupNewServer.setText("Setup new server"); |
| singleRowGridDataFactory.applyTo(setupNewServer); |
| |
| newLabel(container, "Server name:"); |
| newServerName = newText(container); |
| |
| newLabel(container, "Host name:"); |
| newServerHostnameName = newText(container); |
| newServerHostnameName.setText("localhost"); |
| |
| newLabel(container, "Port:"); |
| newServerPort = newText(container); |
| newServerPort.setText(Integer.toString(config.getPort())); |
| |
| newLabel(container, "Username:"); |
| newServerUsername = newText(container); |
| newServerUsername.setText(config.getUsername()); |
| |
| newLabel(container, "Password:"); |
| newServerPassword = newText(container); |
| newServerPassword.setText(config.getPassword()); |
| |
| newLabel(container, "Debug Port:"); |
| newServerDebugPort = newText(container); |
| newServerDebugPort.setText(Integer.toString(config.getDebugPort())); |
| |
| SelectionAdapter radioListener = new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| updateEnablements(); |
| dialogChanged(); |
| } |
| }; |
| useExistingServer.addSelectionListener(radioListener); |
| setupNewServer.addSelectionListener(radioListener); |
| |
| ModifyListener ml = new ModifyListener() { |
| |
| @Override |
| public void modifyText(ModifyEvent e) { |
| dialogChanged(); |
| } |
| }; |
| KeyListener kl = new KeyListener() { |
| |
| @Override |
| public void keyReleased(KeyEvent e) { |
| dialogChanged(); |
| } |
| |
| @Override |
| public void keyPressed(KeyEvent e) { |
| dialogChanged(); |
| } |
| }; |
| newServerName.addModifyListener(ml); |
| newServerName.addKeyListener(kl); |
| newServerHostnameName.addModifyListener(ml); |
| newServerHostnameName.addKeyListener(kl); |
| newServerPort.addModifyListener(ml); |
| newServerPort.addKeyListener(kl); |
| newServerDebugPort.addModifyListener(ml); |
| newServerDebugPort.addKeyListener(kl); |
| |
| useExistingServer.setSelection(existingServerCombo.hasServers()); |
| existingServerCombo.getWidget().setEnabled(existingServerCombo.hasServers()); |
| startExistingServerButton.setEnabled(existingServerCombo.hasServers()); |
| setupNewServer.setSelection(!existingServerCombo.hasServers()); |
| |
| updateEnablements(); |
| |
| setPageComplete(false); |
| |
| setControl(container); |
| |
| // allow the selection to proceed in case we have a preselected server |
| if (useExistingServer.getSelection()) { |
| if (existingServerCombo.getErrorMessage(SKIP_SERVER_STARTED) == null) { |
| updateStatus(null); |
| } |
| } |
| } |
| |
| private Label newLabel(Composite container, String text) { |
| |
| Label label = new Label(container, SWT.NONE); |
| GridData newServerPortLabelData = new GridData(); |
| newServerPortLabelData.horizontalIndent = HORIZONTAL_INDENT; |
| label.setLayoutData(newServerPortLabelData); |
| label.setEnabled(true); |
| label.setText(text); |
| |
| return label; |
| } |
| |
| private Text newText(Composite container) { |
| |
| Text text = new Text(container, SWT.BORDER); |
| text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); |
| |
| return text; |
| } |
| |
| private void dialogChanged() { |
| |
| // called too early |
| if (getControl() == null) { |
| return; |
| } |
| |
| if (useExistingServer.getSelection()) { |
| if (existingServerCombo.getErrorMessage(SKIP_SERVER_STARTED) != null) { |
| updateStatus(existingServerCombo.getErrorMessage()); |
| return; |
| } |
| } else if (setupNewServer.getSelection()) { |
| if (newServerName.getText().length()==0 || |
| getHostname().length()==0 || |
| newServerPort.getText().length()==0 || |
| newServerDebugPort.getText().length()==0 || |
| newServerUsername.getText().length() == 0 || |
| newServerPassword.getText().length() == 0) { |
| updateStatus("Enter values for new server"); |
| return; |
| } |
| } |
| updateStatus(null); |
| } |
| |
| private void updateEnablements() { |
| |
| existingServerCombo.getWidget().setEnabled(useExistingServer.getSelection()); |
| startExistingServerButton.setEnabled(useExistingServer.getSelection()); |
| newServerName.setEnabled(setupNewServer.getSelection()); |
| newServerHostnameName.setEnabled(setupNewServer.getSelection()); |
| newServerPort.setEnabled(setupNewServer.getSelection()); |
| newServerDebugPort.setEnabled(setupNewServer.getSelection()); |
| newServerUsername.setEnabled(setupNewServer.getSelection()); |
| newServerPassword.setEnabled(setupNewServer.getSelection()); |
| } |
| |
| private void updateStatus(String message) { |
| setErrorMessage(message); |
| setPageComplete(message == null); |
| } |
| |
| public boolean getStartServer() { |
| if (!useExistingServer.getSelection()) { |
| return true; // new servers are automatically started |
| } |
| return startExistingServerButton.getSelection(); |
| } |
| |
| /** |
| * Gets or creates a <tt>IServer</tt> instance to deploy projects on |
| * |
| * @param monitor |
| * @return the server instance, possibly null if the user requested to skip deployment |
| * @throws CoreException |
| */ |
| public IServer getOrCreateServer(IProgressMonitor monitor) throws CoreException { |
| |
| if (skipServerConfiguration.getSelection()) { |
| return null; |
| } |
| |
| if (server != null) { |
| return server; |
| } |
| |
| if (useExistingServer.getSelection()) { |
| return existingServerCombo.getServer(); |
| } else { |
| |
| IServerType serverType = ServerCore.findServerType(SERVER_TYPE_LAUNCHPAD); |
| IRuntime slingRuntime = getOrCreateSlingRuntime(monitor); |
| |
| try { |
| // TODO there should be a nicer API for creating this |
| IServerWorkingCopy wc = serverType.createServer(null, null, slingRuntime, monitor); |
| wc.setHost(getHostname()); |
| wc.setName(newServerName.getText()); |
| wc.setAttribute(ISlingLaunchpadServer.PROP_PORT, getPort()); |
| wc.setAttribute(ISlingLaunchpadServer.PROP_DEBUG_PORT, Integer.parseInt(newServerDebugPort.getText())); |
| wc.setAttribute(ISlingLaunchpadServer.PROP_USERNAME, newServerUsername.getText()); |
| wc.setAttribute(ISlingLaunchpadServer.PROP_PASSWORD, newServerPassword.getText()); |
| |
| SlingLaunchpadConfigurationDefaults.applyDefaultValues(wc); |
| |
| wc.setRuntime(slingRuntime); |
| server = wc.save(true, monitor); |
| return server; |
| } catch (CoreException e) { |
| throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, |
| "Failed creating the new server instance", e)); |
| |
| } |
| } |
| } |
| |
| private IRuntime getOrCreateSlingRuntime(IProgressMonitor monitor) throws CoreException { |
| |
| for ( IRuntime runtime : ServerCore.getRuntimes()) { |
| if ( runtime.getRuntimeType().getId().equals(RUNTIME_TYPE_LAUNCHPAD)) { |
| return runtime; |
| } |
| } |
| |
| IRuntimeType serverRuntime = ServerCore.findRuntimeType(RUNTIME_TYPE_LAUNCHPAD); |
| return serverRuntime.createRuntime(null, monitor).createWorkingCopy().save(true, monitor); |
| } |
| |
| private int getPort() { |
| return Integer.parseInt(newServerPort.getText()); |
| } |
| |
| private String getHostname() { |
| return newServerHostnameName.getText(); |
| } |
| |
| } |