/* * � Copyright IBM Corp. 2016 * * Licensed 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 com.ibm.xsp.extlib.designer.bluemix.manifest.editor; import java.io.File; import java.io.IOException; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import com.ibm.commons.swt.SWTLayoutUtils; import com.ibm.commons.util.StringUtil; import com.ibm.xsp.extlib.designer.bluemix.BluemixLogger; import com.ibm.xsp.extlib.designer.bluemix.config.ConfigManager; import com.ibm.xsp.extlib.designer.bluemix.manifest.ManifestAppProps; import com.ibm.xsp.extlib.designer.bluemix.preference.HybridProfile; import com.ibm.xsp.extlib.designer.bluemix.util.BluemixUtil; import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils; import com.ibm.xsp.extlib.designer.xspprops.XSPEditorUtil; /** * @author Gary Marjoram * */ public class ManifestHybridEditorPage extends AbstractManifestEditorPage implements SelectionListener { private Label _domainNameLabel; private Text _domainNameText; private Label _dominoDirLabel; private Text _dominoDirText; private Text _runtimeServerIdText; private Button _daEnabledCheckbox; private String _deployDir; // TODO : Strings to be used later private final static String invalidHybridConfig = "This hybrid configuration is invalid."; // $NLX-ManifestHybridEditorPage.Thishybridconfigurationisinvalid-1$ private final static String dominoBluemixServicesOnly = "Domino Bluemix services only."; // $NLX-ManifestHybridEditorPage.DominoBluemixservicesonly-1$ public ManifestHybridEditorPage(Composite parent, FormToolkit toolkit, ManifestMultiPageEditor mpe) { super(parent, toolkit, mpe); } @Override protected void initialize() { _deployDir = ConfigManager.getInstance().getConfig(_mpe.getDesignerProject()).directory; super.initialize(); } @Override protected String getPageTitle() { return "Hybrid Configuration"; // $NLX-ManifestHybridEditorPage.HybridConfiguration-1$ } @Override protected void createLeftArea(Composite parent) { createOptionsArea(parent); createRemoteDataConnectionArea(parent); createRuntimeApplicationContainerArea(parent); } @Override protected void createRightArea(Composite parent) { createDaArea(parent); } @Override protected void refreshUI() { refreshDaControlState(); super.refreshUI(); } private void createOptionsArea(Composite parent) { Section section = XSPEditorUtil.createSection(_toolkit, parent, "Configuration Options", 1, 1); // $NLX-ManifestHybridEditorPage.ConfigurationOptions-1$ Composite container = XSPEditorUtil.createSectionChild(section, 1); Composite btnContainer = new Composite(container, SWT.NONE); GridLayout gl = SWTLayoutUtils.createLayoutNoMarginDefaultSpacing(2); gl.horizontalSpacing = 5; btnContainer.setLayout(gl); btnContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); btnContainer.setBackground(getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); Button btn = new Button(btnContainer, SWT.PUSH); btn.setText("Load hybrid profile..."); // $NLX-ManifestHybridEditorPage.Loadhybridprofile-1$ btn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { HybridProfileDialog dialog = new HybridProfileDialog(getShell()); if(dialog.open() == Dialog.OK) { loadProfile(dialog.getSelectedProfile()); _mpe.refreshPage(ManifestHybridEditorPage.this); } } }); btn = new Button(btnContainer, SWT.PUSH); btn.setText("Delete this configuration"); // $NLX-ManifestHybridEditorPage.Deletethisconfiguration-1$ btn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String msg = "Are you sure you want to remove this hybrid configuration from the manifest?"; // $NLX-ManifestHybridEditorPage.Areyousureyouwanttoremovethishyri-1$ if(MessageDialog.openQuestion(null, BluemixUtil.productizeString("%BM_PRODUCT% Manifest"), msg)) { // $NLX-ManifestHybridEditorPage.BM_PRODUCTManifest-1$ loadProfile(null); _mpe.refreshPage(ManifestHybridEditorPage.this); } } }); section.setClient(container); } private void createRemoteDataConnectionArea(Composite parent) { Section section = XSPEditorUtil.createSection(_toolkit, parent, "Remote Data Connection", 1, 1); // $NLX-ManifestHybridEditorPage.RemoteDataConnection-1$ Composite container = XSPEditorUtil.createSectionChild(section, 2); Label tLabel = XSPEditorUtil.createLabel(container, "Server address:", 1); // $NLX-ManifestHybridEditorPage.Serveraddress-1$ tLabel.setToolTipText("Fully resolvable public server URL or IP address"); // $NLX-ManifestHybridEditorPage.FullyresolvablepublicserverURLorI-1$ XSPEditorUtil.createText(container, "appRemoteDataServerAddress", 1, 0, 40); // $NON-NLS-1$ tLabel = XSPEditorUtil.createLabel(container, "Server name:", 1); // $NLX-ManifestHybridEditorPage.Servername-1$ tLabel.setToolTipText("Domino abbreviated server name (e.g. crm/acme)"); // $NLX-ManifestHybridEditorPage.Dominoabbreviatedservernameegcrma-1$ XSPEditorUtil.createText(container, "appRemoteDataServerName", 1, 0, 1); // $NON-NLS-1$ section.setClient(container); } private void createRuntimeApplicationContainerArea(Composite parent) { Section section = XSPEditorUtil.createSection(_toolkit, parent, "Runtime Application Container", 1, 1); // $NLX-ManifestHybridEditorPage.RuntimeApplicationContainer-1$ Composite container = XSPEditorUtil.createSectionChild(section, 2); Label tLabel = XSPEditorUtil.createLabel(container, "Server name:", 1); // $NLX-ManifestHybridEditorPage.Servername.1-1$ tLabel.setToolTipText("Domino abbreviated server name (e.g. crm/acme)"); // $NLX-ManifestHybridEditorPage.Dominoabbreviatedservernameegcrma.1-1$ XSPEditorUtil.createText(container, "appRuntimeServerName", 1, 0, 1); // $NON-NLS-1$ tLabel = XSPEditorUtil.createLabel(container, "Server ID file:", 1); // $NLX-ManifestHybridEditorPage.ServerIDfile-1$ tLabel.setToolTipText("Server ID file to be used during application staging"); // $NLX-ManifestHybridEditorPage.ServerIDfiletobeusedduringapplica-1$ Composite btnContainer = new Composite(container, SWT.NONE); GridLayout gl = SWTLayoutUtils.createLayoutNoMarginDefaultSpacing(2); gl.horizontalSpacing = 5; btnContainer.setLayout(gl); btnContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); btnContainer.setBackground(getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); _runtimeServerIdText = XSPEditorUtil.createText(btnContainer, "appRuntimeServerIdfile", 1, 0, 1); // $NON-NLS-1$ Button btn = new Button(btnContainer, SWT.PUSH); btn.setText("Browse..."); // $NLX-ManifestHybridEditorPage.Browse-1$ btn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String fileName = new Path(_deployDir).addTrailingSeparator().append(WizardUtils.getTextValue(_runtimeServerIdText, "")).toOSString(); String fileTypes[] = new String[]{"ID files","All files"}; // $NLX-ManifestHybridEditorPage.IDfiles-1$ $NLX-ManifestHybridEditorPage.Allfiles-2$ fileName = BluemixUtil.launchChooseFileDialog(fileName, new String[]{"*.id","*.*"}, fileTypes); // $NON-NLS-1$ if (StringUtil.isNotEmpty(fileName)) { if (canOverwriteDeployFile(fileName)) { if(copyDeployFile(fileName)) { _runtimeServerIdText.setText(new File(fileName).getName()); } } } } }); tLabel = XSPEditorUtil.createLabel(container, "Server ID password:", 1); // $NLX-ManifestHybridEditorPage.ServerIDpassword-1$ tLabel.setToolTipText("Optional Server ID file password to be used during application staging"); // $NLX-ManifestHybridEditorPage.OptionalServerIDfilepasswordtobeu-1$ XSPEditorUtil.createPasswordText(container, "appRuntimeServerPassword", 1, 0, 1); // $NON-NLS-1$ section.setClient(container); } private void createDaArea(Composite parent) { Section section = XSPEditorUtil.createSection(_toolkit, parent, "Directory Assistance", 1, 1); // $NLX-ManifestHybridEditorPage.DirectoryAssistance-1$ Composite container = XSPEditorUtil.createSectionChild(section, 2); _daEnabledCheckbox = XSPEditorUtil.createCheckboxTF(container, "Enable directory assistance for authentication", "appDaEnabled", 2); // $NON-NLS-2$ $NLX-ManifestHybridEditorPage.Enabledirectoryassistanceforauthe-1$ _daEnabledCheckbox.setToolTipText(StringUtil.format("Enable to allow the runtime application server to use a Domino user directory on the remote server as follows:{0}to authenticate Internet users against the credentials in the directory,{0}to resolve users during NAMELookup calls,{0}to resolve members of groups when authorizing database access.", "\n")); // $NON-NLS-2$ $NLX-ManifestHybridEditorPage.Enabletoallowtheruntimeapplicatio-1$ _daEnabledCheckbox.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { refreshDaControlState(); } }); _domainNameLabel = XSPEditorUtil.createLabel(container, "Domain name:", 1); // $NLX-ManifestHybridEditorPage.Domainname-1$ _domainNameLabel.setToolTipText("The domain name of a Domino directory on the remote server"); // $NLX-ManifestHybridEditorPage.ThedomainnameofaDominodirectoryon-1$ _domainNameText = XSPEditorUtil.createText(container, "appDaDomain", 1, 0, 40); // $NON-NLS-1$ _dominoDirLabel = XSPEditorUtil.createLabel(container, "Domino directory:", 1); // $NLX-ManifestHybridEditorPage.Dominodirectory-1$ _dominoDirLabel.setToolTipText("The file name of a Domino directory on the remote server"); // $NLX-ManifestHybridEditorPage.ThefilenameofaDominodirectoryonth-1$ _dominoDirText = XSPEditorUtil.createText(container, "appDaAddressBook", 1, 0, 1); // $NON-NLS-1$ section.setClient(container); } private void refreshDaControlState() { enableDaControls(_daEnabledCheckbox.getSelection()); } private void enableDaControls(boolean enable) { _domainNameLabel.setEnabled(enable); _domainNameText.setEnabled(enable); _dominoDirLabel.setEnabled(enable); _dominoDirText.setEnabled(enable); } public void loadProfile(HybridProfile profile) { ManifestAppProps props = _mpe.getBean().getManifestProperties(); if (profile != null) { if (!canOverwriteDeployFile(profile.getRuntimeServerIdFile())) { return; } if (!copyDeployFile(profile.getRuntimeServerIdFile())) { return; } } props.setAppRemoteDataServerAddress(null); props.setAppRemoteDataServerName(null); props.setAppRuntimeServerName(null); props.setAppRuntimeServerIdfile(null); props.setAppRuntimeServerPassword(null); props.setAppDaEnabled(null); props.setAppDaDomain(null); props.setAppDaAddressBook(null); if (profile != null) { props.setAppRemoteDataServerAddress(profile.getRemoteServerAddress()); props.setAppRemoteDataServerName(profile.getRemoteServerName()); props.setAppRuntimeServerName(profile.getRuntimeServerName()); props.setAppRuntimeServerIdfile(new File(profile.getRuntimeServerIdFile()).getName()); props.setAppRuntimeServerPassword(profile.getRuntimeServerIdPassword()); props.setAppDaEnabled(profile.isDaEnabled()); props.setAppDaDomain(profile.getDaDomainName()); props.setAppDaAddressBook(profile.getDaDominoDirectory()); } _mpe.writeContentsFromBean(); } @Override public void widgetDefaultSelected(SelectionEvent event) { } @Override public void widgetSelected(SelectionEvent event) { } protected boolean canOverwriteDeployFile(String srcFilename) { if (StringUtil.isNotEmpty(srcFilename)) { File srcFile = new File(srcFilename); File dstFile = new File(new Path(_deployDir).addTrailingSeparator().append(srcFile.getName()).toOSString()); if (!srcFile.equals(dstFile)) { if (dstFile.exists()) { String msg = StringUtil.format("\"{0}\" will be overwritten. Continue?", dstFile.getAbsolutePath()); // $NLX-ManifestHybridEditorPage.0willbeoverwrittenContinue-1$ if(!MessageDialog.openQuestion(null, "Copy file to deployment directory", msg)) { // $NLX-ManifestHybridEditorPage.Copyfiletodeploymentdirectory-1$ return false; } } } } return true; } protected boolean copyDeployFile(String srcFilename) { if (StringUtil.isNotEmpty(srcFilename)) { File srcFile = new File(srcFilename); File dstFile = new File(new Path(_deployDir).addTrailingSeparator().append(srcFile.getName()).toOSString()); if (!srcFile.equals(dstFile)) { try { BluemixUtil.copyFile(srcFile, dstFile); } catch (IOException e) { if (BluemixLogger.BLUEMIX_LOGGER.isErrorEnabled()) { BluemixLogger.BLUEMIX_LOGGER.errorp(BluemixUtil.class, "copyDeployFile", e, "Error copying file {0}", srcFile); // $NON-NLS-1$ $NLE-ManifestHybridEditorPage.Errorcopyingfile0-2$ } String msg = StringUtil.format("Error copying \"{0}\" to \"{1}\"", srcFile.getAbsolutePath(), _deployDir); // $NLX-ManifestHybridEditorPage.Errorcopying0to1-1$ MessageDialog.openError(null, "Copy file to deployment directory", msg); // $NLX-ManifestHybridEditorPage.Copyfiletodeploymentdirectory.1-1$ return false; } } } return true; } }