blob: 618d8e6bfc8508a82a7fb6d90e6e65f24e814354 [file] [log] [blame]
/*
* 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();
}
}