/*******************************************************************************
* Copyright (c) 2012, 2015 Pivotal Software, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of 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.
*
* Contributors:
* Pivotal Software, Inc. - initial API and implementation
* IBM - Switching to use the more generic AbstractCloudFoundryUrl
* instead concrete CloudServerURL
********************************************************************************/
package org.cloudfoundry.ide.eclipse.server.ui.internal;
import java.util.ArrayList;
import java.util.List;
import org.cloudfoundry.ide.eclipse.server.core.AbstractCloudFoundryUrl;
import org.cloudfoundry.ide.eclipse.server.core.internal.CloudFoundryBrandingExtensionPoint.CloudServerURL;
import org.cloudfoundry.ide.eclipse.server.core.internal.CloudFoundryPlugin;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* @author Terry Denney
*/
public class TargetURLDialog extends Dialog {
private final AbstractCloudFoundryUrl cloudUrl;
private final String wildcard;
private String value;
private String name;
private String url;
private Text wildcardText;
private Text nameText;
private final List<AbstractCloudFoundryUrl> allCloudUrls;
/**
* @deprecated use {@link #TargetURLDialog(Shell, AbstractCloudFoundryUrl, String, List)} instead
*/
public TargetURLDialog(Shell parentShell, CloudServerURL cloudUrl, String wildcard, List<CloudServerURL> allCloudUrls) {
super(parentShell);
this.cloudUrl = cloudUrl;
this.wildcard = wildcard;
this.allCloudUrls = new ArrayList <AbstractCloudFoundryUrl>();
for (int i = 0; i < allCloudUrls.size(); ++i) {
this.allCloudUrls.add(allCloudUrls.get(i));
}
this.url = cloudUrl.getUrl();
}
public TargetURLDialog(Shell parentShell, AbstractCloudFoundryUrl cloudUrl, String wildcard, List<AbstractCloudFoundryUrl> allCloudUrls) {
super(parentShell);
this.cloudUrl = cloudUrl;
this.wildcard = wildcard;
this.allCloudUrls = allCloudUrls;
this.url = cloudUrl.getUrl();
}
public String getUrl() {
return url;
}
public String getName() {
return name;
}
@Override
protected Control createDialogArea(Composite parent) {
getShell().setText(NLS.bind(Messages.TargetURLDialog_TEXT_CREATE_DIALOG_SHELL, cloudUrl.getName()));
Composite control = (Composite) super.createDialogArea(parent);
Composite composite = new Composite(control, SWT.NONE);
GridDataFactory.fillDefaults().applyTo(composite);
GridLayoutFactory.fillDefaults().applyTo(composite);
Label wildcardLabel = new Label(composite, SWT.NONE);
wildcardLabel.setText(NLS.bind(Messages.TargetURLDialog_TEXT_WILDCARD_LABEL, wildcard));
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).hint(300, SWT.DEFAULT).applyTo(wildcardLabel);
wildcardText = new Text(composite, SWT.BORDER);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(wildcardText);
wildcardText.setEnabled(true);
wildcardText.setText(wildcard);
value = wildcard;
wildcardText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (nameText.getText().equals(cloudUrl.getName() + " (" + value + ")")) { //$NON-NLS-1$ //$NON-NLS-2$
nameText.setText(cloudUrl.getName() + " (" + wildcardText.getText() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}
value = wildcardText.getText();
}
});
Label nameLabel = new Label(composite, SWT.NONE);
nameLabel.setText(Messages.TargetURLDialog_TEXT_NAMELABEL);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).indent(0, 5).applyTo(nameLabel);
nameText = new Text(composite, SWT.BORDER);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(nameText);
nameText.setEnabled(true);
name = cloudUrl.getName() + " (" + value + ")"; //$NON-NLS-1$ //$NON-NLS-2$
nameText.setText(name);
nameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
name = nameText.getText();
}
});
return control;
}
@Override
protected void okPressed() {
// List<CloudURL> allUrls = CloudUiUtil.getAllUrls(serverTypeId);
for(AbstractCloudFoundryUrl url: allCloudUrls) {
if (url.getName().equals(name)) {
MessageDialog.openError(getParentShell(), Messages.TargetURLDialog_ERROR_DUPLICATE_TITLE, NLS.bind(Messages.TargetURLDialog_ERROR_DUPLICATE_BODY, name));
return;
}
}
final boolean[] shouldProceed = new boolean[] {false};
BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
public void run() {
url = replaceWildcard(cloudUrl.getUrl(), wildcard, value);
try {
CloudFoundryPlugin.getCloudFoundryClientFactory().getCloudFoundryOperations(url).getCloudInfo();
shouldProceed[0] = true;
}
catch (Exception e) {
shouldProceed[0] = MessageDialog.openQuestion(getParentShell(), Messages.TargetURLDialog_ERROR_INVALID_URL_TITLE, NLS.bind(Messages.TargetURLDialog_ERROR_INVALID_URL_BODY, url));
}
}
});
if (shouldProceed[0]) {
super.okPressed();
}
}
private static String replaceWildcard(String url, String wildcard, String value) {
return url.replaceAll("\\{" + wildcard + "\\}", value); //$NON-NLS-1$ //$NON-NLS-2$
}
}