From d8310d99c0fd6f2931fd98a289d88d0567c37fc3 Mon Sep 17 00:00:00 2001 From: Greg Watson Date: Fri, 27 Feb 2015 20:54:15 -0500 Subject: [PATCH] Bug 461098 - Add support for filtering connection types. Change-Id: I0ead2fcf73e6e1f39ce28078d898202d389b3e50 Signed-off-by: Greg Watson --- .../remote/core/IRemoteConnectionType.java | 9 +++++ .../remote/core/IRemoteServicesManager.java | 23 +++++++++++ .../internal/core/RemoteConnection.java | 2 +- .../internal/core/RemoteConnectionType.java | 8 +++- .../core/RemoteConnectionWorkingCopy.java | 2 +- .../internal/core/RemoteServicesManager.java | 40 +++++++++++++++++++ bundles/org.eclipse.remote.jsch.ui/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +-- .../META-INF/MANIFEST.MF | 2 +- .../jsch/ui/wizards/JSchConnectionPage.java | 3 ++ bundles/org.eclipse.remote.ui/.classpath | 2 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +-- .../META-INF/MANIFEST.MF | 2 +- .../remote/ui/IRemoteUIFileService.java | 4 +- .../ui/dialogs/RemoteResourceBrowser.java | 9 ++++- .../ui/widgets/RemoteConnectionWidget.java | 18 +++++++++ .../ui/widgets/RemoteDirectoryWidget.java | 8 +++- .../remote/ui/widgets/RemoteFileWidget.java | 7 +++- .../widgets/RemoteResourceBrowserWidget.java | 15 ++++--- 19 files changed, 145 insertions(+), 23 deletions(-) diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java index 53cec63cc63..94caa2e9f03 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java @@ -101,6 +101,15 @@ public interface IRemoteConnectionType { */ boolean hasService(Class service); + /** + * Do connections created by this connection type support the given service. + * + * @param service + * the service to be tested + * @return true if connections created by this connection type support this service + */ + boolean hasConnectionService(Class service); + /** * Gets the remote connection corresponding to the supplied name. * diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java index b7f68b4a09a..4cb6185ae48 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java @@ -57,6 +57,29 @@ public interface IRemoteServicesManager { */ List getAllConnectionTypes(); + /** + * Returns the list of all connection types that support connections that provide specific services. The connections + * can provide additional services that are not included in the list, so this just guarantees the minimum set of services that + * will be supported. + * + * @param services + * services provided by connections supported by this connection type + * @return compatible connection types + */ + @SuppressWarnings("unchecked") + List getConnectionTypesSupporting(Class... services); + + /** + * Returns the list of all connection types that provide specific services. The connection types can provide additional services + * that are not included in the list, so this just guarantees the minimum set of services that will be supported. + * + * @param services + * services provided by this connection type + * @return compatible connection types + */ + @SuppressWarnings("unchecked") + List getConnectionTypesByService(Class... services); + /** * Returns the list of connection types except for the local connection type. * diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java index f077260c9a1..08edbe688e7 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java @@ -88,7 +88,7 @@ public class RemoteConnection implements IRemoteConnection { */ @Override public boolean hasService(Class service) { - return servicesMap.get(service.getName()) != null || connectionType.hasConnectionService(this, service); + return servicesMap.get(service.getName()) != null || connectionType.hasConnectionService(service); } /* diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java index b4d432cd7b2..a07dacaa239 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java @@ -194,7 +194,13 @@ public class RemoteConnectionType implements IRemoteConnectionType { return null; } - public boolean hasConnectionService(IRemoteConnection connection, Class service) { + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionType#hasConnectionService(java.lang.Class) + */ + @Override + public boolean hasConnectionService(Class service) { return serviceDefinitionMap.get(service.getName()) != null; } diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java index e8422315d61..efd94ac418f 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java @@ -241,7 +241,7 @@ public class RemoteConnectionWorkingCopy implements IRemoteConnectionWorkingCopy if (original != null) { return original.hasService(service); } else { - return connectionType.hasConnectionService(this, service); + return connectionType.hasConnectionService(service); } } diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java index a763719c2c4..f7de07d4b6a 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java @@ -153,6 +153,46 @@ public class RemoteServicesManager implements IRemoteServicesManager { return new ArrayList(connectionTypeMap.values()); } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteServicesManager#getConnectionTypesSupporting(java.lang.Class[]) + */ + @Override + @SafeVarargs + public final List getConnectionTypesSupporting(Class... services) { + List connTypes = new ArrayList(); + for (IRemoteConnectionType connType : getRemoteConnectionTypes()) { + for (Class service : services) { + if (!connType.hasConnectionService(service)) { + connTypes.add(connType); + break; + } + } + } + return connTypes; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteServicesManager#getConnectionTypesByService(java.lang.Class[]) + */ + @Override + @SafeVarargs + public final List getConnectionTypesByService(Class... services) { + List connTypes = new ArrayList(); + for (IRemoteConnectionType connType : getRemoteConnectionTypes()) { + for (Class service : services) { + if (!connType.hasService(service)) { + connTypes.add(connType); + break; + } + } + } + return connTypes; + } + /* * (non-Javadoc) * diff --git a/bundles/org.eclipse.remote.jsch.ui/.classpath b/bundles/org.eclipse.remote.jsch.ui/.classpath index ad32c83a788..098194ca4b7 100644 --- a/bundles/org.eclipse.remote.jsch.ui/.classpath +++ b/bundles/org.eclipse.remote.jsch.ui/.classpath @@ -1,6 +1,6 @@ - + diff --git a/bundles/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs index 8000cd6ca61..7341ab1683c 100644 --- a/bundles/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs +++ b/bundles/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,11 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/bundles/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF index 550f576ecaa..c9ff5975db2 100644 --- a/bundles/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF @@ -21,4 +21,4 @@ Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.remote.internal.jsch.ui;x-internal:=true, org.eclipse.remote.internal.jsch.ui.messages;x-internal:=true Bundle-Localization: plugin -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 diff --git a/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java b/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java index a7f415cd9c2..0c16060d946 100755 --- a/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java +++ b/bundles/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java @@ -19,8 +19,10 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteConnectionHostService; import org.eclipse.remote.core.IRemoteConnectionType; import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; +import org.eclipse.remote.core.IRemotePortForwardingService; import org.eclipse.remote.core.IRemoteServicesManager; import org.eclipse.remote.core.exception.RemoteConnectionException; import org.eclipse.remote.internal.jsch.core.Activator; @@ -289,6 +291,7 @@ public class JSchConnectionPage extends WizardPage { lblConnection.setText(Messages.JSchConnectionPage_SelectConnection); fProxyConnectionWidget = new RemoteConnectionWidget(proxyComp, SWT.NONE, null, 0, null); + fProxyConnectionWidget.filterConnections(IRemoteConnectionHostService.class, IRemotePortForwardingService.class); Label lblCommand = new Label(proxyComp, SWT.WRAP); lblCommand.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); diff --git a/bundles/org.eclipse.remote.ui/.classpath b/bundles/org.eclipse.remote.ui/.classpath index ad32c83a788..098194ca4b7 100644 --- a/bundles/org.eclipse.remote.ui/.classpath +++ b/bundles/org.eclipse.remote.ui/.classpath @@ -1,6 +1,6 @@ - + diff --git a/bundles/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs index 8000cd6ca61..7341ab1683c 100644 --- a/bundles/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs +++ b/bundles/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,11 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/bundles/org.eclipse.remote.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.remote.ui/META-INF/MANIFEST.MF index 21a994d8c0a..d0f9cc2c968 100644 --- a/bundles/org.eclipse.remote.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.remote.ui/META-INF/MANIFEST.MF @@ -15,7 +15,7 @@ Require-Bundle: org.eclipse.ui, org.eclipse.ui.trace, org.eclipse.ui.navigator, org.eclipse.core.expressions -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.remote.internal.ui;x-internal:=true, org.eclipse.remote.internal.ui.messages;x-internal:=true, diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java index cdba005247e..dd62d033613 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java @@ -19,6 +19,7 @@ import org.eclipse.swt.widgets.Shell; /** * Interface for providing file management operations in the UI. Clients can call these methods to open generic dialogs for * operations on remote resources. + * * @since 2.0 */ public interface IRemoteUIFileService extends IRemoteConnectionType.Service { @@ -91,7 +92,8 @@ public interface IRemoteUIFileService extends IRemoteConnectionType.Service { public IRemoteConnection getConnection(); /** - * Set the connection to use for file browsing + * Set the connection to use for file browsing. The connection must support the IRemoteFileService service or it will be + * ignored. * * @param connection * connection to use for file browsing diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java index 53f7cd16f6f..5c850c89ff9 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java @@ -24,6 +24,7 @@ import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.wizard.ProgressMonitorPart; import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteFileService; import org.eclipse.remote.internal.ui.messages.Messages; import org.eclipse.remote.ui.widgets.RemoteResourceBrowserWidget; import org.eclipse.swt.SWT; @@ -256,12 +257,16 @@ public class RemoteResourceBrowser extends Dialog implements IRunnableContext { } /** - * Set the initial connection for the browser. + * Set the connection for the browser. The connection must support the IRemoteFileService service or this method will have no + * effect. * * @param connection + * connection that supports the IRemoteFileService service */ public void setConnection(IRemoteConnection connection) { - fConnection = connection; + if (connection.hasService(IRemoteFileService.class)) { + fConnection = connection; + } } /** diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java index 07e7ca7e65c..a3f289251e6 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java @@ -278,6 +278,24 @@ public class RemoteConnectionWidget extends Composite { fSelectionListeners.add(listener); } + /** + * Limit the connection types that will be used when displaying valid connections. Only connection types that support + * connections with supplied services will be displayed in the connection type combo, and only connections from these connection + * types will be displayed in the connection combo. + * + * @param services + * list of services {@link IRemoteConnection.Service} + * @since 2.0 + */ + @SafeVarargs + public final void filterConnections(Class... services) { + fConnectionTypes = fRemoteServicesManager.getConnectionTypesSupporting(services); + if (fConnectionTypeCombo != null) { + initializeConnectionTypeCombo(); + } + handleConnectionTypeSelected(null); + } + /** * Get the new button from the widget * diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java index 3f6617192ea..c669ee97520 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java @@ -15,6 +15,7 @@ import java.util.Map; import org.eclipse.core.runtime.ListenerList; import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteFileService; import org.eclipse.remote.core.IRemoteProcessService; import org.eclipse.remote.internal.ui.messages.Messages; import org.eclipse.remote.ui.IRemoteUIConnectionService; @@ -84,6 +85,7 @@ public class RemoteDirectoryWidget extends Composite { GridData data = new GridData(SWT.FILL, SWT.FILL, true, false); text.setLayoutData(data); text.addModifyListener(new ModifyListener() { + @Override public void modifyText(ModifyEvent e) { String path = text.getText(); setSavedPath(path); @@ -172,6 +174,9 @@ public class RemoteDirectoryWidget extends Composite { /** * Set the remote connection to use for browsing for the remote directory. * + * The connection type must provide the IRemoteUIConnectionService and IRemoteUIFileService services and the connection must + * support the IRemoteFileService service. If any of these conditions are not met, this method will do nothing. + * * @param conn * remote connection * @since 4.0 @@ -181,7 +186,8 @@ public class RemoteDirectoryWidget extends Composite { throw new NullPointerException(); } - if (!conn.equals(fRemoteConnection)) { + if (conn.hasService(IRemoteFileService.class) && conn.getConnectionType().hasService(IRemoteUIConnectionService.class) + && conn.getConnectionType().hasService(IRemoteUIFileService.class) && !conn.equals(fRemoteConnection)) { fRemoteConnection = conn; String path = getSavedPath(); restoreDefault(path); diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java index e49a6e0ac3d..2f15ed87b4a 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java @@ -15,6 +15,7 @@ import java.util.Map; import org.eclipse.core.runtime.ListenerList; import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteFileService; import org.eclipse.remote.core.IRemoteProcessService; import org.eclipse.remote.internal.ui.messages.Messages; import org.eclipse.remote.ui.IRemoteUIConnectionService; @@ -228,6 +229,9 @@ public class RemoteFileWidget extends Composite { /** * Set the remote connection to use for browsing for the remote file. * + * The connection type must provide the IRemoteUIConnectionService and IRemoteUIFileService services and the connection must + * support the IRemoteFileService service. If any of these conditions are not met, this method will do nothing. + * * @param conn * remote connection * @since 4.0 @@ -237,7 +241,8 @@ public class RemoteFileWidget extends Composite { throw new NullPointerException(); } - if (!conn.equals(fRemoteConnection)) { + if (conn.hasService(IRemoteFileService.class) && conn.getConnectionType().hasService(IRemoteUIConnectionService.class) + && conn.getConnectionType().hasService(IRemoteUIFileService.class) && !conn.equals(fRemoteConnection)) { fRemoteConnection = conn; String path = getSavedPath(); restoreDefault(path); diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java index 7e058e52033..2ed8ebd9bd4 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java @@ -237,6 +237,7 @@ public class RemoteResourceBrowserWidget extends Composite { })); } }); + fRemoteConnectionWidget.filterConnections(IRemoteFileService.class); } Composite textComp = new Composite(mainComp, SWT.NONE); @@ -652,16 +653,20 @@ public class RemoteResourceBrowserWidget extends Composite { } /** - * Set the connection for the browser + * Set the connection for the browser. The connection must support the IRemoteFileService service or this method will have no + * effect. * * @param connection + * connection that supports the IRemoteFileService service */ public void setConnection(IRemoteConnection connection) { - changeInput(connection); - if (fRemoteConnectionWidget != null) { - fRemoteConnectionWidget.setConnection(connection); + if (connection.hasService(IRemoteFileService.class)) { + changeInput(connection); + if (fRemoteConnectionWidget != null) { + fRemoteConnectionWidget.setConnection(connection); + } + updateEnablement(); } - updateEnablement(); } /**