Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/remote
diff options
context:
space:
mode:
Diffstat (limited to 'remote')
-rw-r--r--remote/org.eclipse.cdt.remote.core/.settings/org.eclipse.jdt.ui.prefs80
-rw-r--r--remote/org.eclipse.cdt.remote.core/META-INF/MANIFEST.MF2
-rw-r--r--remote/org.eclipse.cdt.remote.core/about.html14
-rw-r--r--remote/org.eclipse.remote-feature/.project17
-rw-r--r--remote/org.eclipse.remote-feature/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote-feature/build.properties4
-rw-r--r--remote/org.eclipse.remote-feature/eclipse_update_120.jpgbin0 -> 21695 bytes
-rw-r--r--remote/org.eclipse.remote-feature/epl-v20.html189
-rw-r--r--remote/org.eclipse.remote-feature/feature.properties27
-rw-r--r--remote/org.eclipse.remote-feature/feature.xml58
-rw-r--r--remote/org.eclipse.remote.console-feature/.project17
-rw-r--r--remote/org.eclipse.remote.console-feature/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.console-feature/build.properties4
-rw-r--r--remote/org.eclipse.remote.console-feature/eclipse_update_120.jpgbin0 -> 21695 bytes
-rw-r--r--remote/org.eclipse.remote.console-feature/epl-v20.html189
-rw-r--r--remote/org.eclipse.remote.console-feature/feature.properties27
-rw-r--r--remote/org.eclipse.remote.console-feature/feature.xml29
-rw-r--r--remote/org.eclipse.remote.console/.classpath7
-rw-r--r--remote/org.eclipse.remote.console/.project34
-rw-r--r--remote/org.eclipse.remote.console/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.console/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.console/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.console/META-INF/MANIFEST.MF38
-rw-r--r--remote/org.eclipse.remote.console/about.html38
-rw-r--r--remote/org.eclipse.remote.console/about.ini24
-rw-r--r--remote/org.eclipse.remote.console/about.mappings9
-rw-r--r--remote/org.eclipse.remote.console/about.properties32
-rw-r--r--remote/org.eclipse.remote.console/build.properties14
-rw-r--r--remote/org.eclipse.remote.console/cdt_logo_icon32.pngbin0 -> 1885 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/clcl16/command_input_field.gifbin0 -> 385 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/clcl16/connect_co.gifbin0 -> 139 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/clcl16/disconnect_co.gifbin0 -> 146 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/clcl16/lock_co.gifbin0 -> 626 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/clcl16/newterminal.gifbin0 -> 351 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/clcl16/properties_tsk.gifbin0 -> 118 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/cview16/terminal_view.gifbin0 -> 938 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/dlcl16/command_input_field.gifbin0 -> 239 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/dlcl16/connect_co.gifbin0 -> 874 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/dlcl16/disconnect_co.gifbin0 -> 90 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/dlcl16/lock_co.gifbin0 -> 588 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/dlcl16/newterminal.gifbin0 -> 351 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/dlcl16/properties_tsk.gifbin0 -> 90 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/dlcl16/rem_co.gifbin0 -> 159 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/elcl16/command_input_field.gifbin0 -> 239 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/elcl16/connect_co.gifbin0 -> 890 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/elcl16/disconnect_co.gifbin0 -> 118 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/elcl16/lock_co.gifbin0 -> 626 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/elcl16/newterminal.gifbin0 -> 351 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/elcl16/properties_tsk.gifbin0 -> 118 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/elcl16/rem_co.gifbin0 -> 163 bytes
-rw-r--r--remote/org.eclipse.remote.console/icons/eview16/terminal_view.gifbin0 -> 938 bytes
-rw-r--r--remote/org.eclipse.remote.console/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.console/plugin.xml46
-rw-r--r--remote/org.eclipse.remote.console/schema/consoleToolbar.exsd137
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/console/ITerminalConsole.java14
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java56
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/ConsoleAction.java118
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/IConsoleActionFactory.java34
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/Activator.java150
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.java38
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.properties28
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ImageConsts.java54
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java88
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleConnector.java308
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleExtensionManager.java92
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleFactory.java120
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java216
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleSettingsDialog.java194
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.java28
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.properties16
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java36
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java36
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java38
-rw-r--r--remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/OpenCommandShellHandler.java27
-rw-r--r--remote/org.eclipse.remote.core.tests/.classpath11
-rw-r--r--remote/org.eclipse.remote.core.tests/.project34
-rw-r--r--remote/org.eclipse.remote.core.tests/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.core.tests/META-INF/MANIFEST.MF15
-rw-r--r--remote/org.eclipse.remote.core.tests/about.html38
-rw-r--r--remote/org.eclipse.remote.core.tests/build.properties6
-rw-r--r--remote/org.eclipse.remote.core.tests/plugin.properties16
-rw-r--r--remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/Activator.java39
-rw-r--r--remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/ServiceTests.java83
-rw-r--r--remote/org.eclipse.remote.core/.classpath7
-rw-r--r--remote/org.eclipse.remote.core/.options2
-rw-r--r--remote/org.eclipse.remote.core/.project34
-rw-r--r--remote/org.eclipse.remote.core/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.core/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.core/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.core/META-INF/MANIFEST.MF29
-rw-r--r--remote/org.eclipse.remote.core/about.html38
-rw-r--r--remote/org.eclipse.remote.core/about.ini27
-rw-r--r--remote/org.eclipse.remote.core/about.mappings6
-rw-r--r--remote/org.eclipse.remote.core/about.properties25
-rw-r--r--remote/org.eclipse.remote.core/build.properties14
-rw-r--r--remote/org.eclipse.remote.core/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.core/plugin.xml91
-rw-r--r--remote/org.eclipse.remote.core/ptp_logo_icon32.pngbin0 -> 53143 bytes
-rw-r--r--remote/org.eclipse.remote.core/schema/authenticator.exsd99
-rw-r--r--remote/org.eclipse.remote.core/schema/processFactory.exsd98
-rw-r--r--remote/org.eclipse.remote.core/schema/remoteResources.exsd113
-rw-r--r--remote/org.eclipse.remote.core/schema/remoteServices.exsd278
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/AbstractRemoteProcessBuilder.java135
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IProcessFactory.java35
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteCommandShellService.java47
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnection.java174
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionChangeListener.java37
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionControlService.java50
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionHostService.java152
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionPropertyService.java44
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionProviderService.java33
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java206
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java76
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteFileService.java99
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePortForwardingService.java106
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePreferenceConstants.java29
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcess.java136
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessBuilder.java161
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessControlService.java77
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessService.java78
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessSignalService.java51
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessTerminalService.java36
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteResource.java78
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java125
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IUserAuthenticatorService.java131
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionChangeEvent.java92
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionPropertyTester.java35
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteProcessAdapter.java64
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteServicesUtils.java118
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/AddressInUseException.java46
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/ConnectionExistsException.java31
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/PrivilegedPortException.java45
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/RemoteConnectionException.java49
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/UnableToForwardPortException.java48
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/core/launch/IRemoteLaunchConfigService.java56
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java214
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java370
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java314
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteCorePlugin.java142
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteDebugOptions.java115
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemotePath.java1216
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteProcess.java145
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceAdapterFactory.java87
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceFactory.java50
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java220
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/launch/RemoteLaunchConfigService.java65
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/Messages.java20
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/messages.properties5
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/PreferenceInitializer.java31
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/Preferences.java495
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalCommandShellService.java69
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionHostService.java130
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionPropertyService.java58
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionProviderService.java59
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalFileService.java87
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcess.java209
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessBuilder.java183
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessService.java76
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalResource.java49
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/Messages.java15
-rw-r--r--remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/messages.properties1
-rw-r--r--remote/org.eclipse.remote.doc.isv/.project22
-rw-r--r--remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.doc.isv/META-INF/MANIFEST.MF15
-rw-r--r--remote/org.eclipse.remote.doc.isv/about.html38
-rw-r--r--remote/org.eclipse.remote.doc.isv/build.properties12
-rw-r--r--remote/org.eclipse.remote.doc.isv/css/style.css17
-rw-r--r--remote/org.eclipse.remote.doc.isv/html/.gitignore1
-rw-r--r--remote/org.eclipse.remote.doc.isv/html/concepts/concepts.html76
-rw-r--r--remote/org.eclipse.remote.doc.isv/html/gettingstarted/intro.html46
-rw-r--r--remote/org.eclipse.remote.doc.isv/html/samples/examples.html112
-rw-r--r--remote/org.eclipse.remote.doc.isv/html/toc.html20
-rw-r--r--remote/org.eclipse.remote.doc.isv/plugin.xml25
-rw-r--r--remote/org.eclipse.remote.doc.isv/pom.xml126
-rw-r--r--remote/org.eclipse.remote.doc.isv/toc.xml17
-rw-r--r--remote/org.eclipse.remote.doc.isv/tocconcepts.xml7
-rw-r--r--remote/org.eclipse.remote.doc.isv/tocgettingstarted.xml7
-rw-r--r--remote/org.eclipse.remote.doc.isv/tocreference.xml6
-rw-r--r--remote/org.eclipse.remote.doc.isv/tocsamples.xml7
-rw-r--r--remote/org.eclipse.remote.jsch.core/.classpath7
-rw-r--r--remote/org.eclipse.remote.jsch.core/.project34
-rw-r--r--remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.jsch.core/META-INF/MANIFEST.MF22
-rw-r--r--remote/org.eclipse.remote.jsch.core/about.html38
-rw-r--r--remote/org.eclipse.remote.jsch.core/build.properties8
-rw-r--r--remote/org.eclipse.remote.jsch.core/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.jsch.core/plugin.xml82
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/Activator.java110
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/ArgumentParser.java371
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchCommandShellService.java49
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnection.java897
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnectionProxyFactory.java268
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileManager.java101
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileSystem.java102
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcess.java217
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcessBuilder.java290
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchUserInfo.java148
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JschFileStore.java274
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/AbstractRemoteCommand.java479
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ChildInfosCommand.java67
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/DeleteCommand.java30
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ExecCommand.java60
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/FetchInfoCommand.java47
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetInputStreamCommand.java124
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetOutputStreamCommand.java73
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/MkdirCommand.java53
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/PutInfoCommand.java121
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/Messages.java70
-rw-r--r--remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/messages.properties48
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.classpath11
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.project28
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.jsch.tests/META-INF/MANIFEST.MF15
-rw-r--r--remote/org.eclipse.remote.jsch.tests/about.html38
-rw-r--r--remote/org.eclipse.remote.jsch.tests/build.properties6
-rw-r--r--remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/Activator.java57
-rw-r--r--remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ConnectionTests.java152
-rw-r--r--remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/FileStoreTests.java257
-rw-r--r--remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ProcessTests.java235
-rw-r--r--remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/RemoteCoreTestSuite.java16
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.classpath7
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.project34
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF42
-rw-r--r--remote/org.eclipse.remote.jsch.ui/about.html38
-rw-r--r--remote/org.eclipse.remote.jsch.ui/build.properties10
-rw-r--r--remote/org.eclipse.remote.jsch.ui/icons/full/obj16/connection.gifbin0 -> 160 bytes
-rw-r--r--remote/org.eclipse.remote.jsch.ui/icons/ssh.pngbin0 -> 512 bytes
-rw-r--r--remote/org.eclipse.remote.jsch.ui/plugin.properties16
-rw-r--r--remote/org.eclipse.remote.jsch.ui/plugin.xml56
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/Activator.java114
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchFileSystemContributor.java66
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIConnectionService.java111
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUserAuthenticator.java123
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/Messages.java71
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/messages.properties53
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java585
-rw-r--r--remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionWizard.java82
-rw-r--r--remote/org.eclipse.remote.proxy-feature/.project17
-rw-r--r--remote/org.eclipse.remote.proxy-feature/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy-feature/build.properties4
-rw-r--r--remote/org.eclipse.remote.proxy-feature/eclipse_update_120.jpgbin0 -> 21695 bytes
-rw-r--r--remote/org.eclipse.remote.proxy-feature/epl-v20.html189
-rw-r--r--remote/org.eclipse.remote.proxy-feature/feature.properties28
-rw-r--r--remote/org.eclipse.remote.proxy-feature/feature.xml69
-rw-r--r--remote/org.eclipse.remote.proxy.core/.classpath7
-rw-r--r--remote/org.eclipse.remote.proxy.core/.project34
-rw-r--r--remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.core/META-INF/MANIFEST.MF27
-rw-r--r--remote/org.eclipse.remote.proxy.core/about.html38
-rwxr-xr-xremote/org.eclipse.remote.proxy.core/bootstrap.sh125
-rw-r--r--remote/org.eclipse.remote.proxy.core/build.properties11
-rw-r--r--remote/org.eclipse.remote.proxy.core/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.proxy.core/plugin.xml77
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/Activator.java101
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java440
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionBootstrap.java331
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionProviderService.java46
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileManager.java88
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileStore.java290
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileSystem.java86
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java173
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcessBuilder.java154
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/AbstractCommand.java86
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ChildInfosCommand.java68
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/DeleteCommand.java55
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ExecCommand.java83
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/FetchInfoCommand.java63
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetCwdCommand.java57
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetEnvCommand.java65
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetInputStreamCommand.java62
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetOutputStreamCommand.java62
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetPropertiesCommand.java65
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/MkdirCommand.java55
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/PutInfoCommand.java61
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ShellCommand.java55
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/Messages.java118
-rw-r--r--remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/messages.properties72
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.classpath7
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.project34
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/META-INF/MANIFEST.MF16
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/about.html38
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/build.properties9
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/internal/proxy/protocol/core/Activator.java101
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/Protocol.java44
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/SerializableFileInfo.java93
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannel.java369
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannelManager.java567
-rw-r--r--remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/exceptions/ProxyException.java20
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.classpath7
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.project34
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/META-INF/MANIFEST.MF18
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/about.html38
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/build.properties8
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/plugin.xml17
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Application.java44
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/CommandServer.java295
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Server.java78
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerCommand.java17
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerExecCommand.java238
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerChildInfosCommand.java63
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerDeleteCommand.java37
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerExecCommand.java72
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerFetchInfoCommand.java60
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetCwdCommand.java45
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetEnvCommand.java49
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetInputStreamCommand.java91
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetOutputStreamCommand.java92
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetPropertiesCommand.java65
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerMkdirCommand.java37
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerPutInfoCommand.java41
-rw-r--r--remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerShellCommand.java184
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/.gitignore1
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/.project22
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.core.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/META-INF/MANIFEST.MF7
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/about.html38
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/build.properties5
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.ppc64le/pom.xml50
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/.gitignore1
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/.project22
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.core.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/META-INF/MANIFEST.MF7
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/about.html38
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/build.properties5
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.proxy.server.linux.x86_64/pom.xml50
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/.gitignore1
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/.project22
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.core.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/META-INF/MANIFEST.MF7
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/about.html38
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/build.properties5
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/plugin.properties14
-rw-r--r--remote/org.eclipse.remote.proxy.server.macosx.x86_64/pom.xml50
-rw-r--r--remote/org.eclipse.remote.proxy.server.product/.project11
-rw-r--r--remote/org.eclipse.remote.proxy.server.product/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.server.product/pom.xml144
-rw-r--r--remote/org.eclipse.remote.proxy.server.product/product.entitlements18
-rw-r--r--remote/org.eclipse.remote.proxy.server.product/proxy.server.product73
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.classpath11
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.project28
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.tests/META-INF/MANIFEST.MF19
-rw-r--r--remote/org.eclipse.remote.proxy.tests/about.html38
-rw-r--r--remote/org.eclipse.remote.proxy.tests/build.properties6
-rw-r--r--remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/Activator.java57
-rw-r--r--remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ConnectionTests.java258
-rw-r--r--remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/FileStoreTests.java279
-rw-r--r--remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexServerTests.java193
-rw-r--r--remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexTests.java283
-rw-r--r--remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java259
-rw-r--r--remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/RemoteCoreTestSuite.java13
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.classpath7
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.project34
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.proxy.ui/META-INF/MANIFEST.MF42
-rw-r--r--remote/org.eclipse.remote.proxy.ui/about.html38
-rw-r--r--remote/org.eclipse.remote.proxy.ui/about.ini24
-rw-r--r--remote/org.eclipse.remote.proxy.ui/about.mappings9
-rw-r--r--remote/org.eclipse.remote.proxy.ui/about.properties32
-rw-r--r--remote/org.eclipse.remote.proxy.ui/build.properties14
-rw-r--r--remote/org.eclipse.remote.proxy.ui/cdt_logo_icon32.pngbin0 -> 1885 bytes
-rw-r--r--remote/org.eclipse.remote.proxy.ui/icons/full/obj16/connection.gifbin0 -> 160 bytes
-rw-r--r--remote/org.eclipse.remote.proxy.ui/icons/ssh.pngbin0 -> 512 bytes
-rw-r--r--remote/org.eclipse.remote.proxy.ui/plugin.properties16
-rw-r--r--remote/org.eclipse.remote.proxy.ui/plugin.xml56
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/Activator.java114
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyFileSystemContributor.java50
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUIConnectionService.java104
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUserAuthenticator.java118
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/Messages.java71
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/messages.properties53
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionPage.java497
-rw-r--r--remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionWizard.java78
-rw-r--r--remote/org.eclipse.remote.serial-feature/.project17
-rw-r--r--remote/org.eclipse.remote.serial-feature/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.serial-feature/build.properties4
-rw-r--r--remote/org.eclipse.remote.serial-feature/eclipse_update_120.jpgbin0 -> 21695 bytes
-rw-r--r--remote/org.eclipse.remote.serial-feature/epl-v20.html189
-rw-r--r--remote/org.eclipse.remote.serial-feature/feature.properties27
-rw-r--r--remote/org.eclipse.remote.serial-feature/feature.xml37
-rw-r--r--remote/org.eclipse.remote.serial.core/.classpath7
-rw-r--r--remote/org.eclipse.remote.serial.core/.project34
-rw-r--r--remote/org.eclipse.remote.serial.core/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.serial.core/META-INF/MANIFEST.MF16
-rw-r--r--remote/org.eclipse.remote.serial.core/about.html38
-rw-r--r--remote/org.eclipse.remote.serial.core/about.ini27
-rw-r--r--remote/org.eclipse.remote.serial.core/about.mappings6
-rw-r--r--remote/org.eclipse.remote.serial.core/about.properties25
-rw-r--r--remote/org.eclipse.remote.serial.core/build.properties12
-rw-r--r--remote/org.eclipse.remote.serial.core/plugin.properties2
-rw-r--r--remote/org.eclipse.remote.serial.core/plugin.xml22
-rw-r--r--remote/org.eclipse.remote.serial.core/ptp_logo_icon32.pngbin0 -> 53143 bytes
-rw-r--r--remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/ISerialPortService.java30
-rw-r--r--remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortCommandShell.java115
-rw-r--r--remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortConnection.java100
-rw-r--r--remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Activator.java49
-rw-r--r--remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Messages.java29
-rw-r--r--remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/messages.properties14
-rw-r--r--remote/org.eclipse.remote.serial.ui/.classpath7
-rw-r--r--remote/org.eclipse.remote.serial.ui/.project34
-rw-r--r--remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.serial.ui/META-INF/MANIFEST.MF35
-rw-r--r--remote/org.eclipse.remote.serial.ui/about.html38
-rw-r--r--remote/org.eclipse.remote.serial.ui/about.ini24
-rw-r--r--remote/org.eclipse.remote.serial.ui/about.mappings9
-rw-r--r--remote/org.eclipse.remote.serial.ui/about.properties32
-rw-r--r--remote/org.eclipse.remote.serial.ui/build.properties13
-rw-r--r--remote/org.eclipse.remote.serial.ui/cdt_logo_icon32.pngbin0 -> 1885 bytes
-rw-r--r--remote/org.eclipse.remote.serial.ui/icons/serial.pngbin0 -> 410 bytes
-rw-r--r--remote/org.eclipse.remote.serial.ui/plugin.properties2
-rw-r--r--remote/org.eclipse.remote.serial.ui/plugin.xml28
-rw-r--r--remote/org.eclipse.remote.serial.ui/ptp_logo_icon32.pngbin0 -> 53143 bytes
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Activator.java77
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Messages.java36
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/SerialPortConnectionsUI.java85
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/messages.properties21
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizard.java100
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizardPage.java73
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionBlock.java254
-rw-r--r--remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionPropertyPage.java84
-rw-r--r--remote/org.eclipse.remote.telnet-feature/.project17
-rw-r--r--remote/org.eclipse.remote.telnet-feature/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.telnet-feature/build.properties4
-rw-r--r--remote/org.eclipse.remote.telnet-feature/eclipse_update_120.jpgbin0 -> 21695 bytes
-rw-r--r--remote/org.eclipse.remote.telnet-feature/epl-v20.html189
-rw-r--r--remote/org.eclipse.remote.telnet-feature/feature.properties27
-rw-r--r--remote/org.eclipse.remote.telnet-feature/feature.xml37
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.classpath11
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.project28
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/META-INF/MANIFEST.MF13
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/about.html38
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/build.properties6
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/Activator.java50
-rw-r--r--remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/TelnetConnectionTests.java171
-rw-r--r--remote/org.eclipse.remote.telnet.core/.classpath7
-rw-r--r--remote/org.eclipse.remote.telnet.core/.project34
-rw-r--r--remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.telnet.core/META-INF/MANIFEST.MF18
-rw-r--r--remote/org.eclipse.remote.telnet.core/about.html38
-rw-r--r--remote/org.eclipse.remote.telnet.core/about.ini27
-rw-r--r--remote/org.eclipse.remote.telnet.core/about.mappings6
-rw-r--r--remote/org.eclipse.remote.telnet.core/about.properties25
-rw-r--r--remote/org.eclipse.remote.telnet.core/build.properties12
-rw-r--r--remote/org.eclipse.remote.telnet.core/plugin.properties2
-rw-r--r--remote/org.eclipse.remote.telnet.core/plugin.xml32
-rw-r--r--remote/org.eclipse.remote.telnet.core/ptp_logo_icon32.pngbin0 -> 53143 bytes
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCodes.java96
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCommandShell.java192
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetConnection.java230
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetOption.java727
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetProtocol.java734
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Activator.java55
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Logger.java241
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/Messages.java31
-rw-r--r--remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/messages.properties15
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.classpath7
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.project34
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.telnet.ui/META-INF/MANIFEST.MF29
-rw-r--r--remote/org.eclipse.remote.telnet.ui/about.html38
-rw-r--r--remote/org.eclipse.remote.telnet.ui/about.ini24
-rw-r--r--remote/org.eclipse.remote.telnet.ui/about.mappings9
-rw-r--r--remote/org.eclipse.remote.telnet.ui/about.properties32
-rw-r--r--remote/org.eclipse.remote.telnet.ui/build.properties13
-rw-r--r--remote/org.eclipse.remote.telnet.ui/cdt_logo_icon32.pngbin0 -> 1885 bytes
-rw-r--r--remote/org.eclipse.remote.telnet.ui/icons/telnet.pngbin0 -> 51789 bytes
-rw-r--r--remote/org.eclipse.remote.telnet.ui/plugin.properties2
-rw-r--r--remote/org.eclipse.remote.telnet.ui/plugin.xml13
-rw-r--r--remote/org.eclipse.remote.telnet.ui/ptp_logo_icon32.pngbin0 -> 53143 bytes
-rw-r--r--remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Activator.java77
-rw-r--r--remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Messages.java41
-rw-r--r--remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizard.java106
-rw-r--r--remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizardPage.java145
-rw-r--r--remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionsUI.java95
-rw-r--r--remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/messages.properties26
-rw-r--r--remote/org.eclipse.remote.ui.tests/.classpath11
-rw-r--r--remote/org.eclipse.remote.ui.tests/.project28
-rw-r--r--remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.ui.tests/META-INF/MANIFEST.MF13
-rw-r--r--remote/org.eclipse.remote.ui.tests/about.html38
-rw-r--r--remote/org.eclipse.remote.ui.tests/build.properties6
-rw-r--r--remote/org.eclipse.remote.ui.tests/src/org/eclipse/remote/ui/tests/RemoteResourceBrowserTest.java215
-rw-r--r--remote/org.eclipse.remote.ui/.classpath7
-rw-r--r--remote/org.eclipse.remote.ui/.project34
-rw-r--r--remote/org.eclipse.remote.ui/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs486
-rw-r--r--remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.launching.prefs3
-rw-r--r--remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.ui.prefs213
-rw-r--r--remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.api.tools.prefs184
-rw-r--r--remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.prefs35
-rw-r--r--remote/org.eclipse.remote.ui/META-INF/MANIFEST.MF52
-rw-r--r--remote/org.eclipse.remote.ui/about.html38
-rw-r--r--remote/org.eclipse.remote.ui/about.ini24
-rw-r--r--remote/org.eclipse.remote.ui/about.mappings9
-rw-r--r--remote/org.eclipse.remote.ui/about.properties32
-rw-r--r--remote/org.eclipse.remote.ui/build.properties13
-rw-r--r--remote/org.eclipse.remote.ui/cdt_logo_icon32.pngbin0 -> 1885 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/connection.gifbin0 -> 160 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/console.pngbin0 -> 452 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/dlcl16/new_folder.gifbin0 -> 349 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/dlcl16/up_nav.gifbin0 -> 563 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/elcl16/new_folder.gifbin0 -> 349 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/elcl16/up_nav.gifbin0 -> 563 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/new_wiz.gifbin0 -> 612 bytes
-rw-r--r--remote/org.eclipse.remote.ui/icons/ovr16/symlink_ovr.gifbin0 -> 191 bytes
-rw-r--r--remote/org.eclipse.remote.ui/plugin.properties24
-rw-r--r--remote/org.eclipse.remote.ui/plugin.xml230
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStore.java240
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStoreComparer.java48
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/Messages.java20
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/OverlayImageDescriptor.java82
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/PendingUpdateAdapter.java82
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteContentProvider.java78
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteResourceComparator.java46
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeContentManager.java345
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeViewer.java423
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIImages.java158
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIPlugin.java104
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/ServicePropertyTester.java59
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages.properties6
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/Messages.java134
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties77
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/ConnectionsPreferencePage.java631
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/PreferencesAdapter.java339
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/RemoteDevelopmentPreferencePage.java65
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIConnectionService.java53
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileService.java124
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/CloseConnectionHandler.java65
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/DeleteRemoteConnectionHandler.java77
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionHandler.java22
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionTypePage.java120
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionWizard.java65
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/OpenConnectionHandler.java70
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionPropertyPage.java48
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsActionProvider.java17
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsContentProvider.java90
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsView.java28
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/AbstractRemoteUIConnectionService.java103
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionService.java66
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionWizard.java68
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConstants.java34
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java113
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteConnectionsLabelProvider.java92
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteUIFileService.java127
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java331
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java652
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java281
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java300
-rw-r--r--remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java808
-rw-r--r--remote/pom.xml2
651 files changed, 58272 insertions, 8 deletions
diff --git a/remote/org.eclipse.cdt.remote.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.cdt.remote.core/.settings/org.eclipse.jdt.ui.prefs
index e44576346c4..d35ba9b5231 100644
--- a/remote/org.eclipse.cdt.remote.core/.settings/org.eclipse.jdt.ui.prefs
+++ b/remote/org.eclipse.cdt.remote.core/.settings/org.eclipse.jdt.ui.prefs
@@ -1,3 +1,4 @@
+cleanup.add_all=false
cleanup.add_default_serial_version_id=true
cleanup.add_generated_serial_version_id=false
cleanup.add_missing_annotations=true
@@ -11,25 +12,72 @@ cleanup.always_use_blocks=true
cleanup.always_use_parentheses_in_expressions=false
cleanup.always_use_this_for_non_static_field_access=false
cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
cleanup.convert_functional_interfaces=false
cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
cleanup.format_source_code=true
cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
cleanup.make_local_variable_final=true
cleanup.make_parameters_final=false
cleanup.make_private_fields_final=true
cleanup.make_type_abstract_if_missing_method=false
cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
cleanup.never_use_blocks=false
cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
cleanup.qualify_static_field_accesses_with_declaring_class=false
cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
cleanup.qualify_static_member_accesses_with_declaring_class=false
cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
cleanup.remove_private_constructors=true
cleanup.remove_redundant_modifiers=false
cleanup.remove_redundant_semicolons=true
@@ -37,25 +85,57 @@ cleanup.remove_redundant_type_arguments=true
cleanup.remove_trailing_whitespaces=true
cleanup.remove_trailing_whitespaces_all=true
cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
cleanup.remove_unnecessary_casts=true
cleanup.remove_unnecessary_nls_tags=false
cleanup.remove_unused_imports=true
cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
cleanup.remove_unused_private_fields=true
cleanup.remove_unused_private_members=false
cleanup.remove_unused_private_methods=true
cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
cleanup.sort_members=false
cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
cleanup.use_blocks=false
cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
cleanup.use_lambda=true
cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
cleanup.use_this_for_non_static_field_access=false
cleanup.use_this_for_non_static_field_access_only_if_necessary=true
cleanup.use_this_for_non_static_method_access=false
cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
cleanup_profile=_CDT
cleanup_settings_version=2
eclipse.preferences.version=1
diff --git a/remote/org.eclipse.cdt.remote.core/META-INF/MANIFEST.MF b/remote/org.eclipse.cdt.remote.core/META-INF/MANIFEST.MF
index f5cdc32acec..0e01873188c 100644
--- a/remote/org.eclipse.cdt.remote.core/META-INF/MANIFEST.MF
+++ b/remote/org.eclipse.cdt.remote.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.remote.core;singleton:=true
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.1.100.qualifier
Bundle-Activator: org.eclipse.cdt.remote.internal.core.Activator
Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime,
diff --git a/remote/org.eclipse.cdt.remote.core/about.html b/remote/org.eclipse.cdt.remote.core/about.html
index 164f781a8fd..b3134865230 100644
--- a/remote/org.eclipse.cdt.remote.core/about.html
+++ b/remote/org.eclipse.cdt.remote.core/about.html
@@ -1,10 +1,11 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
+
<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>About</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
</head>
+
<body lang="EN-US">
<h2>About This Content</h2>
@@ -16,7 +17,7 @@
(&quot;Content&quot;). Unless otherwise indicated below, the Content
is provided to you under the terms and conditions of the Eclipse
Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
- available at <a href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
For purposes of the EPL, &quot;Program&quot; will mean the Content.
</p>
@@ -29,8 +30,9 @@
license exists, contact the Redistributor. Unless otherwise indicated
below, the terms and conditions of the EPL still apply to any source
code in the Content and such source code may be obtained at <a
- href="http://www.eclipse.org/">http://www.eclipse.org</a>.
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
</p>
</body>
+
</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote-feature/.project b/remote/org.eclipse.remote-feature/.project
new file mode 100644
index 00000000000..04f5e2c94a8
--- /dev/null
+++ b/remote/org.eclipse.remote-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote-feature/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote-feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote-feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote-feature/build.properties b/remote/org.eclipse.remote-feature/build.properties
new file mode 100644
index 00000000000..90b78ae6f71
--- /dev/null
+++ b/remote/org.eclipse.remote-feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+ feature.properties,\
+ eclipse_update_120.jpg,\
+ epl-v20.html
diff --git a/remote/org.eclipse.remote-feature/eclipse_update_120.jpg b/remote/org.eclipse.remote-feature/eclipse_update_120.jpg
new file mode 100644
index 00000000000..bfdf708ad61
--- /dev/null
+++ b/remote/org.eclipse.remote-feature/eclipse_update_120.jpg
Binary files differ
diff --git a/remote/org.eclipse.remote-feature/epl-v20.html b/remote/org.eclipse.remote-feature/epl-v20.html
new file mode 100644
index 00000000000..008b8018db8
--- /dev/null
+++ b/remote/org.eclipse.remote-feature/epl-v20.html
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+ <h2>Eclipse Foundation Software User Agreement</h2>
+ <p>November 22, 2017</p>
+
+ <h3>Usage Of Content</h3>
+
+ <p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,
+ INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY
+ THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS
+ GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY
+ APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS
+ AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE
+ AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT
+ USE THE CONTENT.</p>
+
+ <h3>Applicable Licenses</h3>
+
+ <p>
+ Unless otherwise indicated, all Content made available by the Eclipse
+ Foundation is provided to you under the terms and conditions of the
+ Eclipse Public License Version 2.0 (&quot;EPL&quot;). A copy of the
+ EPL is provided with this Content and is also available at <a
+ href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>Content includes, but is not limited to, source code, object
+ code, documentation and other files maintained in the Eclipse
+ Foundation source code repository (&quot;Repository&quot;) in software
+ modules (&quot;Modules&quot;) and made available as downloadable
+ archives (&quot;Downloads&quot;).</p>
+
+ <ul>
+ <li>Content may be structured and packaged into modules to
+ facilitate delivering, extending, and upgrading the Content. Typical
+ modules may include plug-ins (&quot;Plug-ins&quot;), plug-in
+ fragments (&quot;Fragments&quot;), and features
+ (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory
+ or JAR (Java&trade; ARchive) in a directory named
+ &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or
+ Fragments and associated material. Each Feature may be packaged as a
+ sub-directory in a directory named &quot;features&quot;. Within a
+ Feature, files named &quot;feature.xml&quot; may contain a list of
+ the names and version numbers of the Plug-ins and/or Fragments
+ associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included
+ Features&quot;). Within a Feature, files named
+ &quot;feature.xml&quot; may contain a list of the names and version
+ numbers of Included Features.</li>
+ </ul>
+
+ <p>The terms and conditions governing Plug-ins and Fragments should
+ be contained in files named &quot;about.html&quot;
+ (&quot;Abouts&quot;). The terms and conditions governing Features and
+ Included Features should be contained in files named
+ &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and
+ Feature Licenses may be located in any directory of a Download or
+ Module including, but not limited to the following locations:</p>
+
+ <ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of
+ certain Plug-ins</li>
+ <li>Feature directories</li>
+ </ul>
+
+ <p>Note: if a Feature made available by the Eclipse Foundation is
+ installed using the Provisioning Technology (as defined below), you
+ must agree to a license (&quot;Feature Update License&quot;) during
+ the installation process. If the Feature contains Included Features,
+ the Feature Update License should either provide you with the terms
+ and conditions governing the Included Features or inform you where you
+ can locate them. Feature Update Licenses may be found in the
+ &quot;license&quot; property of files named
+ &quot;feature.properties&quot; found within a Feature. Such Abouts,
+ Feature Licenses, and Feature Update Licenses contain the terms and
+ conditions (or references to such terms and conditions) that govern
+ your use of the associated Content in that directory.</p>
+
+ <p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY
+ REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND
+ CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT
+ ARE NOT LIMITED TO):</p>
+
+ <ul>
+ <li>Eclipse Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)
+ </li>
+ <li>Eclipse Distribution License Version 1.0 (available at <a
+ href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)
+ </li>
+ <li>Common Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)
+ </li>
+ <li>Apache Software License 1.1 (available at <a
+ href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)
+ </li>
+ <li>Apache Software License 2.0 (available at <a
+ href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)
+ </li>
+ <li>Mozilla Public License Version 1.1 (available at <a
+ href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)
+ </li>
+ </ul>
+
+ <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND
+ CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License,
+ or Feature Update License is provided, please contact the Eclipse
+ Foundation to determine what terms and conditions govern that
+ particular Content.</p>
+
+
+ <h3>Use of Provisioning Technology</h3>
+
+ <p>
+ The Eclipse Foundation makes available provisioning software, examples
+ of which include, but are not limited to, p2 and the Eclipse Update
+ Manager (&quot;Provisioning Technology&quot;) for the purpose of
+ allowing users to install software, documentation, information and/or
+ other materials (collectively &quot;Installable Software&quot;). This
+ capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about
+ packaging Installable Software is available at <a
+ href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+ (&quot;Specification&quot;).
+ </p>
+
+ <p>You may use Provisioning Technology to allow other parties to
+ install Installable Software. You shall be responsible for enabling
+ the applicable license agreements relating to the Installable Software
+ to be presented to, and accepted by, the users of the Provisioning
+ Technology in accordance with the Specification. By using Provisioning
+ Technology in such a manner and making it available in accordance with
+ the Specification, you further acknowledge your agreement to, and the
+ acquisition of all necessary rights to permit the following:</p>
+
+ <ol>
+ <li>A series of actions may occur (&quot;Provisioning
+ Process&quot;) in which a user may execute the Provisioning
+ Technology on a machine (&quot;Target Machine&quot;) with the intent
+ of installing, extending or updating the functionality of an
+ Eclipse-based product.</li>
+ <li>During the Provisioning Process, the Provisioning Technology
+ may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</li>
+ <li>Pursuant to the Specification, you will provide to the user
+ the terms and conditions that govern the use of the Installable
+ Software (&quot;Installable Software Agreement&quot;) and such
+ Installable Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable
+ Software Agreement must inform the user of the terms and conditions
+ that govern the Installable Software and must solicit acceptance by
+ the end user in the manner prescribed in such Installable Software
+ Agreement. Upon such indication of agreement by the user, the
+ provisioning Technology will complete installation of the Installable
+ Software.</li>
+ </ol>
+
+ <h3>Cryptography</h3>
+
+ <p>Content may contain encryption software. The country in which
+ you are currently may have restrictions on the import, possession, and
+ use, and/or re-export to another country, of encryption software.
+ BEFORE using any encryption software, please check the country's laws,
+ regulations and policies concerning the import, possession, or use,
+ and re-export of encryption software, to see if this is permitted.</p>
+
+ <p>
+ <small>Java and all Java-based trademarks are trademarks of
+ Oracle Corporation in the United States, other countries, or both.</small>
+ </p>
+</body>
+</html>
diff --git a/remote/org.eclipse.remote-feature/feature.properties b/remote/org.eclipse.remote-feature/feature.properties
new file mode 100644
index 00000000000..763a98aea96
--- /dev/null
+++ b/remote/org.eclipse.remote-feature/feature.properties
@@ -0,0 +1,27 @@
+#################################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#################################################################################
+
+# "featureName" property - name of the feature
+featureName=Remote Services
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse CDT
+
+# "description" property - description of the feature
+description=Provides an extensible remote services framework
+
+# copyright
+copyright=\
+Copyright (c) 2013 IBM Corporation.\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n
diff --git a/remote/org.eclipse.remote-feature/feature.xml b/remote/org.eclipse.remote-feature/feature.xml
new file mode 100644
index 00000000000..775d4a15e3f
--- /dev/null
+++ b/remote/org.eclipse.remote-feature/feature.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.remote"
+ label="%featureName"
+ version="10.7.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.remote.ui"
+ license-feature="org.eclipse.license"
+ license-feature-version="0.0.0">
+
+ <description url="http://eclipse.org/remote">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <plugin
+ id="org.eclipse.remote.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.doc.isv"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.jsch.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.jsch.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/remote/org.eclipse.remote.console-feature/.project b/remote/org.eclipse.remote.console-feature/.project
new file mode 100644
index 00000000000..6b3986a45b6
--- /dev/null
+++ b/remote/org.eclipse.remote.console-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.console-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.console-feature/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.console-feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.console-feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.console-feature/build.properties b/remote/org.eclipse.remote.console-feature/build.properties
new file mode 100644
index 00000000000..adcc4e399d4
--- /dev/null
+++ b/remote/org.eclipse.remote.console-feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+ feature.properties,\
+ epl-v20.html,\
+ eclipse_update_120.jpg
diff --git a/remote/org.eclipse.remote.console-feature/eclipse_update_120.jpg b/remote/org.eclipse.remote.console-feature/eclipse_update_120.jpg
new file mode 100644
index 00000000000..bfdf708ad61
--- /dev/null
+++ b/remote/org.eclipse.remote.console-feature/eclipse_update_120.jpg
Binary files differ
diff --git a/remote/org.eclipse.remote.console-feature/epl-v20.html b/remote/org.eclipse.remote.console-feature/epl-v20.html
new file mode 100644
index 00000000000..008b8018db8
--- /dev/null
+++ b/remote/org.eclipse.remote.console-feature/epl-v20.html
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+ <h2>Eclipse Foundation Software User Agreement</h2>
+ <p>November 22, 2017</p>
+
+ <h3>Usage Of Content</h3>
+
+ <p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,
+ INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY
+ THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS
+ GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY
+ APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS
+ AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE
+ AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT
+ USE THE CONTENT.</p>
+
+ <h3>Applicable Licenses</h3>
+
+ <p>
+ Unless otherwise indicated, all Content made available by the Eclipse
+ Foundation is provided to you under the terms and conditions of the
+ Eclipse Public License Version 2.0 (&quot;EPL&quot;). A copy of the
+ EPL is provided with this Content and is also available at <a
+ href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>Content includes, but is not limited to, source code, object
+ code, documentation and other files maintained in the Eclipse
+ Foundation source code repository (&quot;Repository&quot;) in software
+ modules (&quot;Modules&quot;) and made available as downloadable
+ archives (&quot;Downloads&quot;).</p>
+
+ <ul>
+ <li>Content may be structured and packaged into modules to
+ facilitate delivering, extending, and upgrading the Content. Typical
+ modules may include plug-ins (&quot;Plug-ins&quot;), plug-in
+ fragments (&quot;Fragments&quot;), and features
+ (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory
+ or JAR (Java&trade; ARchive) in a directory named
+ &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or
+ Fragments and associated material. Each Feature may be packaged as a
+ sub-directory in a directory named &quot;features&quot;. Within a
+ Feature, files named &quot;feature.xml&quot; may contain a list of
+ the names and version numbers of the Plug-ins and/or Fragments
+ associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included
+ Features&quot;). Within a Feature, files named
+ &quot;feature.xml&quot; may contain a list of the names and version
+ numbers of Included Features.</li>
+ </ul>
+
+ <p>The terms and conditions governing Plug-ins and Fragments should
+ be contained in files named &quot;about.html&quot;
+ (&quot;Abouts&quot;). The terms and conditions governing Features and
+ Included Features should be contained in files named
+ &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and
+ Feature Licenses may be located in any directory of a Download or
+ Module including, but not limited to the following locations:</p>
+
+ <ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of
+ certain Plug-ins</li>
+ <li>Feature directories</li>
+ </ul>
+
+ <p>Note: if a Feature made available by the Eclipse Foundation is
+ installed using the Provisioning Technology (as defined below), you
+ must agree to a license (&quot;Feature Update License&quot;) during
+ the installation process. If the Feature contains Included Features,
+ the Feature Update License should either provide you with the terms
+ and conditions governing the Included Features or inform you where you
+ can locate them. Feature Update Licenses may be found in the
+ &quot;license&quot; property of files named
+ &quot;feature.properties&quot; found within a Feature. Such Abouts,
+ Feature Licenses, and Feature Update Licenses contain the terms and
+ conditions (or references to such terms and conditions) that govern
+ your use of the associated Content in that directory.</p>
+
+ <p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY
+ REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND
+ CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT
+ ARE NOT LIMITED TO):</p>
+
+ <ul>
+ <li>Eclipse Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)
+ </li>
+ <li>Eclipse Distribution License Version 1.0 (available at <a
+ href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)
+ </li>
+ <li>Common Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)
+ </li>
+ <li>Apache Software License 1.1 (available at <a
+ href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)
+ </li>
+ <li>Apache Software License 2.0 (available at <a
+ href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)
+ </li>
+ <li>Mozilla Public License Version 1.1 (available at <a
+ href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)
+ </li>
+ </ul>
+
+ <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND
+ CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License,
+ or Feature Update License is provided, please contact the Eclipse
+ Foundation to determine what terms and conditions govern that
+ particular Content.</p>
+
+
+ <h3>Use of Provisioning Technology</h3>
+
+ <p>
+ The Eclipse Foundation makes available provisioning software, examples
+ of which include, but are not limited to, p2 and the Eclipse Update
+ Manager (&quot;Provisioning Technology&quot;) for the purpose of
+ allowing users to install software, documentation, information and/or
+ other materials (collectively &quot;Installable Software&quot;). This
+ capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about
+ packaging Installable Software is available at <a
+ href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+ (&quot;Specification&quot;).
+ </p>
+
+ <p>You may use Provisioning Technology to allow other parties to
+ install Installable Software. You shall be responsible for enabling
+ the applicable license agreements relating to the Installable Software
+ to be presented to, and accepted by, the users of the Provisioning
+ Technology in accordance with the Specification. By using Provisioning
+ Technology in such a manner and making it available in accordance with
+ the Specification, you further acknowledge your agreement to, and the
+ acquisition of all necessary rights to permit the following:</p>
+
+ <ol>
+ <li>A series of actions may occur (&quot;Provisioning
+ Process&quot;) in which a user may execute the Provisioning
+ Technology on a machine (&quot;Target Machine&quot;) with the intent
+ of installing, extending or updating the functionality of an
+ Eclipse-based product.</li>
+ <li>During the Provisioning Process, the Provisioning Technology
+ may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</li>
+ <li>Pursuant to the Specification, you will provide to the user
+ the terms and conditions that govern the use of the Installable
+ Software (&quot;Installable Software Agreement&quot;) and such
+ Installable Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable
+ Software Agreement must inform the user of the terms and conditions
+ that govern the Installable Software and must solicit acceptance by
+ the end user in the manner prescribed in such Installable Software
+ Agreement. Upon such indication of agreement by the user, the
+ provisioning Technology will complete installation of the Installable
+ Software.</li>
+ </ol>
+
+ <h3>Cryptography</h3>
+
+ <p>Content may contain encryption software. The country in which
+ you are currently may have restrictions on the import, possession, and
+ use, and/or re-export to another country, of encryption software.
+ BEFORE using any encryption software, please check the country's laws,
+ regulations and policies concerning the import, possession, or use,
+ and re-export of encryption software, to see if this is permitted.</p>
+
+ <p>
+ <small>Java and all Java-based trademarks are trademarks of
+ Oracle Corporation in the United States, other countries, or both.</small>
+ </p>
+</body>
+</html>
diff --git a/remote/org.eclipse.remote.console-feature/feature.properties b/remote/org.eclipse.remote.console-feature/feature.properties
new file mode 100644
index 00000000000..0c2248d72b0
--- /dev/null
+++ b/remote/org.eclipse.remote.console-feature/feature.properties
@@ -0,0 +1,27 @@
+#################################################################################
+# Copyright (c) 2015 QNX Software Systems Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#################################################################################
+
+# "featureName" property - name of the feature
+featureName=Remote Command Shell Console
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse CDT
+
+# "description" property - description of the feature
+description=Provides serial port services for the remote framework
+
+# copyright
+copyright=\
+Copyright (c) 2015 QNX Software Corporation.\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n
diff --git a/remote/org.eclipse.remote.console-feature/feature.xml b/remote/org.eclipse.remote.console-feature/feature.xml
new file mode 100644
index 00000000000..7c996eb732a
--- /dev/null
+++ b/remote/org.eclipse.remote.console-feature/feature.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.remote.console"
+ label="%featureName"
+ version="10.7.0.qualifier"
+ provider-name="%providerName"
+ license-feature="org.eclipse.license"
+ license-feature-version="0.0.0">
+
+ <description>
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <plugin
+ id="org.eclipse.remote.console"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/remote/org.eclipse.remote.console/.classpath b/remote/org.eclipse.remote.console/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.console/.project b/remote/org.eclipse.remote.console/.project
new file mode 100644
index 00000000000..da0bcc42ec2
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.console</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.console/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.console/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.console/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.console/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.console/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.console/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.console/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.console/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.console/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..b6823b19dec
--- /dev/null
+++ b/remote/org.eclipse.remote.console/META-INF/MANIFEST.MF
@@ -0,0 +1,38 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.console;singleton:=true
+Bundle-Version: 1.3.100.qualifier
+Bundle-Activator: org.eclipse.remote.internal.console.Activator
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %pluginProvider
+Export-Package: org.eclipse.remote.console,
+ org.eclipse.remote.console.actions
+Import-Package: org.eclipse.core.commands,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.jface.action,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.ui.widgets,
+ org.eclipse.swt,
+ org.eclipse.swt.events,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.tm.internal.terminal.control,
+ org.eclipse.tm.internal.terminal.provisional.api,
+ org.eclipse.ui,
+ org.eclipse.ui.console,
+ org.eclipse.ui.console.actions,
+ org.eclipse.ui.handlers,
+ org.eclipse.ui.part,
+ org.eclipse.ui.plugin,
+ org.eclipse.ui.progress,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.console/about.html b/remote/org.eclipse.remote.console/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.console/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.console/about.ini b/remote/org.eclipse.remote.console/about.ini
new file mode 100644
index 00000000000..e07a7bb377e
--- /dev/null
+++ b/remote/org.eclipse.remote.console/about.ini
@@ -0,0 +1,24 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=cdt_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.console/about.mappings b/remote/org.eclipse.remote.console/about.mappings
new file mode 100644
index 00000000000..936a8039c3e
--- /dev/null
+++ b/remote/org.eclipse.remote.console/about.mappings
@@ -0,0 +1,9 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20200106-1728"
+# This value will be added automatically via the build scripts
+0=${buildId}
diff --git a/remote/org.eclipse.remote.console/about.properties b/remote/org.eclipse.remote.console/about.properties
new file mode 100644
index 00000000000..993ffb8a4c8
--- /dev/null
+++ b/remote/org.eclipse.remote.console/about.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+# NOTE TO TRANSLATOR: Please do not translate the featureVersion variable.
+
+
+blurb=Remote Command Shell Console\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+\n\
+See the NOTICE file(s) distributed with this work for additional\n\
+information regarding copyright ownership.\n\
+\n\
+Visit http://www.eclipse.org/cdt
diff --git a/remote/org.eclipse.remote.console/build.properties b/remote/org.eclipse.remote.console/build.properties
new file mode 100644
index 00000000000..1e413e22bce
--- /dev/null
+++ b/remote/org.eclipse.remote.console/build.properties
@@ -0,0 +1,14 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ icons/,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ cdt_logo_icon32.png,\
+ about.html,\
+ schema/
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.console/cdt_logo_icon32.png b/remote/org.eclipse.remote.console/cdt_logo_icon32.png
new file mode 100644
index 00000000000..470ca81b327
--- /dev/null
+++ b/remote/org.eclipse.remote.console/cdt_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/clcl16/command_input_field.gif b/remote/org.eclipse.remote.console/icons/clcl16/command_input_field.gif
new file mode 100644
index 00000000000..9e3a547c145
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/clcl16/command_input_field.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/clcl16/connect_co.gif b/remote/org.eclipse.remote.console/icons/clcl16/connect_co.gif
new file mode 100644
index 00000000000..556b230da56
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/clcl16/connect_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/clcl16/disconnect_co.gif b/remote/org.eclipse.remote.console/icons/clcl16/disconnect_co.gif
new file mode 100644
index 00000000000..f1d5fb31e51
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/clcl16/disconnect_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/clcl16/lock_co.gif b/remote/org.eclipse.remote.console/icons/clcl16/lock_co.gif
new file mode 100644
index 00000000000..68fd6cf39ca
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/clcl16/lock_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/clcl16/newterminal.gif b/remote/org.eclipse.remote.console/icons/clcl16/newterminal.gif
new file mode 100644
index 00000000000..80201e0d469
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/clcl16/newterminal.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/clcl16/properties_tsk.gif b/remote/org.eclipse.remote.console/icons/clcl16/properties_tsk.gif
new file mode 100644
index 00000000000..41b5adbd543
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/clcl16/properties_tsk.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/cview16/terminal_view.gif b/remote/org.eclipse.remote.console/icons/cview16/terminal_view.gif
new file mode 100644
index 00000000000..bbb6a9e153e
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/cview16/terminal_view.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/dlcl16/command_input_field.gif b/remote/org.eclipse.remote.console/icons/dlcl16/command_input_field.gif
new file mode 100644
index 00000000000..f538ca707fc
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/dlcl16/command_input_field.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/dlcl16/connect_co.gif b/remote/org.eclipse.remote.console/icons/dlcl16/connect_co.gif
new file mode 100644
index 00000000000..ae5e64b9f6f
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/dlcl16/connect_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/dlcl16/disconnect_co.gif b/remote/org.eclipse.remote.console/icons/dlcl16/disconnect_co.gif
new file mode 100644
index 00000000000..24a628713dc
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/dlcl16/disconnect_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/dlcl16/lock_co.gif b/remote/org.eclipse.remote.console/icons/dlcl16/lock_co.gif
new file mode 100644
index 00000000000..b7764789356
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/dlcl16/lock_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/dlcl16/newterminal.gif b/remote/org.eclipse.remote.console/icons/dlcl16/newterminal.gif
new file mode 100644
index 00000000000..80201e0d469
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/dlcl16/newterminal.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/dlcl16/properties_tsk.gif b/remote/org.eclipse.remote.console/icons/dlcl16/properties_tsk.gif
new file mode 100644
index 00000000000..c307524a7a4
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/dlcl16/properties_tsk.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/dlcl16/rem_co.gif b/remote/org.eclipse.remote.console/icons/dlcl16/rem_co.gif
new file mode 100644
index 00000000000..559e462985f
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/dlcl16/rem_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/elcl16/command_input_field.gif b/remote/org.eclipse.remote.console/icons/elcl16/command_input_field.gif
new file mode 100644
index 00000000000..f538ca707fc
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/elcl16/command_input_field.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/elcl16/connect_co.gif b/remote/org.eclipse.remote.console/icons/elcl16/connect_co.gif
new file mode 100644
index 00000000000..c0de0d32dd6
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/elcl16/connect_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/elcl16/disconnect_co.gif b/remote/org.eclipse.remote.console/icons/elcl16/disconnect_co.gif
new file mode 100644
index 00000000000..ef5bfa8ad71
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/elcl16/disconnect_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/elcl16/lock_co.gif b/remote/org.eclipse.remote.console/icons/elcl16/lock_co.gif
new file mode 100644
index 00000000000..68fd6cf39ca
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/elcl16/lock_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/elcl16/newterminal.gif b/remote/org.eclipse.remote.console/icons/elcl16/newterminal.gif
new file mode 100644
index 00000000000..80201e0d469
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/elcl16/newterminal.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/elcl16/properties_tsk.gif b/remote/org.eclipse.remote.console/icons/elcl16/properties_tsk.gif
new file mode 100644
index 00000000000..41b5adbd543
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/elcl16/properties_tsk.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/elcl16/rem_co.gif b/remote/org.eclipse.remote.console/icons/elcl16/rem_co.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/elcl16/rem_co.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/icons/eview16/terminal_view.gif b/remote/org.eclipse.remote.console/icons/eview16/terminal_view.gif
new file mode 100644
index 00000000000..bbb6a9e153e
--- /dev/null
+++ b/remote/org.eclipse.remote.console/icons/eview16/terminal_view.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.console/plugin.properties b/remote/org.eclipse.remote.console/plugin.properties
new file mode 100644
index 00000000000..d845f050cde
--- /dev/null
+++ b/remote/org.eclipse.remote.console/plugin.properties
@@ -0,0 +1,14 @@
+##########################################################################
+# Copyright (c) 2015 QNX Software Systems, Inc. and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+##########################################################################
+pluginName=Remote Console
+pluginProvider=Eclipse PTP
+terminal.console.name=Command Shell Console
+OpenTerminalCommand.name=Open Command Shell
diff --git a/remote/org.eclipse.remote.console/plugin.xml b/remote/org.eclipse.remote.console/plugin.xml
new file mode 100644
index 00000000000..c016588a867
--- /dev/null
+++ b/remote/org.eclipse.remote.console/plugin.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension-point id="org.eclipse.remote.console.toolbar" name="org.eclipse.remote.console.toolbar" schema="schema/consoleToolbar.exsd"/>
+ <extension
+ point="org.eclipse.ui.console.consoleFactories">
+ <consoleFactory
+ class="org.eclipse.remote.internal.console.TerminalConsoleFactory"
+ icon="icons/cview16/terminal_view.gif"
+ label="%terminal.console.name">
+ </consoleFactory>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.remote.internal.console.actions.OpenCommandShellHandler"
+ id="org.eclipse.remote.ui.command.openTerminal"
+ name="%OpenTerminalCommand.name">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.remote.ui.view.connections">
+ <command
+ commandId="org.eclipse.remote.ui.command.openTerminal"
+ label="%OpenTerminalCommand.name"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <iterate>
+ <test
+ args="org.eclipse.remote.core.IRemoteCommandShellService"
+ property="org.eclipse.remote.ui.hasConnectionService">
+ </test>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.console/schema/consoleToolbar.exsd b/remote/org.eclipse.remote.console/schema/consoleToolbar.exsd
new file mode 100644
index 00000000000..de275214403
--- /dev/null
+++ b/remote/org.eclipse.remote.console/schema/consoleToolbar.exsd
@@ -0,0 +1,137 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.remote.console" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.remote.console" id="org.eclipse.remote.console.toolbar" name="Terminal Console Toolbar Contributions"/>
+ </appinfo>
+ <documentation>
+ This extension point allows contributions to the TerminalConsole for various types of connections. It associates an action id with a connection type and factory.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="action" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="action">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ Identifier for this action
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="connectionType" type="string" use="required">
+ <annotation>
+ <documentation>
+ The connection type this Action applies to
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="actionFactory" type="string" use="required">
+ <annotation>
+ <documentation>
+ A class implementing IConsoleActionFactory to be called to create the Action
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.remote.console.actions.IConsoleActionFactory"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ &lt;extension
+ point=&quot;org.eclipse.remote.console.toolbar&quot;&gt;
+ &lt;action
+ actionFactory=&quot;com.example.actions.MyActionFactory&quot;
+ connectionType=&quot;org.eclipse.remote.serial.core.connectionType&quot;
+ id=&quot;com.example.actions.MyAction&quot;&gt;
+ &lt;/action&gt;
+ &lt;/extension&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ The value of the actionFactory attribute must implement the abstract class &lt;code&gt;org.eclipse.remote.console.ConsoleAction&lt;/code&gt;
+
+The value of the connectionType attribute should reference the id of a connectionType under the org.eclipse.remote.core.remoteServices extension point.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ The package itself does not have any predefined toolbar contributions.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="copyright"/>
+ </appinfo>
+ <documentation>
+ /*******************************************************************************
+ * Copyright (c) 2016 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/ITerminalConsole.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/ITerminalConsole.java
new file mode 100644
index 00000000000..9a1a5c89402
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/ITerminalConsole.java
@@ -0,0 +1,14 @@
+package org.eclipse.remote.console;
+
+import org.eclipse.remote.core.IRemoteConnection;
+
+/**
+ * @since 1.2
+ */
+public interface ITerminalConsole {
+
+ /**
+ * @return The {@link IRemoteConnection} associated to this {@link ITerminalConsole}
+ */
+ public IRemoteConnection getConnection();
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java
new file mode 100644
index 00000000000..a4d08ddffd2
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Red Hat Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat Inc. - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.console;
+
+import java.util.List;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.internal.console.TerminalConsoleFactory;
+import org.eclipse.ui.console.IConsole;
+
+/**
+ * A collection of public API utility methods to open consoles to
+ * IRemoteConnection objects
+ *
+ * @since 1.1
+ */
+public class TerminalConsoleUtility {
+ /**
+ * Opens a dialog to allow selection of an IRemoteConnection, encoding, etc.
+ * and then open a console to it.
+ */
+ public void openConsole() {
+ new TerminalConsoleFactory().openConsole();
+ }
+
+ /**
+ * Open a specific IRemoteConnection and encoding combination.
+ *
+ * @param connection
+ * @param encoding
+ */
+ public static void openConsole(final IRemoteConnection connection, final String encoding) {
+ TerminalConsoleFactory.openConsole(connection, encoding);
+ }
+
+ /**
+ * Find an existing console for the given IRemoteConnection
+ *
+ * @param connection
+ * @return
+ */
+ public static List<IConsole> findConsole(IRemoteConnection connection) {
+ return TerminalConsoleFactory.findConsole(connection);
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/ConsoleAction.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/ConsoleAction.java
new file mode 100644
index 00000000000..4bec036d5af
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/ConsoleAction.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.console.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.remote.internal.console.Activator;
+
+/**
+ * An abstract class to implement basic functionality common to terminal console actions
+ * @since 1.1
+ */
+public abstract class ConsoleAction extends Action {
+
+ /**
+ * @param id
+ * The action id
+ */
+ public ConsoleAction(String id) {
+ this(id, 0);
+ }
+
+ /**
+ * @param id
+ * The action id
+ * @param style
+ * one of AS_PUSH_BUTTON, AS_CHECK_BOX, AS_DROP_DOWN_MENU, AS_RADIO_BUTTON,
+ * and AS_UNSPECIFIED
+ */
+ public ConsoleAction(String id, int style) {
+ super("", style); //$NON-NLS-1$
+ setId(id);
+ }
+
+ /**
+ * @param text
+ * the text for this action
+ * @param tooltip
+ * the tooltip for this action
+ * @param image
+ * the image key for this action
+ * @param enabledImage
+ * the enabled image key for this action
+ * @param disabledImage
+ * the disabled image key for this action
+ * @param enabled
+ * the enabled state for this action
+ */
+ protected void setupAction(String text, String tooltip, String image, String enabledImage, String disabledImage,
+ boolean enabled) {
+ ImageRegistry imageRegistry = Activator.getDefault().getImageRegistry();
+ setupAction(text, tooltip, image, enabledImage, disabledImage, enabled, imageRegistry);
+ }
+
+ /**
+ * @param text
+ * the text for this action
+ * @param tooltip
+ * the tooltip for this action
+ * @param hoverImage
+ * the hover image key for this action
+ * @param enabledImage
+ * the enabled image key for this action
+ * @param disabledImage
+ * the disabled image key for this action
+ * @param enabled
+ * the enabled state for this action
+ * @param imageRegistry
+ * the ImageRegistry to retrieve ImageDescriptor for the keys provided
+ */
+ protected void setupAction(String text, String tooltip, String hoverImage, String enabledImage,
+ String disabledImage, boolean enabled, ImageRegistry imageRegistry) {
+ setupAction(text, tooltip, imageRegistry.getDescriptor(hoverImage), imageRegistry.getDescriptor(enabledImage),
+ imageRegistry.getDescriptor(disabledImage), enabled);
+ }
+
+ /**
+ * @param text
+ * the text for this action
+ * @param tooltip
+ * the tooltip for this action
+ * @param hoverImage
+ * the hover image for this action
+ * @param enabledImage
+ * the enabled image for this action
+ * @param disabledImage
+ * the disabled image for this action
+ * @param enabled
+ * the enabled state for this action
+ */
+ protected void setupAction(String text, String tooltip, ImageDescriptor hoverImage, ImageDescriptor enabledImage,
+ ImageDescriptor disabledImage, boolean enabled) {
+ setText(text);
+ setToolTipText(tooltip);
+ setEnabled(enabled);
+ if (enabledImage != null) {
+ setImageDescriptor(enabledImage);
+ }
+ if (disabledImage != null) {
+ setDisabledImageDescriptor(disabledImage);
+ }
+ if (hoverImage != null) {
+ setHoverImageDescriptor(hoverImage);
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/IConsoleActionFactory.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/IConsoleActionFactory.java
new file mode 100644
index 00000000000..11eae980cbf
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/IConsoleActionFactory.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.console.actions;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * @since 1.1
+ */
+public interface IConsoleActionFactory {
+ /**
+ * Returns an implementation of ConsoleAction
+ *
+ * @param actionId
+ * The id of the action being requested
+ * @param connectionType
+ * The connection type of the terminal console
+ * @param adapter
+ * An adapter to get relevant objects for use by the ConsoleAction being created (eg. IRemoteConnection)
+ * @return an implementation of ConsoleAction
+ */
+ public ConsoleAction createAction(String actionId, String connectionType, IAdaptable adapter);
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/Activator.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/Activator.java
new file mode 100644
index 00000000000..909b1ab12ad
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/Activator.java
@@ -0,0 +1,150 @@
+package org.eclipse.remote.internal.console;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map.Entry;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.console"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ @Override
+ protected void initializeImageRegistry(ImageRegistry imageRegistry) {
+ HashMap<String, String> map = new HashMap<>();
+
+ try {
+ // Local toolbars
+ map.put(ImageConsts.IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_CLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_CLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_CLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_CLCL_COMMAND_INPUT_FIELD, "command_input_field.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_CLCL_SCROLL_LOCK, "lock_co.gif"); //$NON-NLS-1$
+
+ loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_LOCALTOOL, map);
+
+ map.clear();
+
+ // Enabled local toolbars
+ map.put(ImageConsts.IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_ELCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_ELCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_ELCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_ELCL_COMMAND_INPUT_FIELD, "command_input_field.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_ELCL_SCROLL_LOCK, "lock_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_ELCL_REMOVE, "rem_co.gif"); //$NON-NLS-1$
+
+ loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_ELCL, map);
+
+ map.clear();
+
+ // Disabled local toolbars
+ map.put(ImageConsts.IMAGE_NEW_TERMINAL, "newterminal.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_DLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_DLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_DLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_DLCL_COMMAND_INPUT_FIELD, "command_input_field.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_DLCL_SCROLL_LOCK, "lock_co.gif"); //$NON-NLS-1$
+ map.put(ImageConsts.IMAGE_DLCL_REMOVE, "rem_co.gif"); //$NON-NLS-1$
+
+ loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_DLCL, map);
+
+ map.clear();
+
+ map.put(ImageConsts.IMAGE_TERMINAL_VIEW, "terminal_view.gif"); //$NON-NLS-1$
+
+ loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_EVIEW, map);
+
+ map.clear();
+
+ } catch (MalformedURLException malformedURLException) {
+ malformedURLException.printStackTrace();
+ }
+ }
+
+ protected void loadImageRegistry(ImageRegistry imageRegistry, String strDir, HashMap<String, String> map)
+ throws MalformedURLException {
+ ImageDescriptor imageDescriptor;
+
+ for (Entry<String, String> entry : map.entrySet()) {
+ URL url = plugin.getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + strDir + entry.getValue());
+ imageDescriptor = ImageDescriptor.createFromURL(url);
+ imageRegistry.put(entry.getKey(), imageDescriptor);
+ }
+ }
+
+ /**
+ * Create log entry from an IStatus
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Create log entry from a string
+ *
+ * @param msg
+ * message to log
+ */
+ public static void log(String msg) {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, msg, null));
+ }
+
+ /**
+ * Create log entry from a Throwable
+ *
+ * @param e
+ * throwable to log
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, e.getMessage(), e));
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service
+ * service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ final BundleContext context = plugin.getBundle().getBundleContext();
+ final ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.java
new file mode 100644
index 00000000000..f02536f61b6
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+import org.eclipse.osgi.util.NLS;
+
+public class ConsoleMessages extends NLS {
+ static {
+ NLS.initializeMessages(ConsoleMessages.class.getName(), ConsoleMessages.class);
+ }
+
+ public static String SELECT_CONNECTION;
+ public static String ENCODING_UNAVAILABLE_0;
+ public static String ENCODING_UNAVAILABLE_1;
+ public static String ENCODING;
+ public static String OPEN_CONSOLE_ERROR;
+ public static String STATUS;
+ public static String STATUS_CONNECTED;
+ public static String STATUS_CONNECTING;
+ public static String STATUS_CLOSED;
+
+ public static String CONNECTING_TO_TERMINAL;
+ public static String OPENNING_TERMINAL;
+ public static String MAKING_CONNECTION;
+ public static String DISCONNECTING;
+ public static String TerminalConsoleConnector_0;
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.properties b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.properties
new file mode 100644
index 00000000000..e0ffda82eb1
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ConsoleMessages.properties
@@ -0,0 +1,28 @@
+################################################################################
+# Copyright (c) 2015 QNX Software Systems and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# QNX Software Systems - Initial API and implementation
+################################################################################
+SELECT_CONNECTION = Select Remote Connection
+ENCODING_UNAVAILABLE_0 = Unable to set Encoding
+ENCODING_UNAVAILABLE_1 = Encoding {0} is unavailable!
+ENCODING = Encoding:
+OPEN_CONSOLE_ERROR = Error Opening Command Shell Console
+STATUS = Status:
+STATUS_CONNECTED = CONNECTED
+STATUS_CONNECTING = CONNECTING...
+STATUS_CLOSED = CLOSED
+
+CONNECTING_TO_TERMINAL = Connecting to Command Shell
+OPENNING_TERMINAL = Openning Command Shell
+MAKING_CONNECTION = Making Connection
+DISCONNECTING = Disconnecting
+TerminalConsoleConnector_0=Command shell not supported on this connection
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ImageConsts.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ImageConsts.java
new file mode 100644
index 00000000000..f87758d76f4
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/ImageConsts.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Initial Contributors:
+ * The following Wind River employees contributed to the Terminal component
+ * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb,
+ * Helmut Haigermoser and Ted Williams.
+ *
+ * Contributors:
+ * Michael Scharf (Wind River) - extracted from TerminalConsts
+ * Martin Oberhuber (Wind River) - fixed copyright headers and beautified
+ * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin
+ * Michael Scharf (Wind River) - [172483] added some more icons
+ * Michael Scharf (Wind River) - [240023] Get rid of the terminal's "Pin" button
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+public interface ImageConsts {
+ public final static String IMAGE_DIR_ROOT = "icons/"; //$NON-NLS-1$
+ public final static String IMAGE_DIR_LOCALTOOL = "clcl16/"; // basic colors - size 16x16 //$NON-NLS-1$
+ public final static String IMAGE_DIR_DLCL = "dlcl16/"; // disabled - size 16x16 //$NON-NLS-1$
+ public final static String IMAGE_DIR_ELCL = "elcl16/"; // enabled - size 16x16 //$NON-NLS-1$
+ public final static String IMAGE_DIR_VIEW = "cview16/"; // views //$NON-NLS-1$
+ public final static String IMAGE_DIR_EVIEW = "eview16/"; // views //$NON-NLS-1$
+
+ public static final String IMAGE_NEW_TERMINAL = "TerminalViewNewTerminal"; //$NON-NLS-1$
+ public static final String IMAGE_TERMINAL_VIEW = "TerminalView"; //$NON-NLS-1$
+ public static final String IMAGE_CLCL_CONNECT = "ImageClclConnect"; //$NON-NLS-1$
+ public static final String IMAGE_CLCL_DISCONNECT = "ImageClclDisconnect"; //$NON-NLS-1$
+ public static final String IMAGE_CLCL_SETTINGS = "ImageClclSettings"; //$NON-NLS-1$
+ public static final String IMAGE_CLCL_SCROLL_LOCK = "ImageClclScrollLock"; //$NON-NLS-1$
+
+ public static final String IMAGE_DLCL_CONNECT = "ImageDlclConnect"; //$NON-NLS-1$
+ public static final String IMAGE_DLCL_DISCONNECT = "ImageDlclDisconnect"; //$NON-NLS-1$
+ public static final String IMAGE_DLCL_SETTINGS = "ImageDlclSettings"; //$NON-NLS-1$
+ public static final String IMAGE_DLCL_SCROLL_LOCK = "ImageDlclScrollLock"; //$NON-NLS-1$
+ public static final String IMAGE_DLCL_REMOVE = "ImageDlclRemove"; //$NON-NLS-1$
+
+ public static final String IMAGE_ELCL_CONNECT = "ImageElclConnect"; //$NON-NLS-1$
+ public static final String IMAGE_ELCL_DISCONNECT = "ImageElclDisconnect"; //$NON-NLS-1$
+ public static final String IMAGE_ELCL_SETTINGS = "ImageElclSettings"; //$NON-NLS-1$
+ public static final String IMAGE_ELCL_SCROLL_LOCK = "ImageElclScrollLock"; //$NON-NLS-1$
+ public static final String IMAGE_ELCL_REMOVE = "ImageElclRemove"; //$NON-NLS-1$
+ public static final String IMAGE_CLCL_COMMAND_INPUT_FIELD = "ImageClclCommandInputField";//$NON-NLS-1$
+ public static final String IMAGE_ELCL_COMMAND_INPUT_FIELD = "ImageDlclCommandInputField";//$NON-NLS-1$
+ public static final String IMAGE_DLCL_COMMAND_INPUT_FIELD = "ImageDlclCommandInputField";//$NON-NLS-1$
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java
new file mode 100644
index 00000000000..4e9cb8a89bb
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.remote.console.ITerminalConsole;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
+import org.eclipse.ui.console.AbstractConsole;
+import org.eclipse.ui.console.IConsoleView;
+import org.eclipse.ui.part.IPageBookViewPage;
+import org.eclipse.ui.progress.UIJob;
+
+public class TerminalConsole extends AbstractConsole implements ITerminalConsole {
+ private final String encoding;
+ private final TerminalConsoleConnector terminalConnector;
+ private final int index;
+
+ public TerminalConsole(IRemoteConnection connection, int index, String encoding) {
+ super(connection.getName(),
+ Activator.getDefault().getImageRegistry().getDescriptor(ImageConsts.IMAGE_TERMINAL_VIEW));
+ this.encoding = encoding;
+ this.terminalConnector = new TerminalConsoleConnector(connection);
+ this.index = index;
+ }
+
+ public TerminalConsoleConnector getTerminalConnector() {
+ return terminalConnector;
+ }
+
+ @Override
+ public IRemoteConnection getConnection() {
+ return terminalConnector.getConnection();
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public synchronized void setState(TerminalState terminalState) {
+ StringBuffer nameBuff = new StringBuffer(getConnection().getName());
+ if (index > 0) {
+ nameBuff.append(' ');
+ nameBuff.append(String.valueOf(index));
+ }
+ nameBuff.append(" ("); //$NON-NLS-1$
+ if (terminalState == TerminalState.CLOSED) {
+ nameBuff.append(ConsoleMessages.STATUS_CLOSED);
+ } else if (terminalState == TerminalState.CONNECTED) {
+ nameBuff.append(ConsoleMessages.STATUS_CONNECTED);
+ } else if (terminalState == TerminalState.CONNECTING) {
+ nameBuff.append(ConsoleMessages.STATUS_CONNECTING);
+ }
+ nameBuff.append(")"); //$NON-NLS-1$
+
+ final String name = nameBuff.toString();
+ if (!name.equals(getName())) {
+ UIJob job = new UIJob("updating name") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ TerminalConsole.this.setName(name);
+ return Status.OK_STATUS;
+ }
+ };
+ job.setSystem(true);
+ job.schedule();
+ }
+ }
+
+ @Override
+ public IPageBookViewPage createPage(IConsoleView view) {
+ view.setFocus();
+ return new TerminalConsolePage(this, encoding);
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleConnector.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleConnector.java
new file mode 100644
index 00000000000..86dba723c31
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleConnector.java
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessTerminalService;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
+import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
+import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
+import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
+
+public class TerminalConsoleConnector {
+
+ private final IRemoteConnection connection;
+ private IRemoteProcess remoteProcess;
+ private PageConnector[] pageConnectors = new PageConnector[0];
+ private int width, height;
+ private TerminalState state = TerminalState.CLOSED;
+
+ private class OutThread extends Thread {
+ public OutThread() {
+ super("Terminal Output"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void run() {
+ try {
+ byte[] buff = new byte[1024];
+ if (remoteProcess != null) {
+ InputStream in = remoteProcess.getInputStream();
+ for (int n = in.read(buff); n >= 0; n = in.read(buff)) {
+ for (PageConnector connector : pageConnectors) {
+ ITerminalControl control = connector.control;
+ if (control != null) {
+ control.getRemoteToTerminalOutputStream().write(buff, 0, n);
+ }
+ }
+ }
+ }
+ } catch (IOException e) {
+ Activator.log(e);
+ }
+
+ synchronized (TerminalConsoleConnector.this) {
+ outThread = null;
+ disconnect();
+ }
+ }
+ }
+
+ private OutThread outThread;
+
+ public TerminalConsoleConnector(IRemoteConnection connection) {
+ this.connection = connection;
+ }
+
+ public IRemoteConnection getConnection() {
+ return connection;
+ }
+
+ public ITerminalConnector newPageConnector() {
+ PageConnector connector = new PageConnector();
+ List<PageConnector> list = new ArrayList<>(Arrays.asList(pageConnectors));
+ list.add(connector);
+ pageConnectors = list.toArray(new PageConnector[list.size()]);
+ return connector;
+ }
+
+ private void disposePageConnector(PageConnector connector) {
+ List<PageConnector> list = new ArrayList<>(Arrays.asList(pageConnectors));
+ list.remove(connector);
+ pageConnectors = list.toArray(new PageConnector[list.size()]);
+ if (list.isEmpty()) {
+ // All gone, disconnect
+ disconnect();
+ }
+ }
+
+ private synchronized void setState(TerminalState state) {
+ this.state = state;
+ for (PageConnector connector : pageConnectors) {
+ ITerminalControl control = connector.control;
+ if (control != null) {
+ connector.control.setState(state);
+ }
+ }
+ }
+
+ public synchronized void connect() {
+ if (state != TerminalState.CLOSED) {
+ return;
+ }
+
+ new Job(ConsoleMessages.MAKING_CONNECTION) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ // make sure we're only doing this one at a time
+ // second and further controls will inherit much of this
+ synchronized (TerminalConsoleConnector.this) {
+ setState(TerminalState.CONNECTING);
+
+ if (remoteProcess == null || remoteProcess.isCompleted()) {
+ try {
+ // We'll need a new one
+ if (!connection.isOpen()) {
+ try {
+ connection.open(monitor);
+ } catch (RemoteConnectionException e) {
+ return e.getStatus();
+ }
+ }
+ remoteProcess = connection.getService(IRemoteCommandShellService.class)
+ .getCommandShell(IRemoteProcessBuilder.ALLOCATE_PTY);
+ } catch (IOException e) {
+ disconnect();
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getLocalizedMessage(), e);
+ }
+ }
+
+ if (remoteProcess == null) {
+ disconnect();
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ ConsoleMessages.TerminalConsoleConnector_0);
+ }
+
+ if (width > 0 || height > 0) {
+ IRemoteProcessTerminalService termService = remoteProcess
+ .getService(IRemoteProcessTerminalService.class);
+ if (termService != null) {
+ termService.setTerminalSize(width, height, 8 * width, 8 * height);
+ }
+ }
+
+ if (outThread == null) {
+ outThread = new OutThread();
+ outThread.start();
+ }
+
+ setState(TerminalState.CONNECTED);
+ return Status.OK_STATUS;
+ }
+ }
+ }.schedule();
+ }
+
+ public void disconnect() {
+ if (remoteProcess != null && !remoteProcess.isCompleted()) {
+ new Job(ConsoleMessages.DISCONNECTING) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ remoteProcess.destroy();
+ remoteProcess = null;
+ setState(TerminalState.CLOSED);
+ return Status.OK_STATUS;
+ }
+ }.schedule();
+ } else {
+ setState(TerminalState.CLOSED);
+ }
+ }
+
+ private void setTerminalSize() {
+ int minWidth = Integer.MAX_VALUE;
+ int minHeight = Integer.MAX_VALUE;
+
+ for (PageConnector connector : pageConnectors) {
+ if (connector.myWidth < minWidth) {
+ minWidth = connector.myWidth;
+ }
+ if (connector.myHeight < minHeight) {
+ minHeight = connector.myHeight;
+ }
+ }
+
+ // Weird but the terminal has wrapping issues at this width, need to reduce it by 4.
+ minWidth -= 4;
+
+ if (minWidth != width || minHeight != height) {
+ width = minWidth;
+ height = minHeight;
+ synchronized (this) {
+ if (remoteProcess != null) {
+ IRemoteProcessTerminalService termService = remoteProcess
+ .getService(IRemoteProcessTerminalService.class);
+ if (termService != null) {
+ termService.setTerminalSize(width, height, 8 * width, 8 * height);
+ }
+ }
+ }
+ }
+ }
+
+ private class PageConnector extends PlatformObject implements ITerminalConnector {
+ private int myWidth, myHeight;
+ private ITerminalControl control;
+
+ @Override
+ public OutputStream getTerminalToRemoteStream() {
+ return remoteProcess != null ? remoteProcess.getOutputStream() : null;
+ }
+
+ @Override
+ public void connect(final ITerminalControl control) {
+ this.control = control;
+ control.setVT100LineWrapping(true);
+ TerminalConsoleConnector.this.connect();
+ if (!control.getState().equals(state)) {
+ control.setState(state);
+ }
+ }
+
+ @Override
+ public synchronized void disconnect() {
+ disposePageConnector(this);
+ }
+
+ @Override
+ public void setTerminalSize(int newWidth, int newHeight) {
+ if (newWidth != myWidth || newHeight != myHeight) {
+ myWidth = newWidth;
+ myHeight = newHeight;
+ TerminalConsoleConnector.this.setTerminalSize();
+ }
+ }
+
+ @Override
+ public String getId() {
+ // No id, we're magic
+ return null;
+ }
+
+ @Override
+ public String getName() {
+ // No name
+ return null;
+ }
+
+ @Override
+ public boolean isHidden() {
+ // in case we do leak into the TM world, we shouldn't be visible
+ return true;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return true;
+ }
+
+ @Override
+ public String getInitializationErrorMessage() {
+ return null;
+ }
+
+ @Override
+ public boolean isLocalEcho() {
+ // TODO should the be a property of the connection?
+ return false;
+ }
+
+ @Override
+ public void setDefaultSettings() {
+ // we don't do settings
+ }
+
+ @Override
+ public String getSettingsSummary() {
+ // we don't do settings
+ return null;
+ }
+
+ @Override
+ public void load(ISettingsStore arg0) {
+ // we don't do settings
+ }
+
+ @Override
+ public void save(ISettingsStore arg0) {
+ // we don't do settings
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleExtensionManager.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleExtensionManager.java
new file mode 100644
index 00000000000..7bb0eec5568
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleExtensionManager.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2016 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.remote.console.actions.IConsoleActionFactory;
+
+public class TerminalConsoleExtensionManager {
+ private static TerminalConsoleExtensionManager instance;
+ private Map<String, List<String>> actions;
+ private Map<String, IConsoleActionFactory> factories;
+ private Map<String, IConfigurationElement> elements;
+
+ private TerminalConsoleExtensionManager() {
+ }
+
+ public static TerminalConsoleExtensionManager getInstance() {
+ if (instance == null) {
+ instance = new TerminalConsoleExtensionManager();
+ }
+ return instance;
+ }
+
+ public List<String> getActionsForType(String id) {
+ initialize();
+ List<String> list = actions.get(id);
+ return list == null ? new ArrayList<>() : list;
+ }
+
+ public IConsoleActionFactory getFactory(String id) {
+ return factories.get(id);
+ }
+
+ private void initialize() {
+ if (actions == null) {
+ actions = new LinkedHashMap<>();
+ elements = new LinkedHashMap<>();
+ factories = new HashMap<>();
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint point = registry
+ .getExtensionPoint(Activator.getDefault().getBundle().getSymbolicName() + ".toolbar");
+ for (IExtension extension : point.getExtensions()) {
+ for (IConfigurationElement element : extension.getConfigurationElements()) {
+ String id = element.getAttribute("id"); //$NON-NLS-1$
+ if (id != null) {
+ elements.put(id, element);
+ IConsoleActionFactory factory = null;
+ try {
+ factory = (IConsoleActionFactory) element.createExecutableExtension("actionFactory");
+ } catch (CoreException e) {
+ Activator.log(e);
+ }
+ if (factory != null) {
+ String connectionType = element.getAttribute("connectionType");
+ if (connectionType != null) {
+ List<String> actionList = actions.get(connectionType);
+ if (actionList == null) {
+ actionList = new ArrayList<>();
+ }
+ actionList.add(id);
+ actions.put(connectionType, actionList);
+ factories.put(id, factory);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleFactory.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleFactory.java
new file mode 100644
index 00000000000..96882b69be3
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleFactory.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.window.Window;
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleFactory;
+import org.eclipse.ui.console.IConsoleManager;
+
+public class TerminalConsoleFactory implements IConsoleFactory {
+
+ @Override
+ public void openConsole() {
+ final TerminalConsoleSettingsDialog settingsDialog = new TerminalConsoleSettingsDialog(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ if (settingsDialog.open() == Window.OK) {
+ openConsole(settingsDialog.getRemoteConnection(), settingsDialog.getEncoding());
+ }
+ }
+
+ public static void openConsole(final IRemoteConnection connection, final String encoding) {
+ Job j = new Job(ConsoleMessages.OPENNING_TERMINAL) {
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ return openConsoleImplementation(connection, encoding, monitor);
+ }
+ };
+ j.schedule();
+ }
+
+ private static IStatus openConsoleImplementation(final IRemoteConnection connection, final String encoding,
+ IProgressMonitor monitor) {
+ IRemoteCommandShellService commandShellService = connection.getService(IRemoteCommandShellService.class);
+ if (commandShellService == null) {
+ return Status.CANCEL_STATUS;
+ }
+ try {
+ createConsole(connection, encoding, commandShellService, monitor);
+ return Status.OK_STATUS;
+ } catch (RemoteConnectionException rce) {
+ return rce.getStatus();
+ }
+
+ }
+
+ private static IConsole createConsole(final IRemoteConnection connection, final String encoding,
+ IRemoteCommandShellService service, IProgressMonitor monitor) throws RemoteConnectionException {
+ if (!connection.isOpen()) {
+ connection.open(monitor);
+ }
+
+ // TODO, how to handle command shells that are singletons, like serial ports
+
+ IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
+ // Find the next index;
+ int index = findNextIndex(consoleManager, connection);
+
+ TerminalConsole terminalConsole = new TerminalConsole(connection, index, encoding);
+ consoleManager.addConsoles(new IConsole[] { terminalConsole });
+ consoleManager.showConsoleView(terminalConsole);
+ return terminalConsole;
+ }
+
+ private static int findNextIndex(IConsoleManager consoleManager, IRemoteConnection connection) {
+ IConsole[] consoles = consoleManager.getConsoles();
+ boolean[] indices = new boolean[consoles.length];
+ for (IConsole console : consoles) {
+ if (console instanceof TerminalConsole) {
+ TerminalConsole terminalConsole = (TerminalConsole) console;
+ if (terminalConsole.getConnection().equals(connection)) {
+ indices[terminalConsole.getIndex()] = true;
+ }
+ }
+ }
+ int index = 0;
+ while (index < indices.length && indices[index]) {
+ index++;
+ }
+ return index;
+ }
+
+ public static List<IConsole> findConsole(IRemoteConnection connection) {
+ ArrayList<IConsole> ret = new ArrayList<>();
+ IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
+ IConsole[] consoles = consoleManager.getConsoles();
+ for (IConsole console : consoles) {
+ if (console instanceof TerminalConsole) {
+ TerminalConsole terminalConsole = (TerminalConsole) console;
+ if (terminalConsole.getConnection().equals(connection)) {
+ ret.add(terminalConsole);
+ }
+ }
+ }
+ return ret;
+ }
+
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java
new file mode 100644
index 00000000000..ec06831235d
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.console.actions.ConsoleAction;
+import org.eclipse.remote.console.actions.IConsoleActionFactory;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.internal.console.actions.ConsoleActionConnect;
+import org.eclipse.remote.internal.console.actions.ConsoleActionDisconnect;
+import org.eclipse.remote.internal.console.actions.ConsoleActionScrollLock;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.tm.internal.terminal.control.ITerminalListener;
+import org.eclipse.tm.internal.terminal.control.ITerminalViewControl;
+import org.eclipse.tm.internal.terminal.control.TerminalViewControlFactory;
+import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
+import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.IConsoleConstants;
+import org.eclipse.ui.console.actions.CloseConsoleAction;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.Page;
+import org.eclipse.ui.progress.UIJob;
+
+public class TerminalConsolePage extends Page implements IAdaptable {
+ public static final String TOOLBAR_GROUP_ID = "org.eclipse.remote.internal.terminal.console.Toolbar"; //$NON-NLS-1$
+ public static final String CONTRIBUTIONS_GROUP_ID = "org.eclipse.remote.internal.terminal.console.Toolbar.contributions"; //$NON-NLS-1$
+
+ private final ConsoleActionConnect connectAction;
+ private final ConsoleActionDisconnect disconnectAction;
+
+ private final TerminalConsole terminalConsole;
+ private final String encoding;
+ private Composite mainComposite;
+ private ITerminalViewControl tViewCtrl;
+
+ private Job connectTerminalJob = new ConnectTerminalJob();
+
+ private final ITerminalListener listener = new ITerminalListener() {
+ @Override
+ public void setState(TerminalState state) {
+ if (state == TerminalState.CONNECTING || state == TerminalState.CONNECTED) {
+ disconnectAction.setEnabled(true);
+ connectAction.setEnabled(false);
+ } else if (state == TerminalState.CLOSED) {
+ disconnectAction.setEnabled(false);
+ connectAction.setEnabled(true);
+ }
+ terminalConsole.setState(state);
+ }
+
+ @Override
+ public void setTerminalTitle(final String title) {
+ // ignore titles coming from the widget
+ }
+ };
+
+ public TerminalConsolePage(TerminalConsole console, String encoding) {
+ terminalConsole = console;
+ this.encoding = encoding;
+ connectAction = new ConsoleActionConnect(console);
+ disconnectAction = new ConsoleActionDisconnect(console);
+ }
+
+ public TerminalConsole getConsole() {
+ return terminalConsole;
+ }
+
+ @Override
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ IToolBarManager toolBarManager = pageSite.getActionBars().getToolBarManager();
+ toolBarManager.insertBefore(IConsoleConstants.OUTPUT_GROUP, new GroupMarker(TOOLBAR_GROUP_ID));
+
+ toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, connectAction);
+ toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, disconnectAction);
+ toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, new ConsoleActionScrollLock(this));
+ toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, new CloseConsoleAction(terminalConsole));
+
+ toolBarManager.insertAfter(TOOLBAR_GROUP_ID, new GroupMarker(CONTRIBUTIONS_GROUP_ID));
+
+ addToolbarContributions(toolBarManager);
+ }
+
+ private void addToolbarContributions(IToolBarManager toolBarManager) {
+ String connectionType = terminalConsole.getConnection().getConnectionType().getId();
+ List<String> actions = TerminalConsoleExtensionManager.getInstance().getActionsForType(connectionType);
+ for (String id : actions) {
+ IConsoleActionFactory factory = TerminalConsoleExtensionManager.getInstance().getFactory(id);
+ if (factory != null) {
+ ConsoleAction action = factory.createAction(id, connectionType, this);
+ if (action != null) {
+ toolBarManager.appendToGroup(CONTRIBUTIONS_GROUP_ID, action);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ mainComposite = new Composite(parent, SWT.NONE);
+ mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ mainComposite.setLayout(new FillLayout());
+
+ tViewCtrl = TerminalViewControlFactory.makeControl(listener, mainComposite, new ITerminalConnector[] {});
+ tViewCtrl.setConnector(terminalConsole.getTerminalConnector().newPageConnector());
+
+ try {
+ tViewCtrl.setEncoding(encoding);
+ } catch (UnsupportedEncodingException e) {
+ IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ NLS.bind(ConsoleMessages.ENCODING_UNAVAILABLE_1, encoding));
+ Activator.log(status);
+ ErrorDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ ConsoleMessages.OPEN_CONSOLE_ERROR, ConsoleMessages.ENCODING_UNAVAILABLE_0, status);
+ }
+ connectTerminalJob.schedule();
+ }
+
+ @Override
+ public Control getControl() {
+ return mainComposite;
+ }
+
+ @Override
+ public void setFocus() {
+ tViewCtrl.setFocus();
+ }
+
+ @Override
+ public void dispose() {
+ tViewCtrl.disposeTerminal();
+ super.dispose();
+ }
+
+ public TerminalState getTerminalState() {
+ return tViewCtrl.getState();
+ }
+
+ public void connectTerminal() {
+ if (!tViewCtrl.isConnected()) {
+ connectTerminalJob.schedule();
+ }
+ }
+
+ public void disconnectTerminal() {
+ if (tViewCtrl.getState() != TerminalState.CLOSED) {
+ tViewCtrl.disconnectTerminal();
+ }
+ }
+
+ public void setScrollLock(boolean enabled) {
+ tViewCtrl.setScrollLock(enabled);
+ }
+
+ public boolean getScrollLock() {
+ return tViewCtrl.isScrollLock();
+ }
+
+ class ConnectTerminalJob extends UIJob {
+ public ConnectTerminalJob() {
+ super(ConsoleMessages.CONNECTING_TO_TERMINAL);
+ setSystem(true);
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (tViewCtrl != null && !tViewCtrl.isDisposed()) {
+ tViewCtrl.clearTerminal();
+ tViewCtrl.connectTerminal();
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ if (adapter.equals(IRemoteConnection.class)) {
+ return (T) terminalConsole.getConnection();
+ }
+ if (adapter.equals(TerminalConsole.class)) {
+ return (T) terminalConsole;
+ }
+ if (adapter.equals(TerminalConsolePage.class)) {
+ return (T) this;
+ }
+ return null;
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleSettingsDialog.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleSettingsDialog.java
new file mode 100644
index 00000000000..f22d114a117
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleSettingsDialog.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console;
+
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.ui.widgets.RemoteConnectionWidget;
+import org.eclipse.swt.SWT;
+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.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class TerminalConsoleSettingsDialog extends Dialog {
+
+ private static final String CONNECTION_TYPE = "connectionType"; //$NON-NLS-1$
+ private static final String CONNECTION_NAME = "connectionName"; //$NON-NLS-1$
+ private static final String ENCODING = "encoding"; //$NON-NLS-1$
+
+ private RemoteConnectionWidget remoteConnWidget;
+ private Combo encodingCombo;
+ private String selectedEncoding;
+
+ public TerminalConsoleSettingsDialog(IShellProvider parentShell) {
+ this(parentShell.getShell());
+ }
+
+ public TerminalConsoleSettingsDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ composite.setLayout(new GridLayout(2, false));
+
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ // TODO remove the remote process service once we get command shell available with ssh and local
+ @SuppressWarnings("unchecked")
+ List<IRemoteConnectionType> connTypes = manager.getConnectionTypesSupporting(IRemoteCommandShellService.class,
+ IRemoteProcessService.class);
+
+ remoteConnWidget = new RemoteConnectionWidget(composite, SWT.NONE, null, 0, connTypes);
+
+ IDialogSettings settings = getDialogSettings();
+ String initialId = settings.get(CONNECTION_TYPE);
+ String initialName = settings.get(CONNECTION_NAME);
+ if (initialId != null && initialName != null) {
+ remoteConnWidget.setConnection(initialId, initialName);
+ }
+ GridData gd = new GridData();
+ gd.horizontalSpan = 2;
+ remoteConnWidget.setLayoutData(gd);
+ remoteConnWidget.addSelectionListener(new ValidationSelectionListener());
+
+ Label encodingLabel = new Label(composite, SWT.NONE);
+ encodingLabel.setLayoutData(new GridData());
+ encodingLabel.setText(ConsoleMessages.ENCODING);
+
+ encodingCombo = new Combo(composite, SWT.READ_ONLY);
+ encodingCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ int i = 0;
+ String initialEncoding = settings.get(ENCODING);
+ if (initialEncoding == null) {
+ initialEncoding = Charset.defaultCharset().name();
+ }
+ for (String encoding : getEncodings()) {
+ encodingCombo.add(encoding);
+ if (encoding.equals(initialEncoding)) {
+ selectedEncoding = encoding;
+ encodingCombo.select(i);
+ }
+ i++;
+ }
+ encodingCombo.addSelectionListener(new ValidationSelectionListener());
+
+ return composite;
+ }
+
+ private List<String> getEncodings() {
+ List<String> encodings = new ArrayList<>(2);
+ encodings.add("ISO-8859-1"); //$NON-NLS-1$
+ encodings.add("UTF-8"); //$NON-NLS-1$
+
+ String hostEncoding = Charset.defaultCharset().name();
+ if (!encodings.contains(hostEncoding)) {
+ encodings.add(hostEncoding);
+ }
+ return encodings;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ super.createButtonsForButtonBar(parent);
+ validateDialog();
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(ConsoleMessages.SELECT_CONNECTION);
+ }
+
+ private void validateDialog() {
+ IRemoteConnection connection = remoteConnWidget.getConnection();
+ selectedEncoding = encodingCombo.getItem(encodingCombo.getSelectionIndex());
+ if (connection != null && selectedEncoding != null) {
+ getButton(OK).setEnabled(true);
+ } else {
+ getButton(OK).setEnabled(false);
+ }
+ }
+
+ /**
+ * Get the remote connection selected in the dialog.
+ */
+ public IRemoteConnection getRemoteConnection() {
+ return remoteConnWidget.getConnection();
+ }
+
+ /**
+ * Get the encoding selected in the dialog.
+ */
+ public String getEncoding() {
+ return selectedEncoding;
+ }
+
+ class ValidationSelectionListener implements SelectionListener {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateDialog();
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ validateDialog();
+ }
+ }
+
+ private IDialogSettings getDialogSettings() {
+ IDialogSettings result = Activator.getDefault().getDialogSettings()
+ .getSection(TerminalConsoleSettingsDialog.class.getName());
+
+ if (result == null) {
+ result = Activator.getDefault().getDialogSettings()
+ .addNewSection(TerminalConsoleSettingsDialog.class.getName());
+ }
+
+ return result;
+
+ }
+
+ @Override
+ public int open() {
+ int rc = super.open();
+ if (rc == Window.OK) {
+ // save the settings
+ IDialogSettings settings = getDialogSettings();
+ IRemoteConnection connection = getRemoteConnection();
+ settings.put(CONNECTION_TYPE, connection.getConnectionType().getId());
+ settings.put(CONNECTION_NAME, connection.getName());
+ settings.put(ENCODING, getEncoding());
+ }
+ return rc;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.java
new file mode 100644
index 00000000000..758a83c2470
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class ActionMessages extends NLS {
+
+ static {
+ NLS.initializeMessages(ActionMessages.class.getName(), ActionMessages.class);
+ }
+
+ public static String CONNECT;
+ public static String DISCONNECT;
+ public static String SCROLL_LOCK;
+
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.properties b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.properties
new file mode 100644
index 00000000000..1f5b7e51cd4
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ActionMessages.properties
@@ -0,0 +1,16 @@
+################################################################################
+# Copyright (c) 2015 QNX Software Systems and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# QNX Software Systems - Initial API and implementation
+################################################################################
+CONNECT = Connect
+DISCONNECT = Disconnect
+SCROLL_LOCK = Scroll Lock \ No newline at end of file
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java
new file mode 100644
index 00000000000..19a21ad1e74
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console.actions;
+
+import org.eclipse.remote.console.actions.ConsoleAction;
+import org.eclipse.remote.internal.console.ImageConsts;
+import org.eclipse.remote.internal.console.TerminalConsole;
+
+public class ConsoleActionConnect extends ConsoleAction {
+ private final TerminalConsole console;
+
+ public ConsoleActionConnect(TerminalConsole console) {
+ super(ConsoleActionConnect.class.getName());
+
+ this.console = console;
+
+ setupAction(ActionMessages.CONNECT, ActionMessages.CONNECT, ImageConsts.IMAGE_CLCL_CONNECT,
+ ImageConsts.IMAGE_ELCL_CONNECT, ImageConsts.IMAGE_DLCL_CONNECT, true);
+ }
+
+ @Override
+ public void run() {
+ console.getTerminalConnector().connect();
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java
new file mode 100644
index 00000000000..c82a928a1a0
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console.actions;
+
+import org.eclipse.remote.console.actions.ConsoleAction;
+import org.eclipse.remote.internal.console.ImageConsts;
+import org.eclipse.remote.internal.console.TerminalConsole;
+
+public class ConsoleActionDisconnect extends ConsoleAction {
+ private final TerminalConsole console;
+
+ public ConsoleActionDisconnect(TerminalConsole console) {
+ super(ConsoleActionDisconnect.class.getName());
+
+ this.console = console;
+
+ setupAction(ActionMessages.DISCONNECT, ActionMessages.DISCONNECT, ImageConsts.IMAGE_CLCL_DISCONNECT,
+ ImageConsts.IMAGE_ELCL_DISCONNECT, ImageConsts.IMAGE_DLCL_DISCONNECT, false);
+ }
+
+ @Override
+ public void run() {
+ console.getTerminalConnector().disconnect();
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java
new file mode 100644
index 00000000000..38ec2674b96
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.console.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.remote.console.actions.ConsoleAction;
+import org.eclipse.remote.internal.console.ImageConsts;
+import org.eclipse.remote.internal.console.TerminalConsolePage;
+
+public class ConsoleActionScrollLock extends ConsoleAction {
+ private final TerminalConsolePage page;
+
+ public ConsoleActionScrollLock(TerminalConsolePage page) {
+ super(ConsoleActionScrollLock.class.getName(), IAction.AS_RADIO_BUTTON);
+
+ this.page = page;
+
+ setupAction(ActionMessages.SCROLL_LOCK, ActionMessages.SCROLL_LOCK, ImageConsts.IMAGE_CLCL_SCROLL_LOCK,
+ ImageConsts.IMAGE_ELCL_SCROLL_LOCK, ImageConsts.IMAGE_DLCL_SCROLL_LOCK, true);
+ }
+
+ @Override
+ public void run() {
+ page.setScrollLock(!page.getScrollLock());
+ setChecked(page.getScrollLock());
+ }
+}
diff --git a/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/OpenCommandShellHandler.java b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/OpenCommandShellHandler.java
new file mode 100644
index 00000000000..a382559d8e5
--- /dev/null
+++ b/remote/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/OpenCommandShellHandler.java
@@ -0,0 +1,27 @@
+package org.eclipse.remote.internal.console.actions;
+
+import java.nio.charset.Charset;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.internal.console.TerminalConsoleFactory;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class OpenCommandShellHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();
+ if (selection != null && selection instanceof IStructuredSelection) {
+ IRemoteConnection connection = (IRemoteConnection) ((IStructuredSelection) selection).iterator().next();
+ TerminalConsoleFactory.openConsole(connection, Charset.defaultCharset().name());
+ }
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core.tests/.classpath b/remote/org.eclipse.remote.core.tests/.classpath
new file mode 100644
index 00000000000..a42a828e04a
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src">
+ <attributes>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.core.tests/.project b/remote/org.eclipse.remote.core.tests/.project
new file mode 100644
index 00000000000..8eccea27b31
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.core.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..5b1c443114d
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..51a63ec9988
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=2
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.core.tests/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.core.tests/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..25f06cb40ae
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.core.tests;singleton:=true
+Bundle-Version: 1.0.200.qualifier
+Bundle-Vendor: %pluginProvider
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.0",
+ org.junit,
+ com.jcraft.jsch;bundle-version="0.1.41",
+ org.eclipse.core.filesystem;bundle-version="1.2.0",
+ org.eclipse.remote.core;bundle-version="1.0.0",
+ org.eclipse.remote.ui;bundle-version="1.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-Activator: org.eclipse.remote.core.tests.internal.Activator
+Bundle-ActivationPolicy: lazy
diff --git a/remote/org.eclipse.remote.core.tests/about.html b/remote/org.eclipse.remote.core.tests/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.core.tests/build.properties b/remote/org.eclipse.remote.core.tests/build.properties
new file mode 100644
index 00000000000..67af4196ea0
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ about.html,\
+ .
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.core.tests/plugin.properties b/remote/org.eclipse.remote.core.tests/plugin.properties
new file mode 100644
index 00000000000..0c334d914b6
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2009 IBM Corporation and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial API and implementation
+###############################################################################
+
+pluginName=Remote Core Tests
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/Activator.java b/remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/Activator.java
new file mode 100644
index 00000000000..a54a6c73c9e
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/Activator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core.tests.internal;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class Activator implements BundleActivator {
+
+ private static BundleContext bundleContext;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ bundleContext = context;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ bundleContext = null;
+ }
+
+ public static <T> T getService(Class<T> service) {
+ ServiceReference<T> ref = bundleContext.getServiceReference(service);
+ return ref != null ? bundleContext.getService(ref) : null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/ServiceTests.java b/remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/ServiceTests.java
new file mode 100644
index 00000000000..e39e4ecec55
--- /dev/null
+++ b/remote/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/internal/ServiceTests.java
@@ -0,0 +1,83 @@
+package org.eclipse.remote.core.tests.internal;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+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.IRemoteServicesManager;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+import junit.framework.TestCase;
+
+public class ServiceTests extends TestCase {
+ private static final String USERNAME = "test"; //$NON-NLS-1$
+ private static final String PASSWORD = ""; //$NON-NLS-1$
+ private static final String HOST = "localhost"; //$NON-NLS-1$
+
+ private IRemoteConnectionType fConnectionType;
+ private IRemoteConnection fRemoteConnection;
+
+ public void testHostService() {
+ IRemoteConnectionWorkingCopy wc = null;
+ try {
+ wc = fConnectionType.newConnection("test_connection");//$NON-NLS-1$
+ } catch (RemoteConnectionException e) {
+ fail(e.getLocalizedMessage());
+ }
+
+ IRemoteConnectionHostService hostService = wc.getService(IRemoteConnectionHostService.class);
+ assertNotNull(hostService);
+
+ String host = System.getenv("TEST_HOST");
+ if (host == null) {
+ host = HOST;
+ }
+ hostService.setHostname(host);
+
+ String username = System.getenv("TEST_USERNAME");
+ if (username == null) {
+ username = USERNAME;
+ }
+ hostService.setUsername(username);
+
+ String password = System.getenv("TEST_PASSWORD");
+ if (password == null) {
+ password = PASSWORD;
+ }
+ hostService.setPassword(password);
+
+ try {
+ fRemoteConnection = wc.save();
+ } catch (RemoteConnectionException e) {
+ fail(e.getLocalizedMessage());
+ }
+ assertNotNull(fRemoteConnection);
+
+ try {
+ fRemoteConnection.open(new NullProgressMonitor());
+ } catch (RemoteConnectionException e) {
+ fail(e.getLocalizedMessage());
+ }
+ assertTrue(fRemoteConnection.isOpen());
+
+ hostService = fRemoteConnection.getService(IRemoteConnectionHostService.class);
+ assertNotNull(hostService);
+
+ assertEquals(hostService.getHostname(), host);
+ assertEquals(hostService.getUsername(), username);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ fConnectionType = manager.getConnectionType("org.eclipse.remote.JSch"); //$NON-NLS-1$
+ assertNotNull(fConnectionType);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ fConnectionType.removeConnection(fRemoteConnection);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/.classpath b/remote/org.eclipse.remote.core/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.core/.options b/remote/org.eclipse.remote.core/.options
new file mode 100644
index 00000000000..2ebe6916eba
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.options
@@ -0,0 +1,2 @@
+org.eclipse.remote.core/debug=false
+org.eclipse.remote.core/debug/commands=false
diff --git a/remote/org.eclipse.remote.core/.project b/remote/org.eclipse.remote.core/.project
new file mode 100644
index 00000000000..d733886f190
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.core/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.core/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.core/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.core/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.core/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.core/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..61ef546a389
--- /dev/null
+++ b/remote/org.eclipse.remote.core/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.core;singleton:=true
+Bundle-Version: 4.1.100.qualifier
+Bundle-Activator: org.eclipse.remote.internal.core.RemoteCorePlugin
+Bundle-Vendor: %pluginProvider
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.core.launch,
+ org.eclipse.remote.internal.core;x-friends:="org.eclipse.remote.ui,org.eclipse.remote.jsch.core",
+ org.eclipse.remote.internal.core.preferences;x-friends:="org.eclipse.remote.ui"
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: org.eclipse.cdt.utils.pty,
+ org.eclipse.cdt.utils.spawner,
+ org.eclipse.core.expressions,
+ org.eclipse.core.filesystem,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.core.runtime.preferences,
+ org.eclipse.debug.core,
+ org.eclipse.equinox.security.storage,
+ org.eclipse.osgi.service.debug,
+ org.eclipse.osgi.util,
+ org.osgi.framework,
+ org.osgi.service.prefs
diff --git a/remote/org.eclipse.remote.core/about.html b/remote/org.eclipse.remote.core/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.core/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.core/about.ini b/remote/org.eclipse.remote.core/about.ini
new file mode 100644
index 00000000000..5bd1defab8b
--- /dev/null
+++ b/remote/org.eclipse.remote.core/about.ini
@@ -0,0 +1,27 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=ptp_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (not translated)
+# needed for primary features only
+
+# Property "welcomePage" contains path to welcome page (special XML-based format)
+# optional
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.core/about.mappings b/remote/org.eclipse.remote.core/about.mappings
new file mode 100644
index 00000000000..bddaab43109
--- /dev/null
+++ b/remote/org.eclipse.remote.core/about.mappings
@@ -0,0 +1,6 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+0=@build@ \ No newline at end of file
diff --git a/remote/org.eclipse.remote.core/about.properties b/remote/org.eclipse.remote.core/about.properties
new file mode 100644
index 00000000000..e3428f2ba08
--- /dev/null
+++ b/remote/org.eclipse.remote.core/about.properties
@@ -0,0 +1,25 @@
+###############################################################################
+# Copyright (c) 2005, 2007 IBM Corporation and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial API and implementation
+###############################################################################
+
+# NLS_MESSAGEFORMAT_NONE
+# NLS_ENCODING=UTF-8
+
+blurb=Remote Services\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2008 IBM Corporation, and others.\n\
+Visit http://www.eclipse.org/ptp\n
+
diff --git a/remote/org.eclipse.remote.core/build.properties b/remote/org.eclipse.remote.core/build.properties
new file mode 100644
index 00000000000..8b2d6bd061d
--- /dev/null
+++ b/remote/org.eclipse.remote.core/build.properties
@@ -0,0 +1,14 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ plugin.properties,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ ptp_logo_icon32.png,\
+ schema/,\
+ .options
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.core/plugin.properties b/remote/org.eclipse.remote.core/plugin.properties
new file mode 100644
index 00000000000..2e02797f08b
--- /dev/null
+++ b/remote/org.eclipse.remote.core/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Services Core
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.core/plugin.xml b/remote/org.eclipse.remote.core/plugin.xml
new file mode 100644
index 00000000000..bdb2cd3159f
--- /dev/null
+++ b/remote/org.eclipse.remote.core/plugin.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension-point id="remoteServices" name="Remote Services" schema="schema/remoteServices.exsd"/>
+ <extension-point id="remoteResources" name="Remote Resources" schema="schema/remoteResources.exsd"/>
+ <extension-point id="processFactory" name="Process Factory" schema="schema/processFactory.exsd"/>
+ <extension-point id="authenticator" name="User Authenticator" schema="schema/authenticator.exsd"/>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionType
+ canAdd="false"
+ canEdit="false"
+ canRemove="false"
+ id="org.eclipse.remote.LocalServices"
+ name="Local"
+ scheme="file">
+ </connectionType>
+ <connectionTypeService
+ factory="org.eclipse.remote.internal.core.services.local.LocalConnectionProviderService$Factory"
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ service="org.eclipse.remote.core.IRemoteConnectionProviderService">
+ </connectionTypeService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalConnectionPropertyService$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionPropertyService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalFileService$Factory"
+ service="org.eclipse.remote.core.IRemoteFileService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalProcessService$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalCommandShellService$Factory"
+ service="org.eclipse.remote.core.IRemoteCommandShellService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalConnectionHostService$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionHostService">
+ </connectionService>
+ <processService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessControlService">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalProcess$Factory"
+ service="org.eclipse.remote.internal.core.services.local.LocalProcess">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.core.services.local.LocalProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessTerminalService">
+ </processService>
+ </extension>
+ <extension
+ point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="org.eclipse.core.resources.IResource"
+ class="org.eclipse.remote.internal.core.RemoteResourceAdapterFactory">
+ <adapter
+ type="org.eclipse.remote.core.IRemoteResource">
+ </adapter>
+ </factory>
+ </extension>
+ <extension
+ point="org.eclipse.core.runtime.preferences">
+ <initializer
+ class="org.eclipse.remote.internal.core.preferences.PreferenceInitializer">
+ </initializer>
+ </extension>
+ <extension
+ point="org.eclipse.core.expressions.propertyTesters">
+ <propertyTester
+ class="org.eclipse.remote.core.RemoteConnectionPropertyTester"
+ id="org.eclipse.remote.core.remoteConnectionTester"
+ namespace="org.eclipse.remote.core"
+ properties="isConnectionType"
+ type="org.eclipse.remote.core.IRemoteConnection">
+ </propertyTester>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.core/ptp_logo_icon32.png b/remote/org.eclipse.remote.core/ptp_logo_icon32.png
new file mode 100644
index 00000000000..e8ec57270f3
--- /dev/null
+++ b/remote/org.eclipse.remote.core/ptp_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.core/schema/authenticator.exsd b/remote/org.eclipse.remote.core/schema/authenticator.exsd
new file mode 100644
index 00000000000..865b6bbbba7
--- /dev/null
+++ b/remote/org.eclipse.remote.core/schema/authenticator.exsd
@@ -0,0 +1,99 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.remote.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.remote.core" id="authenticator" name="Authenticator"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="authenticator"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="authenticator">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ The ID of the remote services that this authenticator should be used for.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ An implementation of the IUserAuthenticator interface.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.remote.core.IUserAuthenticator"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="priority" type="string">
+ <annotation>
+ <documentation>
+ The numerical value of the priority of the authenticator. The highest priority authenticator will be preferred over lower priority authenticators.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/remote/org.eclipse.remote.core/schema/processFactory.exsd b/remote/org.eclipse.remote.core/schema/processFactory.exsd
new file mode 100644
index 00000000000..dffed2a056c
--- /dev/null
+++ b/remote/org.eclipse.remote.core/schema/processFactory.exsd
@@ -0,0 +1,98 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.remote.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.remote.core" id="processFactory" name="Process Factory"/>
+ </appInfo>
+ <documentation>
+ This extension point allows an alternate implementation of the java.lang.Runtime#exec() methods to be supplied. This is useful because the Java runtime provides limited support for controlling external processes.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="processFactory"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="processFactory">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ the fully qualified name of a class that implements &lt;code&gt;org.eclipse.remote.core.IProcessFactory&lt;/code&gt;
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.remote.core.IProcessFactory"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ &lt;pre&gt;
+ &lt;extension point=&quot;org.eclipse.remote.core.processFactory&quot;&gt;
+ &lt;processFactory class=&quot;MyProcessFactoryClass&quot;/&gt;
+ &lt;/extension&gt;
+&lt;/pre&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ The value of the class attribute must implement the interface &lt;code&gt;org.eclipse.remote.core.IProcessFactory&lt;/code&gt;
+ </documentation>
+ </annotation>
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2013 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/remote/org.eclipse.remote.core/schema/remoteResources.exsd b/remote/org.eclipse.remote.core/schema/remoteResources.exsd
new file mode 100644
index 00000000000..d9db0f8cbdf
--- /dev/null
+++ b/remote/org.eclipse.remote.core/schema/remoteResources.exsd
@@ -0,0 +1,113 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.remote.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.remote.core" id="remoteResources" name="Remote Resources"/>
+ </appInfo>
+ <documentation>
+ This extension point allows remote implementations to provide additional operations on a resource. The extension associates a project nature with the resource extension. Resources contained within a particular project can be adapted to obtain the additional operations.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="remoteResource"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="remoteResource">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ the fully qualified name of a class that implements &lt;code&gt;org.eclipse.remote.core.IRemoteResource&lt;/code&gt;
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.remote.core.IRemoteResource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="nature" type="string" use="required">
+ <annotation>
+ <documentation>
+ a project nature. Resources contained within a project with this nature can be adapted to obtain the &lt;code&gt;org.eclipse.remote.core.IRemoteResource&lt;/code&gt; interface.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ &lt;pre&gt;
+ &lt;extension point=&quot;org.eclipse.remote.core.remoteResource&quot;&gt;
+ &lt;remoteResource class=&quot;MyRemoteResourceClass&quot; nature=&quot;MyProjectNature&quot;/&gt;
+ &lt;/extension&gt;
+&lt;/pre&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ The value of the class attribute must implement the interface &lt;code&gt;org.eclipse.remote.core.IRemoteResource&lt;/code&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ The remote package itself does not have any predefined remote resources.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2013 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/remote/org.eclipse.remote.core/schema/remoteServices.exsd b/remote/org.eclipse.remote.core/schema/remoteServices.exsd
new file mode 100644
index 00000000000..0be736abc86
--- /dev/null
+++ b/remote/org.eclipse.remote.core/schema/remoteServices.exsd
@@ -0,0 +1,278 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.remote.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.remote.core" id="remoteServices" name="Remote Services"/>
+ </appInfo>
+ <documentation>
+ This extension point is used to add a remote services provider.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="connectionType" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="connectionTypeService" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="connectionService" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="processService" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connectionType">
+ <annotation>
+ <appInfo>
+ <meta.element labelAttribute="name"/>
+ </appInfo>
+ <documentation>
+ A connection type.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ A unique identifier for this remote service
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ A human readable name for the remote service
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="scheme" type="string">
+ <annotation>
+ <documentation>
+ An EFS scheme name for this service
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="canAdd" type="boolean">
+ <annotation>
+ <documentation>
+ Can you add connections using the API. Default is true.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="canEdit" type="boolean">
+ <annotation>
+ <documentation>
+ Can a connection be changed using the API. Default is true.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="canRemove" type="boolean">
+ <annotation>
+ <documentation>
+ Can a connection be removed using the API.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connectionTypeService">
+ <annotation>
+ <documentation>
+ This is a service that implements the given service interface for a given connection type.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="connectionTypeId" type="string" use="required">
+ <annotation>
+ <documentation>
+ The remote services that this service applies to.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="identifier" basedOn="org.eclipse.remote.core.remoteServices/connectionType/@id"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="service" type="string" use="required">
+ <annotation>
+ <documentation>
+ The interface class that this service implements. The service is found by calling the getService() method on the IRemoteServices object with this interface class as the parameter.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="factory" type="string" use="required">
+ <annotation>
+ <documentation>
+ The factory class used to instantiate the service.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.remote.core.IRemoteServices$Service$Factory"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connectionService">
+ <annotation>
+ <documentation>
+ This is a service that implements the given service interface for connections of a given connection type.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="connectionTypeId" type="string" use="required">
+ <annotation>
+ <documentation>
+ The connection type for the connections that this service applies to.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="identifier" basedOn="org.eclipse.remote.core.remoteServices/connectionType/@id"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="service" type="string" use="required">
+ <annotation>
+ <documentation>
+ The interface class that this service implements. The service is found by calling the getService() method on the IRemoteConnection object with this interface class as the parameter.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="factory" type="string" use="required">
+ <annotation>
+ <documentation>
+ The factory class used to instantiate the service.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.remote.core.IRemoteConnection$Service$Factory"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="processService">
+ <annotation>
+ <documentation>
+ This is a service that implements the given service interface for processes of a given connection type.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="connectionTypeId" type="string" use="required">
+ <annotation>
+ <documentation>
+ The connection type for the connections that this service applies to.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="identifier" basedOn="org.eclipse.remote.core.remoteServices/connectionType/@id"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="service" type="string" use="required">
+ <annotation>
+ <documentation>
+ The interface class that this service implements. The service is found by calling the getService() method on the IRemoteProcess object with this interface class as the parameter.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="factory" type="string" use="required">
+ <annotation>
+ <documentation>
+ The factory class used to instantiate the service.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.remote.core.IRemoteProcess$Service$Factory"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ &lt;pre&gt;
+ &lt;extension
+ point=&quot;org.eclipse.remote.core.remoteServices&quot;&gt;
+ &lt;remoteServices
+ class=&quot;org.eclipse.remote.internal.core.services.local.LocalServicesFactory&quot;
+ id=&quot;org.eclipse.ptp.remote.LocalServices&quot;
+ name=&quot;Local&quot;
+ scheme=&quot;file&quot;&gt;
+ &lt;/remoteServices&gt;
+ &lt;/extension&gt;
+&lt;/pre&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ The value of the class attribute must implement &lt;samp&gt;org.eclipse.remote.core.IRemoteServicesFactory&lt;/samp&gt;.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ The remote package provides a remote services implementation for local services.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2013 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/AbstractRemoteProcessBuilder.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/AbstractRemoteProcessBuilder.java
new file mode 100644
index 00000000000..1e3685787b9
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/AbstractRemoteProcessBuilder.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.remote.internal.core.RemoteProcess;
+
+/**
+ * Abstract base class for remote process builders. Implementors can use this class to provide a default implementation of a remote
+ * process builder.
+ *
+ * @since 5.0
+ */
+public abstract class AbstractRemoteProcessBuilder implements IRemoteProcessBuilder {
+ private List<String> fCommandArgs;
+ private IFileStore fRemoteDir;
+ private boolean fRedirectErrorStream;
+
+ private final IRemoteConnection fConnection;
+
+ /**
+ * @since 2.0
+ */
+ public AbstractRemoteProcessBuilder(IRemoteConnection connection, List<String> command) {
+ fCommandArgs = command;
+ fConnection = connection;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public AbstractRemoteProcessBuilder(IRemoteConnection connection, String... command) {
+ this(connection, Arrays.asList(command));
+ }
+
+ @Override
+ public List<String> command() {
+ return fCommandArgs;
+ }
+
+ @Override
+ public IRemoteProcessBuilder command(List<String> command) {
+ fCommandArgs = command;
+ return this;
+ }
+
+ @Override
+ public IRemoteProcessBuilder command(String... command) {
+ fCommandArgs = Arrays.asList(command);
+ return this;
+ }
+
+ @Override
+ public IFileStore directory() {
+ return fRemoteDir;
+ }
+
+ @Override
+ public IRemoteProcessBuilder directory(IFileStore directory) {
+ fRemoteDir = directory;
+ return this;
+ }
+
+ @Override
+ public abstract Map<String, String> environment();
+
+ /**
+ * @since 5.0
+ */
+ @Override
+ public abstract int getSupportedFlags();
+
+ @Override
+ public boolean redirectErrorStream() {
+ return fRedirectErrorStream;
+ }
+
+ @Override
+ public IRemoteProcessBuilder redirectErrorStream(boolean redirectErrorStream) {
+ this.fRedirectErrorStream = redirectErrorStream;
+ return this;
+ }
+
+ @Override
+ public IRemoteProcess start() throws IOException {
+ return start(NONE);
+ }
+
+ /**
+ * @since 5.0
+ */
+ @Override
+ public abstract IRemoteProcess start(int flags) throws IOException;
+
+ @Override
+ public String toString() {
+ StringBuilder res = new StringBuilder();
+ for (String arg : command()) {
+ res.append(arg);
+ res.append(" "); //$NON-NLS-1$
+ }
+ return res.toString();
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return fConnection;
+ }
+
+ /**
+ * @since 4.0
+ */
+ protected IRemoteProcess newRemoteProcess() {
+ return new RemoteProcess(getRemoteConnection(), this);
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IProcessFactory.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IProcessFactory.java
new file mode 100644
index 00000000000..ee8783faf9a
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IProcessFactory.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Abstraction of the java.lang.Runtime exec() methods to allow different implementations to be supplied.
+ */
+public interface IProcessFactory {
+
+ public Process exec(String cmd) throws IOException;
+
+ public Process exec(String[] cmdarray) throws IOException;
+
+ public Process exec(String[] cmdarray, String[] envp) throws IOException;
+
+ public Process exec(String cmd, String[] envp) throws IOException;
+
+ public Process exec(String cmd, String[] envp, File dir) throws IOException;
+
+ public Process exec(String cmdarray[], String[] envp, File dir) throws IOException;
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteCommandShellService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteCommandShellService.java
new file mode 100644
index 00000000000..cb072409b37
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteCommandShellService.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.io.IOException;
+
+/**
+ * A service that provides a command shell on a remote. This is mainly used by
+ * Terminal views.
+ *
+ * @since 2.0
+ */
+public interface IRemoteCommandShellService extends IRemoteConnection.Service {
+
+ /**
+ * Get a remote process that runs a command shell on the remote system. The shell will be the user's default shell on the remote
+ * system. The flags may be used to modify behavior of the remote process. These flags may only be supported by specific types
+ * of remote service providers. Clients can use {@link IRemoteProcessBuilder#getSupportedFlags()} to find out the flags
+ * supported by the service provider.
+ *
+ * <pre>
+ * Current flags are:
+ * {@link IRemoteProcessBuilder#NONE} - disable any flags
+ * {@link IRemoteProcessBuilder#ALLOCATE_PTY} - allocate a pseudo-terminal for the process (RFC-4254 Sec. 6.2)
+ * {@link IRemoteProcessBuilder#FORWARD_X11} - enable X11 forwarding (RFC-4254 Sec. 6.3)
+ * </pre>
+ *
+ * @param flags
+ * bitwise-or of flags
+ * @return remote process object
+ * @throws IOException
+ * @since 7.0
+ */
+ public IRemoteProcess getCommandShell(int flags) throws IOException;
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnection.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnection.java
new file mode 100644
index 00000000000..2bac5f20bb9
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnection.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+/**
+ * Represents a connection to a remote system. Use the getService method to get at connection
+ * specific services. Connections have state, open or closed. Some connection types are always
+ * open in which case the close does nothing. Connections have properties which are values that
+ * describe the connection and are discovered. Connections also have attributes which are
+ * client specified values that control the connection.
+ *
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface IRemoteConnection {
+ /**
+ * The interface that is extend by services provided for this remote connection.
+ *
+ * @since 2.0
+ */
+ interface Service {
+ IRemoteConnection getRemoteConnection();
+
+ interface Factory {
+ <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service);
+ }
+ }
+
+ // Common properties
+ final static String OS_NAME_PROPERTY = "os.name"; //$NON-NLS-1$
+ final static String OS_VERSION_PROPERTY = "os.version"; //$NON-NLS-1$
+ final static String OS_ARCH_PROPERTY = "os.arch"; //$NON-NLS-1$
+ final static String FILE_SEPARATOR_PROPERTY = "file.separator"; //$NON-NLS-1$
+ final static String PATH_SEPARATOR_PROPERTY = "path.separator"; //$NON-NLS-1$
+ final static String LINE_SEPARATOR_PROPERTY = "line.separator"; //$NON-NLS-1$
+ final static String USER_HOME_PROPERTY = "user.home"; //$NON-NLS-1$
+ /**
+ * @since 2.0
+ */
+ final static String LOCALE_CHARMAP_PROPERTY = "locale.charmap"; //$NON-NLS-1$
+
+ /**
+ * Get the connection type of this connection
+ *
+ * @return connection type
+ * @since 2.0
+ */
+ public IRemoteConnectionType getConnectionType();
+
+ /**
+ * Get unique name for this connection.
+ *
+ * @return connection name
+ */
+ public String getName();
+
+ /**
+ * Get the service for this remote connection that implements the given interface.
+ *
+ * @param service
+ * the interface the required service must implements
+ * @return the desired service or null if there is no such service available
+ * @throws CoreException
+ * @since 2.0
+ */
+ <T extends Service> T getService(Class<T> service);
+
+ /**
+ * Does this connection support the given service.
+ *
+ * @param service
+ * The service to be tested
+ * @return true if this connection supports the service
+ * @since 2.0
+ */
+ <T extends Service> boolean hasService(Class<T> service);
+
+ /**
+ * Open the connection. Must be called before the connection can be used.
+ *
+ * @param monitor
+ * the progress monitor to use for reporting progress to the user. It is the caller's responsibility to call done()
+ * on the given monitor. Accepts null, indicating that no progress should be reported and that the operation cannot
+ * be cancelled.
+ * @throws RemoteConnectionException
+ */
+ public void open(IProgressMonitor monitor) throws RemoteConnectionException;
+
+ /**
+ * Close the connection. Must be called to terminate the connection.
+ */
+ public void close();
+
+ /**
+ * Test if the connection is open.
+ *
+ * @return true if connection is open.
+ */
+ public boolean isOpen();
+
+ /**
+ * Gets the remote system property indicated by the specified key. The connection must be open prior to calling this method.
+ *
+ * @param key
+ * the name of the property
+ * @return the string value of the property, or null if no property has that key
+ */
+ public String getProperty(String key);
+
+ /**
+ * Get an attribute for a connection.
+ *
+ * NOTE: the attributes do not include any security related information (e.g. passwords, keys, etc.)
+ *
+ * @param key
+ * @return the attribute value, or empty string if not defined.
+ * @since 2.0
+ */
+ public String getAttribute(String key);
+
+ /**
+ * Get an attribute that is stored in secure storage, such as passwords.
+ *
+ * @param key
+ * @return the attribute value, or empty string if not defined.
+ * @since 2.0
+ */
+ public String getSecureAttribute(String key);
+
+ /**
+ * Return a working copy to allow setting and changing of attributes.
+ *
+ * @return working copy of remote
+ */
+ public IRemoteConnectionWorkingCopy getWorkingCopy();
+
+ /**
+ * Register a listener that will be notified when this connection's status changes.
+ *
+ * @param listener
+ */
+ public void addConnectionChangeListener(IRemoteConnectionChangeListener listener);
+
+ /**
+ * Remove a listener that will be notified when this connection's status changes.
+ *
+ * @param listener
+ */
+ public void removeConnectionChangeListener(IRemoteConnectionChangeListener listener);
+
+ /**
+ * Notify all listeners when this connection's status changes. See {{@link RemoteConnectionChangeEvent} for a list of event
+ * types.
+ *
+ * @param event
+ * event type indicating the nature of the event
+ */
+ public void fireConnectionChangeEvent(int type);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionChangeListener.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionChangeListener.java
new file mode 100644
index 00000000000..94e280f85b8
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionChangeListener.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.util.EventListener;
+
+/**
+ * Listener used to register for notification of connection status changes.
+ * Listeners can be registered on individual connections using
+ * {@link IRemoteConnection#addConnectionChangeListener(IRemoteConnectionChangeListener)},
+ * or globally for all connections using
+ * {@link IRemoteServicesManager#addRemoteConnectionChangeListener(IRemoteConnectionChangeListener)}.
+ */
+public interface IRemoteConnectionChangeListener extends EventListener {
+
+ /**
+ * Notifies this listener that the status of a connection has changed.
+ *
+ * @param event
+ * the connection change event
+ * @since 2.0
+ */
+
+ public void connectionChanged(RemoteConnectionChangeEvent event);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionControlService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionControlService.java
new file mode 100644
index 00000000000..f9396d67a25
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionControlService.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+/**
+ * A service to control and report on the state of a connection, open or closed.
+ * Connections that do not provide this service are always assumed to be opened.
+ *
+ * @since 2.0
+ */
+public interface IRemoteConnectionControlService extends IRemoteConnection.Service {
+
+ /**
+ * Open the connection. Must be called before the connection can be used.
+ *
+ * @param monitor
+ * the progress monitor to use for reporting progress to the user. It is the caller's responsibility to call done()
+ * on the given monitor. Accepts null, indicating that no progress should be reported and that the operation cannot
+ * be cancelled.
+ * @throws RemoteConnectionException
+ */
+ public void open(IProgressMonitor monitor) throws RemoteConnectionException;
+
+ /**
+ * Close the connection. Must be called to terminate the connection.
+ */
+ public void close();
+
+ /**
+ * Test if the connection is open.
+ *
+ * @return true if connection is open.
+ */
+ public boolean isOpen();
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionHostService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionHostService.java
new file mode 100644
index 00000000000..85e590e2fb3
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionHostService.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+/**
+ * A service to obtain host specific information.
+ *
+ * @since 2.0
+ */
+public interface IRemoteConnectionHostService extends IRemoteConnection.Service {
+
+ /**
+ * Obtain the hostname associated with this connection.
+ *
+ * @return hostname
+ */
+ String getHostname();
+
+ /**
+ * Obtain the port associated with this connection
+ *
+ * @return port
+ */
+ int getPort();
+
+ /**
+ * Obtain the timeout used when establishing the connection.
+ *
+ * @return timeout
+ */
+ int getTimeout();
+
+ /**
+ * Get the pass phrase associated with this connection.
+ *
+ * @return pass phrase
+ * @since 3.0
+ */
+ String getPassphrase();
+
+ /**
+ * Get the password associated with this connection.
+ *
+ * @return password
+ * @since 3.0
+ */
+ String getPassword();
+
+ /**
+ * Get the value of the use password authentication flag. If true, the connection will try using a password first.
+ *
+ * @return use password authentication flag
+ * @since 3.0
+ */
+ boolean usePassword();
+
+ /**
+ * Obtain the flag that indicates a login shell should be started once the connection is established
+ *
+ * @return login shell flag
+ */
+ boolean useLoginShell();
+
+ /**
+ * Obtain the username associated with this connection.
+ *
+ * @return
+ */
+ String getUsername();
+
+ /**
+ * Set the hostname associated with this connection. Note, this method can only be used for an
+ * IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param hostname
+ * new hostname for connection
+ */
+ void setHostname(String hostname);
+
+ /**
+ * Set the pass phrase associated with this connection. Note, this method can only be used for an
+ * IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param passphrase
+ */
+ void setPassphrase(String passphrase);
+
+ /**
+ * Set the password associated with this connection. Note, this method can only be used for an
+ * IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param password
+ * new password for connection
+ */
+ void setPassword(String password);
+
+ /**
+ * Set the port used for the connection. Note, this method can only be used forh an
+ * IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param port
+ * new port for connection
+ */
+ void setPort(int port);
+
+ /**
+ * Set the timeout used when establishing the connection. A timeout of 0 means infinite. Note, this method can only be used
+ * for an IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param timeout
+ * new timeout value
+ */
+ void setTimeout(int timeout);
+
+ /**
+ * Set the flag indicating a login shell should be stated for this connection. Note, this method can only be used
+ * for an IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param useLogingShell
+ * true to start a login shell
+ */
+ void setUseLoginShell(boolean useLogingShell);
+
+ /**
+ * Set the connection to try password authentication first. Note, this method can only be used for an
+ * IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param usePassword
+ * use password authentication
+ */
+ void setUsePassword(boolean usePassword);
+
+ /**
+ * Set the username associated with this connection. Note, this method can only be used for an
+ * IRemoteConnectionWorkingCopy and will have no effect otherwise.
+ *
+ * @param username
+ * new username for connection
+ */
+ void setUsername(String username);
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionPropertyService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionPropertyService.java
new file mode 100644
index 00000000000..dccf1c41533
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionPropertyService.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+/**
+ * A connection property is some descriptive information that's discovered about the connection.
+ * This service provides property values for a connection.
+ *
+ * Examples include:
+ * <pre>
+ * os.name Operating system name
+ * os.arch Operating system architecture
+ * os.version Operating system version
+ * file.separator File separator ("/" on UNIX)
+ * path.separator Path separator (":" on UNIX)
+ * line.separator Line separator ("\n" on UNIX)
+ * user.home Home directory
+ * </pre>
+ *
+ * @since 2.0
+ */
+public interface IRemoteConnectionPropertyService extends IRemoteConnection.Service {
+
+ /**
+ * Gets the remote system property indicated by the specified key. The connection must be open prior to calling this method.
+ *
+ * @param key
+ * the name of the property
+ * @return the string value of the property, or null if no property has that key
+ */
+ public String getProperty(String key);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionProviderService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionProviderService.java
new file mode 100644
index 00000000000..2117ee44da9
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionProviderService.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+/**
+ * A connection type service for connection types that have automatic means of adding
+ * and removing services. For example, the Local connection type needs to be able
+ * to ensure the Local connection is created, or adapters to other target management
+ * systems may prefer to let those systems manage the connections.
+ *
+ * @since 2.0
+ */
+public interface IRemoteConnectionProviderService extends IRemoteConnectionType.Service {
+
+ /**
+ * Initialize the service. Called after all existing connections are loaded.
+ * This method typically will add the initial connections or start up a job to do it.
+ * This method is called on startup, it's important that it be fast.
+ */
+ void init();
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java
new file mode 100644
index 00000000000..745892537ae
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionType.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.net.URI;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+/**
+ * A remote connection type manages a list of connections that implement the same services.
+ * Services may be registered on the individual connections, or at the connection type level
+ * for service that apply to all connections of this type.
+ *
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @since 2.0
+ */
+public interface IRemoteConnectionType {
+ /**
+ * The interface that is extend by services provided for this remote services implementation.
+ *
+ * @since 2.0
+ */
+ interface Service {
+ IRemoteConnectionType getConnectionType();
+
+ interface Factory {
+ <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service);
+ }
+ }
+
+ /**
+ * Get the remote services manager. This is a convenient way to get back
+ * to the root.
+ *
+ * @return remote services manager
+ */
+ IRemoteServicesManager getRemoteServicesManager();
+
+ /**
+ * Get unique ID of this service. Can be used as a lookup key.
+ *
+ * @return unique ID
+ */
+ String getId();
+
+ /**
+ * Get display name of this service.
+ *
+ * @return display name
+ */
+ String getName();
+
+ /**
+ * Get the EFS scheme provided by this service.
+ *
+ * @return display name
+ */
+ String getScheme();
+
+ /**
+ * Can you add new connections of this type using the API.
+ *
+ * @return can add
+ */
+ boolean canAdd();
+
+ /**
+ * Can you edit connections of this type, i.e. create working copies.
+ *
+ * @return can edit
+ */
+ boolean canEdit();
+
+ /**
+ * Can you remove connections of this type using the API.
+ *
+ * @return can remove
+ */
+ boolean canRemove();
+
+ /**
+ * Get the service for this remote services implementation that implements the given interface.
+ *
+ * @param service
+ * the interface the required service must implements
+ * @return the desired service or null if there is no such service available
+ * @throws CoreException
+ * @since 2.0
+ */
+ <T extends Service> T getService(Class<T> service);
+
+ /**
+ * Does this connection type support the given service.
+ *
+ * @param service
+ * the service to be tested
+ * @return true if this connection type supports this service
+ */
+ <T extends Service> boolean hasService(Class<T> service);
+
+ /**
+ * Return the list of connection type services supported by this type.
+ *
+ * @return connection type services
+ */
+ List<String> getServices();
+
+ /**
+ * 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
+ */
+ <T extends IRemoteConnection.Service> boolean hasConnectionService(Class<T> service);
+
+ /**
+ * Return the list of connection services supported by connections of this type.
+ *
+ * @return connection services
+ */
+ List<String> getConnectionServices();
+
+ /**
+ * Do processes created by this connection type support the given service.
+ *
+ * @param service
+ * the service to be tested
+ * @return true if processes created by this connection type support this service
+ */
+ <T extends IRemoteProcess.Service> boolean hasProcessService(Class<T> service);
+
+ /**
+ * Return the list of process services supported by connections of this type.
+ *
+ * @return process services
+ */
+ List<String> getProcessServices();
+
+ /**
+ * Gets the remote connection corresponding to the supplied name.
+ *
+ * @param name
+ * name of the connection (as returned by {@link IRemoteConnection#getName()})
+ * @return remote connection or null if no connection exists
+ */
+ IRemoteConnection getConnection(String name);
+
+ /**
+ * Gets the remote connection corresponding to the supplied URI.
+ *
+ * @param uri
+ * URI containing a schema for this remote connection
+ * @return remote connection or null if no connection exists or the schema
+ * is incorrect
+ * @since 4.0
+ */
+ IRemoteConnection getConnection(URI uri);
+
+ /**
+ * Get all the connections for this service provider.
+ *
+ * @return connections that we know about
+ */
+ List<IRemoteConnection> getConnections();
+
+ /**
+ * Creates a new remote connection named with supplied name. The connection attributes will be the default for the
+ * implementation.
+ *
+ * Returns a working copy of the remote connection. Callers must call {@link IRemoteConnectionWorkingCopy#save()} before the
+ * connection can be used.
+ *
+ * @param name
+ * name of the connection
+ * @return a new connection working copy with the supplied name
+ * @throws RemoteConnectionException
+ * if connection creation failed
+ * @since 5.0
+ */
+ IRemoteConnectionWorkingCopy newConnection(String name) throws RemoteConnectionException;
+
+ /**
+ * Remove a connection and all resources associated with it.
+ *
+ * @param connection
+ * connection to remove
+ * @throws RemoteConnectionException
+ * if the connection could not be removed
+ */
+ void removeConnection(IRemoteConnection connection) throws RemoteConnectionException;
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java
new file mode 100644
index 00000000000..16f4ed5aa54
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+/**
+ * A working copy of a remote connection used to change the name and/or
+ * attributes of the connection. It is also used when creating a new
+ * connection
+ */
+public interface IRemoteConnectionWorkingCopy extends IRemoteConnection {
+
+ /**
+ * Returns the original connection this working copy was created from.
+ * Returns null if this is a new connection.
+ *
+ * @return original connection
+ */
+ public IRemoteConnection getOriginal();
+
+ /**
+ * Returns whether this connection has been modified since it was last saved or created.
+ *
+ * @return true if the connection has been modified
+ */
+ public boolean isDirty();
+
+ /**
+ * Saves this working copy to its original connection and returns a handle to the resulting connection. Has no effect if this
+ * connection does not need saving.
+ *
+ * @return saved connection
+ * @throws RemoteConnectionException
+ */
+ public IRemoteConnection save() throws RemoteConnectionException;
+
+ /**
+ * Set the name for this connection
+ *
+ * @param name
+ */
+ public void setName(String name);
+
+ /**
+ * Set an implementation dependent attribute for the connection. Attributes keys supported by the connection can be obtained
+ * using {@link #getAttributes()}. Attributes are persisted along with connection information.
+ *
+ * @param key
+ * attribute key
+ * @param value
+ * attribute value
+ */
+ public void setAttribute(String key, String value);
+
+ /**
+ * Set an attribute such as a password that's stored in secure storage.
+ *
+ * @param key
+ * @param value
+ * @since 2.0
+ */
+ public void setSecureAttribute(String key, String value);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteFileService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteFileService.java
new file mode 100644
index 00000000000..4c41caa6ba5
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteFileService.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Interface for managing files on a remote system.
+ *
+ * @since 2.0
+ */
+public interface IRemoteFileService extends IRemoteConnection.Service {
+
+ /**
+ * Get the resource associated with path. IFileStore can then be used to
+ * perform operations on the file.
+ *
+ * The remote connection does not need to be open to use this method, but
+ * subsequent operations on the IFileStore that access the underlying remote
+ * filesystem may require the connection to be open.
+ *
+ * @param path
+ * path to resource
+ * @return the file store representing the remote path
+ */
+ IFileStore getResource(String path);
+
+ /**
+ * Get the base directory to be used for relative paths.
+ *
+ * @return base directory
+ */
+ String getBaseDirectory();
+
+ /**
+ * Set the base directory to be used for relative paths..
+ *
+ * @param path new base directory
+ */
+ void setBaseDirectory(String path);
+
+ /**
+ * Gets the directory separator on the target system.
+ *
+ * @return String
+ */
+ String getDirectorySeparator();
+
+ /**
+ * Convert URI to a remote path. This path is suitable for direct file
+ * operations <i>on the remote system</i>.
+ *
+ * The remote connection does not need to be open to use this method.
+ *
+ * @return IPath representing the remote path
+ */
+ String toPath(URI uri);
+
+ /**
+ * Convert remote path to equivalent URI. This URI is suitable for EFS
+ * operations <i>on the local system</i>.
+ *
+ * The remote connection does not need to be open to use this method.
+ *
+ * @param path
+ * path on remote system
+ * @return URI representing path on remote system, or null if the path is
+ * invalid
+ */
+ URI toURI(IPath path);
+
+ /**
+ * Convert string representation of a remote path to equivalent URI. This
+ * URI is suitable for EFS operations <i>on the local system</i>.
+ *
+ * The remote connection does not need to be open to use this method.
+ *
+ * @param path
+ * path on remote system
+ * @return URI representing path on remote system, or null if the path is
+ * invalid
+ */
+ URI toURI(String path);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePortForwardingService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePortForwardingService.java
new file mode 100644
index 00000000000..caaff8e9c42
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePortForwardingService.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+/**
+ * A connection service for setting up port forwarding between the host and the remote.
+ * This is a feature provided by SSH.
+ *
+ * @since 2.0
+ */
+public interface IRemotePortForwardingService extends IRemoteConnection.Service {
+
+ /**
+ * Forward local port localPort to remote port fwdPort on remote machine fwdAddress. If this IRemoteConnection is not to
+ * fwdAddress, the port will be routed via the connection machine to fwdAddress.
+ *
+ * @param localPort
+ * local port to forward
+ * @param fwdAddress
+ * address of remote machine
+ * @param fwdPort
+ * remote port on remote machine
+ * @throws RemoteConnectionException
+ */
+ public void forwardLocalPort(int localPort, String fwdAddress, int fwdPort) throws RemoteConnectionException;
+
+ /**
+ * Forward a local port to remote port fwdPort on remote machine fwdAddress. The local port is chosen dynamically and returned
+ * by the method. If this IRemoteConnection is not to fwdAddress, the port will be routed via the connection machine to
+ * fwdAddress.
+ *
+ * @param fwdAddress
+ * @param fwdPort
+ * @param monitor
+ * @return local port number
+ * @throws RemoteConnectionException
+ */
+ public int forwardLocalPort(String fwdAddress, int fwdPort, IProgressMonitor monitor)
+ throws RemoteConnectionException;
+
+ /**
+ * Forward remote port remotePort to port fwdPort on machine fwdAddress. When a connection is made to remotePort on the remote
+ * machine, it is forwarded via this IRemoteConnection to fwdPort on machine fwdAddress.
+ *
+ * @param remotePort
+ * remote port to forward
+ * @param fwdAddress
+ * address of recipient machine
+ * @param fwdPort
+ * port on recipient machine
+ * @throws RemoteConnectionException
+ */
+ public void forwardRemotePort(int remotePort, String fwdAddress, int fwdPort) throws RemoteConnectionException;
+
+ /**
+ * Forward a remote port to port fwdPort on remote machine fwdAddress. The remote port is chosen dynamically and returned by the
+ * method. When a connection is made to this port on the remote machine, it is forwarded via this IRemoteConnection to fwdPort
+ * on machine fwdAddress.
+ *
+ * If fwdAddress is the empty string ("") then the fwdPort will be bound to any address on all interfaces. Note that this
+ * requires enabling the GatewayPort sshd option on some systems.
+ *
+ * @param fwdAddress
+ * @param fwdPort
+ * @param monitor
+ * @return remote port number
+ * @throws RemoteConnectionException
+ */
+ public int forwardRemotePort(String fwdAddress, int fwdPort, IProgressMonitor monitor)
+ throws RemoteConnectionException;
+
+ /**
+ * Remove the local port forwarding associated with the given port.
+ *
+ * @param port
+ * forwarded port
+ * @throws RemoteConnectionException
+ * @since 7.0
+ */
+ public void removeLocalPortForwarding(int port) throws RemoteConnectionException;
+
+ /**
+ * Remove the remote port forwarding associated with the given port.
+ *
+ * @param port
+ * forwarded port
+ * @throws RemoteConnectionException
+ * @since 7.0
+ */
+ public void removeRemotePortForwarding(int port) throws RemoteConnectionException;
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePreferenceConstants.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePreferenceConstants.java
new file mode 100644
index 00000000000..645f7420cfe
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemotePreferenceConstants.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+/**
+ * Preference constants that can be used to check the default remote service provider preference.
+ *
+ * @since 6.0
+ */
+public interface IRemotePreferenceConstants {
+ /**
+ * Preference setting for the default connection type. Clients can check this preference to see if a default provider
+ * has been set, and if so, what the provider ID is.
+ *
+ * @since 2.0
+ */
+ public static final String PREF_CONNECTION_TYPE_ID = "connectionTypeId"; //$NON-NLS-1$
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcess.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcess.java
new file mode 100644
index 00000000000..28d375309c6
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcess.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Represents a process running on a remote system. Remote process are created using the {@link IRemoteProcessBuilder} interface.
+ */
+public interface IRemoteProcess {
+ /**
+ * The interface that is extend by services provided for this remote connection.
+ *
+ * @since 2.0
+ */
+ interface Service {
+ IRemoteProcess getRemoteProcess();
+
+ interface Factory {
+ <T extends Service> T getService(IRemoteProcess remoteProcess, Class<T> service);
+ }
+ }
+
+ /**
+ * Terminate the process
+ */
+ void destroy();
+
+ /**
+ * Returns the exit value for the process
+ *
+ * @return the exit value
+ */
+ int exitValue();
+
+ /**
+ * Gets the error output stream of the process
+ *
+ * Note: some implementations (e.g. JSch) will not work correctly if the remote process generates stdout or stderr but the
+ * calling thread does not read the corresponding output or error streams.
+ *
+ * @return the output stream connected to the standard
+ * error of the process
+ */
+ InputStream getErrorStream();
+
+ /**
+ * Gets an InputStream which can be used to read the standard output stream of the process
+ *
+ * Note: some implementations (e.g. JSch) will not work correctly if the remote process generates stdout or stderr but the
+ * calling thread does not read the corresponding input or error streams.
+ *
+ * @return the input stream connected to the standard
+ * output of the process
+ */
+ InputStream getInputStream();
+
+ /**
+ * Gets an output stream which can be used to write to the standard input stream of the process
+ *
+ * @return the output stream connected to the standard
+ * input of the process
+ */
+ OutputStream getOutputStream();
+
+ /**
+ * Get the service for this remote process that implements the given interface.
+ *
+ * @param service
+ * the interface the required service must implements
+ * @return the desired service or null if there is no such service available
+ * @since 2.0
+ */
+ <T extends Service> T getService(Class<T> service);
+
+ /**
+ * Does this remote process support the given service.
+ *
+ * @param service
+ * The service to be tested
+ * @return true if this connection supports the service
+ * @since 2.0
+ */
+ <T extends Service> boolean hasService(Class<T> service);
+
+ /**
+ * Wait until the process has terminated
+ *
+ * Note: some implementations (e.g. JSch) will not work correctly if the remote process generates stdout or stderr but the
+ * calling thread does not read the corresponding input or error streams.
+ *
+ * @return the exit value of the process
+ * @throws InterruptedException
+ * if the current thread is
+ * interrupted by another thread while it is waiting
+ */
+ int waitFor() throws InterruptedException;
+
+ /**
+ * Check if the remote process has completed.
+ *
+ * Note: some implementations (e.g. JSch) will not work correctly if the remote process generates stdout or stderr but the
+ * calling thread does not read the corresponding input or error streams.
+ *
+ * @return true if remote process has completed
+ */
+ boolean isCompleted();
+
+ /**
+ * Get the connection that is used by this process
+ *
+ * @return connection used by this process
+ * @since 2.0
+ */
+ IRemoteConnection getRemoteConnection();
+
+ /**
+ * Get the process builder used to create this process
+ *
+ * @return process builder used to create this process
+ * @since 2.0
+ */
+ IRemoteProcessBuilder getProcessBuilder();
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessBuilder.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessBuilder.java
new file mode 100644
index 00000000000..3167b52a6a7
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessBuilder.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.filesystem.IFileStore;
+
+/**
+ * Abstraction of a process builder for remote processes. This interface behaves in the same manner as
+ * {@link java.lang.ProcessBuilder}.
+ */
+public interface IRemoteProcessBuilder {
+ /**
+ * @since 5.0
+ */
+ public static int NONE = 0x00;
+
+ /**
+ * Flag to request allocation of a pseudo-terminal for the process (RFC-4254
+ * Sec. 6.2)
+ *
+ * @since 5.0
+ */
+ public static int ALLOCATE_PTY = 0x01;
+
+ /**
+ * Flag to request X11 forwarding (RFC-4254 Sec. 6.3)
+ *
+ * @since 5.0
+ */
+ public static int FORWARD_X11 = 0x02;
+
+ /**
+ * Flag to request that the supplied environment be apended to the remote environment; otherwise
+ * it is replaced.
+ * @since 3.0
+ */
+ public static int APPEND_ENVIRONMENT = 0x03;
+
+ /**
+ * Returns this process builder's operating system program and arguments.
+ *
+ * @return a list containing the program and arguments
+ */
+ List<String> command();
+
+ /**
+ * Sets this process builder's operating system program and arguments.
+ *
+ * @param command
+ * @return This process builder
+ */
+ IRemoteProcessBuilder command(List<String> command);
+
+ /**
+ * Sets this process builder's operating system program and arguments.
+ *
+ * @param command
+ * @return this process builder
+ */
+ IRemoteProcessBuilder command(String... command);
+
+ /**
+ * Returns this process builder's working directory.
+ *
+ * @return an IFileStore reference to the working directory
+ */
+ IFileStore directory();
+
+ /**
+ * Sets this process builder's working directory.
+ *
+ * @param directory
+ * @return This process builder
+ */
+ IRemoteProcessBuilder directory(IFileStore directory);
+
+ /**
+ * Returns a string map view of this process builder's environment. The
+ * returned map behaves in the same manner as described in {@link java.lang.ProcessBuilder#environment()}.
+ *
+ * @return the process builder's environment
+ */
+ Map<String, String> environment();
+
+ /**
+ * Get the flags that are supported by this process builder.
+ *
+ * @return bitwise-or of the supported flags
+ * @since 5.0
+ */
+ int getSupportedFlags();
+
+ /**
+ * Tells whether this process builder merges standard error and standard
+ * output.
+ *
+ * @return true if standard error and standard output will be merged
+ */
+ boolean redirectErrorStream();
+
+ /**
+ * Sets this process builder's redirectErrorStream property.
+ *
+ * @param redirectErrorStream
+ * @return This process builder
+ */
+ IRemoteProcessBuilder redirectErrorStream(boolean redirectErrorStream);
+
+ /**
+ * Starts a new process using the attributes of this process builder.
+ *
+ * @return remote process object
+ * @throws IOException
+ */
+ IRemoteProcess start() throws IOException;
+
+ /**
+ * Starts a new process using the attributes of this process builder. The
+ * flags may be used to modify behavior of the remote process. These flags
+ * may only be supported by specific types of remote service providers.
+ * Clients can use {@link #getSupportedFlags()} to find out the flags
+ * supported by the service provider.
+ *
+ * <pre>
+ * Current flags are:
+ * NONE - disable any flags
+ * ALLOCATE_PTY - allocate a pseudo-terminal for the process (RFC-4254 Sec. 6.2)
+ * FORWARD_X11 - enable X11 forwarding (RFC-4254 Sec. 6.3)
+ * </pre>
+ *
+ * @param flags
+ * bitwise-or of flags to use when starting process
+ * @return remote process object
+ * @throws IOException
+ * @since 5.0
+ */
+ IRemoteProcess start(int flags) throws IOException;
+
+ /**
+ * Get the connection that will be used by this process builder to create remote processes.
+ *
+ * @return connection used to create remote processes
+ * @since 2.0
+ */
+ IRemoteConnection getRemoteConnection();
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessControlService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessControlService.java
new file mode 100644
index 00000000000..f1e817038e1
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessControlService.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * A service to control and report on the state of a process.
+ *
+ * @since 2.0
+ */
+public interface IRemoteProcessControlService extends IRemoteProcess.Service {
+ /**
+ * Terminate the process
+ */
+ public void destroy();
+
+ /**
+ * Returns the exit value for the process
+ *
+ * @return the exit value
+ */
+ public int exitValue();
+
+ /**
+ * Gets the error output stream of the process
+ *
+ * @return the output stream connected to the standard
+ * error of the process
+ */
+ public InputStream getErrorStream();
+
+ /**
+ * Gets an InputStream which can be used to read the standard output stream of the process
+ *
+ * @return the input stream connected to the standard
+ * output of the process
+ */
+ public InputStream getInputStream();
+
+ /**
+ * Gets an output stream which can be used to write to the standard input stream of the process
+ *
+ * @return the output stream connected to the standard
+ * input of the process
+ */
+ public OutputStream getOutputStream();
+
+ /**
+ * Wait until the process has terminated
+ *
+ * @return the exit value of the process
+ * @throws InterruptedException
+ * if the current thread is
+ * interrupted by another thread while it is waiting
+ */
+ public int waitFor() throws InterruptedException;
+
+ /**
+ * Check if the remote process has completed
+ *
+ * @return true if remote process has completed
+ */
+ public boolean isCompleted();
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessService.java
new file mode 100644
index 00000000000..b38cae6ec09
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessService.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A connection service for starting up processes on a remote.
+ *
+ * @since 2.0
+ */
+public interface IRemoteProcessService extends IRemoteConnection.Service {
+
+ /**
+ * Returns an unmodifiable string map view of the remote environment. The connection must be open prior to calling this method.
+ *
+ * @return the remote environment
+ */
+ public Map<String, String> getEnv();
+
+ /**
+ * Returns the value of an environment variable. The connection must be open prior to calling this method.
+ *
+ * @param name
+ * name of the environment variable
+ * @return value of the environment variable or null if the variable is not defined
+ */
+ public String getEnv(String name);
+
+ /**
+ * Get a process builder for creating remote processes
+ *
+ * @return process builder or null if connection is not open
+ */
+ public IRemoteProcessBuilder getProcessBuilder(List<String> command);
+
+ /**
+ * Get a process builder for creating remote processes
+ *
+ * @return process builder or null if connection is not open
+ */
+ public IRemoteProcessBuilder getProcessBuilder(String... command);
+
+ /**
+ * Get the working directory. Relative paths will be resolved using this path.
+ *
+ * The remote connection does not need to be open to use this method, however a default directory path, rather than the actual
+ * working directory, may be returned in this case.
+ *
+ * @return String representing the current working directory
+ */
+ public String getWorkingDirectory();
+
+ /**
+ * Set the working directory while the connection is open. The working directory will revert to the default when the connection
+ * is closed then subsequently reopened.
+ *
+ * Relative paths will be resolved using this path. The path must be valid and absolute for any changes to be made.
+ *
+ * @param path
+ * String representing the current working directory
+ * @since 4.0
+ */
+ public void setWorkingDirectory(String path);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessSignalService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessSignalService.java
new file mode 100644
index 00000000000..038952be6d7
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessSignalService.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+/**
+ * A service abstraction for signals.
+ *
+ * @since 2.0
+ */
+public interface IRemoteProcessSignalService extends IRemoteProcess.Service {
+ public static final int HUP = 1;
+ public static final int INT = 2;
+ public static final int QUIT = 3;
+ public static final int ILL = 4;
+ public static final int ABRT = 6;
+ public static final int FPE = 8;
+ public static final int KILL = 9;
+ public static final int SEGV = 11;
+ public static final int PIPE = 13;
+ public static final int ALRM = 14;
+ public static final int TERM = 15;
+ public static final int STOP = 17;
+ public static final int TSTP = 18;
+ public static final int CONT = 19;
+ public static final int USR1 = 30;
+ public static final int USR2 = 31;
+
+ /**
+ * Send a signal to the remote process.
+ *
+ * @param signal
+ * signal to send.
+ * @throws RemoteConnectionException
+ * if the underlying connection fails
+ * @since 2.0
+ */
+ void sendSignal(int signal) throws RemoteConnectionException;
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessTerminalService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessTerminalService.java
new file mode 100644
index 00000000000..b9597c5270f
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteProcessTerminalService.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+/**
+ * A service abstraction for remote terminals.
+ *
+ * @since 2.0
+ */
+public interface IRemoteProcessTerminalService extends IRemoteProcess.Service {
+ /**
+ * Change the terminal window dimension interactively. Refer to RFC 4254 6.7. Window Dimension Change Message. The character/row
+ * dimensions override the pixel dimensions (when nonzero). Pixel dimensions refer to the drawable area of the window.
+ *
+ * @param cols
+ * terminal width in characters
+ * @param rows
+ * terminal height in characters
+ * @param width
+ * terminal width in pixels
+ * @param height
+ * terminal height in pixels
+ */
+ void setTerminalSize(int cols, int rows, int width, int height);
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteResource.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteResource.java
new file mode 100644
index 00000000000..06afab93dcf
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteResource.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.net.URI;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Abstraction of a remote resource. There are currently two types of remote resources: fully remote and synchronized. This
+ * interface provides a common mechanism for accessing resource information from either type.
+ *
+ * Usage:
+ *
+ * <code>
+ * IRemoteResource remoteRes = (IRemoteResource)resource.getAdapter(IRemoteResource.class);
+ * if (remoteRes != null) {
+ * URI location = remoteRes.getDefaultLocationURI();
+ * ...
+ * }
+ * </code>
+ *
+ * @author greg
+ * @since 6.0
+ *
+ */
+public interface IRemoteResource {
+ /**
+ * Get the active location URI of the resource in the remote project. Returns null if the URI can't be obtained (@see
+ * {@link IResource#getLocationURI()}).
+ *
+ * For fully remote projects, this is just the URI of the remote resource. For synchronized projects, this is the URI of the
+ * resource from the active synchronization target.
+ *
+ * @return URI or null if URI can't be obtained
+ */
+ public URI getActiveLocationURI();
+
+ /**
+ * Get the platform resource corresponding to the remote resource
+ *
+ * @return IResource
+ */
+ public IResource getResource();
+
+ /**
+ * Synchronize the resource with the underlying filesystem. Performs a refresh for local and remote projects, but causes
+ * synchronized projects to attempt to synchronize with their remote files. May synchronize more than just the single resource.
+ * Blocks until the refresh has completed, so callers should use a job if necessary.
+ *
+ * @param monitor
+ * progress monitor to cancel refresh
+ * @throws CoreException
+ * if the underlying synchronization fails
+ */
+ public void refresh(IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * Set the platform resource
+ *
+ * @param resource
+ * platform resource corresponding to this remote resource
+ */
+ public void setResource(IResource resource);
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java
new file mode 100644
index 00000000000..330a8d06f77
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteServicesManager.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.net.URI;
+import java.util.List;
+
+/**
+ * The main entry point into the remote services system. The remote services manager
+ * is an OSGi service. It provides a list of connection types and the global
+ * list of all connections.
+ *
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @since 2.0
+ */
+public interface IRemoteServicesManager {
+
+ /**
+ * Get the connection type identified by the id
+ *
+ * @param id
+ * id of the connection type
+ * @return connection type or null if the service can not be found
+ */
+ IRemoteConnectionType getConnectionType(String id);
+
+ /**
+ * Get the connection type that provides connections to locations identified by
+ * the URI.
+ *
+ * @param uri
+ * uri of locations to be accessed
+ * @return the connection type that can be used to access the locations
+ * or null if no connection type is available for the uri.
+ */
+ IRemoteConnectionType getConnectionType(URI uri);
+
+ /**
+ * Return the connection type used to access local resources.
+ *
+ * @return the local services
+ */
+ IRemoteConnectionType getLocalConnectionType();
+
+ /**
+ * Returns the list of all connection types including the local services.
+ *
+ * @return all connection types
+ */
+ List<IRemoteConnectionType> 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<IRemoteConnectionType> getConnectionTypesSupporting(Class<? extends IRemoteConnection.Service>... 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<IRemoteConnectionType> getConnectionTypesByService(Class<? extends IRemoteConnectionType.Service>... services);
+
+ /**
+ * Returns the list of connection types except for the local connection type.
+ *
+ * @return all connection types that are really remote
+ */
+ List<IRemoteConnectionType> getRemoteConnectionTypes();
+
+ /**
+ * Returns the list of all known remote connections.
+ *
+ * @return all remote connections
+ */
+ List<IRemoteConnection> getAllRemoteConnections();
+
+ /**
+ * Add a global connection change listener that receives events for all connections.
+ *
+ * @param listener
+ * global connection change listener to be added
+ */
+ void addRemoteConnectionChangeListener(IRemoteConnectionChangeListener listener);
+
+ /**
+ * Remove the global connection change listener.
+ *
+ * @param listener
+ * global connection change listener to be removed
+ */
+ void removeRemoteConnectionChangeListener(IRemoteConnectionChangeListener listener);
+
+ /**
+ * Used by connections and other components to notify the global connection
+ * change listeners of events.
+ *
+ * @param event
+ * connection change event
+ */
+ void fireRemoteConnectionChangeEvent(RemoteConnectionChangeEvent event);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IUserAuthenticatorService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IUserAuthenticatorService.java
new file mode 100644
index 00000000000..e497335c32c
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/IUserAuthenticatorService.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007, 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Atsuhiko Yamanaka, JCraft,Inc. - adding promptForKeyboradInteractive method
+ * - copying this class from cvs.core plug-in.
+ * Greg Watson, IBM - modified for use with PTP
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.net.PasswordAuthentication;
+
+/**
+ * Allow clients to provide their own user interface for connection authentication.
+ *
+ * @since 2.0
+ */
+public interface IUserAuthenticatorService extends IRemoteConnection.Service {
+
+ /**
+ * ID for an "Ok" response (value 0).
+ */
+ public final static int OK = 0;
+
+ /**
+ * ID for a "Cancel" response (value 1).
+ */
+ public final static int CANCEL = 1;
+
+ /**
+ * ID for a "Yes" response (value 2).
+ */
+ public final static int YES = 2;
+
+ /**
+ * ID for a "No" response (value 3).
+ */
+ public final static int NO = 3;
+
+ /**
+ * Constant for a prompt with no type (value 0).
+ */
+ public final static int NONE = 0;
+
+ /**
+ * Constant for an error prompt (value 1).
+ */
+ public final static int ERROR = 1;
+
+ /**
+ * Constant for an information prompt (value 2).
+ */
+ public final static int INFORMATION = 2;
+
+ /**
+ * Constant for a question prompt (value 3).
+ */
+ public final static int QUESTION = 3;
+
+ /**
+ * Constant for a warning dialog (value 4).
+ */
+ public final static int WARNING = 4;
+
+ /**
+ * Authenticates the user for access.
+ * The obtained values for user name and password will be placed
+ * into returned object. Implementors are allowed to
+ * save user names and passwords. The user should be prompted for
+ * user name and password if there is no saved one.
+ *
+ * @param username
+ * The initial username, or null if there is no initial username
+ * @param message
+ * An optional message to display if, e.g., previous authentication failed.
+ */
+ public PasswordAuthentication prompt(String username, String message);
+
+ /**
+ * Prompts the user for a number values using text fields. The labels are provided in
+ * the <core>prompt</code> array. Implementors will return the entered values, or null if
+ * the user cancels the prompt.
+ *
+ * @param destination
+ * the destination in the format like username@hostname:port
+ * @param name
+ * a name for this dialog
+ * @param message
+ * the message to be displayed to the user
+ * @param prompt
+ * labels for each of the text fields.
+ * @param echo
+ * an array to show which fields are secret
+ * @return the entered values, or null if the user canceled.
+ */
+ public String[] prompt(String destination, String name, String message, String[] prompt, boolean[] echo);
+
+ /**
+ * Prompts for additional information regarding this authentication
+ * request. A default implementation of this method should return the <code>defaultResponse</code>,
+ * whereas alternate implementations could prompt the user with a dialog.
+ *
+ * @param promptType
+ * one of the following values:
+ * <ul>
+ * <li> <code>NONE</code> for a unspecified prompt type</li>
+ * <li> <code>ERROR</code> for an error prompt</li>
+ * <li> <code>INFORMATION</code> for an information prompt</li>
+ * <li> <code>QUESTION </code> for a question prompt</li>
+ * <li> <code>WARNING</code> for a warning prompt</li>
+ * </ul>
+ * @param title
+ * the prompt title that could be displayed to the user
+ * @param message
+ * the message to display to the user
+ * @param promptResponses
+ * the possible responses to the prompt (e.g. corresponding to buttons on a dialog)
+ * @param defaultResponseIndex
+ * the default response to the prompt
+ * @return the response to the prompt
+ */
+ public int prompt(int promptType, String title, String message, int[] promptResponses, int defaultResponseIndex);
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionChangeEvent.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionChangeEvent.java
new file mode 100644
index 00000000000..661c70b2423
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionChangeEvent.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+/**
+ * Event representing a change in connection status. The {@link #getType()} method can be used to obtain information about the type
+ * of event that occurred.
+ *
+ * @since 2.0
+ */
+public class RemoteConnectionChangeEvent {
+
+ /**
+ * Event indicating that the connection was closed.
+ */
+ public static final int CONNECTION_CLOSED = 1 << 0;
+
+ /**
+ * Event indicating that the connection was opened.
+ */
+ public static final int CONNECTION_OPENED = 1 << 1;
+
+ /**
+ * Event indicating that the connection was closed abnormally.
+ */
+ public static final int CONNECTION_ABORTED = 1 << 2;
+
+ /**
+ * Event indicating that the connection name will be changed. It is sent prior to the name change taking place.
+ * The event passes an IRemoteConnectionWorkingCopy so that the original and new name can be used by the listener.
+ */
+ public static final int CONNECTION_RENAMED = 1 << 3;
+
+ /**
+ * Event indicating the connection was added.
+ * @since 2.0
+ */
+ public static final int CONNECTION_ADDED = 1 << 4;
+
+ /**
+ * Event indicating the connection is about to be removed.
+ * @since 2.0
+ */
+ public static final int CONNECTION_REMOVED = 1 << 5;
+
+ /**
+ * Event indicating the connection attributes had changed.
+ * @since 4.0
+ */
+ public static final int ATTRIBUTES_CHANGED = 1 << 6;
+
+ private final IRemoteConnection connection;
+ private final int type;
+
+ public RemoteConnectionChangeEvent(IRemoteConnection connection, int type) {
+ this.connection = connection;
+ this.type = type;
+ }
+
+ /**
+ * Get the connection that has changed.
+ *
+ * @return IRemoteConnection
+ */
+ public IRemoteConnection getConnection() {
+ return connection;
+ }
+
+ /**
+ * Returns the type of event being reported. This type
+ * is obtained by bitwise OR'ing the event types together.
+ *
+ * {@link #CONNECTION_CLOSED} {@link #CONNECTION_OPENED} {@link #CONNECTION_ABORTED} {@link #CONNECTION_RENAMED}
+ *
+ * @return a bitwise OR of event type constants
+ */
+ public int getType() {
+ return type;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionPropertyTester.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionPropertyTester.java
new file mode 100644
index 00000000000..8d78ccea991
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteConnectionPropertyTester.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2016 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import org.eclipse.core.expressions.PropertyTester;
+
+/**
+ * @since 2.1
+ */
+public class RemoteConnectionPropertyTester extends PropertyTester {
+
+ @Override
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof IRemoteConnection) {
+ if (property.equals("isConnectionType")) {
+ IRemoteConnection connection = (IRemoteConnection) receiver;
+ if (connection.getConnectionType().getId().equals(expectedValue)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteProcessAdapter.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteProcessAdapter.java
new file mode 100644
index 00000000000..0eb03c2f25d
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteProcessAdapter.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Utility class to adapt an IRemoteProcess to a java.lang.Process
+ *
+ * @author crecoskie
+ *
+ */
+public class RemoteProcessAdapter extends Process {
+
+ private final IRemoteProcess fProcess;
+
+ public RemoteProcessAdapter(IRemoteProcess process) {
+ fProcess = process;
+ }
+
+ @Override
+ public void destroy() {
+ fProcess.destroy();
+
+ }
+
+ @Override
+ public int exitValue() {
+ return fProcess.exitValue();
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ return fProcess.getErrorStream();
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return fProcess.getInputStream();
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ return fProcess.getOutputStream();
+ }
+
+ @Override
+ public int waitFor() throws InterruptedException {
+ return fProcess.waitFor();
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteServicesUtils.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteServicesUtils.java
new file mode 100644
index 00000000000..b135c5827d6
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/RemoteServicesUtils.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ * Martin Oberhuber - [468889] Support Eclipse older than Mars
+ *******************************************************************************/
+package org.eclipse.remote.core;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.remote.internal.core.RemoteCorePlugin;
+import org.eclipse.remote.internal.core.RemotePath;
+import org.eclipse.remote.internal.core.preferences.Preferences;
+
+/**
+ * Remote services utility methods.
+ */
+public class RemoteServicesUtils {
+ /**
+ * Constructs a new POSIX path from the given string path. The string path
+ * must represent a valid file system path on a POSIX file system. The path
+ * is canonicalized and double slashes are removed except at the beginning
+ * (to handle UNC paths). All forward slashes ('/') are treated as segment
+ * delimiters. This factory method should be used if the string path is for
+ * a POSIX file system.
+ *
+ * @param path the string path
+ * @see org.eclipse.core.runtime.Path#forPosix(String)
+ * @since 2.0
+ */
+ public static IPath posixPath(String path) {
+ try {
+ //Use the Mars implementation of Path, see bug 454959
+ return Path.forPosix(path);
+ } catch (NoSuchMethodError e) {
+ //TODO For older Eclipse, use the fallback below. That code should be
+ //removed when support for Eclipse older than Mars is no longer needed.
+ return RemotePath.forPosix(path);
+ }
+ }
+
+ /**
+ * Convert a UNC path to a URI
+ *
+ * Maps the UNC server component to a connection known by one of the remote service implementations. It is assumed that the
+ * server component is of the form "[connection_type_id:]connection_name". If the "connection_type_id:" part is omitted then the
+ * current connection type preference is used by default. If no preference is set, then each implementation is tried until
+ * a matching connection name is found.
+ *
+ * @param path
+ * UNC path
+ * @return corresponding URI or null if not a valid path
+ */
+ public static URI toURI(IPath path) {
+ if (path.isUNC()) {
+ IRemoteServicesManager manager = RemoteCorePlugin.getService(IRemoteServicesManager.class);
+ /*
+ * Split the server component if possible.
+ */
+ String[] parts = path.segment(0).split(":"); //$NON-NLS-1$
+ IRemoteConnectionType services = null;
+ String connName = null;
+ if (parts.length == 2) {
+ services = manager.getConnectionType(parts[0]);
+ connName = parts[1];
+ } else if (parts.length == 1) {
+ String id = Preferences.getString(IRemotePreferenceConstants.PREF_CONNECTION_TYPE_ID);
+ if (id != null) {
+ services = manager.getConnectionType(id);
+ }
+ connName = parts[0];
+ }
+
+ /*
+ * If we've found the remote services then look up the connection, otherwise iterate through all available services
+ * checking for the connection name.
+ */
+ IRemoteConnection conn = null;
+ if (services != null) {
+ conn = services.getConnection(connName);
+ } else if (connName != null) {
+ for (IRemoteConnectionType s : manager.getAllConnectionTypes()) {
+ if (s != null) {
+ conn = s.getConnection(connName);
+ if (conn != null) {
+ break;
+ }
+ }
+ }
+ }
+
+ /*
+ * If a connection was found then convert it to a URI.
+ */
+ if (conn != null) {
+ String scheme = conn.getConnectionType().getScheme();
+ String filePath = path.removeFirstSegments(1).makeAbsolute().toString();
+ try {
+ return new URI(scheme, connName, filePath, null, null);
+ } catch (URISyntaxException e) {
+ // Ignore
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/AddressInUseException.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/AddressInUseException.java
new file mode 100644
index 00000000000..2f797393327
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/AddressInUseException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.core.exception;
+
+/**
+ * Exception thrown when a connection address is already in use.
+ *
+ */
+public class AddressInUseException extends RemoteConnectionException {
+ private static final long serialVersionUID = 1771839754428411610L;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public AddressInUseException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public AddressInUseException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public AddressInUseException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/ConnectionExistsException.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/ConnectionExistsException.java
new file mode 100644
index 00000000000..4848696e6d2
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/ConnectionExistsException.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core.exception;
+
+/**
+ * Thrown when trying to add a connection with the same name as an existing
+ * connection, or when trying to rename a connection to the same name as an
+ * existing connection.
+ *
+ * @since 2.0
+ */
+public class ConnectionExistsException extends RemoteConnectionException {
+
+ private static final long serialVersionUID = -1591235868439783613L;
+
+ public ConnectionExistsException(String message) {
+ super(message);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/PrivilegedPortException.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/PrivilegedPortException.java
new file mode 100644
index 00000000000..192577d21f2
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/PrivilegedPortException.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.core.exception;
+
+/**
+ * Exception thrown when an attempt is made to use a privileged port.
+ */
+public class PrivilegedPortException extends RemoteConnectionException {
+ private static final long serialVersionUID = -7794871221470179956L;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public PrivilegedPortException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public PrivilegedPortException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public PrivilegedPortException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/RemoteConnectionException.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/RemoteConnectionException.java
new file mode 100644
index 00000000000..81157e01319
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/RemoteConnectionException.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.core.exception;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.remote.internal.core.RemoteCorePlugin;
+
+/**
+ * Exception thrown when a remote connection error occurs.
+ */
+public class RemoteConnectionException extends CoreException {
+ private static final long serialVersionUID = -7794871221470179956L;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public RemoteConnectionException(String message, Throwable cause) {
+ super(new Status(IStatus.ERROR, RemoteCorePlugin.getUniqueIdentifier(), message, cause));
+ }
+
+ /**
+ * @param message
+ */
+ public RemoteConnectionException(String message) {
+ this(message, null);
+ }
+
+ /**
+ * @param cause
+ */
+ public RemoteConnectionException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/UnableToForwardPortException.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/UnableToForwardPortException.java
new file mode 100644
index 00000000000..45c42a84c89
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/exception/UnableToForwardPortException.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.core.exception;
+
+/**
+ * Exception thrown when a port is unable to be forwarded.
+ */
+public class UnableToForwardPortException extends RemoteConnectionException {
+ /**
+ *
+ */
+ private static final long serialVersionUID = -5814772755700213717L;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public UnableToForwardPortException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public UnableToForwardPortException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public UnableToForwardPortException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/launch/IRemoteLaunchConfigService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/launch/IRemoteLaunchConfigService.java
new file mode 100644
index 00000000000..913ab81dd7a
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/core/launch/IRemoteLaunchConfigService.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.core.launch;
+
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.remote.core.IRemoteConnection;
+
+/**
+ * Manages and persists the mapping between launch configurations and
+ * remote connections that they run on. Each launch configuration has an
+ * active remote connection.
+ *
+ * @since 2.0
+ */
+public interface IRemoteLaunchConfigService {
+
+ /**
+ * Sets the active remote connection for the given launch configuration.
+ *
+ * @param launchConfig launch configuration
+ * @param connection active remote connection
+ */
+ void setActiveConnection(ILaunchConfiguration launchConfig, IRemoteConnection connection);
+
+ /**
+ * Gets the active remote connection for the given launch configuration
+ * @param launchConfig launch configuration
+ * @return active remote connection
+ */
+ IRemoteConnection getActiveConnection(ILaunchConfiguration launchConfig);
+
+ /**
+ * For a given launch configuration type, get the remote connection that was last
+ * used by a launch configuration of that type.
+ *
+ * This is used for new launch configurations with the assumption that the user
+ * will want to use the same remote connection.
+ *
+ * @param launchConfigType launch configuration type
+ * @return last active remote configuration
+ */
+ IRemoteConnection getLastActiveConnection(ILaunchConfigurationType launchConfigType);
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java
new file mode 100644
index 00000000000..015843de9b9
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnection.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.equinox.security.storage.ISecurePreferences;
+import org.eclipse.equinox.security.storage.StorageException;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.IRemoteConnectionPropertyService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.eclipse.remote.core.exception.ConnectionExistsException;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * The standard root class for remote connections. Implements common hook up
+ * with the remote services and the remote services manager as well as handling
+ * for services.
+ */
+public class RemoteConnection implements IRemoteConnection {
+
+ private final RemoteConnectionType connectionType;
+ private String name;
+
+ private final Map<Class<? extends Service>, Service> servicesMap = new HashMap<>();
+
+ private final ListenerList fListeners = new ListenerList();
+
+ final static String EMPTY_STRING = ""; //$NON-NLS-1$
+
+ public RemoteConnection(RemoteConnectionType connectionType, String name) {
+ this.connectionType = connectionType;
+ this.name = name;
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(Class<T> service) {
+ T obj = (T) servicesMap.get(service);
+ if (obj == null) {
+ obj = connectionType.getConnectionService(this, service);
+ if (obj != null) {
+ servicesMap.put(service, obj);
+ }
+ }
+
+ return obj;
+ }
+
+ @Override
+ public <T extends Service> boolean hasService(Class<T> service) {
+ return servicesMap.get(service.getName()) != null || connectionType.hasConnectionService(service);
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Called from working copy when name has changed.
+ *
+ * @param name
+ * the new name
+ */
+ void rename(String newName) throws ConnectionExistsException {
+ try {
+ // Copy the old preferences over and remove the old node
+ if (connectionType.getPreferenceNode().nodeExists(newName)) {
+ throw new ConnectionExistsException(newName);
+ }
+
+ Preferences newPrefs = connectionType.getPreferenceNode().node(URLEncoder.encode(newName, "UTF-8"));
+ Preferences oldPrefs = getPreferences();
+ for (String key : oldPrefs.keys()) {
+ newPrefs.put(key, oldPrefs.get(key, null));
+ }
+
+ oldPrefs.removeNode();
+ } catch (BackingStoreException | UnsupportedEncodingException e) {
+ RemoteCorePlugin.log(e);
+ }
+
+ this.name = newName;
+ }
+
+ Preferences getPreferences() {
+ try {
+ return connectionType.getPreferenceNode().node(URLEncoder.encode(name, "UTF-8")); //$NON-NLS-1$
+ } catch (UnsupportedEncodingException e) {
+ // Should not happen!
+ throw new RuntimeException(e);
+ }
+ }
+
+ ISecurePreferences getSecurePreferences() {
+ try {
+ return connectionType.getSecurePreferencesNode().node(URLEncoder.encode(name, "UTF-8")); //$NON-NLS-1$
+ } catch (UnsupportedEncodingException e) {
+ // Should not happen!
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public String getAttribute(String key) {
+ return getPreferences().get(key, EMPTY_STRING);
+ }
+
+ @Override
+ public String getSecureAttribute(String key) {
+ try {
+ return getSecurePreferences().get(key, EMPTY_STRING);
+ } catch (StorageException e) {
+ RemoteCorePlugin.log(e);
+ return EMPTY_STRING;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy getWorkingCopy() {
+ return new RemoteConnectionWorkingCopy(this);
+ }
+
+ @Override
+ public String getProperty(String key) {
+ IRemoteConnectionPropertyService propertyService = getService(IRemoteConnectionPropertyService.class);
+ if (propertyService != null) {
+ return propertyService.getProperty(key);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void open(IProgressMonitor monitor) throws RemoteConnectionException {
+ IRemoteConnectionControlService controlService = getService(IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ controlService.open(monitor);
+ }
+ }
+
+ @Override
+ public void close() {
+ IRemoteConnectionControlService controlService = getService(IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ controlService.close();
+ }
+ }
+
+ @Override
+ public boolean isOpen() {
+ IRemoteConnectionControlService controlService = getService(IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ return controlService.isOpen();
+ } else {
+ // default is always open
+ return true;
+ }
+ }
+
+ @Override
+ public void addConnectionChangeListener(IRemoteConnectionChangeListener listener) {
+ fListeners.add(listener);
+ }
+
+ @Override
+ public void removeConnectionChangeListener(IRemoteConnectionChangeListener listener) {
+ fListeners.remove(listener);
+ }
+
+ @Override
+ public void fireConnectionChangeEvent(final int type) {
+ RemoteConnectionChangeEvent event = new RemoteConnectionChangeEvent(this, type);
+ for (Object listener : fListeners.getListeners()) {
+ ((IRemoteConnectionChangeListener) listener).connectionChanged(event);
+ }
+ // fire to the global listeners too
+ connectionType.getRemoteServicesManager().fireRemoteConnectionChangeEvent(event);
+ }
+
+ @Override
+ public String toString() {
+ return name + " - " + connectionType.getName(); //$NON-NLS-1$
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java
new file mode 100644
index 00000000000..3bfe570ea18
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionType.java
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.equinox.security.storage.ISecurePreferences;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.eclipse.remote.core.exception.ConnectionExistsException;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * The implementation for a given remote services collection.n
+ */
+public class RemoteConnectionType implements IRemoteConnectionType {
+
+ private final RemoteServicesManager remoteServicesManager;
+ private final String id;
+ private final String name;
+ private final String scheme;
+ private final boolean canAdd;
+ private final boolean canEdit;
+ private final boolean canRemove;
+
+ private final Map<Class<? extends Service>, Object> serviceMap = new HashMap<>();
+ private final Map<String, IConfigurationElement> serviceDefinitionMap = new HashMap<>();
+ private final Map<String, IConfigurationElement> connectionServiceDefinitionMap = new HashMap<>();
+ private final Map<String, IConfigurationElement> processServiceDefinitionMap = new HashMap<>();
+
+ private final Map<String, RemoteConnection> connections = new HashMap<>();
+
+ public RemoteConnectionType(IConfigurationElement ce, RemoteServicesManager manager) {
+ this.remoteServicesManager = manager;
+ id = ce.getAttribute("id"); //$NON-NLS-1$
+ name = ce.getAttribute("name"); //$NON-NLS-1$
+ scheme = ce.getAttribute("scheme"); //$NON-NLS-1$
+
+ // capabilities, default is true for all of these
+ String canAddStr = ce.getAttribute("canAdd"); //$NON-NLS-1$
+ canAdd = canAddStr != null ? Boolean.parseBoolean(canAddStr) : true;
+
+ String canEditStr = ce.getAttribute("canEdit"); //$NON-NLS-1$
+ canEdit = canEditStr != null ? Boolean.parseBoolean(canEditStr) : true;
+
+ String canRemoveStr = ce.getAttribute("canRemove"); //$NON-NLS-1$
+ canRemove = canRemoveStr != null ? Boolean.parseBoolean(canRemoveStr) : true;
+
+ // load up existing connections
+ try {
+ for (String nodeName : getPreferenceNode().childrenNames()) {
+ String connectionName = URLDecoder.decode(nodeName, "UTF-8");
+ connections.put(connectionName, new RemoteConnection(this, connectionName));
+ }
+ } catch (BackingStoreException | UnsupportedEncodingException e) {
+ RemoteCorePlugin.log(e);
+ }
+ }
+
+ Preferences getPreferenceNode() {
+ return remoteServicesManager.getPreferenceNode().node(id);
+ }
+
+ ISecurePreferences getSecurePreferencesNode() {
+ return remoteServicesManager.getSecurePreferenceNode().node(id);
+ }
+
+ @Override
+ public IRemoteServicesManager getRemoteServicesManager() {
+ return remoteServicesManager;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getScheme() {
+ return scheme;
+ }
+
+ @Override
+ public boolean canAdd() {
+ return canAdd;
+ }
+
+ @Override
+ public boolean canEdit() {
+ return canEdit;
+ }
+
+ @Override
+ public boolean canRemove() {
+ return canRemove;
+ }
+
+ @Override
+ public <T extends Service> T getService(Class<T> service) {
+ synchronized (serviceDefinitionMap) {
+ @SuppressWarnings("unchecked")
+ T obj = (T) serviceMap.get(service);
+ if (obj == null) {
+ IConfigurationElement ce = serviceDefinitionMap.get(service.getName());
+ if (ce != null) {
+ try {
+ Service.Factory factory = (Service.Factory) ce.createExecutableExtension("factory"); //$NON-NLS-1$
+ if (factory != null) {
+ obj = factory.getService(this, service);
+ serviceMap.put(service, obj);
+ }
+ } catch (CoreException e) {
+ RemoteCorePlugin.log(e.getStatus());
+ }
+ }
+ }
+ return obj;
+ }
+ }
+
+ @Override
+ public List<String> getServices() {
+ synchronized (serviceDefinitionMap) {
+ return new ArrayList<>(serviceDefinitionMap.keySet());
+ }
+ }
+
+ @Override
+ public <T extends Service> boolean hasService(Class<T> service) {
+ synchronized (serviceDefinitionMap) {
+ return serviceDefinitionMap.get(service.getName()) != null;
+ }
+ }
+
+ /**
+ * Called from the connection to get a service object for that connection.
+ *
+ * @param connection
+ * the connection to which the service applies
+ * @param service
+ * the interface the service must implement
+ * @return the service object
+ * @throws CoreException
+ */
+ public <T extends IRemoteConnection.Service> T getConnectionService(IRemoteConnection connection,
+ Class<T> service) {
+ synchronized (connectionServiceDefinitionMap) {
+ IConfigurationElement ce = connectionServiceDefinitionMap.get(service.getName());
+ if (ce != null) {
+ try {
+ IRemoteConnection.Service.Factory factory = (IRemoteConnection.Service.Factory) ce
+ .createExecutableExtension("factory"); //$NON-NLS-1$
+ if (factory != null) {
+ return factory.getService(connection, service);
+ }
+ } catch (CoreException e) {
+ RemoteCorePlugin.log(e.getStatus());
+ }
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public List<String> getConnectionServices() {
+ synchronized (connectionServiceDefinitionMap) {
+ return new ArrayList<>(connectionServiceDefinitionMap.keySet());
+ }
+ }
+
+ @Override
+ public <T extends IRemoteConnection.Service> boolean hasConnectionService(Class<T> service) {
+ synchronized (connectionServiceDefinitionMap) {
+ return connectionServiceDefinitionMap.get(service.getName()) != null;
+ }
+ }
+
+ /**
+ * Called from the remote process to get a service object for that process.
+ *
+ * @param process
+ * the process to which the service applies
+ * @param service
+ * the interface the service must implement
+ * @return the service object
+ * @throws CoreException
+ */
+ public <T extends IRemoteProcess.Service> T getProcessService(IRemoteProcess process, Class<T> service) {
+ synchronized (processServiceDefinitionMap) {
+ IConfigurationElement ce = processServiceDefinitionMap.get(service.getName());
+ if (ce != null) {
+ try {
+ IRemoteProcess.Service.Factory factory = (IRemoteProcess.Service.Factory) ce
+ .createExecutableExtension("factory"); //$NON-NLS-1$
+ if (factory != null) {
+ return factory.getService(process, service);
+ }
+ } catch (CoreException e) {
+ RemoteCorePlugin.log(e.getStatus());
+ }
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public List<String> getProcessServices() {
+ synchronized (processServiceDefinitionMap) {
+ return new ArrayList<>(processServiceDefinitionMap.keySet());
+ }
+ }
+
+ @Override
+ public <T extends IRemoteProcess.Service> boolean hasProcessService(Class<T> service) {
+ synchronized (processServiceDefinitionMap) {
+ return processServiceDefinitionMap.get(service.getName()) != null;
+ }
+ }
+
+ /**
+ * Called from the remote service manager to register a service extension for
+ * this remote services implementation
+ *
+ * @param ce
+ * the extension element defining the service
+ */
+ public void addService(IConfigurationElement ce) {
+ String serviceName = ce.getAttribute("service"); //$NON-NLS-1$
+ String name = ce.getName();
+ switch (name) {
+ case "connectionTypeService": //$NON-NLS-1$
+ serviceDefinitionMap.put(serviceName, ce);
+ break;
+ case "connectionService": //$NON-NLS-1$
+ connectionServiceDefinitionMap.put(serviceName, ce);
+ break;
+ case "processService": //$NON-NLS-1$
+ processServiceDefinitionMap.put(serviceName, ce);
+ break;
+ }
+ }
+
+ /**
+ * Signal connection has been added.
+ *
+ * @since 2.0
+ */
+ protected void connectionAdded(final IRemoteConnection connection) {
+ RemoteConnectionChangeEvent event = new RemoteConnectionChangeEvent(connection,
+ RemoteConnectionChangeEvent.CONNECTION_ADDED);
+ remoteServicesManager.fireRemoteConnectionChangeEvent(event);
+ }
+
+ /**
+ * Signal a connection is about to be removed.
+ *
+ * @since 2.0
+ */
+ protected void connectionRemoved(final IRemoteConnection connection) {
+ RemoteConnectionChangeEvent event = new RemoteConnectionChangeEvent(connection,
+ RemoteConnectionChangeEvent.CONNECTION_REMOVED);
+ remoteServicesManager.fireRemoteConnectionChangeEvent(event);
+ }
+
+ @Override
+ public IRemoteConnection getConnection(String name) {
+ synchronized (connections) {
+ return connections.get(name);
+ }
+ }
+
+ @Override
+ public IRemoteConnection getConnection(URI uri) {
+ synchronized (connections) {
+ IRemoteConnection connection = connections.get(uri.getAuthority());
+ if (connection != null) {
+ return connection;
+ }
+
+ // If it's a file: scheme we must be the local connection type, just return our
+ // hopefully one connection, the Local connection.
+ if (uri.getScheme().equals("file") && !connections.isEmpty()) { //$NON-NLS-1$
+ return connections.values().iterator().next();
+ }
+
+ return null;
+ }
+ }
+
+ @Override
+ public List<IRemoteConnection> getConnections() {
+ synchronized (connections) {
+ return new ArrayList<>(connections.values());
+ }
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy newConnection(String name) throws RemoteConnectionException {
+ synchronized (connections) {
+ if (connections.containsKey(name)) {
+ throw new ConnectionExistsException(name);
+ }
+ return new RemoteConnectionWorkingCopy(this, name);
+ }
+ }
+
+ void addConnection(RemoteConnection remoteConnection) {
+ synchronized (connections) {
+ connections.put(remoteConnection.getName(), remoteConnection);
+ }
+ }
+
+ void removeConnection(String name) {
+ synchronized (connections) {
+ connections.remove(name);
+ }
+ }
+
+ @Override
+ public void removeConnection(IRemoteConnection connection) throws RemoteConnectionException {
+ synchronized (connections) {
+ if (connection instanceof RemoteConnection) {
+ connection.close();
+ RemoteConnection conn = (RemoteConnection) connection;
+ try {
+ conn.getPreferences().removeNode();
+ } catch (BackingStoreException e) {
+ throw new RemoteConnectionException(e);
+ }
+ conn.getSecurePreferences().removeNode();
+ connections.remove(conn.getName());
+ connection.fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_REMOVED);
+ } else {
+ RemoteCorePlugin
+ .log("Wrong class for " + connection.getName() + ", was " + connection.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java
new file mode 100644
index 00000000000..e304bb3d69d
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteConnectionWorkingCopy.java
@@ -0,0 +1,314 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.equinox.security.storage.ISecurePreferences;
+import org.eclipse.equinox.security.storage.StorageException;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.IRemoteConnectionPropertyService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+public class RemoteConnectionWorkingCopy implements IRemoteConnectionWorkingCopy {
+
+ private RemoteConnection original;
+ private final RemoteConnectionType connectionType;
+ private String newName;
+ private final Map<String, String> newAttributes = new HashMap<>();
+ private final Map<String, String> newSecureAttributes = new HashMap<>();
+ private final List<IRemoteConnectionChangeListener> newListeners = new ArrayList<>();
+
+ /**
+ * New Connection.
+ */
+ public RemoteConnectionWorkingCopy(RemoteConnectionType connectionType, String name) {
+ this.connectionType = connectionType;
+ this.newName = name;
+ }
+
+ /**
+ * Edit Connection
+ */
+ public RemoteConnectionWorkingCopy(RemoteConnection original) {
+ this.original = original;
+ this.connectionType = (RemoteConnectionType) original.getConnectionType();
+ }
+
+ @Override
+ public String getName() {
+ if (newName != null) {
+ return newName;
+ }
+
+ if (original != null) {
+ return original.getName();
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setName(String name) {
+ // set it only if it's changed
+ if (original == null || !name.equals(original.getName())) {
+ newName = name;
+ }
+ }
+
+ @Override
+ public String getAttribute(String key) {
+ String value = newAttributes.get(key);
+ if (value != null) {
+ return value;
+ }
+
+ if (original != null) {
+ return original.getAttribute(key);
+ }
+
+ return RemoteConnection.EMPTY_STRING;
+ }
+
+ @Override
+ public void setAttribute(String key, String value) {
+ // set only if it's changed or value is null
+ if (original == null || value == null || !value.equals(original.getAttribute(key))) {
+ newAttributes.put(key, value);
+ }
+ }
+
+ @Override
+ public String getSecureAttribute(String key) {
+ String value = newSecureAttributes.get(key);
+ if (value != null) {
+ return value;
+ }
+
+ if (original != null) {
+ return original.getSecureAttribute(key);
+ }
+
+ return RemoteConnection.EMPTY_STRING;
+ }
+
+ @Override
+ public void setSecureAttribute(String key, String value) {
+ // set only if it's changed or value is null
+ if (original == null || value == null || !value.equals(original.getSecureAttribute(key))) {
+ newSecureAttributes.put(key, value);
+ }
+ }
+
+ @Override
+ public void addConnectionChangeListener(IRemoteConnectionChangeListener listener) {
+ if (original != null) {
+ original.addConnectionChangeListener(listener);
+ } else {
+ newListeners.add(listener);
+ }
+ }
+
+ @Override
+ public void removeConnectionChangeListener(IRemoteConnectionChangeListener listener) {
+ if (original != null) {
+ original.removeConnectionChangeListener(listener);
+ } else {
+ newListeners.remove(listener);
+ }
+ }
+
+ @Override
+ public void fireConnectionChangeEvent(int type) {
+ if (original != null && type != RemoteConnectionChangeEvent.CONNECTION_RENAMED) {
+ original.fireConnectionChangeEvent(type);
+ } else {
+ RemoteConnectionChangeEvent event = new RemoteConnectionChangeEvent(this, type);
+ for (IRemoteConnectionChangeListener listener : newListeners) {
+ listener.connectionChanged(event);
+ }
+ connectionType.getRemoteServicesManager().fireRemoteConnectionChangeEvent(event);
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy getWorkingCopy() {
+ return this;
+ }
+
+ @Override
+ public <T extends Service> T getService(Class<T> service) {
+ return connectionType.getConnectionService(this, service);
+ }
+
+ @Override
+ public <T extends Service> boolean hasService(Class<T> service) {
+ if (original != null) {
+ return original.hasService(service);
+ } else {
+ return connectionType.hasConnectionService(service);
+ }
+ }
+
+ @Override
+ public IRemoteConnection getOriginal() {
+ return original;
+ }
+
+ @Override
+ public boolean isDirty() {
+ return newName != null || !newAttributes.isEmpty() || !newSecureAttributes.isEmpty();
+ }
+
+ @Override
+ public IRemoteConnection save() throws RemoteConnectionException {
+ if (newName != null && original != null) {
+ // rename, delete the old one
+ fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_RENAMED);
+ connectionType.removeConnection(original.getName());
+ original.rename(newName);
+ }
+
+ boolean added = false;
+ if (original == null) {
+ original = new RemoteConnection(connectionType, newName);
+ added = true;
+ }
+
+ Preferences prefs = original.getPreferences();
+ for (Map.Entry<String, String> entry : newAttributes.entrySet()) {
+ String value = entry.getValue();
+ if (value != null && !value.isEmpty()) {
+ prefs.put(entry.getKey(), value);
+ } else {
+ prefs.remove(entry.getKey());
+ }
+ }
+ try {
+ prefs.flush();
+ } catch (BackingStoreException e1) {
+ throw new RemoteConnectionException(e1);
+ }
+
+ ISecurePreferences securePrefs = original.getSecurePreferences();
+ for (Map.Entry<String, String> entry : newSecureAttributes.entrySet()) {
+ String value = entry.getValue();
+ if (value != null && !value.isEmpty()) {
+ try {
+ securePrefs.put(entry.getKey(), value, true);
+ } catch (StorageException e) {
+ throw new RemoteConnectionException(e);
+ }
+ } else {
+ securePrefs.remove(entry.getKey());
+ }
+ }
+ try {
+ securePrefs.flush();
+ } catch (IOException e) {
+ throw new RemoteConnectionException(e);
+ }
+
+ if (newAttributes.size() > 0 || newSecureAttributes.size() > 0) {
+ original.fireConnectionChangeEvent(RemoteConnectionChangeEvent.ATTRIBUTES_CHANGED);
+ }
+
+ /*
+ * Reset state for isDirty()
+ */
+ newAttributes.clear();
+ newSecureAttributes.clear();
+ newName = null;
+
+ connectionType.addConnection(original);
+ if (added) {
+ original.fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_ADDED);
+ }
+ return original;
+ }
+
+ @Override
+ public void open(IProgressMonitor monitor) throws RemoteConnectionException {
+ if (original != null) {
+ original.open(monitor);
+ } else {
+ IRemoteConnectionControlService controlService = connectionType.getConnectionService(this,
+ IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ controlService.open(monitor);
+ }
+ }
+ }
+
+ @Override
+ public void close() {
+ if (original != null) {
+ original.close();
+ } else {
+ IRemoteConnectionControlService controlService = connectionType.getConnectionService(this,
+ IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ controlService.close();
+ }
+ }
+ }
+
+ @Override
+ public boolean isOpen() {
+ if (original != null) {
+ return original.isOpen();
+ }
+
+ IRemoteConnectionControlService controlService = connectionType.getConnectionService(this,
+ IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ return controlService.isOpen();
+ }
+
+ return true;
+ }
+
+ @Override
+ public String getProperty(String key) {
+ if (original != null) {
+ return original.getProperty(key);
+ }
+
+ IRemoteConnectionPropertyService propertyService = connectionType.getConnectionService(this,
+ IRemoteConnectionPropertyService.class);
+ if (propertyService != null) {
+ return propertyService.getProperty(key);
+ }
+
+ return null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteCorePlugin.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteCorePlugin.java
new file mode 100644
index 00000000000..b115c3f34fe
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteCorePlugin.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import org.eclipse.core.resources.ISaveContext;
+import org.eclipse.core.resources.ISaveParticipant;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.launch.IRemoteLaunchConfigService;
+import org.eclipse.remote.internal.core.launch.RemoteLaunchConfigService;
+import org.eclipse.remote.internal.core.preferences.Preferences;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class RemoteCorePlugin extends Plugin {
+ private static final String PLUGIN_ID = "org.eclipse.remote.core"; //$NON-NLS-1$
+
+ // The shared instance
+ private static RemoteCorePlugin plugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static RemoteCorePlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get unique identifier for this plugin
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() == null) {
+ return PLUGIN_ID;
+ }
+ return getDefault().getBundle().getSymbolicName();
+ }
+
+ /**
+ * Logs the specified status with this plug-in's log.
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Logs an internal error with the specified message.
+ *
+ * @param message
+ * the error message to log
+ */
+ public static void log(String message) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
+ }
+
+ /**
+ * Logs an internal error with the specified throwable
+ *
+ * @param e
+ * the exception to be logged
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+ /**
+ * The constructor
+ */
+ public RemoteCorePlugin() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ context.registerService(IRemoteServicesManager.class, new RemoteServicesManager(), null);
+ context.registerService(IRemoteLaunchConfigService.class, new RemoteLaunchConfigService(), null);
+ RemoteDebugOptions.configure(context);
+ ResourcesPlugin.getWorkspace().addSaveParticipant(getUniqueIdentifier(), new ISaveParticipant() {
+ @Override
+ public void saving(ISaveContext saveContext) throws CoreException {
+ Preferences.savePreferences();
+ }
+
+ @Override
+ public void rollback(ISaveContext saveContext) {
+ // Do nothing
+ }
+
+ @Override
+ public void prepareToSave(ISaveContext saveContext) throws CoreException {
+ // Do nothing
+ }
+
+ @Override
+ public void doneSaving(ISaveContext saveContext) {
+ // Do nothing
+ }
+ });
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ Preferences.savePreferences();
+ plugin = null;
+ super.stop(context);
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteDebugOptions.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteDebugOptions.java
new file mode 100644
index 00000000000..9fa9cda9e85
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteDebugOptions.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Sage Electronic Engineering, LLC. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Jason Litton (Sage Electronic Engineering, LLC) - initial API and implementation
+ * Greg Watson (IBM) - adapted for remote core
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.core;
+
+import java.util.Hashtable;
+
+import org.eclipse.osgi.service.debug.DebugOptions;
+import org.eclipse.osgi.service.debug.DebugOptionsListener;
+import org.eclipse.osgi.service.debug.DebugTrace;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Hooks our debug options to the Platform trace functonality.
+ * In essence, we can open Window -> Preferences -> Tracing
+ * and turn on debug options for this package. The debug output
+ * will come out on the console and can be saved directly to
+ * a file. Classes that need to be debugged can call into
+ * RemoteDebugOptions to get debug flags. If new flags need to be
+ * created, they will need to have a unique identifier and added to
+ * the .options file in this plugin
+ */
+public class RemoteDebugOptions implements DebugOptionsListener {
+
+ public static final String DEBUG_REMOTE_COMMANDS = "/debug/commands"; //$NON-NLS-1$
+
+ private static DebugTrace fDebugTrace;
+ private static DebugOptions fDebugOptions;
+ private static RemoteDebugOptions fRemoteDebugOptions;
+
+ public static void configure(BundleContext context) {
+ if (fRemoteDebugOptions == null) {
+ fRemoteDebugOptions = new RemoteDebugOptions(context);
+ }
+ }
+
+ private RemoteDebugOptions(BundleContext context) {
+ Hashtable<String, String> props = new Hashtable<>(2);
+ props.put(DebugOptions.LISTENER_SYMBOLICNAME, RemoteCorePlugin.getUniqueIdentifier());
+ context.registerService(DebugOptionsListener.class.getName(), this, props);
+ }
+
+ @Override
+ public void optionsChanged(DebugOptions options) {
+ fDebugOptions = options;
+ fDebugTrace = options.newDebugTrace(RemoteCorePlugin.getUniqueIdentifier());
+ }
+
+ public static boolean isDebugging() {
+ return RemoteCorePlugin.getDefault().isDebugging();
+ }
+
+ public static boolean isDebugging(String option) {
+ if (fDebugOptions == null) {
+ return false;
+ }
+ return fDebugOptions.getBooleanOption(RemoteCorePlugin.getUniqueIdentifier() + option, false);
+ }
+
+ public static void setDebugging(String option, boolean value) {
+ if (fDebugOptions != null) {
+ if (value) {
+ fDebugOptions.setDebugEnabled(true);
+ }
+ fDebugOptions.setOption(option, Boolean.toString(value));
+ }
+ }
+
+ /**
+ * Prints the given message to System.out and to the OSGi tracing (if enabled)
+ *
+ * @param message
+ * the message or <code>null</code>
+ */
+ public static void trace(String message) {
+ trace(null, message);
+ }
+
+ /**
+ * Prints the given message to System.out and to the OSGi tracing (if enabled)
+ *
+ * @param option
+ * the option to determine if tracing is displayed
+ * @param message
+ * the message or <code>null</code>
+ * @param arguments
+ * optional arguments for the message or <code>null</code>
+ */
+ public static void trace(String option, String message, String... arguments) {
+ String traceMsg = message;
+ if (arguments.length > 0) {
+ traceMsg = NLS.bind(message, arguments);
+ }
+ if ((option != null && isDebugging(option)) || isDebugging()) {
+ System.out.println(traceMsg);
+ if (fDebugTrace != null) {
+ fDebugTrace.trace(option, traceMsg, null);
+ }
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemotePath.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemotePath.java
new file mode 100644
index 00000000000..ce63b9bde3d
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemotePath.java
@@ -0,0 +1,1216 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Patrick Tasse - Add extra constructor to Path class (bug 454959)
+ * Martin Oberhuber - [468889] Copy from equinox.common/org.eclipse.core.runtime
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import java.io.File;
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * The Eclipse Mars implementation of <code>org.eclipse.core.runtime.Path</code>.
+ *
+ * Cloned from org.eclipse.equinox.common. This class should be removed when
+ * Eclipse older than Mars no longer needs to be supported.
+ *
+ * @see org.eclipse.core.runtime.Path
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class RemotePath implements IPath, Cloneable {
+ /** masks for flag values */
+ private static final int HAS_LEADING = 1;
+ private static final int IS_UNC = 2;
+ private static final int HAS_TRAILING = 4;
+ private static final int IS_FOR_WINDOWS = 8;
+
+ private static final int ALL_SEPARATORS = HAS_LEADING | IS_UNC | HAS_TRAILING;
+ private static final int ALL_FLAGS = HAS_LEADING | IS_UNC | HAS_TRAILING | IS_FOR_WINDOWS;
+
+ /** Constant value indicating if the current platform is Windows */
+ private static final boolean RUNNING_ON_WINDOWS = java.io.File.separatorChar == '\\';
+
+ /** Constant empty string value. */
+ private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+
+ /** Constant value indicating no segments */
+ private static final String[] NO_SEGMENTS = new String[0];
+
+ /** Constant value containing the empty path with no device on the local file system. */
+ public static final RemotePath EMPTY = new RemotePath(EMPTY_STRING);
+
+ /** Mask for all bits that are involved in the hash code */
+ private static final int HASH_MASK = ~(HAS_TRAILING | IS_FOR_WINDOWS);
+
+ /** Constant root path string (<code>"/"</code>). */
+ private static final String ROOT_STRING = "/"; //$NON-NLS-1$
+
+ /** Constant value containing the root path with no device on the local file system. */
+ public static final RemotePath ROOT = new RemotePath(ROOT_STRING);
+
+ /** The device id string. May be null if there is no device. */
+ private String device = null;
+
+ //Private implementation note: the segments array and flag bitmap
+ //are never modified, so that they can be shared between path instances
+
+ /** The path segments */
+ private String[] segments;
+
+ /** flags indicating separators (has leading, is UNC, has trailing, is for Windows) */
+ private int flags;
+
+ /**
+ * Constructs a new path from the given string path.
+ * The string path must represent a valid file system path
+ * on the local file system.
+ * The path is canonicalized and double slashes are removed
+ * except at the beginning. (to handle UNC paths). All forward
+ * slashes ('/') are treated as segment delimiters, and any
+ * segment and device delimiters for the local file system are
+ * also respected.
+ *
+ * @param pathString the portable string path
+ * @see IPath#toPortableString()
+ * @since 3.1
+ */
+ public static IPath fromOSString(String pathString) {
+ return new RemotePath(pathString);
+ }
+
+ /**
+ * Constructs a new path from the given path string.
+ * The path string must have been produced by a previous
+ * call to <code>IPath.toPortableString</code>.
+ *
+ * @param pathString the portable path string
+ * @see IPath#toPortableString()
+ * @since 3.1
+ */
+ public static IPath fromPortableString(String pathString) {
+ int firstMatch = pathString.indexOf(DEVICE_SEPARATOR) + 1;
+ //no extra work required if no device characters
+ if (firstMatch <= 0)
+ return new RemotePath().initialize(null, pathString, RUNNING_ON_WINDOWS);
+ //if we find a single colon, then the path has a device
+ String devicePart = null;
+ int pathLength = pathString.length();
+ if (firstMatch == pathLength || pathString.charAt(firstMatch) != DEVICE_SEPARATOR) {
+ devicePart = pathString.substring(0, firstMatch);
+ pathString = pathString.substring(firstMatch, pathLength);
+ }
+ //optimize for no colon literals
+ if (pathString.indexOf(DEVICE_SEPARATOR) == -1)
+ return new RemotePath().initialize(devicePart, pathString, RUNNING_ON_WINDOWS);
+ //contract colon literals
+ char[] chars = pathString.toCharArray();
+ int readOffset = 0, writeOffset = 0, length = chars.length;
+ while (readOffset < length) {
+ if (chars[readOffset] == DEVICE_SEPARATOR)
+ if (++readOffset >= length)
+ break;
+ chars[writeOffset++] = chars[readOffset++];
+ }
+ return new RemotePath().initialize(devicePart, new String(chars, 0, writeOffset), RUNNING_ON_WINDOWS);
+ }
+
+ /**
+ * Constructs a new POSIX path from the given string path. The string path
+ * must represent a valid file system path on a POSIX file system. The path
+ * is canonicalized and double slashes are removed except at the beginning
+ * (to handle UNC paths). All forward slashes ('/') are treated as segment
+ * delimiters. This factory method should be used if the string path is for
+ * a POSIX file system.
+ *
+ * @param fullPath the string path
+ * @see #isValidPosixPath(String)
+ * @since 3.7
+ */
+ public static RemotePath forPosix(String fullPath) {
+ return new RemotePath(fullPath, false);
+ }
+
+ /**
+ * Constructs a new Windows path from the given string path. The string path
+ * must represent a valid file system path on the Windows file system. The
+ * path is canonicalized and double slashes are removed except at the
+ * beginning (to handle UNC paths). All forward slashes ('/') are treated as
+ * segment delimiters, and any segment ('\') and device (':') delimiters for
+ * the Windows file system are also respected. This factory method should be
+ * used if the string path is for the Windows file system.
+ *
+ * @param fullPath the string path
+ * @see #isValidWindowsPath(String)
+ * @since 3.7
+ */
+ public static RemotePath forWindows(String fullPath) {
+ return new RemotePath(fullPath, true);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Private constructor.
+ */
+ private RemotePath() {
+ // not allowed
+ }
+
+ /**
+ * Constructs a new path from the given string path.
+ * The string path must represent a valid file system path
+ * on the local file system.
+ * The path is canonicalized and double slashes are removed
+ * except at the beginning. (to handle UNC paths). All forward
+ * slashes ('/') are treated as segment delimiters, and any
+ * segment and device delimiters for the local file system are
+ * also respected (such as colon (':') and backslash ('\') on some file systems).
+ * This constructor should be used if the string path if for the local file system.
+ *
+ * @param fullPath the string path
+ * @see #isValidPath(String)
+ */
+ public RemotePath(String fullPath) {
+ this(fullPath, RUNNING_ON_WINDOWS);
+ }
+
+ /**
+ * Constructs a new path from the given device id and string path.
+ * The given string path must be valid.
+ * The path is canonicalized and double slashes are removed except
+ * at the beginning (to handle UNC paths). All forward
+ * slashes ('/') are treated as segment delimiters, and any
+ * segment delimiters for the local file system are
+ * also respected (such as backslash ('\') on some file systems).
+ *
+ * @param device the device id
+ * @param path the string path
+ * @see #isValidPath(String)
+ * @see #setDevice(String)
+ */
+ public RemotePath(String device, String path) {
+ if (RUNNING_ON_WINDOWS) {
+ //convert backslash to forward slash
+ path = path.indexOf('\\') == -1 ? path : path.replace('\\', SEPARATOR);
+ }
+ initialize(device, path, RUNNING_ON_WINDOWS);
+ }
+
+ /**
+ * Constructs a new path from the given string path. The string path must
+ * represent a valid file system path on the specified file system. The path
+ * is canonicalized and double slashes are removed except at the beginning
+ * (to handle UNC paths). All forward slashes ('/') are treated as segment
+ * delimiters, and any segment and device delimiters for the specified file
+ * system are also respected (such as colon (':') and backslash ('\') on
+ * Windows).
+ *
+ * @param fullPath the string path
+ * @param forWindows true if the string path is for the Windows file system
+ * @since 3.7
+ */
+ private RemotePath(String fullPath, boolean forWindows) {
+ String devicePart = null;
+ if (forWindows) {
+ //convert backslash to forward slash
+ fullPath = fullPath.indexOf('\\') == -1 ? fullPath : fullPath.replace('\\', SEPARATOR);
+ //extract device
+ int i = fullPath.indexOf(DEVICE_SEPARATOR);
+ if (i != -1) {
+ //remove leading slash from device part to handle output of URL.getFile()
+ int start = fullPath.charAt(0) == SEPARATOR ? 1 : 0;
+ devicePart = fullPath.substring(start, i + 1);
+ fullPath = fullPath.substring(i + 1, fullPath.length());
+ }
+ }
+ initialize(devicePart, fullPath, forWindows);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Private constructor.
+ */
+ private RemotePath(String device, String[] segments, int flags) {
+ // no segment validations are done for performance reasons
+ this.segments = segments;
+ this.device = device;
+ //hash code is cached in all but the bottom four bits of the flags field
+ this.flags = (computeHashCode() << 4) | (flags & ALL_FLAGS);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#addFileExtension
+ */
+ @Override
+ public IPath addFileExtension(String extension) {
+ if (isRoot() || isEmpty() || hasTrailingSeparator())
+ return this;
+ int len = segments.length;
+ String[] newSegments = new String[len];
+ System.arraycopy(segments, 0, newSegments, 0, len - 1);
+ newSegments[len - 1] = segments[len - 1] + '.' + extension;
+ return new RemotePath(device, newSegments, flags);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#addTrailingSeparator
+ */
+ @Override
+ public IPath addTrailingSeparator() {
+ if (hasTrailingSeparator() || isRoot()) {
+ return this;
+ }
+ //XXX workaround, see 1GIGQ9V
+ if (isEmpty()) {
+ return new RemotePath(device, segments, (flags & IS_FOR_WINDOWS) | HAS_LEADING);
+ }
+ return new RemotePath(device, segments, flags | HAS_TRAILING);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#append(IPath)
+ */
+ @Override
+ public IPath append(IPath tail) {
+ //optimize some easy cases
+ if (tail == null || tail.segmentCount() == 0)
+ return this;
+ //these call chains look expensive, but in most cases they are no-ops
+ //the tail must be for the same platform as this instance
+ if (this.isEmpty() && ((flags & IS_FOR_WINDOWS) == 0) == tail.isValidSegment(":")) //$NON-NLS-1$
+ return tail.setDevice(device).makeRelative().makeUNC(isUNC());
+ if (this.isRoot() && ((flags & IS_FOR_WINDOWS) == 0) == tail.isValidSegment(":")) //$NON-NLS-1$
+ return tail.setDevice(device).makeAbsolute().makeUNC(isUNC());
+
+ //concatenate the two segment arrays
+ int myLen = segments.length;
+ int tailLen = tail.segmentCount();
+ String[] newSegments = new String[myLen + tailLen];
+ System.arraycopy(segments, 0, newSegments, 0, myLen);
+ for (int i = 0; i < tailLen; i++) {
+ newSegments[myLen + i] = tail.segment(i);
+ }
+ //use my leading separators and the tail's trailing separator
+ RemotePath result = new RemotePath(device, newSegments,
+ (flags & (HAS_LEADING | IS_UNC | IS_FOR_WINDOWS)) | (tail.hasTrailingSeparator() ? HAS_TRAILING : 0));
+ String tailFirstSegment = newSegments[myLen];
+ if (tailFirstSegment.equals("..") || tailFirstSegment.equals(".")) { //$NON-NLS-1$ //$NON-NLS-2$
+ result.canonicalize();
+ }
+ return result;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#append(java.lang.String)
+ */
+ @Override
+ public IPath append(String tail) {
+ //optimize addition of a single segment
+ if (tail.indexOf(SEPARATOR) == -1 && tail.indexOf("\\") == -1 && tail.indexOf(DEVICE_SEPARATOR) == -1) { //$NON-NLS-1$
+ int tailLength = tail.length();
+ if (tailLength < 3) {
+ //some special cases
+ if (tailLength == 0 || ".".equals(tail)) { //$NON-NLS-1$
+ return this;
+ }
+ if ("..".equals(tail)) //$NON-NLS-1$
+ return removeLastSegments(1);
+ }
+ //just add the segment
+ int myLen = segments.length;
+ String[] newSegments = new String[myLen + 1];
+ System.arraycopy(segments, 0, newSegments, 0, myLen);
+ newSegments[myLen] = tail;
+ return new RemotePath(device, newSegments, flags & ~HAS_TRAILING);
+ }
+ //go with easy implementation
+ return append(new RemotePath(tail, (flags & IS_FOR_WINDOWS) != 0));
+ }
+
+ /**
+ * Destructively converts this path to its canonical form.
+ * <p>
+ * In its canonical form, a path does not have any
+ * "." segments, and parent references ("..") are collapsed
+ * where possible.
+ * </p>
+ * @return true if the path was modified, and false otherwise.
+ */
+ private boolean canonicalize() {
+ //look for segments that need canonicalizing
+ for (int i = 0, max = segments.length; i < max; i++) {
+ String segment = segments[i];
+ if (segment.charAt(0) == '.' && (segment.equals("..") || segment.equals("."))) { //$NON-NLS-1$ //$NON-NLS-2$
+ //path needs to be canonicalized
+ collapseParentReferences();
+ //paths of length 0 have no trailing separator
+ if (segments.length == 0)
+ flags &= (HAS_LEADING | IS_UNC);
+ //recompute hash because canonicalize affects hash
+ flags = (flags & ALL_FLAGS) | (computeHashCode() << 4);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Clones this object.
+ */
+ @Override
+ public Object clone() {
+ try {
+ return super.clone();
+ } catch (CloneNotSupportedException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Destructively removes all occurrences of ".." segments from this path.
+ */
+ private void collapseParentReferences() {
+ int segmentCount = segments.length;
+ String[] stack = new String[segmentCount];
+ int stackPointer = 0;
+ for (int i = 0; i < segmentCount; i++) {
+ String segment = segments[i];
+ if (segment.equals("..")) { //$NON-NLS-1$
+ if (stackPointer == 0) {
+ // if the stack is empty we are going out of our scope
+ // so we need to accumulate segments. But only if the original
+ // path is relative. If it is absolute then we can't go any higher than
+ // root so simply toss the .. references.
+ if (!isAbsolute())
+ stack[stackPointer++] = segment; //stack push
+ } else {
+ // if the top is '..' then we are accumulating segments so don't pop
+ if ("..".equals(stack[stackPointer - 1])) //$NON-NLS-1$
+ stack[stackPointer++] = ".."; //$NON-NLS-1$
+ else
+ stackPointer--;
+ //stack pop
+ }
+ //collapse current references
+ } else if (!segment.equals(".") || segmentCount == 1) //$NON-NLS-1$
+ stack[stackPointer++] = segment; //stack push
+ }
+ //if the number of segments hasn't changed, then no modification needed
+ if (stackPointer == segmentCount)
+ return;
+ //build the new segment array backwards by popping the stack
+ String[] newSegments = new String[stackPointer];
+ System.arraycopy(stack, 0, newSegments, 0, stackPointer);
+ this.segments = newSegments;
+ }
+
+ /**
+ * Removes duplicate slashes from the given path, with the exception
+ * of leading double slash which represents a UNC path.
+ */
+ private String collapseSlashes(String path) {
+ int length = path.length();
+ // if the path is only 0, 1 or 2 chars long then it could not possibly have illegal
+ // duplicate slashes.
+ if (length < 3)
+ return path;
+ // check for an occurrence of // in the path. Start at index 1 to ensure we skip leading UNC //
+ // If there are no // then there is nothing to collapse so just return.
+ if (path.indexOf("//", 1) == -1) //$NON-NLS-1$
+ return path;
+ // We found an occurrence of // in the path so do the slow collapse.
+ char[] result = new char[path.length()];
+ int count = 0;
+ boolean hasPrevious = false;
+ char[] characters = path.toCharArray();
+ for (int index = 0; index < characters.length; index++) {
+ char c = characters[index];
+ if (c == SEPARATOR) {
+ if (hasPrevious) {
+ // skip double slashes, except for beginning of UNC.
+ // note that a UNC path can't have a device.
+ if (device == null && index == 1) {
+ result[count] = c;
+ count++;
+ }
+ } else {
+ hasPrevious = true;
+ result[count] = c;
+ count++;
+ }
+ } else {
+ hasPrevious = false;
+ result[count] = c;
+ count++;
+ }
+ }
+ return new String(result, 0, count);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Computes the hash code for this object.
+ */
+ private int computeHashCode() {
+ int hash = device == null ? 17 : device.hashCode();
+ int segmentCount = segments.length;
+ for (int i = 0; i < segmentCount; i++) {
+ //this function tends to given a fairly even distribution
+ hash = hash * 37 + segments[i].hashCode();
+ }
+ return hash;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Returns the size of the string that will be created by toString or toOSString.
+ */
+ private int computeLength() {
+ int length = 0;
+ if (device != null)
+ length += device.length();
+ if ((flags & HAS_LEADING) != 0)
+ length++;
+ if ((flags & IS_UNC) != 0)
+ length++;
+ //add the segment lengths
+ int max = segments.length;
+ if (max > 0) {
+ for (int i = 0; i < max; i++) {
+ length += segments[i].length();
+ }
+ //add the separator lengths
+ length += max - 1;
+ }
+ if ((flags & HAS_TRAILING) != 0)
+ length++;
+ return length;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Returns the number of segments in the given path
+ */
+ private int computeSegmentCount(String path) {
+ int len = path.length();
+ if (len == 0 || (len == 1 && path.charAt(0) == SEPARATOR)) {
+ return 0;
+ }
+ int count = 1;
+ int prev = -1;
+ int i;
+ while ((i = path.indexOf(SEPARATOR, prev + 1)) != -1) {
+ if (i != prev + 1 && i != len) {
+ ++count;
+ }
+ prev = i;
+ }
+ if (path.charAt(len - 1) == SEPARATOR) {
+ --count;
+ }
+ return count;
+ }
+
+ /**
+ * Computes the segment array for the given canonicalized path.
+ */
+ private String[] computeSegments(String path) {
+ // performance sensitive --- avoid creating garbage
+ int segmentCount = computeSegmentCount(path);
+ if (segmentCount == 0)
+ return NO_SEGMENTS;
+ String[] newSegments = new String[segmentCount];
+ int len = path.length();
+ // check for initial slash
+ int firstPosition = (path.charAt(0) == SEPARATOR) ? 1 : 0;
+ // check for UNC
+ if (firstPosition == 1 && len > 1 && (path.charAt(1) == SEPARATOR))
+ firstPosition = 2;
+ int lastPosition = (path.charAt(len - 1) != SEPARATOR) ? len - 1 : len - 2;
+ // for non-empty paths, the number of segments is
+ // the number of slashes plus 1, ignoring any leading
+ // and trailing slashes
+ int next = firstPosition;
+ for (int i = 0; i < segmentCount; i++) {
+ int start = next;
+ int end = path.indexOf(SEPARATOR, next);
+ if (end == -1) {
+ newSegments[i] = path.substring(start, lastPosition + 1);
+ } else {
+ newSegments[i] = path.substring(start, end);
+ }
+ next = end + 1;
+ }
+ return newSegments;
+ }
+
+ /**
+ * Returns the platform-neutral encoding of the given segment onto
+ * the given string buffer. This escapes literal colon characters with double colons.
+ */
+ private void encodeSegment(String string, StringBuffer buf) {
+ int len = string.length();
+ for (int i = 0; i < len; i++) {
+ char c = string.charAt(i);
+ buf.append(c);
+ if (c == DEVICE_SEPARATOR)
+ buf.append(DEVICE_SEPARATOR);
+ }
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Compares objects for equality.
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!(obj instanceof RemotePath))
+ return false;
+ RemotePath target = (RemotePath) obj;
+ //check leading separators and hash code
+ if ((flags & HASH_MASK) != (target.flags & HASH_MASK))
+ return false;
+ String[] targetSegments = target.segments;
+ int i = segments.length;
+ //check segment count
+ if (i != targetSegments.length)
+ return false;
+ //check segments in reverse order - later segments more likely to differ
+ while (--i >= 0)
+ if (!segments[i].equals(targetSegments[i]))
+ return false;
+ //check device last (least likely to differ)
+ return device == target.device || (device != null && device.equals(target.device));
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#getDevice
+ */
+ @Override
+ public String getDevice() {
+ return device;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#getFileExtension
+ */
+ @Override
+ public String getFileExtension() {
+ if (hasTrailingSeparator()) {
+ return null;
+ }
+ String lastSegment = lastSegment();
+ if (lastSegment == null) {
+ return null;
+ }
+ int index = lastSegment.lastIndexOf('.');
+ if (index == -1) {
+ return null;
+ }
+ return lastSegment.substring(index + 1);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * Computes the hash code for this object.
+ */
+ @Override
+ public int hashCode() {
+ return flags & HASH_MASK;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#hasTrailingSeparator2
+ */
+ @Override
+ public boolean hasTrailingSeparator() {
+ return (flags & HAS_TRAILING) != 0;
+ }
+
+ /*
+ * Initialize the current path with the given string.
+ */
+ private IPath initialize(String deviceString, String path, boolean forWindows) {
+ Assert.isNotNull(path);
+ this.device = deviceString;
+
+ path = collapseSlashes(path);
+ int len = path.length();
+
+ //compute the flags bitmap
+ if (len < 2) {
+ if (len == 1 && path.charAt(0) == SEPARATOR) {
+ this.flags = HAS_LEADING;
+ } else {
+ this.flags = 0;
+ }
+ } else {
+ boolean hasLeading = path.charAt(0) == SEPARATOR;
+ boolean isUNC = hasLeading && path.charAt(1) == SEPARATOR;
+ //UNC path of length two has no trailing separator
+ boolean hasTrailing = !(isUNC && len == 2) && path.charAt(len - 1) == SEPARATOR;
+ flags = hasLeading ? HAS_LEADING : 0;
+ if (isUNC)
+ flags |= IS_UNC;
+ if (hasTrailing)
+ flags |= HAS_TRAILING;
+ }
+ if (forWindows) {
+ flags |= IS_FOR_WINDOWS;
+ }
+ //compute segments and ensure canonical form
+ segments = computeSegments(path);
+ if (!canonicalize()) {
+ //compute hash now because canonicalize didn't need to do it
+ flags = (flags & ALL_FLAGS) | (computeHashCode() << 4);
+ }
+ return this;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#isAbsolute
+ */
+ @Override
+ public boolean isAbsolute() {
+ //it's absolute if it has a leading separator
+ return (flags & HAS_LEADING) != 0;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#isEmpty
+ */
+ @Override
+ public boolean isEmpty() {
+ //true if no segments and no leading prefix
+ return segments.length == 0 && ((flags & ALL_SEPARATORS) != HAS_LEADING);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#isPrefixOf
+ */
+ @Override
+ public boolean isPrefixOf(IPath anotherPath) {
+ if (device == null) {
+ if (anotherPath.getDevice() != null) {
+ return false;
+ }
+ } else {
+ if (!device.equalsIgnoreCase(anotherPath.getDevice())) {
+ return false;
+ }
+ }
+ if (isEmpty() || (isRoot() && anotherPath.isAbsolute())) {
+ return true;
+ }
+ int len = segments.length;
+ if (len > anotherPath.segmentCount()) {
+ return false;
+ }
+ for (int i = 0; i < len; i++) {
+ if (!segments[i].equals(anotherPath.segment(i)))
+ return false;
+ }
+ return true;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#isRoot
+ */
+ @Override
+ public boolean isRoot() {
+ //must have no segments, a leading separator, and not be a UNC path.
+ return this == ROOT || (segments.length == 0 && ((flags & ALL_SEPARATORS) == HAS_LEADING));
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#isUNC
+ */
+ @Override
+ public boolean isUNC() {
+ if (device != null)
+ return false;
+ return (flags & IS_UNC) != 0;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#isValidPath(String)
+ */
+ @Override
+ public boolean isValidPath(String path) {
+ return isValidPath(path, (flags & IS_FOR_WINDOWS) != 0);
+ }
+
+ /**
+ * Returns whether the given string is syntactically correct as a path on a
+ * POSIX file system. The path is correct if each of the segments in its
+ * canonicalized form is valid.
+ *
+ * @param path the path to check
+ * @return <code>true</code> if the given string is a valid path,
+ * and <code>false</code> otherwise
+ * @see #isValidPosixSegment(String)
+ * @since 3.7
+ */
+ public static boolean isValidPosixPath(String path) {
+ return isValidPath(path, false);
+ }
+
+ /**
+ * Returns whether the given string is syntactically correct as a path on
+ * the Windows file system. The device id is the prefix up to and including
+ * the device separator (':'); the path proper is everything to the right of
+ * it, or the entire string if there is no device separator. The device id
+ * is not checked for validity; the path proper is correct if each of the
+ * segments in its canonicalized form is valid.
+ *
+ * @param path the path to check
+ * @return <code>true</code> if the given string is a valid path,
+ * and <code>false</code> otherwise
+ * @see #isValidWindowsSegment(String)
+ * @since 3.7
+ */
+ public static boolean isValidWindowsPath(String path) {
+ return isValidPath(path, true);
+ }
+
+ /**
+ * Returns whether the given string is syntactically correct as a path on
+ * the specified file system. The device id is the prefix up to and
+ * including the device separator for the specified file system; the path
+ * proper is everything to the right of it, or the entire string if there is
+ * no device separator. When the specified platform is a file system with no
+ * meaningful device separator, the entire string is treated as the path
+ * proper. The device id is not checked for validity; the path proper is
+ * correct if each of the segments in its canonicalized form is valid.
+ *
+ * @param path the path to check
+ * @param forWindows true if the path is for the Windows file system
+ * @return <code>true</code> if the given string is a valid path,
+ * and <code>false</code> otherwise
+ * @see #isValidSegment(String, boolean)
+ * @since 3.7
+ */
+ private static boolean isValidPath(String path, boolean forWindows) {
+ RemotePath test = new RemotePath(path, forWindows);
+ for (int i = 0, max = test.segmentCount(); i < max; i++)
+ if (!RemotePath.isValidSegment(test.segment(i), forWindows))
+ return false;
+ return true;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#isValidSegment(String)
+ */
+ @Override
+ public boolean isValidSegment(String segment) {
+ return isValidSegment(segment, (flags & IS_FOR_WINDOWS) != 0);
+ }
+
+ /**
+ * Returns whether the given string is valid as a segment in a path on a
+ * POSIX file system. The rules for valid segments are as follows:
+ * <ul>
+ * <li>the empty string is not valid
+ * <li>any string containing the slash character ('/') is not valid
+ * </ul>
+ *
+ * @param segment the path segment to check
+ * @return <code>true</code> if the given path segment is valid,
+ * and <code>false</code> otherwise
+ * @since 3.7
+ */
+ public static boolean isValidPosixSegment(String segment) {
+ return isValidSegment(segment, false);
+ }
+
+ /**
+ * Returns whether the given string is valid as a segment in a path on the
+ * Windows file system. The rules for valid segments are as follows:
+ * <ul>
+ * <li>the empty string is not valid
+ * <li>any string containing the slash character ('/') is not valid
+ * <li>any string containing segment ('\') or device (':') separator
+ * characters is not valid
+ * </ul>
+ *
+ * @param segment the path segment to check
+ * @return <code>true</code> if the given path segment is valid,
+ * and <code>false</code> otherwise
+ * @since 3.7
+ */
+ public static boolean isValidWindowsSegment(String segment) {
+ return isValidSegment(segment, true);
+ }
+
+ /**
+ * Returns whether the given string is valid as a segment in a path on the
+ * specified file system. The rules for valid segments are as follows:
+ * <ul>
+ * <li>the empty string is not valid
+ * <li>any string containing the slash character ('/') is not valid
+ * <li>any string containing segment or device separator characters on the
+ * specified file system, such as the backslash ('\') and colon (':') on
+ * Windows, is not valid
+ * </ul>
+ *
+ * @param segment the path segment to check
+ * @param forWindows true if the path is for the Windows file system
+ * @return <code>true</code> if the given path segment is valid,
+ * and <code>false</code> otherwise
+ * @since 3.7
+ */
+ private static boolean isValidSegment(String segment, boolean forWindows) {
+ int size = segment.length();
+ if (size == 0)
+ return false;
+ for (int i = 0; i < size; i++) {
+ char c = segment.charAt(i);
+ if (c == '/')
+ return false;
+ if (forWindows && (c == '\\' || c == ':'))
+ return false;
+ }
+ return true;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#lastSegment()
+ */
+ @Override
+ public String lastSegment() {
+ int len = segments.length;
+ return len == 0 ? null : segments[len - 1];
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#makeAbsolute()
+ */
+ @Override
+ public IPath makeAbsolute() {
+ if (isAbsolute()) {
+ return this;
+ }
+ RemotePath result = new RemotePath(device, segments, flags | HAS_LEADING);
+ //may need canonicalizing if it has leading ".." or "." segments
+ if (result.segmentCount() > 0) {
+ String first = result.segment(0);
+ if (first.equals("..") || first.equals(".")) { //$NON-NLS-1$ //$NON-NLS-2$
+ result.canonicalize();
+ }
+ }
+ return result;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#makeRelative()
+ */
+ @Override
+ public IPath makeRelative() {
+ if (!isAbsolute()) {
+ return this;
+ }
+ return new RemotePath(device, segments, flags & (HAS_TRAILING | IS_FOR_WINDOWS));
+ }
+
+ /**
+ * {@inheritDoc}
+ * @since org.eclipse.equinox.common 3.5
+ */
+ @Override
+ public IPath makeRelativeTo(IPath base) {
+ //can't make relative if devices are not equal
+ if (device != base.getDevice() && (device == null || !device.equalsIgnoreCase(base.getDevice())))
+ return this;
+ int commonLength = matchingFirstSegments(base);
+ final int differenceLength = base.segmentCount() - commonLength;
+ final int newSegmentLength = differenceLength + segmentCount() - commonLength;
+ if (newSegmentLength == 0)
+ return RemotePath.EMPTY;
+ String[] newSegments = new String[newSegmentLength];
+ //add parent references for each segment different from the base
+ Arrays.fill(newSegments, 0, differenceLength, ".."); //$NON-NLS-1$
+ //append the segments of this path not in common with the base
+ System.arraycopy(segments, commonLength, newSegments, differenceLength, newSegmentLength - differenceLength);
+ return new RemotePath(null, newSegments, flags & (HAS_TRAILING | IS_FOR_WINDOWS));
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#makeUNC(boolean)
+ */
+ @Override
+ public IPath makeUNC(boolean toUNC) {
+ // if we are already in the right form then just return
+ if (!(toUNC ^ isUNC()))
+ return this;
+
+ int newSeparators = this.flags;
+ if (toUNC) {
+ newSeparators |= HAS_LEADING | IS_UNC;
+ } else {
+ //mask out the UNC bit
+ newSeparators &= HAS_LEADING | HAS_TRAILING | IS_FOR_WINDOWS;
+ }
+ return new RemotePath(toUNC ? null : device, segments, newSeparators);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#matchingFirstSegments(IPath)
+ */
+ @Override
+ public int matchingFirstSegments(IPath anotherPath) {
+ Assert.isNotNull(anotherPath);
+ int anotherPathLen = anotherPath.segmentCount();
+ int max = Math.min(segments.length, anotherPathLen);
+ int count = 0;
+ for (int i = 0; i < max; i++) {
+ if (!segments[i].equals(anotherPath.segment(i))) {
+ return count;
+ }
+ count++;
+ }
+ return count;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#removeFileExtension()
+ */
+ @Override
+ public IPath removeFileExtension() {
+ String extension = getFileExtension();
+ if (extension == null || extension.equals("")) { //$NON-NLS-1$
+ return this;
+ }
+ String lastSegment = lastSegment();
+ int index = lastSegment.lastIndexOf(extension) - 1;
+ return removeLastSegments(1).append(lastSegment.substring(0, index));
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#removeFirstSegments(int)
+ */
+ @Override
+ public IPath removeFirstSegments(int count) {
+ if (count == 0)
+ return this;
+ if (count >= segments.length) {
+ return new RemotePath(device, NO_SEGMENTS, flags & IS_FOR_WINDOWS);
+ }
+ Assert.isLegal(count > 0);
+ int newSize = segments.length - count;
+ String[] newSegments = new String[newSize];
+ System.arraycopy(this.segments, count, newSegments, 0, newSize);
+
+ //result is always a relative path
+ return new RemotePath(device, newSegments, flags & (HAS_TRAILING | IS_FOR_WINDOWS));
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#removeLastSegments(int)
+ */
+ @Override
+ public IPath removeLastSegments(int count) {
+ if (count == 0)
+ return this;
+ if (count >= segments.length) {
+ //result will have no trailing separator
+ return new RemotePath(device, NO_SEGMENTS, flags & (HAS_LEADING | IS_UNC | IS_FOR_WINDOWS));
+ }
+ Assert.isLegal(count > 0);
+ int newSize = segments.length - count;
+ String[] newSegments = new String[newSize];
+ System.arraycopy(this.segments, 0, newSegments, 0, newSize);
+ return new RemotePath(device, newSegments, flags);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#removeTrailingSeparator()
+ */
+ @Override
+ public IPath removeTrailingSeparator() {
+ if (!hasTrailingSeparator()) {
+ return this;
+ }
+ return new RemotePath(device, segments, flags & (HAS_LEADING | IS_UNC | IS_FOR_WINDOWS));
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#segment(int)
+ */
+ @Override
+ public String segment(int index) {
+ if (index >= segments.length)
+ return null;
+ return segments[index];
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#segmentCount()
+ */
+ @Override
+ public int segmentCount() {
+ return segments.length;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#segments()
+ */
+ @Override
+ public String[] segments() {
+ String[] segmentCopy = new String[segments.length];
+ System.arraycopy(segments, 0, segmentCopy, 0, segments.length);
+ return segmentCopy;
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#setDevice(String)
+ */
+ @Override
+ public IPath setDevice(String value) {
+ if (value != null) {
+ Assert.isTrue(value.indexOf(IPath.DEVICE_SEPARATOR) == (value.length() - 1),
+ "Last character should be the device separator"); //$NON-NLS-1$
+ }
+ //return the receiver if the device is the same
+ if (value == device || (value != null && value.equals(device)))
+ return this;
+
+ return new RemotePath(value, segments, flags);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#toFile()
+ */
+ @Override
+ public File toFile() {
+ return new File(toOSString());
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#toOSString()
+ */
+ @Override
+ public String toOSString() {
+ //Note that this method is identical to toString except
+ //it uses the OS file separator instead of the path separator
+ int resultSize = computeLength();
+ if (resultSize <= 0)
+ return EMPTY_STRING;
+ char FILE_SEPARATOR = File.separatorChar;
+ char[] result = new char[resultSize];
+ int offset = 0;
+ if (device != null) {
+ int size = device.length();
+ device.getChars(0, size, result, offset);
+ offset += size;
+ }
+ if ((flags & HAS_LEADING) != 0)
+ result[offset++] = FILE_SEPARATOR;
+ if ((flags & IS_UNC) != 0)
+ result[offset++] = FILE_SEPARATOR;
+ int len = segments.length - 1;
+ if (len >= 0) {
+ //append all but the last segment, with file separators
+ for (int i = 0; i < len; i++) {
+ int size = segments[i].length();
+ segments[i].getChars(0, size, result, offset);
+ offset += size;
+ result[offset++] = FILE_SEPARATOR;
+ }
+ //append the last segment
+ int size = segments[len].length();
+ segments[len].getChars(0, size, result, offset);
+ offset += size;
+ }
+ if ((flags & HAS_TRAILING) != 0)
+ result[offset++] = FILE_SEPARATOR;
+ return new String(result);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#toPortableString()
+ */
+ @Override
+ public String toPortableString() {
+ int resultSize = computeLength();
+ if (resultSize <= 0)
+ return EMPTY_STRING;
+ StringBuffer result = new StringBuffer(resultSize);
+ if (device != null)
+ result.append(device);
+ if ((flags & HAS_LEADING) != 0)
+ result.append(SEPARATOR);
+ if ((flags & IS_UNC) != 0)
+ result.append(SEPARATOR);
+ int len = segments.length;
+ //append all segments with separators
+ for (int i = 0; i < len; i++) {
+ if (segments[i].indexOf(DEVICE_SEPARATOR) >= 0)
+ encodeSegment(segments[i], result);
+ else
+ result.append(segments[i]);
+ if (i < len - 1 || (flags & HAS_TRAILING) != 0)
+ result.append(SEPARATOR);
+ }
+ return result.toString();
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#toString()
+ */
+ @Override
+ public String toString() {
+ int resultSize = computeLength();
+ if (resultSize <= 0)
+ return EMPTY_STRING;
+ char[] result = new char[resultSize];
+ int offset = 0;
+ if (device != null) {
+ int size = device.length();
+ device.getChars(0, size, result, offset);
+ offset += size;
+ }
+ if ((flags & HAS_LEADING) != 0)
+ result[offset++] = SEPARATOR;
+ if ((flags & IS_UNC) != 0)
+ result[offset++] = SEPARATOR;
+ int len = segments.length - 1;
+ if (len >= 0) {
+ //append all but the last segment, with separators
+ for (int i = 0; i < len; i++) {
+ int size = segments[i].length();
+ segments[i].getChars(0, size, result, offset);
+ offset += size;
+ result[offset++] = SEPARATOR;
+ }
+ //append the last segment
+ int size = segments[len].length();
+ segments[len].getChars(0, size, result, offset);
+ offset += size;
+ }
+ if ((flags & HAS_TRAILING) != 0)
+ result[offset++] = SEPARATOR;
+ return new String(result);
+ }
+
+ /* (Intentionally not included in javadoc)
+ * @see IPath#uptoSegment(int)
+ */
+ @Override
+ public IPath uptoSegment(int count) {
+ if (count == 0)
+ return new RemotePath(device, NO_SEGMENTS, flags & (HAS_LEADING | IS_UNC | IS_FOR_WINDOWS));
+ if (count >= segments.length)
+ return this;
+ Assert.isTrue(count > 0, "Invalid parameter to RemotePath.uptoSegment"); //$NON-NLS-1$
+ String[] newSegments = new String[count];
+ System.arraycopy(segments, 0, newSegments, 0, count);
+ return new RemotePath(device, newSegments, flags);
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteProcess.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteProcess.java
new file mode 100644
index 00000000000..fe68a06b4e6
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteProcess.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessControlService;
+
+/**
+ * Standard root class for remote processes.
+ */
+public class RemoteProcess extends Process implements IRemoteProcess {
+ private final Map<Class<? extends Service>, Service> servicesMap = new HashMap<>();
+ private final IRemoteConnection connection;
+ private final IRemoteProcessBuilder builder;
+
+ /**
+ * @since 2.0
+ */
+ public RemoteProcess(IRemoteConnection connection, IRemoteProcessBuilder builder) {
+ this.connection = connection;
+ this.builder = builder;
+ }
+
+ @Override
+ public void destroy() {
+ IRemoteProcessControlService controlService = getService(IRemoteProcessControlService.class);
+ if (controlService != null) {
+ controlService.destroy();
+ }
+ }
+
+ @Override
+ public int exitValue() {
+ IRemoteProcessControlService controlService = getService(IRemoteProcessControlService.class);
+ if (controlService != null) {
+ return controlService.exitValue();
+ }
+ return 0;
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ IRemoteProcessControlService controlService = getService(IRemoteProcessControlService.class);
+ if (controlService != null) {
+ return controlService.getErrorStream();
+ }
+ return null;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ IRemoteProcessControlService controlService = getService(IRemoteProcessControlService.class);
+ if (controlService != null) {
+ return controlService.getInputStream();
+ }
+ return null;
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ IRemoteProcessControlService controlService = getService(IRemoteProcessControlService.class);
+ if (controlService != null) {
+ return controlService.getOutputStream();
+ }
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(Class<T> service) {
+ T obj = (T) servicesMap.get(service);
+ if (obj == null) {
+ obj = getConnectionType().getProcessService(this, service);
+ if (obj != null) {
+ servicesMap.put(service, obj);
+ }
+ }
+
+ return obj;
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Override
+ public <T extends Service> boolean hasService(Class<T> service) {
+ return servicesMap.get(service.getName()) != null || getConnectionType().hasProcessService(service);
+ }
+
+ @Override
+ public int waitFor() throws InterruptedException {
+ IRemoteProcessControlService controlService = getService(IRemoteProcessControlService.class);
+ if (controlService != null) {
+ return controlService.waitFor();
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isCompleted() {
+ IRemoteProcessControlService controlService = getService(IRemoteProcessControlService.class);
+ if (controlService != null) {
+ return controlService.isCompleted();
+ }
+ return true;
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return connection;
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder() {
+ return builder;
+ }
+
+ private RemoteConnectionType getConnectionType() {
+ return (RemoteConnectionType) getRemoteConnection().getConnectionType();
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceAdapterFactory.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceAdapterFactory.java
new file mode 100644
index 00000000000..4af892e7891
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceAdapterFactory.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.remote.core.IRemoteResource;
+import org.eclipse.remote.internal.core.services.local.LocalResource;
+
+public class RemoteResourceAdapterFactory implements IAdapterFactory {
+ public static final String EXTENSION_POINT_ID = "remoteResources"; //$NON-NLS-1$
+
+ public static final String ATTR_NATURE = "nature"; //$NON-NLS-1$
+ public static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private Map<String, RemoteResourceFactory> fResourceFactory;
+
+ @Override
+ public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
+ if (adapterType == IRemoteResource.class) {
+ if (adaptableObject instanceof IResource) {
+ loadExtensions();
+ IResource resource = (IResource) adaptableObject;
+ for (String nature : fResourceFactory.keySet()) {
+ try {
+ if (resource.getProject().hasNature(nature)) {
+ RemoteResourceFactory factory = fResourceFactory.get(nature);
+ if (factory != null) {
+ return adapterType.cast(factory.getRemoteResource(resource));
+ }
+ }
+ } catch (CoreException e) {
+ // Treat as failure
+ }
+ }
+ return adapterType.cast(new LocalResource(resource));
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Class<?>[] getAdapterList() {
+ return new Class[] { IRemoteResource.class };
+ }
+
+ private synchronized void loadExtensions() {
+ if (fResourceFactory == null) {
+ fResourceFactory = new HashMap<>();
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(RemoteCorePlugin.getUniqueIdentifier(),
+ EXTENSION_POINT_ID);
+
+ for (IExtension ext : extensionPoint.getExtensions()) {
+ final IConfigurationElement[] elements = ext.getConfigurationElements();
+
+ for (IConfigurationElement ce : elements) {
+ String nature = ce.getAttribute(ATTR_NATURE);
+ RemoteResourceFactory factory = new RemoteResourceFactory(ce);
+ fResourceFactory.put(nature, factory);
+ }
+ }
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceFactory.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceFactory.java
new file mode 100644
index 00000000000..83e164456f9
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteResourceFactory.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.remote.core.IRemoteResource;
+
+/**
+ * Factory to create an IRemoteResource
+ *
+ * @author greg
+ *
+ */
+public class RemoteResourceFactory {
+ private final IConfigurationElement fConfigElement;
+
+ public RemoteResourceFactory(IConfigurationElement ce) {
+ fConfigElement = ce;
+ }
+
+ /**
+ * Get the remote resource associated with the platform resource.
+ *
+ * @return IRemoteResource
+ */
+ public IRemoteResource getRemoteResource(IResource resource) {
+ try {
+ IRemoteResource remoteRes = (IRemoteResource) fConfigElement
+ .createExecutableExtension(RemoteResourceAdapterFactory.ATTR_CLASS);
+ remoteRes.setResource(resource);
+ return remoteRes;
+ } catch (CoreException e) {
+ RemoteCorePlugin.log(e);
+ return null;
+ }
+ }
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java
new file mode 100644
index 00000000000..828a10abc4d
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/RemoteServicesManager.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.equinox.security.storage.ISecurePreferences;
+import org.eclipse.equinox.security.storage.SecurePreferencesFactory;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteConnectionProviderService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * The implementation for the remote services manager service.
+ *
+ */
+public class RemoteServicesManager implements IRemoteServicesManager {
+
+ private static final String LOCAL_SERVICES_ID = "org.eclipse.remote.LocalServices"; //$NON-NLS-1$
+
+ // Map from id to remote services
+ private final Map<String, RemoteConnectionType> connectionTypeMap = new HashMap<>();
+
+ // Map from URI scheme to remote services
+ private final Map<String, IRemoteConnectionType> schemeMap = new HashMap<>();
+
+ private final List<IRemoteConnectionChangeListener> listeners = new LinkedList<>();
+ private boolean inited;
+
+ /**
+ * Loads up the services extensions and then loads up the persisted connections.
+ * This stuff can't be done from the constructor for the manager since that's done
+ * in the bundle activator which is way too early. It also gives us the ability
+ * to override the initialization in tests
+ */
+ protected void init() {
+ if (inited) {
+ return;
+ }
+ inited = true;
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint point = registry.getExtensionPoint(RemoteCorePlugin.getUniqueIdentifier(), "remoteServices"); //$NON-NLS-1$
+
+ // Load up the connection types
+ for (IExtension ext : point.getExtensions()) {
+ for (IConfigurationElement ce : ext.getConfigurationElements()) {
+ if (ce.getName().equals("connectionType")) { //$NON-NLS-1$
+ RemoteConnectionType services = new RemoteConnectionType(ce, this);
+ connectionTypeMap.put(services.getId(), services);
+ String scheme = services.getScheme();
+ if (scheme != null) {
+ schemeMap.put(scheme, services);
+ }
+ }
+ }
+ }
+
+ // Load up the services
+ for (IExtension ext : point.getExtensions()) {
+ for (IConfigurationElement ce : ext.getConfigurationElements()) {
+ String name = ce.getName();
+ if (name.equals("connectionTypeService") || name.equals("connectionService") //$NON-NLS-1$//$NON-NLS-2$
+ || name.equals("processService")) { //$NON-NLS-1$
+ String id = ce.getAttribute("connectionTypeId"); //$NON-NLS-1$
+ RemoteConnectionType services = connectionTypeMap.get(id);
+ if (services != null) {
+ services.addService(ce);
+ }
+ }
+ }
+ }
+
+ // Init connection providers
+ for (IRemoteConnectionType connectionType : connectionTypeMap.values()) {
+ IRemoteConnectionProviderService providerService = connectionType
+ .getService(IRemoteConnectionProviderService.class);
+ if (providerService != null) {
+ providerService.init();
+ }
+ }
+ }
+
+ public Preferences getPreferenceNode() {
+ return InstanceScope.INSTANCE.getNode(RemoteCorePlugin.getUniqueIdentifier()).node("connections"); //$NON-NLS-1$
+ }
+
+ public ISecurePreferences getSecurePreferenceNode() {
+ return SecurePreferencesFactory.getDefault().node(RemoteCorePlugin.getUniqueIdentifier()).node("connections"); //$NON-NLS-1$
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType(String id) {
+ init();
+ return connectionTypeMap.get(id);
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType(URI uri) {
+ init();
+ return schemeMap.get(uri.getScheme());
+ }
+
+ @Override
+ public IRemoteConnectionType getLocalConnectionType() {
+ return getConnectionType(LOCAL_SERVICES_ID);
+ }
+
+ @Override
+ public List<IRemoteConnectionType> getAllConnectionTypes() {
+ init();
+ return new ArrayList<>(connectionTypeMap.values());
+ }
+
+ @Override
+ @SafeVarargs
+ public final List<IRemoteConnectionType> getConnectionTypesSupporting(
+ Class<? extends IRemoteConnection.Service>... services) {
+ List<IRemoteConnectionType> connTypes = new ArrayList<>();
+ for (IRemoteConnectionType connType : getAllConnectionTypes()) {
+ for (Class<? extends IRemoteConnection.Service> service : services) {
+ if (connType.hasConnectionService(service)) {
+ connTypes.add(connType);
+ break;
+ }
+ }
+ }
+ return connTypes;
+ }
+
+ @Override
+ @SafeVarargs
+ public final List<IRemoteConnectionType> getConnectionTypesByService(
+ Class<? extends IRemoteConnectionType.Service>... services) {
+ List<IRemoteConnectionType> connTypes = new ArrayList<>();
+ for (IRemoteConnectionType connType : getAllConnectionTypes()) {
+ for (Class<? extends IRemoteConnectionType.Service> service : services) {
+ if (!connType.hasService(service)) {
+ connTypes.add(connType);
+ break;
+ }
+ }
+ }
+ return connTypes;
+ }
+
+ @Override
+ public List<IRemoteConnectionType> getRemoteConnectionTypes() {
+ init();
+ List<IRemoteConnectionType> connTypes = new ArrayList<>(connectionTypeMap.values().size() - 1);
+ IRemoteConnectionType localServices = getLocalConnectionType();
+ for (IRemoteConnectionType s : connectionTypeMap.values()) {
+ if (!s.equals(localServices)) {
+ connTypes.add(s);
+ }
+ }
+ return connTypes;
+ }
+
+ @Override
+ public List<IRemoteConnection> getAllRemoteConnections() {
+ List<IRemoteConnection> connections = new ArrayList<>();
+ for (IRemoteConnectionType connType : getAllConnectionTypes()) {
+ connections.addAll(connType.getConnections());
+ }
+ return connections;
+ }
+
+ @Override
+ public void addRemoteConnectionChangeListener(IRemoteConnectionChangeListener listener) {
+ synchronized (listeners) {
+ listeners.add(listener);
+ }
+ }
+
+ @Override
+ public void removeRemoteConnectionChangeListener(IRemoteConnectionChangeListener listener) {
+ synchronized (listeners) {
+ listeners.remove(listener);
+ }
+ }
+
+ @Override
+ public void fireRemoteConnectionChangeEvent(RemoteConnectionChangeEvent event) {
+ List<IRemoteConnectionChangeListener> iListeners;
+ synchronized (listeners) {
+ iListeners = new ArrayList<>(listeners);
+ }
+ for (IRemoteConnectionChangeListener listener : iListeners) {
+ listener.connectionChanged(event);
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/launch/RemoteLaunchConfigService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/launch/RemoteLaunchConfigService.java
new file mode 100644
index 00000000000..3e71db08388
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/launch/RemoteLaunchConfigService.java
@@ -0,0 +1,65 @@
+package org.eclipse.remote.internal.core.launch;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.launch.IRemoteLaunchConfigService;
+import org.eclipse.remote.internal.core.RemoteCorePlugin;
+import org.osgi.service.prefs.Preferences;
+
+public class RemoteLaunchConfigService implements IRemoteLaunchConfigService {
+
+ private static final String REMOTE_LAUNCH_CONFIG = "remoteLaunchConfig"; //$NON-NLS-1$
+ private static final String REMOTE_LAUNCH_TYPE = "remoteLaunchType"; //$NON-NLS-1$
+
+ private Preferences getPreferences(String node) {
+ return InstanceScope.INSTANCE.getNode(RemoteCorePlugin.getUniqueIdentifier()).node(node);
+ }
+
+ private IRemoteConnection getRemoteConnection(String remoteId) {
+ if (remoteId == null) {
+ return null;
+ }
+
+ String[] ids = remoteId.split(":"); //$NON-NLS-1$
+ if (ids.length < 2) {
+ return null;
+ }
+
+ IRemoteServicesManager manager = RemoteCorePlugin.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connectionType = manager.getConnectionType(ids[0]);
+ if (connectionType == null) {
+ return null;
+ }
+
+ return connectionType.getConnection(ids[1]);
+ }
+
+ @Override
+ public void setActiveConnection(ILaunchConfiguration launchConfig, IRemoteConnection connection) {
+ String remoteId = connection.getConnectionType().getId() + ":" + connection.getName(); //$NON-NLS-1$
+ getPreferences(REMOTE_LAUNCH_CONFIG).put(launchConfig.getName(), remoteId);
+ try {
+ getPreferences(REMOTE_LAUNCH_TYPE).put(launchConfig.getType().getIdentifier(), remoteId);
+ } catch (CoreException e) {
+ RemoteCorePlugin.log(e.getStatus());
+ }
+ }
+
+ @Override
+ public IRemoteConnection getActiveConnection(ILaunchConfiguration launchConfig) {
+ String remoteId = getPreferences(REMOTE_LAUNCH_CONFIG).get(launchConfig.getName(), null);
+ return getRemoteConnection(remoteId);
+ }
+
+ @Override
+ public IRemoteConnection getLastActiveConnection(ILaunchConfigurationType launchConfigType) {
+ String remoteId = getPreferences(REMOTE_LAUNCH_TYPE).get(launchConfigType.getIdentifier(), null);
+ return getRemoteConnection(remoteId);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/Messages.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/Messages.java
new file mode 100644
index 00000000000..306928d81c6
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/Messages.java
@@ -0,0 +1,20 @@
+package org.eclipse.remote.internal.core.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.internal.core.messages.messages"; //$NON-NLS-1$
+ public static String LocalConnection_1;
+ public static String LocalConnection_2;
+ public static String RemoteServicesProxy_0;
+ public static String RemoteServicesProxy_1;
+ public static String Unable_to_create_new_local_connections;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/messages.properties b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/messages.properties
new file mode 100644
index 00000000000..501161fef7d
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/messages/messages.properties
@@ -0,0 +1,5 @@
+LocalConnection_1=localhost
+LocalConnection_2=Port forwarding not supported
+Unable_to_create_new_local_connections=Unable to create new local connections
+RemoteServicesProxy_0=Missing {0} attribute
+RemoteServicesProxy_1=Failed to instantiate factory: {0} in type: {1} in plugin: {2}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/PreferenceInitializer.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/PreferenceInitializer.java
new file mode 100644
index 00000000000..0ba21c8d684
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/PreferenceInitializer.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2012 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.core.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.remote.core.IRemotePreferenceConstants;
+
+/**
+ * Class used to initialize default preference values.
+ *
+ * @since 6.0
+ */
+public class PreferenceInitializer extends AbstractPreferenceInitializer {
+
+ @Override
+ public void initializeDefaultPreferences() {
+ Preferences.setDefaultString(IRemotePreferenceConstants.PREF_CONNECTION_TYPE_ID, "org.eclipse.remote.JSch"); //$NON-NLS-1$
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/Preferences.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/Preferences.java
new file mode 100644
index 00000000000..88e14f49981
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/preferences/Preferences.java
@@ -0,0 +1,495 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.preferences;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.remote.internal.core.RemoteCorePlugin;
+import org.osgi.service.prefs.BackingStoreException;
+
+/**
+ * Convenience class to facilitate using the new {@link IEclipsePreferences} story. Adapted from
+ * org.eclipse.debug.internal.core.Preferences.
+ *
+ * @since 5.0
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ */
+public final class Preferences {
+
+ private static final IScopeContext[] contexts = new IScopeContext[] { DefaultScope.INSTANCE,
+ InstanceScope.INSTANCE };
+
+ private static final int DEFAULT_CONTEXT = 0;
+ private static final int INSTANCE_CONTEXT = 1;
+
+ private static final String fQualifier = RemoteCorePlugin.getUniqueIdentifier();
+
+ /**
+ * Adds the given preference listener to the {@link DefaultScope} and the {@link InstanceScope}
+ *
+ * @param listener
+ */
+ public static void addPreferenceChangeListener(IPreferenceChangeListener listener) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).addPreferenceChangeListener(listener);
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).addPreferenceChangeListener(listener);
+ }
+
+ /**
+ * Returns whether the named preference is know in the preference store.
+ *
+ * @param name
+ * @return
+ */
+ public static boolean contains(String name) {
+ return (contexts[INSTANCE_CONTEXT].getNode(fQualifier).get(name, null) != null
+ || contexts[DEFAULT_CONTEXT].getNode(fQualifier).get(name, null) != null);
+ }
+
+ /**
+ * Returns the value in the preference store for the given key. If the key
+ * is not defined then return the default value. Use the canonical scope
+ * lookup order for finding the preference value.
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the value of the preference or the given default value
+ */
+ public static boolean getBoolean(String key) {
+ return Platform.getPreferencesService().getBoolean(fQualifier, key, false, null);
+ }
+
+ /**
+ * Returns the value in the preference store for the given key. If the key
+ * is not defined then return the default value. Use the canonical scope
+ * lookup order for finding the preference value.
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the value of the preference or the given default value
+ */
+ public static byte[] getByteArray(String key) {
+ return Platform.getPreferencesService().getByteArray(fQualifier, key, null, null);
+ }
+
+ /**
+ * Returns the default boolean value stored in the {@link DefaultScope} for
+ * the given key or the specified default value if the key does not appear
+ * in the {@link DefaultScope}
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the boolean value set in the {@link DefaultScope} for the given
+ * key, or the specified default value.
+ */
+ public static synchronized boolean getDefaultBoolean(String key, boolean defaultvalue) {
+ return contexts[DEFAULT_CONTEXT].getNode(fQualifier).getBoolean(key, defaultvalue);
+ }
+
+ /**
+ * Returns the default byte array value stored in the {@link DefaultScope} for the given key or the specified default value if
+ * the key does not
+ * appear in the {@link DefaultScope}
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the byte array value set in the {@link DefaultScope} for the
+ * given key, or the specified default value.
+ */
+ public static synchronized byte[] getDefaultByteArray(String key, byte[] defaultvalue) {
+ return contexts[DEFAULT_CONTEXT].getNode(fQualifier).getByteArray(key, defaultvalue);
+ }
+
+ /**
+ * Returns the default double value stored in the {@link DefaultScope} for
+ * the given key or the specified default value if the key does not appear
+ * in the {@link DefaultScope}
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the double value set in the {@link DefaultScope} for the given
+ * key, or the specified default value.
+ */
+ public static synchronized double getDefaultDouble(String key, double defaultvalue) {
+ return contexts[DEFAULT_CONTEXT].getNode(fQualifier).getDouble(key, defaultvalue);
+ }
+
+ /**
+ * Returns the default float value stored in the {@link DefaultScope} for
+ * the given key or the specified default value if the key does not appear
+ * in the {@link DefaultScope}
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the float value set in the {@link DefaultScope} for the given
+ * key, or the specified default value.
+ */
+ public static synchronized float getDefaultFloat(String key, float defaultvalue) {
+ return contexts[DEFAULT_CONTEXT].getNode(fQualifier).getFloat(key, defaultvalue);
+ }
+
+ /**
+ * Returns the default integer value stored in the {@link DefaultScope} for
+ * the given key or the specified default value if the key does not appear
+ * in the {@link DefaultScope}
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the integer value set in the {@link DefaultScope} for the given
+ * key, or the specified default value.
+ */
+ public static synchronized int getDefaultInt(String key, int defaultvalue) {
+ return contexts[DEFAULT_CONTEXT].getNode(fQualifier).getInt(key, defaultvalue);
+ }
+
+ /**
+ * Returns the default long value stored in the {@link DefaultScope} for the
+ * given key or the specified default value if the key does not appear in
+ * the {@link DefaultScope}
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the long value set in the {@link DefaultScope} for the given key,
+ * or the specified default value.
+ */
+ public static synchronized long getDefaultLong(String key, long defaultvalue) {
+ return contexts[DEFAULT_CONTEXT].getNode(fQualifier).getLong(key, defaultvalue);
+ }
+
+ /**
+ * Returns the default string value stored in the {@link DefaultScope} for
+ * the given key or the specified default value if the key does not appear
+ * in the {@link DefaultScope}
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the string value set in the {@link DefaultScope} for the given
+ * key, or the specified default value.
+ */
+ public static synchronized String getDefaultString(String key, String defaultvalue) {
+ return contexts[DEFAULT_CONTEXT].getNode(fQualifier).get(key, defaultvalue);
+ }
+
+ /**
+ * Returns the value in the preference store for the given key. If the key
+ * is not defined then return the default value. Use the canonical scope
+ * lookup order for finding the preference value.
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the value of the preference or the given default value
+ */
+ public static double getDouble(String key) {
+ return Platform.getPreferencesService().getDouble(fQualifier, key, 0.0, null);
+ }
+
+ /**
+ * Returns the value in the preference store for the given key. If the key
+ * is not defined then return the default value. Use the canonical scope
+ * lookup order for finding the preference value.
+ *
+ * @param fQualifier
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the value of the preference or the given default value
+ */
+ public static float getFloat(String key) {
+ return Platform.getPreferencesService().getFloat(fQualifier, key, 0.0f, null);
+ }
+
+ /**
+ * Returns the value in the preference store for the given key. If the key
+ * is not defined then return the default value. Use the canonical scope
+ * lookup order for finding the preference value.
+ *
+ * @param fQualifier
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the value of the preference or the given default value
+ */
+ public static int getInt(String key) {
+ return Platform.getPreferencesService().getInt(fQualifier, key, 0, null);
+ }
+
+ /**
+ * Returns the value in the preference store for the given key. If the key
+ * is not defined then return the default value. Use the canonical scope
+ * lookup order for finding the preference value.
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the value of the preference or the given default value
+ */
+ public static long getLong(String key) {
+ return Platform.getPreferencesService().getLong(fQualifier, key, 0L, null);
+ }
+
+ /**
+ * Returns the value in the preference store for the given key. If the key
+ * is not defined then return the default value. Use the canonical scope
+ * lookup order for finding the preference value.
+ *
+ * @param key
+ * @param defaultvalue
+ *
+ * @return the value of the preference or the given default value
+ */
+ public static String getString(String key) {
+ return Platform.getPreferencesService().getString(fQualifier, key, null, null);
+ }
+
+ /**
+ * Returns true if the named preference has the default value.
+ *
+ * @param name
+ * @return
+ */
+ public static boolean isDefault(String name) {
+ String defVal = contexts[DEFAULT_CONTEXT].getNode(fQualifier).get(name, null);
+ if (defVal != null) {
+ String val = contexts[INSTANCE_CONTEXT].getNode(fQualifier).get(name, null);
+ return (val != null && val.equals(defVal));
+ }
+ return false;
+ }
+
+ /**
+ * Removes the given preference listener from the {@link DefaultScope} and
+ * the {@link InstanceScope}
+ *
+ * @param listener
+ */
+ public static void removePreferenceChangeListener(IPreferenceChangeListener listener) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).removePreferenceChangeListener(listener);
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).removePreferenceChangeListener(listener);
+ }
+
+ /**
+ * Save the preferences for the given plugin identifier. It should be noted
+ * that all pending preference changes will be flushed with this method.
+ */
+ public static synchronized void savePreferences() {
+ try {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).flush();
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).flush();
+ } catch (BackingStoreException bse) {
+ RemoteCorePlugin.log(bse);
+ }
+ }
+
+ /**
+ * Sets a boolean preference in the {@link InstanceScope}.
+ *
+ * @param key
+ * the key
+ * @param value
+ * the value
+ */
+ public static synchronized void setBoolean(String key, boolean value) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).putBoolean(key, value);
+ }
+
+ /**
+ * Sets a byte array preference in the {@link InstanceScope}.
+ *
+ * @param key
+ * the key
+ * @param value
+ * the value
+ */
+ public static synchronized void setByteArray(String key, byte[] value) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).putByteArray(key, value);
+ }
+
+ /**
+ * Sets a boolean in the {@link DefaultScope}
+ *
+ * @param key
+ * the key
+ * @param value
+ * the new value
+ */
+ public static synchronized void setDefaultBoolean(String key, boolean value) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).putBoolean(key, value);
+ }
+
+ /**
+ * Sets a byte array in the {@link DefaultScope}
+ *
+ * @param key
+ * the key
+ * @param value
+ * the new value
+ */
+ public static synchronized void setDefaultByteArray(String key, byte[] value) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).putByteArray(key, value);
+ }
+
+ /**
+ * Sets a double in the {@link DefaultScope}
+ *
+ * @param key
+ * the key
+ * @param value
+ * the new value
+ */
+ public static synchronized void setDefaultDouble(String key, double value) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).putDouble(key, value);
+ }
+
+ /**
+ * Sets a float in the {@link DefaultScope}
+ *
+ * @param key
+ * the key
+ * @param value
+ * the new value
+ */
+ public static synchronized void setDefaultFloat(String key, float value) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).putFloat(key, value);
+ }
+
+ /**
+ * Sets a integer in the {@link DefaultScope}
+ *
+ * @param key
+ * the key
+ * @param value
+ * the new value
+ */
+ public static synchronized void setDefaultInt(String key, int value) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).putInt(key, value);
+ }
+
+ /**
+ * Sets a long in the {@link DefaultScope}
+ *
+ * @param key
+ * the key
+ * @param value
+ * the new value
+ */
+ public static synchronized void setDefaultLong(String key, long value) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).putLong(key, value);
+ }
+
+ /**
+ * Sets a string in the {@link DefaultScope}
+ *
+ * @param key
+ * the key
+ * @param value
+ * the new value
+ */
+ public static synchronized void setDefaultString(String key, String value) {
+ contexts[DEFAULT_CONTEXT].getNode(fQualifier).put(key, value);
+ }
+
+ /**
+ * Sets a double preference in the {@link InstanceScope}.
+ *
+ * @param key
+ * the key
+ * @param value
+ * the value
+ */
+ public static synchronized void setDouble(String key, double value) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).putDouble(key, value);
+ }
+
+ /**
+ * Sets a float preference in the {@link InstanceScope}.
+ *
+ * @param key
+ * the key
+ * @param value
+ * the value
+ */
+ public static synchronized void setFloat(String key, float value) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).putFloat(key, value);
+ }
+
+ /**
+ * Sets a integer preference in the {@link InstanceScope}.
+ *
+ * @param key
+ * the key
+ * @param value
+ * the value
+ */
+ public static synchronized void setInt(String key, int value) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).putInt(key, value);
+ }
+
+ /**
+ * Sets a long preference in the {@link InstanceScope}.
+ *
+ * @param key
+ * the key
+ * @param value
+ * the value
+ */
+ public static synchronized void setLong(String key, long value) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).putLong(key, value);
+ }
+
+ /**
+ * Sets a string preference in the {@link InstanceScope}.
+ *
+ * @param key
+ * the key
+ * @param value
+ * the value
+ */
+ public static synchronized void setString(String key, String value) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).put(key, value);
+ }
+
+ /**
+ * Sets the given preference to its default value. This is done by removing
+ * any set value from the {@link InstanceScope}. Has no effect if the given
+ * key is <code>null</code>.
+ *
+ * @param key
+ * the key for the preference
+ */
+ public static synchronized void setToDefault(String key) {
+ if (key != null) {
+ contexts[INSTANCE_CONTEXT].getNode(fQualifier).remove(key);
+ }
+ }
+
+ /**
+ * Constructor
+ */
+ private Preferences() {
+ // no direct instantiation
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalCommandShellService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalCommandShellService.java
new file mode 100644
index 00000000000..dbf6132f0f6
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalCommandShellService.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessService;
+
+public class LocalCommandShellService implements IRemoteCommandShellService {
+
+ private final IRemoteConnection connection;
+
+ public LocalCommandShellService(IRemoteConnection connection) {
+ this.connection = connection;
+ }
+
+ public static class Factory implements IRemoteCommandShellService.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (service.equals(IRemoteCommandShellService.class)) {
+ return (T) new LocalCommandShellService(remoteConnection);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return connection;
+ }
+
+ @SuppressWarnings("nls")
+ @Override
+ public IRemoteProcess getCommandShell(int flags) throws IOException {
+ IRemoteProcessService procService = connection.getService(IRemoteProcessService.class);
+ String[] command;
+ if (Platform.getOS().equals(Platform.OS_WIN32)) {
+ command = new String[] { "cmd" };
+ } else {
+ List<String> list = new ArrayList<>(Arrays.asList(System.getenv("SHELL").split("\\s+")));
+ list.add("-l");
+ command = list.toArray(new String[list.size()]);
+ }
+ IRemoteProcessBuilder builder = procService.getProcessBuilder(command);
+ return builder.start(IRemoteProcessBuilder.ALLOCATE_PTY);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionHostService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionHostService.java
new file mode 100644
index 00000000000..d11d8b55f7a
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionHostService.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+
+public class LocalConnectionHostService implements IRemoteConnectionHostService {
+
+ private final IRemoteConnection connection;
+
+ public LocalConnectionHostService(IRemoteConnection connection) {
+ this.connection = connection;
+ }
+
+ public static class Factory implements IRemoteConnectionHostService.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (service.equals(IRemoteConnectionHostService.class)) {
+ return (T) new LocalConnectionHostService(remoteConnection);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return this.connection;
+ }
+
+ @Override
+ public String getHostname() {
+ try {
+ return InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ return "unknown"; //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public String getPassphrase() {
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getPassword() {
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public int getPort() {
+ return 0;
+ }
+
+ @Override
+ public int getTimeout() {
+ return 0;
+ }
+
+ @Override
+ public boolean useLoginShell() {
+ return true;
+ }
+
+ @Override
+ public String getUsername() {
+ return System.getProperty("user.name"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void setHostname(String hostname) {
+ // Ignored
+ }
+
+ @Override
+ public void setPassphrase(String passphrase) {
+ // Ignored
+ }
+
+ @Override
+ public void setPassword(String password) {
+ // Ignored
+ }
+
+ @Override
+ public void setPort(int port) {
+ // Ignored
+ }
+
+ @Override
+ public void setTimeout(int timeout) {
+ // Ignored
+ }
+
+ @Override
+ public void setUseLoginShell(boolean useLogingShell) {
+ // Ignored
+ }
+
+ @Override
+ public void setUsePassword(boolean usePassword) {
+ // Ignored
+ }
+
+ @Override
+ public void setUsername(String username) {
+ // Ignored
+ }
+
+ @Override
+ public boolean usePassword() {
+ return false;
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionPropertyService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionPropertyService.java
new file mode 100644
index 00000000000..27f00ac311e
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionPropertyService.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteConnectionPropertyService;
+import org.eclipse.remote.internal.core.RemoteCorePlugin;
+
+public class LocalConnectionPropertyService implements IRemoteConnectionPropertyService {
+
+ private final IRemoteConnection connection;
+
+ public LocalConnectionPropertyService(IRemoteConnection connection) {
+ this.connection = connection;
+ }
+
+ public static class Factory implements IRemoteConnectionPropertyService.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (service.equals(IRemoteConnectionPropertyService.class)) {
+ return (T) new LocalConnectionPropertyService(remoteConnection);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return connection;
+ }
+
+ @Override
+ public String getProperty(String key) {
+ switch (key) {
+ case IRemoteConnection.OS_NAME_PROPERTY:
+ return RemoteCorePlugin.getDefault().getBundle().getBundleContext().getProperty("osgi.os"); //$NON-NLS-1$
+ case IRemoteConnection.OS_ARCH_PROPERTY:
+ return RemoteCorePlugin.getDefault().getBundle().getBundleContext().getProperty("osgi.arch"); //$NON-NLS-1$
+ case IRemoteConnection.LOCALE_CHARMAP_PROPERTY:
+ return System.getProperty("file.encoding"); //$NON-NLS-1$
+ }
+ return System.getProperty(key);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionProviderService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionProviderService.java
new file mode 100644
index 00000000000..8b811b7e354
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalConnectionProviderService.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import org.eclipse.remote.core.IRemoteConnectionProviderService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.core.RemoteCorePlugin;
+
+public class LocalConnectionProviderService implements IRemoteConnectionProviderService {
+
+ private static final String localConnectionName = Messages.LocalConnectionProviderService_LocalConnectionName;
+
+ private IRemoteConnectionType connectionType;
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (service.equals(IRemoteConnectionProviderService.class)) {
+ return (T) new LocalConnectionProviderService(connectionType);
+ }
+ return null;
+ }
+ }
+
+ public LocalConnectionProviderService(IRemoteConnectionType connectionType) {
+ this.connectionType = connectionType;
+ }
+
+ @Override
+ public void init() {
+ if (connectionType.getConnections().isEmpty()) {
+ try {
+ connectionType.newConnection(localConnectionName).save();
+ } catch (RemoteConnectionException e) {
+ RemoteCorePlugin.log(e.getStatus());
+ }
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalFileService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalFileService.java
new file mode 100644
index 00000000000..b9aa823302f
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalFileService.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteProcessService;
+
+public class LocalFileService implements IRemoteFileService {
+
+ private final IRemoteConnection connection;
+
+ public LocalFileService(IRemoteConnection connection) {
+ this.connection = connection;
+ }
+
+ public static class Factory implements IRemoteFileService.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (IRemoteFileService.class.equals(service)) {
+ return (T) new LocalFileService(remoteConnection);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return connection;
+ }
+
+ @Override
+ public String getDirectorySeparator() {
+ return System.getProperty("file.separator", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public IFileStore getResource(String path) {
+ return EFS.getLocalFileSystem().getStore(Path.fromOSString(path));
+ }
+
+ @Override
+ public String getBaseDirectory() {
+ return connection.getService(IRemoteProcessService.class).getWorkingDirectory();
+ }
+
+ @Override
+ public void setBaseDirectory(String path) {
+ connection.getService(IRemoteProcessService.class).setWorkingDirectory(path);
+ }
+
+ @Override
+ public String toPath(URI uri) {
+ return URIUtil.toPath(uri).toString();
+ }
+
+ @Override
+ public URI toURI(IPath path) {
+ return URIUtil.toURI(path);
+ }
+
+ @Override
+ public URI toURI(String path) {
+ return URIUtil.toURI(path);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcess.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcess.java
new file mode 100644
index 00000000000..b72c06b3c5b
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcess.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+
+import org.eclipse.cdt.utils.pty.PTY;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessControlService;
+import org.eclipse.remote.core.IRemoteProcessTerminalService;
+
+public class LocalProcess implements IRemoteProcessControlService, IRemoteProcessTerminalService {
+ private static int refCount = 0;
+
+ private final IRemoteProcess remoteProcess;
+ private final Process localProcess;
+ private final PTY pty;
+ private int width, height;
+ private InputStream procStdout;
+ private InputStream procStderr;
+ private Thread stdoutReader;
+ private Thread stderrReader;
+ private final Thread completedChecker;
+ private volatile boolean isCompleted;
+
+ public static class Factory implements IRemoteProcess.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends IRemoteProcess.Service> T getService(IRemoteProcess remoteProcess, Class<T> service) {
+ // This little trick creates an instance of this class
+ // then for each interface it implements, it returns the same object.
+ // This works because the connection caches the service so only one gets created.
+ // As a side effect, it makes this class a service too which can be used
+ // by the this plug-in
+ if (LocalProcess.class.equals(service)) {
+ return (T) new LocalProcess(remoteProcess);
+ }
+ if (IRemoteProcessControlService.class.equals(service)) {
+ return (T) remoteProcess.getService(LocalProcess.class);
+ }
+ if (IRemoteProcessTerminalService.class.equals(service)) {
+ return (T) remoteProcess.getService(LocalProcess.class);
+ }
+ return null;
+ }
+ }
+
+ /**
+ * Thread to merge stdout and stderr. Keeps refcount so that output stream
+ * is not closed too early.
+ *
+ */
+ private class ProcOutputMerger implements Runnable {
+ private final static int BUF_SIZE = 8192;
+
+ private final InputStream input;
+ private final OutputStream output;
+
+ public ProcOutputMerger(InputStream input, OutputStream output) {
+ this.input = input;
+ this.output = output;
+ synchronized (this.output) {
+ refCount++;
+ }
+ }
+
+ @Override
+ public void run() {
+ int len;
+ byte b[] = new byte[BUF_SIZE];
+
+ try {
+ while ((len = input.read(b)) > 0) {
+ output.write(b, 0, len);
+ }
+ } catch (IOException e) {
+ // Ignore
+ }
+ synchronized (output) {
+ if (--refCount == 0) {
+ try {
+ output.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ }
+ }
+
+ public class NullInputStream extends InputStream {
+ @Override
+ public int read() throws IOException {
+ return -1;
+ }
+
+ @Override
+ public int available() {
+ return 0;
+ }
+ }
+
+ public LocalProcess(IRemoteProcess process) {
+ remoteProcess = process;
+ LocalProcessBuilder builder = (LocalProcessBuilder) process.getProcessBuilder();
+ localProcess = builder.getProcess();
+ pty = builder.getPty();
+
+ try {
+ if (process.getProcessBuilder().redirectErrorStream()) {
+ PipedOutputStream pipedOutput = new PipedOutputStream();
+
+ procStderr = new NullInputStream();
+ procStdout = new PipedInputStream(pipedOutput);
+
+ stderrReader = new Thread(new ProcOutputMerger(localProcess.getErrorStream(), pipedOutput));
+ stdoutReader = new Thread(new ProcOutputMerger(localProcess.getInputStream(), pipedOutput));
+
+ stderrReader.start();
+ stdoutReader.start();
+ } else {
+ procStderr = localProcess.getErrorStream();
+ procStdout = localProcess.getInputStream();
+ }
+ } catch (IOException e) {
+ localProcess.destroy();
+ }
+
+ completedChecker = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ while (!isCompleted) {
+ try {
+ localProcess.waitFor();
+ } catch (InterruptedException e) {
+ continue;
+ }
+ isCompleted = true;
+ }
+ }
+
+ });
+ completedChecker.start();
+ }
+
+ @Override
+ public void destroy() {
+ localProcess.destroy();
+ }
+
+ @Override
+ public int exitValue() {
+ return localProcess.exitValue();
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ return procStderr;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return procStdout;
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ return localProcess.getOutputStream();
+ }
+
+ @Override
+ public int waitFor() throws InterruptedException {
+ return localProcess.waitFor();
+ }
+
+ @Override
+ public boolean isCompleted() {
+ return isCompleted;
+ }
+
+ @Override
+ public IRemoteProcess getRemoteProcess() {
+ return remoteProcess;
+ }
+
+ @Override
+ public void setTerminalSize(int cols, int rows, int pwidth, int pheight) {
+ if (pty != null && (width != cols || height != rows)) {
+ width = cols;
+ height = rows;
+ pty.setTerminalSize(width, height);
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessBuilder.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessBuilder.java
new file mode 100644
index 00000000000..3f7a4a3a2f4
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessBuilder.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.cdt.utils.pty.PTY;
+import org.eclipse.cdt.utils.pty.PTY.Mode;
+import org.eclipse.cdt.utils.spawner.ProcessFactory;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.remote.core.AbstractRemoteProcessBuilder;
+import org.eclipse.remote.core.IProcessFactory;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.internal.core.RemoteCorePlugin;
+import org.eclipse.remote.internal.core.RemoteProcess;
+
+public class LocalProcessBuilder extends AbstractRemoteProcessBuilder {
+ private static final String EXTENSION_POINT_ID = "processFactory"; //$NON-NLS-1$
+ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private final IProcessFactory fProcessFactory;
+ private final Map<String, String> fRemoteEnv = new HashMap<>();
+
+ private Process localProcess;
+ private PTY pty;
+
+ public LocalProcessBuilder(IRemoteConnection connection, List<String> command) {
+ super(connection, command);
+ fRemoteEnv.putAll(System.getenv());
+ fProcessFactory = getProcessFactory();
+ }
+
+ public LocalProcessBuilder(IRemoteConnection connection, String... command) {
+ this(connection, Arrays.asList(command));
+ }
+
+ @Override
+ public IFileStore directory() {
+ IFileStore dir = super.directory();
+ if (dir == null) {
+ String userDir = System.getProperty("user.dir"); //$NON-NLS-1$
+ if (userDir != null) {
+ dir = EFS.getLocalFileSystem().getStore(Path.fromOSString(userDir));
+ directory(dir);
+ }
+ }
+ return dir;
+ }
+
+ @Override
+ public Map<String, String> environment() {
+ return fRemoteEnv;
+ }
+
+ @Override
+ public int getSupportedFlags() {
+ return NONE;
+ }
+
+ @Override
+ public IRemoteProcess start(int flags) throws IOException {
+ String commandArray[] = command().toArray(new String[0]);
+
+ if ((flags & IRemoteProcessBuilder.ALLOCATE_PTY) != 0) {
+ environment().put("TERM", "vt100"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ String environmentArray[] = new String[environment().size()];
+ int index = 0;
+ for (Entry<String, String> entry : environment().entrySet()) {
+ environmentArray[index++] = entry.getKey() + "=" + entry.getValue(); //$NON-NLS-1$
+ }
+
+ try {
+ if ((flags & IRemoteProcessBuilder.ALLOCATE_PTY) != 0) {
+ pty = new PTY(Mode.TERMINAL);
+ File dir = directory() != null ? directory().toLocalFile(EFS.NONE, new NullProgressMonitor()) : null;
+ localProcess = ProcessFactory.getFactory().exec(commandArray, environmentArray, dir, pty);
+ } else {
+ if (directory() != null) {
+ localProcess = fProcessFactory.exec(commandArray, environmentArray,
+ directory().toLocalFile(EFS.NONE, new NullProgressMonitor()));
+ } else {
+ localProcess = fProcessFactory.exec(commandArray, environmentArray);
+ }
+ }
+ } catch (CoreException e) {
+ throw new IOException(e.getMessage());
+ }
+ return new RemoteProcess(getRemoteConnection(), this);
+ }
+
+ public Process getProcess() {
+ return localProcess;
+ }
+
+ public PTY getPty() {
+ return pty;
+ }
+
+ private IProcessFactory getProcessFactory() {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(RemoteCorePlugin.getUniqueIdentifier(),
+ EXTENSION_POINT_ID);
+
+ IProcessFactory processFactory = null;
+
+ for (IExtension ext : extensionPoint.getExtensions()) {
+ final IConfigurationElement[] elements = ext.getConfigurationElements();
+
+ for (IConfigurationElement ce : elements) {
+ try {
+ processFactory = (IProcessFactory) ce.createExecutableExtension(ATTR_CLASS);
+ } catch (CoreException e) {
+ // Use default factory
+ }
+ }
+ }
+
+ if (processFactory == null) {
+ processFactory = new IProcessFactory() {
+ @Override
+ public Process exec(String cmd) throws IOException {
+ return Runtime.getRuntime().exec(cmd);
+ }
+
+ @Override
+ public Process exec(String[] cmdarray) throws IOException {
+ return Runtime.getRuntime().exec(cmdarray);
+ }
+
+ @Override
+ public Process exec(String[] cmdarray, String[] envp) throws IOException {
+ return Runtime.getRuntime().exec(cmdarray, envp);
+ }
+
+ @Override
+ public Process exec(String cmd, String[] envp) throws IOException {
+ return Runtime.getRuntime().exec(cmd, envp);
+ }
+
+ @Override
+ public Process exec(String cmd, String[] envp, File dir) throws IOException {
+ return Runtime.getRuntime().exec(cmd, envp, dir);
+ }
+
+ @Override
+ public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException {
+ return Runtime.getRuntime().exec(cmdarray, envp, dir);
+ }
+ };
+ }
+
+ return processFactory;
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessService.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessService.java
new file mode 100644
index 00000000000..7dac4f81b5b
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalProcessService.java
@@ -0,0 +1,76 @@
+package org.eclipse.remote.internal.core.services.local;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessService;
+
+public class LocalProcessService implements IRemoteProcessService {
+
+ private final IRemoteConnection remoteConnection;
+ private String workingDirectory;
+
+ public LocalProcessService(IRemoteConnection remoteConnection) {
+ this.remoteConnection = remoteConnection;
+ }
+
+ public static class Factory implements IRemoteProcessService.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (IRemoteProcessService.class.equals(service)) {
+ return (T) new LocalProcessService(remoteConnection);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return remoteConnection;
+ }
+
+ @Override
+ public Map<String, String> getEnv() {
+ return System.getenv();
+ }
+
+ @Override
+ public String getEnv(String name) {
+ return System.getenv(name);
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder(List<String> command) {
+ return new LocalProcessBuilder(remoteConnection, command);
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder(String... command) {
+ return new LocalProcessBuilder(remoteConnection, command);
+ }
+
+ @Override
+ public String getWorkingDirectory() {
+ if (workingDirectory == null) {
+ workingDirectory = System.getProperty("user.home"); //$NON-NLS-1$
+ if (workingDirectory == null) {
+ workingDirectory = System.getProperty("user.dir"); //$NON-NLS-1$
+ if (workingDirectory == null) {
+ workingDirectory = Path.ROOT.toOSString();
+ }
+ }
+ }
+ return workingDirectory;
+ }
+
+ @Override
+ public void setWorkingDirectory(String path) {
+ workingDirectory = path;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalResource.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalResource.java
new file mode 100644
index 00000000000..be943a9c3aa
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/LocalResource.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.core.services.local;
+
+import java.net.URI;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.remote.core.IRemoteResource;
+
+public class LocalResource implements IRemoteResource {
+ private IResource fResource;
+
+ public LocalResource(IResource resource) {
+ fResource = resource;
+ }
+
+ @Override
+ public URI getActiveLocationURI() {
+ return fResource.getLocationURI();
+ }
+
+ @Override
+ public IResource getResource() {
+ return fResource;
+ }
+
+ @Override
+ public void refresh(IProgressMonitor monitor) throws CoreException {
+ fResource.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+ }
+
+ @Override
+ public void setResource(IResource resource) {
+ fResource = resource;
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/Messages.java b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/Messages.java
new file mode 100644
index 00000000000..571f9045ca8
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/Messages.java
@@ -0,0 +1,15 @@
+package org.eclipse.remote.internal.core.services.local;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.internal.core.services.local.messages"; //$NON-NLS-1$
+ public static String LocalConnectionProviderService_LocalConnectionName;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/messages.properties b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/messages.properties
new file mode 100644
index 00000000000..e72dc8616fc
--- /dev/null
+++ b/remote/org.eclipse.remote.core/src/org/eclipse/remote/internal/core/services/local/messages.properties
@@ -0,0 +1 @@
+LocalConnectionProviderService_LocalConnectionName=Local
diff --git a/remote/org.eclipse.remote.doc.isv/.project b/remote/org.eclipse.remote.doc.isv/.project
new file mode 100644
index 00000000000..f25b52a6f0c
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.doc.isv</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.doc.isv/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.doc.isv/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..481cefaea0a
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Eclipse Remote Development documentation plug-in
+Bundle-SymbolicName: org.eclipse.remote.doc.isv;singleton:=true
+Bundle-Version: 1.1.200.qualifier
+Bundle-Vendor: Eclipse PTP
+Require-Bundle: org.eclipse.remote.console,
+ org.eclipse.remote.core,
+ org.eclipse.remote.jsch.core,
+ org.eclipse.remote.jsch.ui,
+ org.eclipse.remote.serial.core,
+ org.eclipse.remote.serial.ui,
+ org.eclipse.remote.telnet.core,
+ org.eclipse.remote.telnet.ui,
+ org.eclipse.remote.ui
diff --git a/remote/org.eclipse.remote.doc.isv/about.html b/remote/org.eclipse.remote.doc.isv/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.doc.isv/build.properties b/remote/org.eclipse.remote.doc.isv/build.properties
new file mode 100644
index 00000000000..4f5ed0212bd
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/build.properties
@@ -0,0 +1,12 @@
+bin.includes = plugin.xml,\
+ META-INF/,\
+ html/,\
+ toc*.xml,\
+ css/,\
+ about.html,\
+ toc.xml,\
+ tocconcepts.xml,\
+ tocgettingstarted.xml,\
+ tocreference.xml,\
+ tocsamples.xml
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.doc.isv/css/style.css b/remote/org.eclipse.remote.doc.isv/css/style.css
new file mode 100644
index 00000000000..00cc9fbc494
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/css/style.css
@@ -0,0 +1,17 @@
+code {
+ color: Crimson;
+ font-family: monaco,consolas,"courier new",monospace;
+ }
+
+pre {
+ background-color: lightgrey;
+ width: auto;
+ overflow: auto;
+ padding: 25px;
+ border: 1px solid navy;
+ margin: 1em;
+}
+
+p {
+ font: 15px arial, sans-serif;
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.doc.isv/html/.gitignore b/remote/org.eclipse.remote.doc.isv/html/.gitignore
new file mode 100644
index 00000000000..07f43314f62
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/html/.gitignore
@@ -0,0 +1 @@
+/reference/
diff --git a/remote/org.eclipse.remote.doc.isv/html/concepts/concepts.html b/remote/org.eclipse.remote.doc.isv/html/concepts/concepts.html
new file mode 100644
index 00000000000..a000aa679f9
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/html/concepts/concepts.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>Concepts</title>
+ <link rel="stylesheet" type="text/css" href="../../css/style.css">
+</style>
+</head>
+
+<body>
+<p>This section describes the main concepts and services implemented by the Eclipse remote framework.</p>
+
+<!--
+ Concepts
+-->
+
+<h1>Concepts</h1>
+
+<p>Some few concepts are needed to understand the framework's services overall. They are described in the next sections.</p>
+
+<h3>Connection type</h3>
+<p>An connection type (<code>IRemoteConnectionType</code>) abstracts a remote protocol to host access. As of version 2.0.1, the framework provides the <b>ssh</b> (implemented through JSch framework), <b>Telnet</b> and <b>Local</b> types.</p>
+<p>The connection type is obtained from the remote services manager either by passing its scheme ID (Identification) or an URI.</p>
+<p>It has the <code>newConnection</code> method where a new connection of this type is created. It also holds the list of all connections already created that belongs to it.</p>
+
+<h3>Remote connection</h3>
+<p>The remote connection (<code>IRemoteConnection</code>) interface is used to manage a connection to a single remote host. A connection must be established (open) before any other operations are permitted. All operations carried out on remote host should be evoked from its associated services, which are get with <code>getService</code> method.</p>
+<p>Connections are read-only objects. In order to change the attributes of a connection, a working copy (<code>IRemoteConnectionWorkingCopy</code>) must be created. The host attributes getters and setters can also be managed with connection host service (<code>IRemoteConnectionHostService</code>).
+
+<p>Every remote connection belongs to a connection type.</p>
+
+
+<h3>Remote resource</h3>
+<p>The remote resource interface (<code>IRemoteResource</code>) provides an adapter to a remote resource.</p>
+<p>As of version 2.0.1, there are two types of remote resources: fully remote and synchronized. This interface provides a common mechanism for accessing resource information from either types.</p>
+
+<h3>Process builder</h3>
+<p>The process builder (<code>IRemoteProcessBuilder</code>) provides process operations on the remote host. This interface is intended to be a drop-in replacement for the Java SE <code>ProcessBuilder</code> class. See the <code>java.lang.ProcessBuilder</code> documentation for a description of the methods.</p>
+<p>It is obtained from the process service (see <code>IRemoteProcessService</code> below) associated with a connection object that holds access information to the remote host.</p>
+
+<h3>Remote process</h3>
+<p>The remote process (<code>IRemoteProcess</code>) represents a process running on the remote host. Use it to manage the process (destroy), get exit status, and input/output/error streams.</p>
+<p>Remote process are created using the <code>IRemoteProcessBuilder</code> interface.</p>
+
+<!--
+ Services
+-->
+
+<h1>Services</h1>
+
+<p>The remote services are implemented as OSGi services. There are available non-UI (core) and UI services.</p>
+
+<p>Any given service can be associated with objects of the model (concepts) or nested to another one. In either case, an service instance is obtained by calling the <code>getService</code> method of its object's provider.</p>
+
+<p>The main remote services are detailed in the next sections.</p>
+
+<h3>Services manager</h3>
+<p>The services manager (<code>IRemoteServicesManager</code>) interface provides the <b>main entry point</b> for accessing remote services. It can be obtained by calling <code>RemoteServicesUtils.getService(IRemoteServicesManager.class)</code> or using the Plugin's bundle context to access a OSGi service.</p>
+<p>It provides access to connection types implemented by the framework and any connection already created.</p>
+
+<h3>File Service</h3>
+<p>The file service (<code>IRemoteFileService</code>) provides remote file manipulation operations on a given connection. It is obtained from a remote connection object by calling its <code>getService(IRemoteFileService.class)</code> method.</p>
+
+<p>Using this interface, a path can be translated into an <code>IFileStore</code> object, and then manipulated using any of the normal EFS operations.</p>
+<p>Its UI counterpart service (<code>IRemoteUIFileService</code>) comes with dialog widgets to browse files and directories on remote filesystem.
+
+<h3>Process Service</h3>
+<p>The process service (<code>IRemoteProcessService</code>) provides services for starting up processes on a remote host. It is obtained from a remote connection object by calling its <code>getService(IRemoteProcessService.class)</code> method.</p>
+<p>It is the entry point to get an <code>IRemoteProcessBuilder</code> object, used to spawn processes on the remote host. Environment variables of remote host are accessed using this service too.</p>
+
+<h3>Connection Service</h3>
+<p>The UI Connection service (<code>IRemoteUIConnectionService</code>) is used for manipulating connections in the UI, such as adding, editing, and opening connections.</p>
+<p>Non-UI connection manipulation should use the <code>IRemoteConnectionType</code> interface (obtained from services manager) and the services related with <code>IRemoteConnection</code> interface.</p>
+</body>
+</html>
diff --git a/remote/org.eclipse.remote.doc.isv/html/gettingstarted/intro.html b/remote/org.eclipse.remote.doc.isv/html/gettingstarted/intro.html
new file mode 100644
index 00000000000..ea7b1499cf8
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/html/gettingstarted/intro.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>Getting started</title>
+ <link rel="stylesheet" type="text/css" href="../../css/style.css">
+</head>
+
+<body>
+<h1>Introduction</h1>
+<p>The purpose of remote services API is to provide a programming interface to remote services that is agnostic to the actual remote services implementation. Currently the only implementation supported of SSH protocol uses JSch(Java Secure Channel) project (<a href="http://www.jcraft.com/jsch/">www.jcraft.com/jsch</a>). An implementation for the local system (where Eclipse is run) and Telnet protocol are also provided.</p>
+<p>The API is generic enough so that it is possible to use it for all remote or local operations. This is useful for situations where both a remote and local mode should be provided, but the programmer wants to avoid two separate code paths.</p>
+
+<h1>Types of services</h1>
+<p>The API is divided into two types of remote services: UI and non-UI.</p>
+<p>UI services are for activities such as file browsing that require use of the UI. In particular, it provides a main preference page (under "Remote Development > Remote Connections") which allow connections to be created, edited, removed, opened, and closed. </p>
+<p>Non-UI services are purely programmatic, they provides a set of core services for manipulating remote resources. The non-UI services can be used independently of the UI services.</p>
+
+<h1>Remote Services Plugins</h1>
+
+<p>The remote services are divided into two plugins. These plugins should have no dependencies other than the platform.</p>
+<ul>
+ <li>org.eclipse.remote.core - provides non-UI remote services</li>
+ <li>org.eclipse.remote.ui - provides UI remote services</li>
+</ul>
+
+<p>Remote service implementations provide the actual remote functionality using a particular remote protocol. These are supplied as a set of adapter plugins.
+
+<p>As of version 2.0.1, there is currently one implementation of SSH protocol using JSch:</p>
+
+<ul>
+ <li>org.eclipse.remote.jsch.core</li>
+ <li>org.eclipse.remote.jsch.ui</li>
+</ul>
+
+<p>The Telnet protocol implementation and UI widgets are provided by the plugins:</p>
+<ul>
+ <li>org.eclipse.remote.telnet.core</li>
+ <li>org.eclipse.remote.telnet.ui</li>
+</ul>
+
+<p>These plugins are dependent on the remote services implementations, but are optional for the remote services API. The API will automatically detect the installed plugins.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.doc.isv/html/samples/examples.html b/remote/org.eclipse.remote.doc.isv/html/samples/examples.html
new file mode 100644
index 00000000000..955358e4309
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/html/samples/examples.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>Samples</title>
+ <link rel="stylesheet" type="text/css" href="../../css/style.css">
+</head>
+
+<body>
+<h1>Usage examples</h1>
+<p>This section shows usage examples for using the Eclipse Remote API.</p>
+
+<p>The services manager can be obtained using <code>RemoteServicesUtils</code> (since 2.0.1) helper:</p>
+
+<pre><code class="snippet">
+IRemoteServicesManager servicesManager = RemoteServicesUtils.getService(IRemoteServicesManager.class);
+</code></pre>
+
+<p>An alternative is to use the bundle's context to get the service reference:</p>
+
+<pre><code class="snippet">
+BundleContext context = plugin.getBundle().getBundleContext();
+ServiceReference<T> ref = context.getServiceReference(IRemoteServicesManager.class);
+IRemoteServicesManager servicesManager = context.getService(ref);
+</code></pre>
+
+<p>Once with services manager object, you obtain a connection type by its scheme ID or any URI to the remote host, as in:</p>
+<pre><code class="snippet">
+IRemoteConnectionType connType;
+// Get connection type by Scheme ID
+connType = servicesManager.getConnectionType("ssh");
+// Get connection type by URI
+URI uri = URI.create("ssh://MyConnection/path/to/file");
+connType = servicesManager.getConnectionType(uri);
+</code></pre>
+
+<p>The Telnet connection type can not be obtained by URI, instead you must use its ID:
+<pre><code class="snippet">
+IRemoteConnectionType connType;
+connType = servicesManager.getConnectionType("org.eclipse.remote.telnet.core.connectionType");
+</code></pre>
+
+<p>The remote connection is obtained from connection type object by either name or an URI. For example:
+<pre><code class="snippet">
+IRemoteConnection connection;
+// Get connection by URI
+URI uri = URI.create("ssh://MyConnection/path/to/file");
+connection = connType.getConnection(uri);
+// Get connection by name
+connection = connType.getConnection("MyConnection");
+</code></pre>
+
+<p>If the connection does not exist, it can be created with a connection type (<code>IRemoteConnectionType</code>) instance. Use the connection type object to delete it as well:
+
+<pre><code class="snippet">
+IRemoteConnectionWorkingCopy rcwc; // Writable connection working copy
+rcwc = connType.newConnection(connectionName); // Create connection of connection type
+IRemoteConnectionHostService hostServices; // Fill connection information through host service
+hostServices = rcwc.getService(IRemoteConnectionHostService.class); // Obtain the service from working copy instance
+hostServices.setHostname(address);
+hostServices.setUsername(username);
+hostServices.setUsePassword(true);
+hostServices.setPassword(passwd);
+IRemoteConnection connection = rcwc.save(); // Finally save the working copy, then get the connection (read-only) object
+
+connType.removeConnection(connection); // Remove connection and all resources associated with it
+</code></pre>
+
+<p>Connections can be opened or closed programmatically. Some operations requires the connection opened:</p>
+<pre><code class="snippet">
+connection.open(monitor); // Open the connection but allow the user to cancel the progress monitor
+connection.close(); // Now close it
+</code></pre>
+
+<p>The file service is obtained from a connection object. Remote resources can be manipulated with <code>IFileStore</code>:</p>
+<pre><code class="snippet">
+IRemoteFileService fileService = connection.getService(IRemoteFileService.class);
+// The remote connection does not need to be open to get the resource
+IFileStore fs = fileService.getResource("/path/to/resource");
+// But the remote connection need to be open to operate on the resource
+if (fs.fetchInfo().exists()) {
+ System.out.println("It exists!");
+}
+</code></pre>
+
+<p>In the other hand, the UI file service is obtained from a connection type rather than the connection. The reason is that it allows user to select the connection in a list. It is also possible to set the connection:</p>
+<pre><code class="snippet">
+IRemoteUIFileService uiFileService = conn.getConnectionType().getService(IRemoteUIFileService.class);
+uiFileService.setConnection(connection); // Set default connection (optional)
+uiFileService.showConnections(true); // Also show list of available connections
+// The return value is the path of the directory selected on the remote system
+String path = uiFileService.browseDirectory(shell, "Browse /home", "/home", IRemoteUIConstants.NONE);
+</code></pre>
+
+<p>Use a connection object to get its associated process service (<code>IRemoteProcessService</code>). Then obtain a process builder (<code>IRemoteProcessBuilder</code>), so that commands can be executed on remote host:</p>
+<pre><code class="snippet">
+IRemoteProcessService ps = connection.getService(IRemoteProcessService.class);
+IRemoteProcessBuilder pb = ps.getProcessBuilder("/bin/ls", "-l");
+IRemoteProcess process = pb.start();
+// Use IRemoteProcess to manage the process. Alternatively, use an adaptor to java.lang.Process
+Process process2 = new RemoteProcessAdapter(process);
+</code></pre>
+
+<p>Use the <code>IRemoteResource</code> adapter to get a location URI of the project (<code>IProject</code>):
+<pre><code class="snippet">
+IRemoteResource resource = (IRemoteResource)project.getAdapter(IRemoteResource.class);
+URI projectLocation = resource.getActiveLocationURI(); // Get URI to active location
+</code></pre>
+
+</body>
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.doc.isv/html/toc.html b/remote/org.eclipse.remote.doc.isv/html/toc.html
new file mode 100644
index 00000000000..e589c3134ee
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/html/toc.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>Remote Developer's Guide</title>
+</head>
+
+<body>
+<h1>Eclipse Remote Developer's Guide</h1>
+<p>This is the guide of the eclipse remote development framework as of provided by <i>org.eclipse.remote</i> project.</p>
+<h3>Table of Contents</h3>
+<ul style="list-style-type:none">
+ <li><a href="gettingstarted/intro.html">Getting Started</a></li>
+ <li><a href="concepts/concepts.html">Concepts</a></li>
+ <li><a href="samples/examples.html">Usage Examples</a></li>
+ <li><a href="reference/api/index.html">Reference</a></li>
+</ul>
+</body>
+</html>
diff --git a/remote/org.eclipse.remote.doc.isv/plugin.xml b/remote/org.eclipse.remote.doc.isv/plugin.xml
new file mode 100644
index 00000000000..1f77cc97a9c
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/plugin.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="toc.xml"
+ primary="true">
+ </toc>
+ <toc
+ file="tocconcepts.xml">
+ </toc>
+ <toc
+ file="tocgettingstarted.xml">
+ </toc>
+ <toc
+ file="tocreference.xml">
+ </toc>
+ <toc
+ file="tocsamples.xml">
+ </toc>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.doc.isv/pom.xml b/remote/org.eclipse.remote.doc.isv/pom.xml
new file mode 100644
index 00000000000..2e21470ef8e
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/pom.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.cdt</groupId>
+ <artifactId>cdt-parent</artifactId>
+ <version>10.7.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <version>1.1.200-SNAPSHOT</version>
+ <artifactId>org.eclipse.remote.doc.isv</artifactId>
+ <packaging>eclipse-plugin</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <executions>
+ <execution>
+ <id>plugin-source</id>
+ <phase>none</phase>
+ </execution>
+ <execution>
+ <id>attach-source</id>
+ <phase>none</phase>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>build-doc</id>
+ <activation>
+ <property>
+ <name>!skipDoc</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho.extras</groupId>
+ <artifactId>tycho-document-bundle-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <executions>
+ <execution>
+ <id>eclipse-javadoc</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>javadoc</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${project.basedir}/html/reference/api
+ </outputDirectory>
+ <javadocOptions>
+ <includes>
+ <include>org.eclipse.cdt.remote.*</include>
+ <include>org.eclipse.remote.*</include>
+ </includes>
+ <excludes>
+ <exclude>org.eclipse.remote.internal.*</exclude>
+ <exclude>org.eclipse.remote.*.internal.*</exclude>
+ <exclude>org.eclipse.cdt.remote.internal.*</exclude>
+ <exclude>org.eclipse.cdt.remote.*.internal.*</exclude>
+ </excludes>
+ <additionalArguments>
+ <additionalArgument>-windowtitle "Eclipse CDT org.eclipse.remote API Specification"</additionalArgument>
+ <additionalArgument>-doctitle "Eclipse CDT org.eclipse.remote API Specification"
+ </additionalArgument>
+ <additionalArgument>-link "https://docs.oracle.com/en/java/javase/11/docs/api/"</additionalArgument>
+ <additionalArgument>-linkoffline ../../org.eclipse.platform.doc.isv/reference/api
+ </additionalArgument>
+ <additionalArgument>-public</additionalArgument>
+ <additionalArgument>-header "Eclipse CDT's org.eclipse.remote 10.7.0"
+ </additionalArgument>
+ <additionalArgument>-bottom "Copyright (c) IBM Corp. and others 2004, 2021. All Rights Reserved."</additionalArgument>
+ <additionalArgument>-tag 'noimplement:a:Restriction:'</additionalArgument>
+ <additionalArgument>-tag 'noextend:a:Restriction:'</additionalArgument>
+ <additionalArgument>-tag 'noreference:a:Restriction:'</additionalArgument>
+ <additionalArgument>-tag 'noinstantiate:a:Restriction:'</additionalArgument>
+ <additionalArgument>-tag 'nooverride:a:Restriction:'</additionalArgument>
+ </additionalArguments>
+ </javadocOptions>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>fake-doc</id>
+ <activation>
+ <property>
+ <name>skipDoc</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <configuration>
+ <target>
+ <touch file="index/indexed_docs" mkdirs="true" />
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
diff --git a/remote/org.eclipse.remote.doc.isv/toc.xml b/remote/org.eclipse.remote.doc.isv/toc.xml
new file mode 100644
index 00000000000..4a099b6a2a2
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/toc.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Eclipse Remote Developer's Guide" topic="html/toc.html">
+ <topic label="Getting Started">
+ <anchor id="gettingstarted"/>
+ </topic>
+ <topic label="Concepts">
+ <anchor id="concepts"/>
+ </topic>
+ <topic label="Reference">
+ <anchor id="reference"/>
+ </topic>
+ <topic label="Samples">
+ <anchor id="samples"/>
+ </topic>
+</toc>
diff --git a/remote/org.eclipse.remote.doc.isv/tocconcepts.xml b/remote/org.eclipse.remote.doc.isv/tocconcepts.xml
new file mode 100644
index 00000000000..eb382cbaf3a
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/tocconcepts.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Concepts" link_to="toc.xml#concepts">
+ <topic label="Concepts" href="html/concepts/concepts.html">
+ </topic>
+</toc>
diff --git a/remote/org.eclipse.remote.doc.isv/tocgettingstarted.xml b/remote/org.eclipse.remote.doc.isv/tocgettingstarted.xml
new file mode 100644
index 00000000000..fb12307e209
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/tocgettingstarted.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Getting Started" link_to="toc.xml#gettingstarted">
+ <topic label="Getting Started" href="html/gettingstarted/intro.html">
+ </topic>
+</toc>
diff --git a/remote/org.eclipse.remote.doc.isv/tocreference.xml b/remote/org.eclipse.remote.doc.isv/tocreference.xml
new file mode 100644
index 00000000000..e9dc3b6853f
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/tocreference.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Reference" link_to="toc.xml#reference">
+ <topic label="API Reference" href="html/reference/api/index.html" />
+</toc>
diff --git a/remote/org.eclipse.remote.doc.isv/tocsamples.xml b/remote/org.eclipse.remote.doc.isv/tocsamples.xml
new file mode 100644
index 00000000000..542cbc72678
--- /dev/null
+++ b/remote/org.eclipse.remote.doc.isv/tocsamples.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Samples" link_to="toc.xml#samples">
+ <topic label="Samples" href="html/samples/examples.html">
+ </topic>
+</toc>
diff --git a/remote/org.eclipse.remote.jsch.core/.classpath b/remote/org.eclipse.remote.jsch.core/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.jsch.core/.project b/remote/org.eclipse.remote.jsch.core/.project
new file mode 100644
index 00000000000..dcc7bbcb87c
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.jsch.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.jsch.core/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.jsch.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..778724bd8a5
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.jsch.core;singleton:=true
+Bundle-Version: 1.1.100.qualifier
+Bundle-Activator: org.eclipse.remote.internal.jsch.core.Activator
+Bundle-Vendor: %pluginProvider
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.internal.jsch.core;x-friends:="org.eclipse.remote.jsch.ui,org.eclipse.remote.jsch.tests",
+ org.eclipse.remote.internal.jsch.core.messages;x-internal:=true
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: com.jcraft.jsch,
+ org.eclipse.core.filesystem,
+ org.eclipse.core.filesystem.provider,
+ org.eclipse.core.runtime,
+ org.eclipse.jsch.core,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.internal.core,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.jsch.core/about.html b/remote/org.eclipse.remote.jsch.core/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.core/build.properties b/remote/org.eclipse.remote.jsch.core/build.properties
new file mode 100644
index 00000000000..7b3c227b84a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.jsch.core/plugin.properties b/remote/org.eclipse.remote.jsch.core/plugin.properties
new file mode 100644
index 00000000000..523756273b5
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=JSch Remote Support
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.jsch.core/plugin.xml b/remote/org.eclipse.remote.jsch.core/plugin.xml
new file mode 100644
index 00000000000..b3d72c998f0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/plugin.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionType
+ id="org.eclipse.remote.JSch"
+ name="SSH"
+ scheme="ssh">
+ </connectionType>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionControlService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchConnection$Factory"
+ service="org.eclipse.remote.core.IRemotePortForwardingService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionPropertyService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchFileManager$Factory"
+ service="org.eclipse.remote.core.IRemoteFileService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionHostService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchConnection$Factory"
+ service="org.eclipse.remote.internal.jsch.core.JSchConnection">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchCommandShellService$Factory"
+ service="org.eclipse.remote.core.IRemoteCommandShellService">
+ </connectionService>
+ <processService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessControlService">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessSignalService">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessTerminalService">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.core.JSchProcess$Factory"
+ service="org.eclipse.remote.internal.jsch.core.JSchProcess">
+ </processService>
+ </extension>
+ <extension
+ id="org.eclipse.remote.jsch.filesystem"
+ point="org.eclipse.core.filesystem.filesystems">
+ <filesystem
+ scheme="ssh">
+ <run
+ class="org.eclipse.remote.internal.jsch.core.JSchFileSystem">
+ </run>
+ </filesystem>
+ </extension>
+</plugin>
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/Activator.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/Activator.java
new file mode 100644
index 00000000000..3a1ff880f70
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/Activator.java
@@ -0,0 +1,110 @@
+package org.eclipse.remote.internal.jsch.core;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jsch.core.IJSchService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.jsch.core"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get unique identifier
+ *
+ * @return
+ * @since 5.0
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() == null) {
+ return PLUGIN_ID;
+ }
+ return getDefault().getBundle().getSymbolicName();
+ }
+
+ /**
+ * Logs the specified status with this plug-in's log.
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Logs an internal error with the specified message.
+ *
+ * @param message
+ * the error message to log
+ */
+ public static void log(String message) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
+ }
+
+ /**
+ * Logs an internal error with the specified throwable
+ *
+ * @param e
+ * the exception to be logged
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
+ }
+
+ private IJSchService fJSchService;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+ public IJSchService getService() {
+ return fJSchService;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ ServiceReference<IJSchService> reference = context.getServiceReference(IJSchService.class);
+ fJSchService = context.getService(reference);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/ArgumentParser.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/ArgumentParser.java
new file mode 100644
index 00000000000..3649730a553
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/ArgumentParser.java
@@ -0,0 +1,371 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.text.CharacterIterator;
+import java.text.StringCharacterIterator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Utilitiy class for managing command line arguments.
+ *
+ */
+public class ArgumentParser {
+ private static List<String> parseCommandline(String commandline) {
+ ArrayList<String> result = new ArrayList<>();
+ StringCharacterIterator iterator = new StringCharacterIterator(commandline);
+
+ for (iterator.first(); iterator.current() != CharacterIterator.DONE; iterator.next()) {
+
+ // Restart to skip white space
+ if (Character.isWhitespace(iterator.current())) {
+ continue;
+ }
+
+ // Read token
+ StringBuffer buffer = new StringBuffer();
+ token_reader: for (; iterator.current() != CharacterIterator.DONE; iterator.next()) {
+ char tokenChar = iterator.current();
+
+ // A white space terminates the token
+ if (Character.isWhitespace(tokenChar)) {
+ break token_reader;
+ }
+
+ // Handle character that composes the token
+ switch (tokenChar) {
+ case '"': {
+ /*
+ * Read all text within double quotes or until end of
+ * string. Allows escaping.
+ */
+ iterator.next(); // Skip quote
+ quoted_reader: while ((iterator.current() != CharacterIterator.DONE)
+ && (iterator.current() != '"')) {
+ char innerChar = iterator.current();
+ switch (innerChar) {
+ case '\\':
+ char nextChar = iterator.next();
+ switch (nextChar) {
+ case CharacterIterator.DONE:
+ break quoted_reader;
+ case '"':
+ // Add the character, but remove the escape
+ buffer.append(nextChar);
+ iterator.next();
+ continue quoted_reader;
+ default:
+ // Add the character and keep escape
+ buffer.append(innerChar);
+ buffer.append(nextChar);
+ iterator.next();
+ continue quoted_reader;
+ }
+ default:
+ buffer.append(innerChar);
+ iterator.next();
+ continue quoted_reader;
+ }
+ }
+ continue token_reader;
+ }
+ case '\'': {
+ /*
+ * Read all text within single quotes or until end of
+ * string. No escaping.
+ */
+ iterator.next(); // Skip the quote
+ while ((iterator.current() != CharacterIterator.DONE) && (iterator.current() != '\'')) {
+ buffer.append(iterator.current());
+ iterator.next();
+ }
+ continue token_reader;
+ }
+ case '\\': {
+ /*
+ * Read escaped char.
+ */
+ char nextChar = iterator.next();
+ switch (nextChar) {
+ case CharacterIterator.DONE:
+ break token_reader;
+ case '\n':
+ // Ignore newline. Both lines are concatenated.
+ continue token_reader;
+ default:
+ // Add the character, but remove the escape
+ buffer.append(nextChar);
+ continue token_reader;
+ }
+ }
+ default:
+ /*
+ * Any other char, add to the buffer.
+ */
+ buffer.append(tokenChar);
+ continue token_reader;
+ }
+ }
+ result.add(buffer.toString());
+ }
+
+ return result;
+ }
+
+ private final List<String> tokens;
+
+ /**
+ * Create a command line representation from an array of strings. The first
+ * element of the list is assumed to be the command, the remaining, the
+ * arguments. The elements are not parsed not (un)escaped., but taked as the
+ * are.
+ *
+ */
+ public ArgumentParser(List<String> tokenList) {
+ this.tokens = new ArrayList<>(tokenList);
+ }
+
+ /**
+ * Create a command line representation from the string with a shell command
+ * line. The command line is parsed and split on spaces. Quoted or escaped
+ * spaces are preserved..
+ *
+ */
+ public ArgumentParser(String commandline) {
+ this.tokens = parseCommandline(commandline);
+ }
+
+ /**
+ * Create a command line representation from an array of strings. The first
+ * element of the array is assumed to be the command, the remaining, the
+ * arguments. The elements are not parsed not (un)escaped., but taked as the
+ * are.
+ *
+ */
+ public ArgumentParser(String tokenArray[]) {
+ this(Arrays.asList(tokenArray));
+ }
+
+ /**
+ * Create a command line representation from the command and an list of
+ * parameters. The elements are not parsed not (un)escaped., but taked as
+ * the are.
+ *
+ */
+ public ArgumentParser(String command, List<String> parameterList) {
+ this.tokens = new ArrayList<>();
+ this.tokens.add(command);
+ this.tokens.addAll(parameterList);
+ }
+
+ /**
+ * Create a command line representation from the command and an array of
+ * parameters. The elements are not parsed not (un)escaped., but taked as
+ * the are.
+ *
+ */
+ public ArgumentParser(String command, String parameterArray[]) {
+ this(command, Arrays.asList(parameterArray));
+ }
+
+ private StringBuffer escapeToken(String token, boolean fullEscape) {
+ StringBuffer buffer = new StringBuffer();
+ StringCharacterIterator iter = new StringCharacterIterator(token);
+ for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
+ if (Character.isWhitespace(c)) {
+ buffer.append('\\');
+ buffer.append(c);
+ continue;
+ }
+ switch (c) {
+ case '(':
+ case ')':
+ case '[':
+ case ']':
+ case '{':
+ case '}':
+ case '|':
+ case '\\':
+ case '*':
+ case '&':
+ case '^':
+ case '%':
+ case '$':
+ case '#':
+ case '@':
+ case '!':
+ case '~':
+ case '`':
+ case '\'':
+ case '"':
+ case ':':
+ case ';':
+ case '?':
+ case '>':
+ case '<':
+ case '\n':
+ if (fullEscape) {
+ buffer.append('\\');
+ }
+ buffer.append(c);
+ continue;
+ case ' ':
+ buffer.append('\\');
+ buffer.append(c);
+ continue;
+ default:
+ buffer.append(c);
+ continue;
+ }
+ }
+ return buffer;
+ }
+
+ /**
+ * Returns the command of the command line, assuming that the first entry is
+ * always the command.
+ *
+ * @return The command or null if the command lines has no command nor
+ * arguments.
+ */
+ public String getCommand() {
+ if (this.tokens.size() == 0) {
+ return null;
+ }
+ return this.tokens.get(0);
+ }
+
+ /**
+ * Convert all tokens in a full command line that can be executed in a
+ * shell.
+ *
+ * @param fullEscape
+ * If every special character shall be escaped. If false, only
+ * white spaces are escaped and the shell will interpret the
+ * special chars. If true, then all special chars are quoted.
+ */
+ public String getCommandLine(boolean fullEscape) {
+ StringBuffer buffer = new StringBuffer();
+ Iterator<String> iterator = this.tokens.iterator();
+ boolean first = true;
+ while (iterator.hasNext()) {
+ String token = iterator.next();
+ if (!first) {
+ buffer.append(' ');
+ } else {
+ first = false;
+ }
+ buffer.append(escapeToken(token, fullEscape));
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * Returns the command of the command line, assuming that the first entry is
+ * always the command.
+ *
+ * @return The command or null if the command lines has no command nor
+ * arguments.
+ * @param fullEscape
+ * If every special character shall be escaped. If false, only
+ * white spaces are escaped and the shell will interpret the
+ * special chars. If true, then all special chars are quoted.
+ */
+ public String getEscapedCommand(boolean fullEscalpe) {
+ if (this.tokens.size() == 0) {
+ return null;
+ }
+ return escapeToken(this.tokens.get(0), fullEscalpe).toString();
+ }
+
+ /**
+ * Returns a list of all arguments, assuming that the first entry is the
+ * command name.
+ *
+ * @return The Array or null if the command lines has no command nor
+ * arguments.
+ */
+ public String[] getParameterArray() {
+ if (this.tokens.size() == 0) {
+ return null;
+ }
+ return this.tokens.subList(1, this.tokens.size()).toArray(new String[this.tokens.size() - 1]);
+ }
+
+ /**
+ * Returns a list of all arguments, assuming that the first entry is the
+ * command name.
+ *
+ * @return The List or null if the command lines has no command nor
+ * arguments.
+ */
+ public List<String> getParameterList() {
+ if (this.tokens.size() == 0) {
+ return null;
+ }
+ return new ArrayList<>(this.tokens.subList(1, this.tokens.size()));
+ }
+
+ /**
+ * Returns the total number of entries.
+ *
+ * @return
+ */
+ public int getSize() {
+ return this.tokens.size();
+ }
+
+ /**
+ * Returns a List of all entries of the command line.
+ *
+ * @return The Array
+ */
+ public String[] getTokenArray() {
+ return this.tokens.toArray(new String[this.tokens.size()]);
+ }
+
+ /**
+ * Returns a List of all entries of the command line.
+ *
+ * @return The List
+ */
+ public List<String> getTokenList() {
+ return new ArrayList<>(this.tokens);
+ }
+
+ /**
+ * Returns a representation of the command line for debug purposes.
+ */
+ @Override
+ public String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("<"); //$NON-NLS-1$
+ Iterator<String> iterator = this.tokens.iterator();
+ boolean first = true;
+ while (iterator.hasNext()) {
+ String token = iterator.next();
+ if (!first) {
+ buffer.append('\n');
+ } else {
+ first = false;
+ }
+ buffer.append(token);
+ }
+ buffer.append(">"); //$NON-NLS-1$
+ return buffer.toString();
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchCommandShellService.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchCommandShellService.java
new file mode 100644
index 00000000000..9051fceb51e
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchCommandShellService.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.io.IOException;
+
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteProcess;
+
+public class JSchCommandShellService implements IRemoteCommandShellService {
+ private IRemoteConnection fRemoteConnection;
+
+ public JSchCommandShellService(IRemoteConnection remoteConnection) {
+ fRemoteConnection = remoteConnection;
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return fRemoteConnection;
+ }
+
+ @Override
+ public IRemoteProcess getCommandShell(int flags) throws IOException {
+ return new JSchProcessBuilder(getRemoteConnection()).start(flags);
+ }
+
+ public static class Factory implements IRemoteConnection.Service.Factory {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends IRemoteConnection.Service> T getService(IRemoteConnection connection, Class<T> service) {
+ if (IRemoteCommandShellService.class.equals(service)) {
+ return (T) new JSchCommandShellService(connection);
+ }
+ return null;
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnection.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnection.java
new file mode 100644
index 00000000000..49378fe3466
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnection.java
@@ -0,0 +1,897 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ * Patrick Tasse - [462418] use stored password on non-preferred password based authentication
+ * Martin Oberhuber - [468889] Support Eclipse older than Mars
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jsch.core.IJSchService;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IRemoteConnectionPropertyService;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemotePortForwardingService;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.IUserAuthenticatorService;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.eclipse.remote.core.RemoteServicesUtils;
+import org.eclipse.remote.core.exception.AddressInUseException;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.core.exception.UnableToForwardPortException;
+import org.eclipse.remote.internal.jsch.core.commands.ExecCommand;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.ChannelShell;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+
+/**
+ * @since 5.0
+ */
+public class JSchConnection
+ implements IRemoteConnectionControlService, IRemoteConnectionPropertyService, IRemotePortForwardingService,
+ IRemoteProcessService, IRemoteConnectionHostService, IRemoteConnectionChangeListener {
+ // Connection Type ID
+ public static final String JSCH_ID = "org.eclipse.remote.JSch"; //$NON-NLS-1$
+
+ // Attributes
+ public static final String ADDRESS_ATTR = "JSCH_ADDRESS_ATTR"; //$NON-NLS-1$
+ public static final String USERNAME_ATTR = "JSCH_USERNAME_ATTR"; //$NON-NLS-1$
+ public static final String PASSWORD_ATTR = "JSCH_PASSWORD_ATTR"; //$NON-NLS-1$
+ public static final String PORT_ATTR = "JSCH_PORT_ATTR"; //$NON-NLS-1$
+ public static final String PROXYCONNECTION_ATTR = "JSCH_PROXYCONNECTION_ATTR"; //$NON-NLS-1$
+ public static final String PROXYCOMMAND_ATTR = "JSCH_PROXYCOMMAND_ATTR"; //$NON-NLS-1$
+ public static final String IS_PASSWORD_ATTR = "JSCH_IS_PASSWORD_ATTR"; //$NON-NLS-1$
+ public static final String PASSPHRASE_ATTR = "JSCH_PASSPHRASE_ATTR"; //$NON-NLS-1$
+ public static final String TIMEOUT_ATTR = "JSCH_TIMEOUT_ATTR"; //$NON-NLS-1$
+ public static final String USE_LOGIN_SHELL_ATTR = "JSCH_USE_LOGIN_SHELL_ATTR"; //$NON-NLS-1$
+ public static final String LOGIN_SHELL_COMMAND_ATTR = "JSCH_LOGIN_SHELL_COMMAND_ATTR"; //$NON-NLS-1$
+
+ public static final int DEFAULT_PORT = 22;
+ public static final int DEFAULT_TIMEOUT = 0;
+ public static final boolean DEFAULT_IS_PASSWORD = false;
+ public static final boolean DEFAULT_USE_LOGIN_SHELL = true;
+ public static final String DEFAULT_LOGIN_SHELL_COMMAND = "/bin/bash -l -c '{0}'"; //$NON-NLS-1$
+ public static final String DEFAULT_ENCODING = "UTF-8"; //$NON-NLS-1$
+ public static final String EMPTY_STRING = ""; //$NON-NLS-1$
+
+ private String fWorkingDir;
+
+ private final IRemoteConnection fRemoteConnection;
+ private final IJSchService fJSchService;
+
+ private final Map<String, String> fEnv = new HashMap<>();
+ private final Map<String, String> fProperties = new HashMap<>();
+ private final List<Session> fSessions = new ArrayList<>();
+
+ private ChannelSftp fSftpCommandChannel;
+ private boolean isFullySetup; // including sftp channel and environment
+
+ private static final Map<IRemoteConnection, JSchConnection> connectionMap = new HashMap<>();
+
+ public JSchConnection(IRemoteConnection connection) {
+ fRemoteConnection = connection;
+ fJSchService = Activator.getDefault().getService();
+ connection.addConnectionChangeListener(this);
+ }
+
+ @Override
+ public void connectionChanged(RemoteConnectionChangeEvent event) {
+ if (event.getType() == RemoteConnectionChangeEvent.CONNECTION_REMOVED) {
+ synchronized (connectionMap) {
+ connectionMap.remove(event.getConnection());
+ }
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return fRemoteConnection;
+ }
+
+ public static class Factory implements IRemoteConnection.Service.Factory {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends IRemoteConnection.Service> T getService(IRemoteConnection connection, Class<T> service) {
+ // This little trick creates an instance of this class for a connection
+ // then for each interface it implements, it returns the same object.
+ // This works because the connection caches the service so only one gets created.
+ // As a side effect, it makes this class a service too which can be used
+ // by the this plug-in
+ if (JSchConnection.class.equals(service)) {
+ synchronized (connectionMap) {
+ JSchConnection jschConnection = connectionMap.get(connection);
+ if (jschConnection == null) {
+ jschConnection = new JSchConnection(connection);
+ connectionMap.put(connection, jschConnection);
+ }
+ return (T) jschConnection;
+ }
+ } else if (IRemoteConnectionControlService.class.equals(service)
+ || IRemoteConnectionPropertyService.class.equals(service)
+ || IRemotePortForwardingService.class.equals(service) || IRemoteProcessService.class.equals(service)
+ || IRemoteConnectionHostService.class.equals(service)) {
+ return (T) connection.getService(JSchConnection.class);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ private boolean checkConfiguration(Session session, IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ ChannelSftp sftp;
+ try {
+ /*
+ * First, check if sftp is supported at all. This is required for EFS, so throw exception if not supported.
+ */
+ sftp = openSftpChannel(session);
+ } catch (RemoteConnectionException e) {
+ throw new RemoteConnectionException(Messages.JSchConnection_Remote_host_does_not_support_sftp);
+ }
+ /*
+ * While sftp channel is open, try opening an exec channel. If it doesn't succeed, then MaxSession is < 2 so we need at
+ * least one additional session.
+ */
+ try {
+ loadEnv(subMon.newChild(10));
+ } catch (RemoteConnectionException e) {
+ if (e.getMessage().contains("channel is not opened")) { //$NON-NLS-1$
+ return false;
+ }
+ } finally {
+ if (sftp != null) {
+ sftp.disconnect();
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @throws RemoteConnectionException
+ */
+ private void checkIsConfigured() throws RemoteConnectionException {
+ if (fRemoteConnection.getAttribute(ADDRESS_ATTR) == null) {
+ throw new RemoteConnectionException(Messages.JSchConnection_remote_address_must_be_set);
+ }
+ if (fRemoteConnection.getAttribute(USERNAME_ATTR) == null) {
+ throw new RemoteConnectionException(Messages.JSchConnection_username_must_be_set);
+ }
+ }
+
+ private synchronized void cleanup() {
+ if (fSftpCommandChannel != null) {
+ if (fSftpCommandChannel.isConnected()) {
+ fSftpCommandChannel.disconnect();
+ }
+ fSftpCommandChannel = null;
+ }
+ for (Session session : fSessions) {
+ if (session.isConnected()) {
+ session.disconnect();
+ }
+ }
+ fSessions.clear();
+ }
+
+ @Override
+ public synchronized void close() {
+ cleanup();
+ fRemoteConnection.fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_CLOSED);
+ }
+
+ /**
+ * Execute the command and return the result as a string.
+ *
+ * @param cmd
+ * command to execute
+ * @param monitor
+ * progress monitor
+ * @return result of command
+ * @throws RemoteConnectionException
+ */
+ private String executeCommand(String cmd, IProgressMonitor monitor) throws RemoteConnectionException {
+ ExecCommand exec = new ExecCommand(this);
+ monitor.subTask(NLS.bind(Messages.JSchConnection_Executing_command, cmd));
+ return exec.setCommand(cmd).getResult(monitor).trim();
+ }
+
+ @Override
+ public void forwardLocalPort(int localPort, String fwdAddress, int fwdPort) throws RemoteConnectionException {
+ if (!isOpen()) {
+ throw new RemoteConnectionException(Messages.JSchConnection_connectionNotOpen);
+ }
+ try {
+ fSessions.get(0).setPortForwardingL(localPort, fwdAddress, fwdPort);
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public int forwardLocalPort(String fwdAddress, int fwdPort, IProgressMonitor monitor)
+ throws RemoteConnectionException {
+ if (!isOpen()) {
+ throw new RemoteConnectionException(Messages.JSchConnection_connectionNotOpen);
+ }
+ SubMonitor progress = SubMonitor.convert(monitor, 10);
+ progress.beginTask(Messages.JSchConnection_forwarding, 10);
+ /*
+ * Start with a different port number, in case we're doing this all on localhost.
+ */
+ int localPort = fwdPort + 1;
+
+ /*
+ * Try to find a free port on the remote machine. This take a while, so allow it to be canceled. If we've tried all
+ * ports (which could take a very long while) then bail out.
+ */
+ while (!progress.isCanceled()) {
+ try {
+ forwardLocalPort(localPort, fwdAddress, fwdPort);
+ } catch (AddressInUseException e) {
+ if (++localPort == fwdPort) {
+ throw new UnableToForwardPortException(Messages.JSchConnection_remotePort);
+ }
+ progress.worked(1);
+ }
+ return localPort;
+ }
+ return -1;
+ }
+
+ @Override
+ public void forwardRemotePort(int remotePort, String fwdAddress, int fwdPort) throws RemoteConnectionException {
+ if (!isOpen()) {
+ throw new RemoteConnectionException(Messages.JSchConnection_connectionNotOpen);
+ }
+ try {
+ fSessions.get(0).setPortForwardingR(remotePort, fwdAddress, fwdPort);
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public int forwardRemotePort(String fwdAddress, int fwdPort, IProgressMonitor monitor)
+ throws RemoteConnectionException {
+ if (!isOpen()) {
+ throw new RemoteConnectionException(Messages.JSchConnection_connectionNotOpen);
+ }
+ SubMonitor progress = SubMonitor.convert(monitor, 10);
+ progress.beginTask(Messages.JSchConnection_forwarding, 10);
+ /*
+ * Start with a different port number, in case we're doing this all on localhost.
+ */
+ int remotePort = fwdPort + 1;
+ /*
+ * Try to find a free port on the remote machine. This take a while, so allow it to be canceled. If we've tried all
+ * ports (which could take a very long while) then bail out.
+ */
+ while (!progress.isCanceled()) {
+ try {
+ forwardRemotePort(remotePort, fwdAddress, fwdPort);
+ return remotePort;
+ } catch (AddressInUseException e) {
+ if (++remotePort == fwdPort) {
+ throw new UnableToForwardPortException(Messages.JSchConnection_remotePort);
+ }
+ progress.worked(1);
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public String getHostname() {
+ return fRemoteConnection.getAttribute(ADDRESS_ATTR);
+ }
+
+ /**
+ * Get the result of executing a pwd command.
+ *
+ * @return current working directory
+ */
+ private String getCwd(IProgressMonitor monitor) {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ try {
+ return executeCommand("pwd", subMon.newChild(10)); //$NON-NLS-1$
+ } catch (RemoteConnectionException e) {
+ // Ignore
+ }
+ return null;
+ }
+
+ @Override
+ public Map<String, String> getEnv() {
+ return Collections.unmodifiableMap(fEnv);
+ }
+
+ @Override
+ public String getEnv(String name) {
+ return getEnv().get(name);
+ }
+
+ /**
+ * Open an exec channel to the remote host.
+ *
+ * @return exec channel or null if the progress monitor was cancelled
+ *
+ * @throws RemoteConnectionException
+ * if a channel could not be opened
+ */
+ public ChannelExec getExecChannel() throws RemoteConnectionException {
+ try {
+ return (ChannelExec) fSessions.get(0).openChannel("exec"); //$NON-NLS-1$
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ /**
+ * Open a shell channel to the remote host.
+ *
+ * @return shell channel or null if the progress monitor was cancelled
+ *
+ * @throws RemoteConnectionException
+ * if a channel could not be opened
+ */
+ public ChannelShell getShellChannel() throws RemoteConnectionException {
+ try {
+ return (ChannelShell) fSessions.get(0).openChannel("shell"); //$NON-NLS-1$
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public String getPassphrase() {
+ return fRemoteConnection.getSecureAttribute(PASSPHRASE_ATTR);
+ }
+
+ @Override
+ public String getPassword() {
+ return fRemoteConnection.getSecureAttribute(PASSWORD_ATTR);
+ }
+
+ @Override
+ public int getPort() {
+ String portStr = fRemoteConnection.getAttribute(PORT_ATTR);
+ return !portStr.isEmpty() ? Integer.parseInt(portStr) : DEFAULT_PORT;
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder(List<String> command) {
+ if (!isOpen()) {
+ return null;
+ }
+ return new JSchProcessBuilder(getRemoteConnection(), command);
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder(String... command) {
+ if (!isOpen()) {
+ return null;
+ }
+ return new JSchProcessBuilder(getRemoteConnection(), command);
+ }
+
+ @Override
+ public String getProperty(String key) {
+ return fProperties.get(key);
+ }
+
+ /**
+ * Get the login shell command if useLoginShell is true
+ *
+ * @return login shell command
+ */
+ public String getLoginShellCommand() {
+ String loginShell = fRemoteConnection.getAttribute(LOGIN_SHELL_COMMAND_ATTR);
+ return loginShell.isEmpty() ? DEFAULT_LOGIN_SHELL_COMMAND : loginShell;
+ }
+
+ /**
+ * Gets the proxy command. For no proxy command null is returned.
+ *
+ * @return proxy command
+ */
+ public String getProxyCommand() {
+ return fRemoteConnection.getAttribute(PROXYCOMMAND_ATTR);
+ }
+
+ /**
+ * Gets the proxy connection. If no proxy connection is used it returns null.
+ *
+ * @return proxy connection
+ */
+ public JSchConnection getProxyConnection() {
+ String proxyConnectionName = getProxyConnectionName();
+ if (proxyConnectionName.isEmpty()) {
+ return null;
+ }
+ return fRemoteConnection.getConnectionType().getConnection(proxyConnectionName)
+ .getService(JSchConnection.class);
+ }
+
+ /**
+ * Gets the proxy connection name
+ *
+ * @return proxy connection name. If no proxy is used returns null.
+ */
+ public String getProxyConnectionName() {
+ return fRemoteConnection.getAttribute(PROXYCONNECTION_ATTR);
+ }
+
+ /**
+ * Open an sftp command channel to the remote host. This channel is for commands that do not require any
+ * state being preserved and should not be closed. Long running commands (such as get/put) should use a separate channel
+ * obtained via {#link #newSftpChannel()}.
+ *
+ * Always use the second session if available.
+ *
+ * @return sftp channel
+ * @throws RemoteConnectionException
+ * if a channel could not be opened
+ */
+ public ChannelSftp getSftpCommandChannel() throws RemoteConnectionException {
+ if (fSftpCommandChannel == null || fSftpCommandChannel.isClosed()) {
+ fSftpCommandChannel = newSftpChannel();
+ }
+ return fSftpCommandChannel;
+ }
+
+ /**
+ * Open a channel for long running commands. This channel should be closed when the command is completed.
+ *
+ * @return sftp channel
+ * @throws RemoteConnectionException
+ * if a channel could not be opened
+ */
+ public ChannelSftp newSftpChannel() throws RemoteConnectionException {
+ Session session = fSessions.get(0);
+ if (fSessions.size() > 1) {
+ session = fSessions.get(1);
+ }
+ ChannelSftp channel = openSftpChannel(session);
+ if (channel == null) {
+ throw new RemoteConnectionException(Messages.JSchConnection_Unable_to_open_sftp_channel);
+ }
+ return channel;
+ }
+
+ public Channel getStreamForwarder(String host, int port) throws RemoteConnectionException {
+ try {
+ Channel channel = fSessions.get(0).getStreamForwarder(host, port);
+ channel.connect();
+ return channel;
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e);
+ }
+ }
+
+ @Override
+ public int getTimeout() {
+ String str = fRemoteConnection.getAttribute(TIMEOUT_ATTR);
+ return !str.isEmpty() ? Integer.parseInt(str) : DEFAULT_TIMEOUT;
+ }
+
+ @Override
+ public String getUsername() {
+ return fRemoteConnection.getAttribute(USERNAME_ATTR);
+ }
+
+ @Override
+ public String getWorkingDirectory() {
+ if (!isOpen()) {
+ return "/"; //$NON-NLS-1$
+ }
+ if (fWorkingDir == null) {
+ return "/"; //$NON-NLS-1$
+ }
+ return fWorkingDir;
+ }
+
+ /**
+ * Test if the connection has a valid open session. Doesn't check whether the connection is fully setup.
+ *
+ * @return true if a valid session is available.
+ */
+ public boolean hasOpenSession() {
+ boolean hasOpenSession = fSessions.size() > 0;
+ if (hasOpenSession) {
+ for (Session session : fSessions) {
+ hasOpenSession &= session.isConnected();
+ }
+ }
+ if (!hasOpenSession) {
+ cleanup(); // Cleanup if session is closed
+ }
+ return hasOpenSession;
+ }
+
+ @Override
+ public boolean isOpen() {
+ return hasOpenSession() && isFullySetup;
+ }
+
+ @Override
+ public boolean usePassword() {
+ String str = fRemoteConnection.getAttribute(IS_PASSWORD_ATTR);
+ return !str.isEmpty() ? Boolean.parseBoolean(str) : DEFAULT_IS_PASSWORD;
+ }
+
+ private void loadEnv(IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ String env = executeCommand("printenv", subMon.newChild(10)); //$NON-NLS-1$
+ String[] vars = env.split("\n"); //$NON-NLS-1$
+ for (String var : vars) {
+ String[] kv = var.split("="); //$NON-NLS-1$
+ if (kv.length == 2) {
+ fEnv.put(kv[0], kv[1]);
+ }
+ }
+ }
+
+ /**
+ *
+ * Load the following hard-coded properties at runtime:
+ *
+ * <dl>
+ * <dt>file.separator
+ * <dd>File separator character of the (remote) connection. Hardcoded "/" (forward slash).
+ * <dt>path.separator
+ * <dd>Path separator character of the (remote) connection. Hardcoded ":" (colon).
+ * <dt>line.separator
+ * <dd>Line separator character of the (remote) connection. Hardcoded "\n" (new-line).
+ * <dt>user.home
+ * <dd>User home directory on the (remote) connection.
+ * <dt>os.name
+ * <dd>Operating system name of the (remote) connection. For example, given results from the "uname" command:
+ * <ul>
+ * <li>Linux</li>
+ * <li>AIX</li>
+ * <li>Mac OS X - if results equal "Darwin" then results from "sw_vers -productName"</li>
+ * <li>everything else - results from "uname" command</li>
+ * </ul>
+ * <dt>os.version
+ * <dd>Operating system version of the (remote) connection. For example:
+ * <ul>
+ * <li>For Linux - results from "uname -r" such as "2.6.32-279.2.1.el6.x86_64"</li>
+ * <li>For AIX - results from "oslevel" such as "7.1.0.0"</li>
+ * <li>For Mac OS X - results from "sw_vers -productVersion" such as "10.8.3"</li>
+ * <li>For everything else - "unknown"</li>
+ * </ul>
+ * <dt>os.arch
+ * <dd>Machine architecture of the (remote) connection. For example:
+ * <ul>
+ * <li>For Linux - results from "uname -m" such as "x86_64"</li>
+ * <li>For AIX - if results from "uname -p" equals "powerpc"
+ * <ul style="list-style: none;">
+ * <li>then if "prtconf -k" contains "64-bit" then "ppc64" else "ppc"</li>
+ * <li>else the result from "uname -p"</li>
+ * </ul>
+ * </li>
+ * <li>For Mac OS X - if results from "uname -m" equals "i386"
+ * <ul style="list-style: none;">
+ * <li>then if results from "sysctl -n hw.optional.x86_64" equals "1" then "x86_64" else the results from "uname -m"</li>
+ * <li>else the results from "uname -m"</li>
+ * </ul>
+ * </li>
+ * <li>For everything else - "unknown"</li>
+ * </ul>
+ * <dl>
+ *
+ */
+ private void loadProperties(IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 100);
+ fProperties.put(IRemoteConnection.FILE_SEPARATOR_PROPERTY, "/"); //$NON-NLS-1$
+ fProperties.put(IRemoteConnection.PATH_SEPARATOR_PROPERTY, ":"); //$NON-NLS-1$
+ fProperties.put(IRemoteConnection.LINE_SEPARATOR_PROPERTY, "\n"); //$NON-NLS-1$
+ fProperties.put(IRemoteConnection.USER_HOME_PROPERTY, getWorkingDirectory());
+
+ String osVersion;
+ String osArch;
+ String encoding = DEFAULT_ENCODING;
+
+ String osName = executeCommand("uname", subMon.newChild(10)); //$NON-NLS-1$
+ switch (osName.toLowerCase()) {
+ case "linux": //$NON-NLS-1$
+ osArch = executeCommand("uname -m", subMon.newChild(10)); //$NON-NLS-1$
+ osVersion = executeCommand("uname -r", subMon.newChild(10)); //$NON-NLS-1$
+ try {
+ encoding = executeCommand("locale charmap", subMon.newChild(10)); //$NON-NLS-1$
+ } catch (RemoteConnectionException e) {
+ // Use default
+ }
+ break;
+
+ case "darwin": //$NON-NLS-1$
+ osName = executeCommand("sw_vers -productName", subMon.newChild(10)); //$NON-NLS-1$
+ osVersion = executeCommand("sw_vers -productVersion", subMon.newChild(10)); //$NON-NLS-1$
+ osArch = executeCommand("uname -m", subMon.newChild(10)); //$NON-NLS-1$
+ if (osArch.equalsIgnoreCase("i386")) { //$NON-NLS-1$
+ String opt = executeCommand("sysctl -n hw.optional.x86_64", subMon.newChild(10)); //$NON-NLS-1$
+ if (opt.equals("1")) { //$NON-NLS-1$
+ osArch = "x86_64"; //$NON-NLS-1$
+ }
+ }
+ try {
+ encoding = executeCommand("locale charmap", subMon.newChild(10)); //$NON-NLS-1$
+ } catch (RemoteConnectionException e) {
+ // Use default
+ }
+ break;
+
+ case "aix": //$NON-NLS-1$
+ osArch = executeCommand("uname -p", subMon.newChild(10)); //$NON-NLS-1$
+ osVersion = executeCommand("oslevel", subMon.newChild(10)); //$NON-NLS-1$
+ if (osArch.equalsIgnoreCase("powerpc")) { //$NON-NLS-1$
+ /* Make the architecture match what Linux produces: either ppc or ppc64 */
+ osArch = "ppc"; //$NON-NLS-1$
+ /* Get Kernel type either 32-bit or 64-bit */
+ String opt = executeCommand("prtconf -k", subMon.newChild(10)); //$NON-NLS-1$
+ if (opt.indexOf("64-bit") > 0) { //$NON-NLS-1$
+ osArch += "64"; //$NON-NLS-1$
+ }
+ }
+ try {
+ encoding = executeCommand("locale charmap", subMon.newChild(10)); //$NON-NLS-1$
+ } catch (RemoteConnectionException e) {
+ // Use default
+ }
+ break;
+
+ case "qnx": //$NON-NLS-1$
+ osArch = executeCommand("uname -p", subMon.newChild(10)); //$NON-NLS-1$
+ osVersion = executeCommand("uname -r", subMon.newChild(10)); //$NON-NLS-1$
+ break;
+
+ default:
+ osVersion = "unknown"; //$NON-NLS-1$
+ osArch = "unknown"; //$NON-NLS-1$
+ encoding = "unknown"; //$NON-NLS-1$
+ break;
+ }
+
+ fProperties.put(IRemoteConnection.OS_NAME_PROPERTY, osName);
+ fProperties.put(IRemoteConnection.OS_VERSION_PROPERTY, osVersion);
+ fProperties.put(IRemoteConnection.OS_ARCH_PROPERTY, osArch);
+ fProperties.put(IRemoteConnection.LOCALE_CHARMAP_PROPERTY, encoding);
+ }
+
+ private Session newSession(IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor progress = SubMonitor.convert(monitor, 10);
+ try {
+ IRemoteConnectionWorkingCopy wc = getRemoteConnection().getWorkingCopy();
+ IRemoteConnectionHostService hostService = wc.getService(IRemoteConnectionHostService.class);
+ IUserAuthenticatorService authService = wc.getService(IUserAuthenticatorService.class);
+ Session session = fJSchService.createSession(hostService.getHostname(), hostService.getPort(),
+ hostService.getUsername());
+ session.setUserInfo(new JSchUserInfo(hostService, authService));
+ if (hostService.usePassword()) {
+ session.setConfig("PreferredAuthentications", //$NON-NLS-1$
+ "password,keyboard-interactive,gssapi-with-mic,publickey"); //$NON-NLS-1$
+ } else {
+ session.setConfig("PreferredAuthentications", //$NON-NLS-1$
+ "publickey,gssapi-with-mic,password,keyboard-interactive"); //$NON-NLS-1$
+ }
+ String password = hostService.getPassword();
+ if (!password.isEmpty()) {
+ session.setPassword(password);
+ }
+ if (getProxyCommand().isEmpty() && getProxyConnectionName().isEmpty()) {
+ fJSchService.connect(session, getTimeout() * 1000, progress.newChild(10)); // connect without proxy
+ } else {
+ if (getProxyCommand().isEmpty()) {
+ session.setProxy(
+ JSchConnectionProxyFactory.createForwardProxy(getProxyConnection(), progress.newChild(10)));
+ fJSchService.connect(session, getTimeout() * 1000, progress.newChild(10));
+ } else {
+ session.setProxy(JSchConnectionProxyFactory.createCommandProxy(getProxyConnection(),
+ getProxyCommand(), progress.newChild(10)));
+ session.connect(getTimeout() * 1000); // the fJSchService doesn't pass the timeout correctly
+ }
+ }
+ if (progress.isCanceled()) {
+ return null;
+ }
+ wc.save();
+ fSessions.add(session);
+ return session;
+ } catch (OperationCanceledException e) {
+ throw new RemoteConnectionException(Messages.JSchConnection_0);
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void open(IProgressMonitor monitor) throws RemoteConnectionException {
+ open(monitor, true);
+ }
+
+ /**
+ * Open ssh connection without full setup (environment, sftp)
+ *
+ * @see org.eclipse.remote.core.IRemoteConnection#open()
+ *
+ * @param monitor
+ * @throws RemoteConnectionException
+ */
+ public void openMinimal(IProgressMonitor monitor) throws RemoteConnectionException {
+ open(monitor, false);
+ }
+
+ /**
+ * @see org.eclipse.remote.core.IRemoteConnection#open()
+ *
+ * @param monitor
+ * @param setupFully
+ * open a full featured connection (environment query and sftp)
+ * @throws RemoteConnectionException
+ */
+ private void open(IProgressMonitor monitor, boolean setupFully) throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 60);
+ if (!hasOpenSession()) {
+ checkIsConfigured();
+ newSession(subMon.newChild(10));
+ if (subMon.isCanceled()) {
+ throw new RemoteConnectionException(Messages.JSchConnection_Connection_was_cancelled);
+ }
+ isFullySetup = false;
+ }
+ if (setupFully && !isFullySetup) { // happens on the first open with setupFully==true, which might not be the first open
+ isFullySetup = true;
+ // getCwd checks the exec channel before checkConfiguration checks the sftp channel
+ fWorkingDir = getCwd(subMon.newChild(10));
+ try {
+ if (!checkConfiguration(fSessions.get(0), subMon.newChild(20))) {
+ newSession(subMon.newChild(10));
+ loadEnv(subMon.newChild(10));
+ }
+ } catch (RemoteConnectionException e) {
+ // Do not throw exception now, it will be thrown if FileService is accessed.
+ }
+ loadProperties(subMon.newChild(10));
+ fRemoteConnection.fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_OPENED);
+ }
+ }
+
+ private ChannelSftp openSftpChannel(Session session) throws RemoteConnectionException {
+ try {
+ ChannelSftp channel = (ChannelSftp) session.openChannel("sftp"); //$NON-NLS-1$
+ channel.connect();
+ return channel;
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void removeLocalPortForwarding(int port) throws RemoteConnectionException {
+ if (!isOpen()) {
+ throw new RemoteConnectionException(Messages.JSchConnection_connectionNotOpen);
+ }
+ try {
+ fSessions.get(0).delPortForwardingL(port);
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void removeRemotePortForwarding(int port) throws RemoteConnectionException {
+ if (!isOpen()) {
+ throw new RemoteConnectionException(Messages.JSchConnection_connectionNotOpen);
+ }
+ try {
+ fSessions.get(0).delPortForwardingR(port);
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void setWorkingDirectory(String path) {
+ if (RemoteServicesUtils.posixPath(path).isAbsolute()) {
+ fWorkingDir = path;
+ }
+ }
+
+ @Override
+ public boolean useLoginShell() {
+ String str = fRemoteConnection.getAttribute(USE_LOGIN_SHELL_ATTR);
+ return !str.isEmpty() ? Boolean.parseBoolean(str) : DEFAULT_USE_LOGIN_SHELL;
+ }
+
+ @Override
+ public void setHostname(String hostname) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(ADDRESS_ATTR, hostname);
+ }
+ }
+
+ @Override
+ public void setPassphrase(String passphrase) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setSecureAttribute(PASSPHRASE_ATTR, passphrase);
+ }
+ }
+
+ @Override
+ public void setPassword(String password) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setSecureAttribute(PASSWORD_ATTR, password);
+ }
+ }
+
+ @Override
+ public void setPort(int port) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(PORT_ATTR, Integer.toString(port));
+ }
+ }
+
+ @Override
+ public void setTimeout(int timeout) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(TIMEOUT_ATTR, Integer.toString(timeout));
+ }
+ }
+
+ @Override
+ public void setUseLoginShell(boolean useLogingShell) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(USE_LOGIN_SHELL_ATTR, Boolean.toString(useLogingShell));
+ }
+ }
+
+ @Override
+ public void setUsePassword(boolean usePassword) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(IS_PASSWORD_ATTR, Boolean.toString(usePassword));
+ }
+ }
+
+ @Override
+ public void setUsername(String username) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(USERNAME_ATTR, username);
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnectionProxyFactory.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnectionProxyFactory.java
new file mode 100644
index 00000000000..041da3314b5
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchConnectionProxyFactory.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2014 University of Tennessee and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * University of Tennessee (Roland Schulz) - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.Proxy;
+import com.jcraft.jsch.SocketFactory;
+
+/**
+ * Creates a JSch Proxy. Supports both command proxies, as well as the ssh build-in
+ * stream forwarding.
+ *
+ * @author rschulz
+ *
+ */
+public class JSchConnectionProxyFactory {
+ private static class CommandProxy implements Proxy {
+ private String command;
+ private IRemoteProcess process;
+ private JSchConnection connection;
+ private final IProgressMonitor monitor;
+ private boolean connectCalled = false;
+
+ private CommandProxy(JSchConnection connection, String command, IProgressMonitor monitor) {
+ if (command == null || monitor == null) {
+ throw new IllegalArgumentException();
+ }
+ this.command = command;
+ this.connection = connection;
+ this.monitor = monitor;
+ }
+
+ @Override
+ public void close() {
+ process.destroy();
+ }
+
+ @Override
+ public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws IOException {
+ assert !connectCalled : "connect should only be called once"; //$NON-NLS-1$
+ connectCalled = true;
+
+ if (timeout == 0) {
+ timeout = 10000; // default to 10s
+ }
+ final int waitTime = 50;
+ final int waitSteps = timeout / waitTime;
+ SubMonitor subMon = SubMonitor.convert(monitor, waitSteps * 2);
+ final SubMonitor childMon = subMon.newChild(waitSteps);
+
+ if (connection != null) {
+ // Open connection if it isn't already opened
+ try {
+ connection.openMinimal(childMon);
+ } catch (RemoteConnectionException e) {
+ throw new IOException(e);
+ }
+ }
+ subMon.setWorkRemaining(waitSteps);
+
+ // Start command
+ command = command.replace("%h", host); //$NON-NLS-1$
+ command = command.replace("%p", Integer.toString(port)); //$NON-NLS-1$
+
+ List<String> cmd = new ArgumentParser(command).getTokenList();
+
+ if (connection != null) {
+ JSchProcessBuilder processBuilder = (JSchProcessBuilder) connection.getProcessBuilder(cmd);
+ processBuilder.setPreamble(false);
+ process = processBuilder.start();
+ } else {
+ process = Activator.getService(IRemoteServicesManager.class).getLocalConnectionType().getConnections()
+ .get(0).getService(IRemoteProcessService.class).getProcessBuilder(cmd).start();
+ }
+
+ // Wait on command to produce stdout output
+ long endTime = System.currentTimeMillis() + timeout;
+ boolean bOutputAvailable, bProcessComplete, bTimedOut, bCanceled;
+ do {
+ try {
+ Thread.sleep(waitTime);
+ subMon.worked(1);
+ } catch (InterruptedException e) {
+ /* ignore */
+ }
+ bOutputAvailable = (getInputStream().available() != 0);
+ bProcessComplete = process.isCompleted();
+ bTimedOut = System.currentTimeMillis() > endTime;
+ bCanceled = subMon.isCanceled();
+ } while (!bOutputAvailable && !bProcessComplete && !bTimedOut && !bCanceled);
+
+ // If no output was produced before process died, throw an exception with the stderr output
+ final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+ if (getInputStream().available() == 0 || process.isCompleted()) {
+ String msg = ""; //$NON-NLS-1$
+ while (bufferedReader.ready()) {
+ msg += (char) bufferedReader.read();
+ }
+ msg = msg.trim();
+
+ if (!process.isCompleted()) {
+ process.destroy();
+ }
+
+ String cause = Messages.JSchConnectionProxyFactory_failed;
+ if (bTimedOut) {
+ cause = Messages.JSchConnectionProxyFactory_timedOut;
+ } else if (bCanceled) {
+ cause = Messages.JSchConnectionProxyFactory_wasCanceled;
+ }
+ throw new IOException(MessageFormat.format(Messages.JSchConnectionProxyFactory_ProxyCommandFailed,
+ command, cause, msg));
+ }
+
+ // Dump the stderr to log
+ new Thread() {
+ @Override
+ public void run() {
+ final ILog log = Activator.getDefault().getLog();
+ String line;
+ try {
+ while ((line = bufferedReader.readLine()) != null) {
+ log.log(new Status(IStatus.INFO, Activator.getUniqueIdentifier(), IStatus.OK, line, null));
+ }
+ } catch (IOException e) {
+ Activator.log(e);
+ }
+ }
+ }.start();
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return process.getInputStream();
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ return process.getOutputStream();
+ }
+
+ @Override
+ public Socket getSocket() {
+ return null;
+ }
+ }
+
+ private static class SSHForwardProxy implements Proxy {
+ private Channel channel;
+ private final JSchConnection connection;
+ private final IProgressMonitor monitor;
+ private boolean connectCalled = false;
+
+ private SSHForwardProxy(JSchConnection proxyConnection, IProgressMonitor monitor) {
+ if (proxyConnection == null || monitor == null) {
+ throw new IllegalArgumentException();
+ }
+ this.connection = proxyConnection;
+ this.monitor = monitor;
+ }
+
+ @Override
+ public void close() {
+ channel.disconnect();
+ }
+
+ @Override
+ public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws Exception {
+ assert !connectCalled : "connect should only be called once"; //$NON-NLS-1$
+ try {
+ if (!connection.hasOpenSession()) {
+ try {
+ connection.openMinimal(monitor);
+ } catch (RemoteConnectionException e) {
+ throw new IOException(e);
+ }
+ }
+ channel = connection.getStreamForwarder(host, port);
+ } finally {
+ connectCalled = true;
+ }
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ try {
+ return channel.getInputStream();
+ } catch (IOException e) {
+ Activator.log(e);
+ return null;
+ }
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ try {
+ return channel.getOutputStream();
+ } catch (IOException e) {
+ Activator.log(e);
+ return null;
+ }
+ }
+
+ @Override
+ public Socket getSocket() {
+ return null;
+ }
+ }
+
+ /**
+ * Creates a (local or remote) command proxy.
+ *
+ * @param connection
+ * Either a valid connection or null for a local command
+ * @param command
+ * A valid proxy command. Cannot be null or empty.
+ * @param monitor
+ * A valid progress monitor. Cannot be null.
+ * @return ssh proxy
+ */
+ public static Proxy createCommandProxy(JSchConnection connection, String command, IProgressMonitor monitor) {
+ return new CommandProxy(connection, command, monitor);
+ }
+
+ /**
+ * Creates a ssh forward proxy.
+ *
+ * @param proxyConnection
+ * The Jsch proxy connection. Cannot be null.
+ * @param monitor
+ * A valid progress monitor. Cannot be null.
+ * @return ssh proxy
+ */
+ public static Proxy createForwardProxy(JSchConnection proxyConnection, IProgressMonitor monitor) {
+ return new SSHForwardProxy(proxyConnection, monitor);
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileManager.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileManager.java
new file mode 100644
index 00000000000..05b8627318c
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileManager.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ * Martin Oberhuber - [468889] Support Eclipse older than Mars
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.RemoteServicesUtils;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+public class JSchFileManager implements IRemoteFileService {
+ private final IRemoteConnection fConnection;
+
+ private JSchFileManager(IRemoteConnection connection) {
+ fConnection = connection;
+ }
+
+ public static class Factory implements IRemoteFileService.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (IRemoteFileService.class.equals(service)) {
+ if (remoteConnection instanceof JSchConnection)
+ try {
+ ((JSchConnection) remoteConnection).getSftpCommandChannel();
+ } catch (RemoteConnectionException e) {
+ throw new UnsupportedOperationException(
+ Messages.JSchConnection_Remote_host_does_not_support_sftp);
+ }
+ return (T) new JSchFileManager(remoteConnection);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return fConnection;
+ }
+
+ @Override
+ public String getDirectorySeparator() {
+ return "/"; //$NON-NLS-1$
+ }
+
+ @Override
+ public IFileStore getResource(String pathStr) {
+ IPath path = RemoteServicesUtils.posixPath(pathStr);
+ if (!path.isAbsolute()) {
+ path = RemoteServicesUtils.posixPath(getBaseDirectory()).append(path);
+ }
+ return JschFileStore.getInstance(JSchFileSystem.getURIFor(fConnection.getName(), path.toString()));
+ }
+
+ @Override
+ public String getBaseDirectory() {
+ return fConnection.getService(IRemoteProcessService.class).getWorkingDirectory();
+ }
+
+ @Override
+ public void setBaseDirectory(String path) {
+ fConnection.getService(IRemoteProcessService.class).setWorkingDirectory(path);
+ }
+
+ @Override
+ public String toPath(URI uri) {
+ return uri.getPath();
+ }
+
+ @Override
+ public URI toURI(IPath path) {
+ try {
+ return JSchFileSystem.getURIFor(fConnection.getName(), path.toString());
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ @Override
+ public URI toURI(String path) {
+ return toURI(RemoteServicesUtils.posixPath(path));
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileSystem.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileSystem.java
new file mode 100644
index 00000000000..135f82d53d0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchFileSystem.java
@@ -0,0 +1,102 @@
+/********************************************************************************
+ * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License 2.0 which accompanies this distribution, and is
+ * available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Initial Contributors:
+ * The following IBM employees contributed to the Remote System Explorer
+ * component that contains this file: David McKnight, Kushal Munir,
+ * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson,
+ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
+ *
+ * Contributors:
+ * David Dykstal (IBM) - 168977: refactoring IConnectorService and ServerLauncher hierarchies
+ * Kushal Munir (IBM) - moved to internal package
+ * Martin Oberhuber (Wind River) - [181917] EFS Improvements: Avoid unclosed Streams,
+ * - Fix early startup issues by deferring FileStore evaluation and classloading,
+ * - Improve performance by RSEFileStore instance factory and caching IRemoteFile.
+ * - Also remove unnecessary class RSEFileCache and obsolete branding files.
+ * Martin Oberhuber (Wind River) - [188360] renamed from plugin org.eclipse.rse.eclipse.filesystem
+ * Martin Oberhuber (Wind River) - [199587] return attributes of RemoteToolsFileSystem
+ ********************************************************************************/
+
+package org.eclipse.remote.internal.jsch.core;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.filesystem.provider.FileSystem;
+import org.eclipse.core.runtime.IPath;
+
+public class JSchFileSystem extends FileSystem {
+ /**
+ * Return the connection name encoded in the URI.
+ *
+ * @param uri
+ * URI specifying a remote tools connection
+ * @return name of the connection or null if the URI is invalid
+ * @since 4.0
+ */
+ public static String getConnectionNameFor(URI uri) {
+ return uri.getAuthority();
+ }
+
+ /**
+ * Return an URI uniquely naming a remote tools remote resource.
+ *
+ * @param connectionName
+ * remote tools connection name
+ * @param path
+ * absolute path to resource as valid on the remote system
+ * @return an URI uniquely naming the remote resource.
+ */
+ public static URI getURIFor(String connectionName, String path) {
+ try {
+ return new URI("ssh", connectionName, path, null, null); //$NON-NLS-1$
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Default constructor.
+ */
+ public JSchFileSystem() {
+ super();
+ }
+
+ @Override
+ public int attributes() {
+ // Attributes supported by JSch IFileService
+ return EFS.ATTRIBUTE_READ_ONLY | EFS.ATTRIBUTE_EXECUTABLE | EFS.ATTRIBUTE_SYMLINK | EFS.ATTRIBUTE_LINK_TARGET;
+ }
+
+ @Override
+ public boolean canDelete() {
+ return true;
+ }
+
+ @Override
+ public boolean canWrite() {
+ return true;
+ }
+
+ @Override
+ public IFileStore getStore(IPath path) {
+ return EFS.getNullFileSystem().getStore(path);
+ }
+
+ @Override
+ public IFileStore getStore(URI uri) {
+ try {
+ return JschFileStore.getInstance(uri);
+ } catch (Exception e) {
+ // Could be an URI format exception
+ Activator.log(e);
+ return EFS.getNullFileSystem().getStore(uri);
+ }
+ }
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcess.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcess.java
new file mode 100644
index 00000000000..e94d7e304d1
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcess.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessControlService;
+import org.eclipse.remote.core.IRemoteProcessSignalService;
+import org.eclipse.remote.core.IRemoteProcessTerminalService;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.ChannelShell;
+
+public class JSchProcess
+ implements IRemoteProcessControlService, IRemoteProcessSignalService, IRemoteProcessTerminalService {
+ @SuppressWarnings("nls")
+ private final String signals[] = new String[] { "", "HUP", "INT", "QUIT", "ILL", "", "ABRT", "", "FPE", "KILL", "",
+ "SEGV", "", "PIPE", "ALRM", "TERM", "", "STOP", "TSTP", "CONT", "", "", "", "", "", "", "", "", "", "",
+ "USR1", "USR2" };
+
+ private static int WAIT_TIMEOUT = 1000;
+ private static int refCount = 0;
+
+ private final Channel fChannel;
+ private final IRemoteProcess fProcess;
+
+ private InputStream fProcStdout;
+ private InputStream fProcStderr;
+ private Thread fStdoutReader;
+ private Thread fStderrReader;
+
+ public static class Factory implements IRemoteProcess.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends IRemoteProcess.Service> T getService(IRemoteProcess remoteProcess, Class<T> service) {
+ // This little trick creates an instance of this class
+ // then for each interface it implements, it returns the same object.
+ // This works because the connection caches the service so only one gets created.
+ // As a side effect, it makes this class a service too which can be used
+ // by the this plug-in
+ if (JSchProcess.class.equals(service)) {
+ return (T) new JSchProcess(remoteProcess);
+ }
+ if (IRemoteProcessControlService.class.equals(service) || IRemoteProcessSignalService.class.equals(service)
+ || IRemoteProcessTerminalService.class.equals(service)) {
+ return (T) remoteProcess.getService(JSchProcess.class);
+ }
+ return null;
+ }
+ }
+
+ private class ProcReader implements Runnable {
+ private final static int BUF_SIZE = 8192;
+
+ private final InputStream fInput;
+ private final OutputStream fOutput;
+
+ public ProcReader(InputStream input, OutputStream output) {
+ fInput = input;
+ fOutput = output;
+ synchronized (this.fOutput) {
+ refCount++;
+ }
+ }
+
+ @Override
+ public void run() {
+ int len;
+ byte b[] = new byte[BUF_SIZE];
+
+ try {
+ while ((len = fInput.read(b)) > 0) {
+ fOutput.write(b, 0, len);
+ }
+ } catch (IOException e) {
+ // Ignore
+ }
+ synchronized (fOutput) {
+ if (--refCount == 0) {
+ try {
+ fOutput.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+ }
+ }
+
+ public class NullInputStream extends InputStream {
+ @Override
+ public int read() throws IOException {
+ return -1;
+ }
+
+ @Override
+ public int available() {
+ return 0;
+ }
+ }
+
+ public JSchProcess(IRemoteProcess process) {
+ fProcess = process;
+ fChannel = ((JSchProcessBuilder) process.getProcessBuilder()).getChannel();
+
+ try {
+ if (process.getProcessBuilder().redirectErrorStream()) {
+ PipedOutputStream pipedOutput = new PipedOutputStream();
+
+ fProcStdout = new PipedInputStream(pipedOutput);
+ fProcStderr = new NullInputStream();
+
+ fStderrReader = new Thread(new ProcReader(fChannel.getExtInputStream(), pipedOutput));
+ fStdoutReader = new Thread(new ProcReader(fChannel.getInputStream(), pipedOutput));
+
+ fStderrReader.start();
+ fStdoutReader.start();
+ } else {
+ fProcStdout = fChannel.getInputStream();
+ fProcStderr = fChannel.getExtInputStream();
+ }
+ } catch (IOException e) {
+ Activator.log(e);
+ destroy();
+ }
+
+ }
+
+ @Override
+ public void destroy() {
+ fChannel.disconnect();
+ }
+
+ @Override
+ public int exitValue() {
+ if (!isCompleted()) {
+ throw new IllegalThreadStateException(Messages.JSchProcess_exitValue_exception_msg);
+ }
+ return fChannel.getExitStatus();
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ return fProcStderr;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return fProcStdout;
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ try {
+ return fChannel.getOutputStream();
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public int waitFor() throws InterruptedException {
+ while (!isCompleted()) {
+ Thread.sleep(WAIT_TIMEOUT);
+ }
+ return exitValue();
+ }
+
+ @Override
+ public boolean isCompleted() {
+ return fChannel.isClosed();
+ }
+
+ @Override
+ public IRemoteProcess getRemoteProcess() {
+ return fProcess;
+ }
+
+ @Override
+ public void setTerminalSize(int cols, int rows, int width, int height) {
+ if (fChannel instanceof ChannelExec) {
+ ((ChannelExec) fChannel).setPtySize(cols, rows, width, height);
+ } else if (fChannel instanceof ChannelShell) {
+ ((ChannelShell) fChannel).setPtySize(cols, rows, width, height);
+ }
+ }
+
+ @Override
+ public void sendSignal(int signal) throws RemoteConnectionException {
+ if (signal >= 0 && signal <= USR2) {
+ try {
+ fChannel.sendSignal(signals[signal]);
+ } catch (Exception e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcessBuilder.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcessBuilder.java
new file mode 100644
index 00000000000..5b45981762f
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchProcessBuilder.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.io.IOException;
+import java.text.CharacterIterator;
+import java.text.StringCharacterIterator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.remote.core.AbstractRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.core.RemoteDebugOptions;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.ChannelShell;
+import com.jcraft.jsch.JSchException;
+
+public class JSchProcessBuilder extends AbstractRemoteProcessBuilder {
+
+ private final JSchConnection fConnection;
+ private final Map<String, String> fRemoteEnv = new HashMap<>();
+ private final Set<Character> charSet = new HashSet<>();
+
+ private Channel fChannel;
+ private Map<String, String> fNewRemoteEnv;
+ private boolean fPreamble = true;
+ private boolean fShell = false;
+
+ public JSchProcessBuilder(IRemoteConnection connection, List<String> command) {
+ super(connection, command);
+ fConnection = connection.getService(JSchConnection.class);
+ fRemoteEnv.putAll(fConnection.getEnv());
+
+ // Create set of characters not to escape
+ String trustedChars = null;
+ trustedChars = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //$NON-NLS-1$ //$NON-NLS-2$
+ trustedChars += "0123456789" + "/._-"; //$NON-NLS-1$ //$NON-NLS-2$
+ CharacterIterator it = new StringCharacterIterator(trustedChars);
+ for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
+ charSet.add(c);
+ }
+ }
+
+ public JSchProcessBuilder(IRemoteConnection connection, String... command) {
+ this(connection, Arrays.asList(command));
+ }
+
+ public JSchProcessBuilder(IRemoteConnection connection) {
+ this(connection, new ArrayList<String>());
+ fShell = true;
+ }
+
+ @Override
+ public IFileStore directory() {
+ IFileStore dir = super.directory();
+ IRemoteFileService fileService = fConnection.getRemoteConnection().getService(IRemoteFileService.class);
+ if (dir == null && fileService != null) {
+ dir = fileService.getResource(fConnection.getWorkingDirectory());
+ directory(dir);
+ }
+ return dir;
+ }
+
+ @Override
+ public Map<String, String> environment() {
+ if (fNewRemoteEnv == null) {
+ fNewRemoteEnv = new HashMap<>();
+ fNewRemoteEnv.putAll(fRemoteEnv);
+ }
+ return fNewRemoteEnv;
+ }
+
+ @Override
+ public int getSupportedFlags() {
+ return ALLOCATE_PTY | FORWARD_X11;
+ }
+
+ @Override
+ public IRemoteProcess start(int flags) throws IOException {
+ if (!fConnection.hasOpenSession()) {
+ throw new IOException(Messages.JSchProcessBuilder_Connection_is_not_open);
+ }
+
+ List<String> cmdArgs = command();
+ if (cmdArgs.size() < 1 && !fShell) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ String remoteCmd = ""; //$NON-NLS-1$
+
+ for (int i = 0; i < cmdArgs.size(); i++) {
+ if (i > 0) {
+ remoteCmd += " "; //$NON-NLS-1$
+ }
+ remoteCmd += charEscapify(cmdArgs.get(i), charSet);
+ }
+
+ /*
+ * There are two possibilities:
+ *
+ * 1. Some environment variables have changed values, or new variables have been added. In this case we just want to
+ * send send the changed values rather than all the variables.
+ *
+ * 2. Some of the existing variables have been removed. In this case, we need to resend the entire environment variable
+ * list.
+ */
+
+ final List<String> env = new ArrayList<>();
+ boolean clearEnv = false;
+
+ if (fNewRemoteEnv != null) {
+
+ /*
+ * See if any of the existing variables have been removed
+ */
+ for (String key : fRemoteEnv.keySet()) {
+ if (fNewRemoteEnv.get(key) == null) {
+ clearEnv = true;
+ break;
+ }
+ }
+
+ if (clearEnv) {
+ /*
+ * Add new/changed variables
+ */
+ for (Entry<String, String> entry : fNewRemoteEnv.entrySet()) {
+ env.add(entry.getKey() + "=" + entry.getValue()); //$NON-NLS-1$
+ }
+ } else {
+ /*
+ * Just add new or changed environment variables.
+ */
+ for (Entry<String, String> entry : fNewRemoteEnv.entrySet()) {
+ String oldValue = fRemoteEnv.get(entry.getKey());
+ if (oldValue == null || !oldValue.equals(entry.getValue())) {
+ env.add(entry.getKey() + "=" + entry.getValue()); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ try {
+ if (fShell) {
+ fChannel = fConnection.getShellChannel();
+ if ((flags & ALLOCATE_PTY) == ALLOCATE_PTY) {
+ ((ChannelShell) fChannel).setPty(true);
+ ((ChannelShell) fChannel).setPtyType((flags & FORWARD_X11) == FORWARD_X11 ? "xterm" : "vt100"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ RemoteDebugOptions.trace(RemoteDebugOptions.DEBUG_REMOTE_COMMANDS, "executing shell"); //$NON-NLS-1$
+ } else {
+ fChannel = fConnection.getExecChannel();
+ String command = buildCommand(remoteCmd, env, clearEnv);
+ ((ChannelExec) fChannel).setCommand(command);
+ if ((flags & ALLOCATE_PTY) == ALLOCATE_PTY) {
+ ((ChannelExec) fChannel).setPty(true);
+ ((ChannelExec) fChannel).setPtyType((flags & FORWARD_X11) == FORWARD_X11 ? "xterm" : "vt100"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ RemoteDebugOptions.trace(RemoteDebugOptions.DEBUG_REMOTE_COMMANDS, "executing command: " + command); //$NON-NLS-1$
+ }
+ fChannel.setXForwarding((flags & FORWARD_X11) == FORWARD_X11);
+ fChannel.connect();
+ return newRemoteProcess();
+ } catch (RemoteConnectionException e) {
+ throw new IOException(e.getMessage());
+ } catch (JSchException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ public Channel getChannel() {
+ return fChannel;
+ }
+
+ public void setPreamble(boolean enable) {
+ fPreamble = enable;
+ }
+
+ private String buildCommand(String cmd, List<String> environment, boolean clearEnv) {
+ StringBuffer sb = new StringBuffer();
+ if (fPreamble) {
+ if (directory() != null) {
+ sb.append("cd " + charEscapify(directory().toURI().getPath(), charSet) + " && "); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (clearEnv) {
+ sb.append("env -i"); //$NON-NLS-1$
+ for (String env : environment) {
+ sb.append(" \"" + env + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ sb.append(" "); //$NON-NLS-1$
+ } else {
+ for (String env : environment) {
+ sb.append("export \"" + env + "\"; "); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+ sb.append(cmd);
+ if (fPreamble && fConnection.useLoginShell()) {
+ return substitute(fConnection.getLoginShellCommand(), sb.toString());
+ }
+ return sb.toString();
+ }
+
+ private String charEscapify(String inputString, Set<Character> charSet) {
+ if (inputString == null) {
+ return null;
+ }
+ StringBuffer newString = new StringBuffer(""); //$NON-NLS-1$
+ CharacterIterator it = new StringCharacterIterator(inputString);
+
+ for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
+ if (c == '\'') {
+ newString.append("'\\\\\\''"); //$NON-NLS-1$
+ } else if (c > 127 || charSet.contains(c)) { // Do not escape non-ASCII characters (> 127)
+ newString.append(c);
+ } else {
+ newString.append("\\" + c); //$NON-NLS-1$
+ }
+ }
+ inputString = newString.toString();
+ return inputString;
+ }
+
+ private String substitute(String str, String... args) {
+ int length = str.length();
+ StringBuffer buffer = new StringBuffer(length + (args.length * 5));
+ for (int i = 0; i < length; i++) {
+ char c = str.charAt(i);
+ switch (c) {
+ case '{':
+ int index = str.indexOf('}', i);
+ // if we don't have a matching closing brace then...
+ if (index == -1) {
+ buffer.append(c);
+ break;
+ }
+ i++;
+ if (i >= length) {
+ buffer.append(c);
+ break;
+ }
+ // look for a substitution
+ int number = -1;
+ try {
+ number = Integer.parseInt(str.substring(i, index));
+ } catch (NumberFormatException e) {
+ buffer.append("<invalid argument>"); //$NON-NLS-1$
+ i = index;
+ break;
+ }
+ if (number >= args.length || number < 0) {
+ buffer.append("<missing argument>"); //$NON-NLS-1$
+ i = index;
+ break;
+ }
+ buffer.append(args[number]);
+ i = index;
+ break;
+ default:
+ buffer.append(c);
+ }
+ }
+ return buffer.toString();
+ }
+
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchUserInfo.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchUserInfo.java
new file mode 100644
index 00000000000..58eaa019a63
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JSchUserInfo.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ * Patrick Tasse - [462418] use stored password on non-preferred password based authentication
+ * Martin Oberhuber - [468889] Support Eclipse older than Mars
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.net.PasswordAuthentication;
+
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IUserAuthenticatorService;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.UIKeyboardInteractive;
+import com.jcraft.jsch.UserInfo;
+
+/**
+ * Class to supply credentials from connection attributes without user interaction.
+ */
+public class JSchUserInfo implements UserInfo, UIKeyboardInteractive {
+ private boolean logging = false;
+ private boolean firstTryPassphrase = true;
+
+ private final IRemoteConnectionHostService hostService;
+ private IUserAuthenticatorService userAuthenticatorService;
+
+ public JSchUserInfo(IRemoteConnectionHostService hostService) {
+ this.hostService = hostService;
+ }
+
+ public JSchUserInfo(IRemoteConnectionHostService hostService, IUserAuthenticatorService userAuthenticatorService) {
+ this(hostService);
+ this.userAuthenticatorService = userAuthenticatorService;
+ }
+
+ @Override
+ public String getPassphrase() {
+ if (logging) {
+ System.out.println("getPassphrase"); //$NON-NLS-1$
+ }
+ return hostService.getPassphrase();
+ }
+
+ @Override
+ public String getPassword() {
+ if (logging) {
+ System.out.println("getPassword"); //$NON-NLS-1$
+ }
+ return hostService.getPassword();
+ }
+
+ @Override
+ public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt,
+ boolean[] echo) {
+ if (logging) {
+ System.out.println("promptKeyboardInteractive:" + destination + ":" + name + ":" + instruction); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ for (String p : prompt) {
+ System.out.println(" " + p); //$NON-NLS-1$
+ }
+ }
+
+ if (userAuthenticatorService != null) {
+ String[] result = userAuthenticatorService.prompt(destination, name, instruction, prompt, echo);
+ if (result != null) {
+ if (prompt.length == 1 && prompt[0].trim().equalsIgnoreCase("password:")) { //$NON-NLS-1$
+ hostService.setPassword(result[0]);
+ }
+ }
+ return result;
+ }
+ return null;
+ }
+
+ @Override
+ public boolean promptPassphrase(String message) {
+ if (logging) {
+ System.out.println("promptPassphrase:" + message); //$NON-NLS-1$
+ }
+ if (firstTryPassphrase && !getPassphrase().equals("")) { //$NON-NLS-1$
+ firstTryPassphrase = false;
+ return true;
+ }
+ if (userAuthenticatorService != null) {
+ PasswordAuthentication auth = userAuthenticatorService.prompt(hostService.getUsername(), message);
+ if (auth == null) {
+ return false;
+ }
+ hostService.setUsername(auth.getUserName());
+ hostService.setPassphrase(new String(auth.getPassword()));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean promptPassword(String message) {
+ if (logging) {
+ System.out.println("promptPassword:" + message); //$NON-NLS-1$
+ }
+ if (userAuthenticatorService != null) {
+ PasswordAuthentication auth = userAuthenticatorService.prompt(hostService.getUsername(), message);
+ if (auth == null) {
+ return false;
+ }
+ hostService.setUsername(auth.getUserName());
+ hostService.setPassword(new String(auth.getPassword()));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean promptYesNo(String message) {
+ if (logging) {
+ System.out.println("promptYesNo:" + message); //$NON-NLS-1$
+ }
+ if (userAuthenticatorService != null) {
+ int prompt = userAuthenticatorService.prompt(IUserAuthenticatorService.QUESTION,
+ Messages.AuthInfo_Authentication_message, message,
+ new int[] { IUserAuthenticatorService.YES, IUserAuthenticatorService.NO },
+ IUserAuthenticatorService.YES);
+ return prompt == IUserAuthenticatorService.YES;
+ }
+ return true;
+ }
+
+ @Override
+ public void showMessage(String message) {
+ if (logging) {
+ System.out.println("showMessage:" + message); //$NON-NLS-1$
+ }
+ if (userAuthenticatorService != null) {
+ userAuthenticatorService.prompt(IUserAuthenticatorService.INFORMATION,
+ Messages.AuthInfo_Authentication_message, message, new int[] { IUserAuthenticatorService.OK },
+ IUserAuthenticatorService.OK);
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JschFileStore.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JschFileStore.java
new file mode 100644
index 00000000000..14461a4df78
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/JschFileStore.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ * Roland Schulz, University of Tennessee
+ * Martin Oberhuber - [468889] Support Eclipse older than Mars
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.core;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.filesystem.provider.FileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.RemoteServicesUtils;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.commands.ChildInfosCommand;
+import org.eclipse.remote.internal.jsch.core.commands.DeleteCommand;
+import org.eclipse.remote.internal.jsch.core.commands.FetchInfoCommand;
+import org.eclipse.remote.internal.jsch.core.commands.GetInputStreamCommand;
+import org.eclipse.remote.internal.jsch.core.commands.GetOutputStreamCommand;
+import org.eclipse.remote.internal.jsch.core.commands.MkdirCommand;
+import org.eclipse.remote.internal.jsch.core.commands.PutInfoCommand;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+public class JschFileStore extends FileStore {
+ /**
+ * Public factory method for obtaining JschFileStore instances.
+ *
+ * @param uri
+ * URI to get a fileStore for
+ * @return an JschFileStore instance for the URI.
+ */
+ public static JschFileStore getInstance(URI uri) {
+ synchronized (instanceMap) {
+ JschFileStore store = instanceMap.get(uri.toString());
+ if (store == null) {
+ store = new JschFileStore(uri);
+ instanceMap.put(uri.toString(), store);
+ }
+ return store;
+ }
+ }
+
+ private static Map<String, JschFileStore> instanceMap = new HashMap<>();
+
+ private final IPath fRemotePath;
+ private final URI fURI;
+
+ private JschFileStore(URI uri) {
+ fURI = uri;
+ fRemotePath = RemoteServicesUtils.posixPath(uri.getPath());
+ }
+
+ private JSchConnection checkConnection(IProgressMonitor monitor) throws RemoteConnectionException {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connectionType = manager.getConnectionType(fURI);
+ if (connectionType == null) {
+ throw new RemoteConnectionException(
+ NLS.bind(Messages.JschFileStore_No_remote_services_found_for_URI, fURI));
+ }
+
+ try {
+ IRemoteConnection connection = connectionType.getConnection(fURI);
+ if (connection == null) {
+ throw new RemoteConnectionException(NLS.bind(Messages.JschFileStore_Invalid_connection_for_URI, fURI));
+ }
+ if (!connection.isOpen()) {
+ connection.open(monitor);
+ if (!connection.isOpen()) {
+ throw new RemoteConnectionException(Messages.JschFileStore_Connection_is_not_open);
+ }
+ }
+ return connection.getService(JSchConnection.class);
+ } catch (CoreException e) {
+ throw new RemoteConnectionException(e);
+ }
+ }
+
+ @Override
+ public IFileInfo[] childInfos(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ JSchConnection connection = checkConnection(subMon.newChild(1));
+ ChildInfosCommand command = new ChildInfosCommand(connection, fRemotePath);
+ return command.getResult(subMon.newChild(9));
+ }
+
+ @Override
+ public String[] childNames(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ IFileInfo[] infos = childInfos(options, subMon.newChild(10));
+ String[] names = new String[infos.length];
+ for (int i = 0; i < infos.length; i++) {
+ names[i] = infos[i].getName();
+ }
+ return names;
+ }
+
+ @Override
+ public void delete(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 20);
+ JSchConnection connection = checkConnection(subMon.newChild(1));
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(9));
+ if (!subMon.isCanceled() && info.exists()) {
+ DeleteCommand command = new DeleteCommand(connection, fRemotePath);
+ command.getResult(subMon.newChild(10));
+ }
+ }
+
+ @Override
+ public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ JSchConnection connection = checkConnection(subMon.newChild(1));
+ FetchInfoCommand command = new FetchInfoCommand(connection, fRemotePath);
+ return command.getResult(subMon.newChild(9));
+ }
+
+ @Override
+ public IFileStore getChild(String name) {
+ URI uri = JSchFileSystem.getURIFor(JSchFileSystem.getConnectionNameFor(fURI),
+ fRemotePath.append(name).toString());
+ return JschFileStore.getInstance(uri);
+ }
+
+ @Override
+ public String getName() {
+ return getNameFromPath(fRemotePath);
+ }
+
+ /**
+ * Utility routing to get the file name from an absolute path.
+ *
+ * @param path
+ * path to extract file name from
+ * @return last segment of path, or the full path if it is root
+ */
+ private String getNameFromPath(IPath path) {
+ if (path.isRoot()) {
+ return path.toString();
+ }
+ return path.lastSegment();
+ }
+
+ @Override
+ public IFileStore getParent() {
+ if (fRemotePath.isRoot()) {
+ return null;
+ }
+ String parentPath = fRemotePath.toString();
+ if (fRemotePath.segmentCount() > 0) {
+ parentPath = fRemotePath.removeLastSegments(1).toString();
+ }
+ return JschFileStore
+ .getInstance(JSchFileSystem.getURIFor(JSchFileSystem.getConnectionNameFor(fURI), parentPath));
+ }
+
+ @Override
+ public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 20);
+ JSchConnection connection = checkConnection(subMon.newChild(1));
+
+ if ((options & EFS.SHALLOW) == EFS.SHALLOW) {
+ IFileStore parent = getParent();
+ if (parent != null && !parent.fetchInfo(EFS.NONE, subMon.newChild(9)).exists()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRITE,
+ NLS.bind(Messages.JschFileStore_The_parent_of_directory_does_not_exist, fRemotePath.toString()),
+ null));
+ }
+ if (subMon.isCanceled()) {
+ return this;
+ }
+ }
+
+ try {
+ MkdirCommand command = new MkdirCommand(connection, fRemotePath);
+ command.getResult(subMon.newChild(10));
+ } catch (Exception e) {
+ // Ignore any exceptions
+ }
+ if (!subMon.isCanceled()) {
+ /*
+ * Check if the result exists and is a directory, throw an exception if neither.
+ */
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(10));
+ if (!subMon.isCanceled()) {
+ if (!info.exists()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRITE,
+ NLS.bind(Messages.JschFileStore_The_directory_could_not_be_created, fRemotePath.toString()),
+ null));
+ }
+ if (!info.isDirectory()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(),
+ EFS.ERROR_WRONG_TYPE,
+ NLS.bind(Messages.JschFileStore_A_file_of_name_already_exists, fRemotePath.toString()),
+ null));
+ }
+ }
+ }
+
+ return this;
+ }
+
+ @Override
+ public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 30);
+ JSchConnection connection = checkConnection(subMon.newChild(1));
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(9));
+ if (!subMon.isCanceled()) {
+ if (!info.exists()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_READ,
+ NLS.bind(Messages.JschFileStore_File_doesnt_exist, fRemotePath.toString()), null));
+ }
+ if (info.isDirectory()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRONG_TYPE,
+ NLS.bind(Messages.JschFileStore_Is_a_directory, fRemotePath.toString()), null));
+ }
+ GetInputStreamCommand command = new GetInputStreamCommand(connection, fRemotePath);
+ return command.getResult(subMon.newChild(10));
+ }
+ return null;
+ }
+
+ @Override
+ public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 30);
+ JSchConnection connection = checkConnection(subMon.newChild(1));
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(9));
+ if (!subMon.isCanceled()) {
+ if (info.isDirectory()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRONG_TYPE,
+ NLS.bind(Messages.JschFileStore_Is_a_directory, fRemotePath.toString()), null));
+ }
+ GetOutputStreamCommand command = new GetOutputStreamCommand(connection, options, fRemotePath);
+ return command.getResult(subMon.newChild(10));
+ }
+ return null;
+ }
+
+ @Override
+ public void putInfo(IFileInfo info, int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ JSchConnection connection = checkConnection(subMon.newChild(1));
+ PutInfoCommand command = new PutInfoCommand(connection, info, options, fRemotePath);
+ command.getResult(subMon.newChild(9));
+ }
+
+ @Override
+ public URI toURI() {
+ return fURI;
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/AbstractRemoteCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/AbstractRemoteCommand.java
new file mode 100644
index 00000000000..31cd158af04
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/AbstractRemoteCommand.java
@@ -0,0 +1,479 @@
+/******************************************************************************
+ * Copyright (c) 2013, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial Implementation
+ * Martin Oberhuber - [468889] Support Eclipse older than Mars
+ *****************************************************************************/
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import java.io.IOException;
+import java.text.CharacterIterator;
+import java.text.MessageFormat;
+import java.text.StringCharacterIterator;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.provider.FileInfo;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.RemoteServicesUtils;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpATTRS;
+import com.jcraft.jsch.SftpException;
+import com.jcraft.jsch.SftpProgressMonitor;
+
+/**
+ * @author greg
+ *
+ */
+public abstract class AbstractRemoteCommand<T> {
+ protected static class CommandProgressMonitor implements SftpProgressMonitor {
+ private final IProgressMonitor fMonitor;
+ private double fWorkPercentFactor;
+ private Long fMaxWork;
+ private String fMaxWorkSize;
+ private long fWorkToDate;
+ private String fPrefix;
+
+ public CommandProgressMonitor(IProgressMonitor monitor) {
+ fMonitor = monitor;
+ }
+
+ public CommandProgressMonitor(String prefix, IProgressMonitor monitor) {
+ fPrefix = prefix;
+ fMonitor = monitor;
+ }
+
+ @Override
+ public boolean count(long count) {
+ fWorkToDate += count;
+ String size;
+ Long workToDate;
+ if (fWorkToDate < 1024L) {
+ size = "bytes"; //$NON-NLS-1$
+ workToDate = fWorkToDate;
+ } else {
+ size = "KB"; //$NON-NLS-1$
+ workToDate = fWorkToDate / 1024L;
+ }
+ StringBuffer taskName = new StringBuffer();
+ if (fPrefix != null) {
+ taskName.append(fPrefix);
+ }
+ if (fWorkPercentFactor < 0) {
+ taskName.append(MessageFormat.format(Messages.AbstractRemoteCommand_format1,
+ new Object[] { workToDate, size }));
+ } else {
+ Double workPercent = Double.valueOf(fWorkPercentFactor * fWorkToDate);
+ taskName.append(MessageFormat.format(Messages.AbstractRemoteCommand_format2,
+ new Object[] { workToDate, size, fMaxWork, fMaxWorkSize, workPercent }));
+ }
+ fMonitor.subTask(taskName.toString());
+ fMonitor.worked((int) count);
+ return !(fMonitor.isCanceled());
+ }
+
+ @Override
+ public void end() {
+ fMonitor.done();
+ }
+
+ @Override
+ public void init(int op, String src, String dest, long max) {
+ fWorkPercentFactor = 1.0 / max;
+ if (max < 1024L) {
+ fMaxWorkSize = "bytes"; //$NON-NLS-1$
+ fMaxWork = max;
+ } else {
+ fMaxWorkSize = "KB"; //$NON-NLS-1$
+ fMaxWork = max / 1024L;
+ }
+ fWorkToDate = 0;
+ fMonitor.beginTask(RemoteServicesUtils.posixPath(src).lastSegment(), (int) max);
+ }
+ }
+
+ protected abstract class ExecCallable<T1> implements Callable<T1> {
+ private IProgressMonitor fProgressMonitor;
+ private ChannelExec fExecChannel;
+
+ private Future<T1> asyncCmdInThread() throws RemoteConnectionException {
+ setChannel(fConnection.getExecChannel());
+ return fPool.submit(this);
+ }
+
+ @Override
+ public abstract T1 call() throws JSchException, IOException, RemoteConnectionException;
+
+ private void finalizeCmdInThread() {
+ setChannel(null);
+ }
+
+ public ChannelExec getChannel() {
+ return fExecChannel;
+ }
+
+ public IProgressMonitor getProgressMonitor() {
+ return fProgressMonitor;
+ }
+
+ /**
+ * Function opens exec channel and then executes the exec operation. If
+ * run on the main thread it executes it on a separate thread
+ */
+ public T1 getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ Future<T1> future = null;
+ fProgressMonitor = SubMonitor.convert(monitor, 10);
+ try {
+ future = asyncCmdInThread();
+ return waitCmdInThread(future);
+ } finally {
+ finalizeCmdInThread();
+ }
+ }
+
+ public void setChannel(ChannelExec channel) {
+ fExecChannel = channel;
+ }
+
+ private T1 waitCmdInThread(Future<T1> future) throws RemoteConnectionException {
+ boolean bInterrupted = Thread.interrupted();
+ while (!getProgressMonitor().isCanceled()) {
+ try {
+ return future.get(100, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ bInterrupted = true;
+ } catch (TimeoutException e) {
+ // ignore
+ } catch (ExecutionException e) {
+ getChannel().disconnect();
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ getProgressMonitor().worked(1);
+ }
+ if (bInterrupted) {
+ Thread.currentThread().interrupt(); // set current thread flag
+ }
+ future.cancel(true);
+ getChannel().disconnect();
+ throw new RemoteConnectionException(Messages.AbstractRemoteCommand_Operation_cancelled_by_user);
+ }
+ }
+
+ protected abstract class SftpCallable<T1> implements Callable<T1> {
+ private IProgressMonitor fProgressMonitor;
+ private ChannelSftp fSftpChannel;
+
+ private Future<T1> asyncCmdInThread() throws RemoteConnectionException {
+ setChannel(fConnection.getSftpCommandChannel());
+ return fPool.submit(this);
+ }
+
+ @Override
+ public abstract T1 call() throws JSchException, SftpException, IOException;
+
+ private void finalizeCmdInThread() {
+ setChannel(null);
+ }
+
+ public ChannelSftp getChannel() {
+ return fSftpChannel;
+ }
+
+ public IProgressMonitor getProgressMonitor() {
+ return fProgressMonitor;
+ }
+
+ /**
+ * Function opens sftp channel and then executes the sftp operation. If
+ * run on the main thread it executes it on a separate thread
+ */
+ public T1 getResult(IProgressMonitor monitor) throws SftpException, RemoteConnectionException {
+ Future<T1> future = null;
+ fProgressMonitor = SubMonitor.convert(monitor, 10);
+ try {
+ future = asyncCmdInThread();
+ return waitCmdInThread(future);
+ } finally {
+ finalizeCmdInThread();
+ }
+ }
+
+ public void setChannel(ChannelSftp channel) {
+ fSftpChannel = channel;
+ }
+
+ private T1 waitCmdInThread(Future<T1> future) throws SftpException, RemoteConnectionException {
+ boolean bInterrupted = Thread.interrupted();
+ while (!getProgressMonitor().isCanceled()) {
+ try {
+ return future.get(100, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ bInterrupted = true;
+ } catch (TimeoutException e) {
+ // ignore
+ } catch (ExecutionException e) {
+ if (e.getCause() instanceof SftpException) {
+ throw (SftpException) e.getCause();
+ }
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ getProgressMonitor().worked(1);
+ }
+ if (bInterrupted) {
+ Thread.currentThread().interrupt(); // set current thread flag
+ }
+ future.cancel(true);
+ throw new RemoteConnectionException(Messages.AbstractRemoteCommand_Operation_cancelled_by_user);
+ }
+ }
+
+ private static ExecutorService fPool = Executors.newSingleThreadExecutor();
+
+ private final JSchConnection fConnection;
+
+ public static final int UNKNOWN = 0;
+
+ public static final int SUCCESS_OK = 1;
+
+ public static final int SUCCESS_ERROR = 2;
+
+ public static final int ERROR_NOT_EXECUTABLE = 126;
+
+ public static final int ERROR_NOT_FOUND = 127;
+ public static final int INVALID_EXIT_CODE = 128;
+ public static final int SIGHUP = 129;
+ public static final int SIGINT = 130;
+ public static final int SIGQUIT = 131;
+ public static final int SIGILL = 132;
+ public static final int SIGTRAP = 133;
+ public static final int SIGIOT = 134;
+ public static final int SIGBUS = 135;
+ public static final int SIGFPE = 136;
+ public static final int SIGKILL = 137;
+ public static final int SIGUSR1 = 138;
+ public static final int SIGSEGV = 139;
+ public static final int SIGUSR2 = 140;
+ public static final int SIGPIPE = 141;
+ public static final int SIGALRM = 142;
+ public static final int SIGTERM = 143;
+ public static final int SIGSTKFLT = 144;
+ public static final int SIGCHLD = 145;
+ public static final int SIGCONT = 146;
+ public static final int SIGSTOP = 147;
+ public static final int SIGTSTP = 148;
+ public static final int SIGTTIN = 149;
+ public static final int SIGTTOU = 150;
+ public static final int SIGURG = 151;
+ public static final int SIGXCPU = 152;
+ public static final int SIGXFSZ = 153;
+ public static final int SIGVTALRM = 154;
+ public static final int SIGPROF = 155;
+ public static final int SIGWINCH = 156;
+ public static final int SIGIO = 157;
+ public static final int SIGPWR = 158;
+
+ public AbstractRemoteCommand(JSchConnection connection) {
+ fConnection = connection;
+ }
+
+ protected IFileInfo convertToFileInfo(final IPath path, SftpATTRS attrs, IProgressMonitor monitor)
+ throws RemoteConnectionException {
+ return convertToFileInfo(path.lastSegment(), path.removeLastSegments(1), attrs, monitor);
+ }
+
+ protected IFileInfo convertToFileInfo(final String name, final IPath parentPath, SftpATTRS attrs,
+ IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor progress = SubMonitor.convert(monitor, 10);
+ FileInfo fileInfo = new FileInfo(name);
+ fileInfo.setExists(true);
+ fileInfo.setDirectory(attrs.isDir());
+ fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE, (attrs.getPermissions() & 0100) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_WRITE, (attrs.getPermissions() & 0200) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_READ, (attrs.getPermissions() & 0400) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE, (attrs.getPermissions() & 0010) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_WRITE, (attrs.getPermissions() & 0020) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_READ, (attrs.getPermissions() & 0040) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE, (attrs.getPermissions() & 0001) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_WRITE, (attrs.getPermissions() & 0002) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_OTHER_READ, (attrs.getPermissions() & 0004) != 0);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_SYMLINK, attrs.isLink());
+ if (attrs.isLink()) {
+ SftpCallable<String> c2 = new SftpCallable<>() {
+ @Override
+ public String call() throws JSchException, SftpException {
+ return getChannel().readlink(parentPath.append(name).toString());
+ }
+ };
+ String target;
+ try {
+ progress.subTask(Messages.AbstractRemoteCommand_Get_symlink_target);
+ target = c2.getResult(progress.newChild(10));
+ fileInfo.setStringAttribute(EFS.ATTRIBUTE_LINK_TARGET, target);
+ } catch (SftpException e) {
+ // Ignore
+ }
+ }
+ fileInfo.setLastModified(attrs.getMTime() * 1000L);
+ fileInfo.setLength(attrs.getSize());
+ return fileInfo;
+ }
+
+ public JSchConnection getConnection() {
+ return fConnection;
+ }
+
+ public int getFinishStatus() {
+ int code = 0;
+
+ if (code == 0) {
+ return SUCCESS_OK;
+ } else if (code <= 125) {
+ return SUCCESS_ERROR;
+ } else if (code == 126) {
+ return ERROR_NOT_EXECUTABLE;
+ } else if (code == 127) {
+ return ERROR_NOT_FOUND;
+ } else if (code == 128) {
+ return UNKNOWN;
+ } else if (code == 255) {
+ return INVALID_EXIT_CODE;
+ } else if (code == 128 + 1) {
+ return SIGHUP;
+ } else if (code == 128 + 2) {
+ return SIGINT;
+ } else if (code == 128 + 3) {
+ return SIGQUIT;
+ } else if (code == 128 + 4) {
+ return SIGILL;
+ } else if (code == 128 + 5) {
+ return SIGTRAP;
+ } else if (code == 128 + 6) {
+ return SIGIOT;
+ } else if (code == 128 + 7) {
+ return SIGBUS;
+ } else if (code == 128 + 8) {
+ return SIGFPE;
+ } else if (code == 128 + 9) {
+ return SIGKILL;
+ } else if (code == 128 + 10) {
+ return SIGUSR1;
+ } else if (code == 128 + 11) {
+ return SIGSEGV;
+ } else if (code == 128 + 12) {
+ return SIGUSR2;
+ } else if (code == 128 + 13) {
+ return SIGPIPE;
+ } else if (code == 128 + 14) {
+ return SIGALRM;
+ } else if (code == 128 + 15) {
+ return SIGTERM;
+ } else if (code == 128 + 16) {
+ return SIGSTKFLT;
+ } else if (code == 128 + 17) {
+ return SIGCHLD;
+ } else if (code == 128 + 18) {
+ return SIGCONT;
+ } else if (code == 128 + 19) {
+ return SIGSTOP;
+ } else if (code == 128 + 20) {
+ return SIGTSTP;
+ } else if (code == 128 + 21) {
+ return SIGTTIN;
+ } else if (code == 128 + 22) {
+ return SIGTTOU;
+ } else if (code == 128 + 23) {
+ return SIGURG;
+ } else if (code == 128 + 24) {
+ return SIGXCPU;
+ } else if (code == 128 + 25) {
+ return SIGXFSZ;
+ } else if (code == 128 + 26) {
+ return SIGVTALRM;
+ } else if (code == 128 + 27) {
+ return SIGPROF;
+ } else if (code == 128 + 28) {
+ return SIGWINCH;
+ } else if (code == 128 + 29) {
+ return SIGIO;
+ } else if (code == 128 + 30) {
+ return SIGPWR;
+ } else {
+ return UNKNOWN;
+ }
+ }
+
+ protected abstract T getResult(IProgressMonitor monitor) throws RemoteConnectionException;
+
+ protected String quote(String path, boolean full) {
+ StringBuffer buffer = new StringBuffer();
+ StringCharacterIterator iter = new StringCharacterIterator(path);
+ for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
+ switch (c) {
+ case '(':
+ case ')':
+ case '[':
+ case ']':
+ case '{':
+ case '}':
+ case '|':
+ case '\\':
+ case '*':
+ case '&':
+ case '^':
+ case '%':
+ case '$':
+ case '#':
+ case '@':
+ case '!':
+ case '~':
+ case '`':
+ case '\'':
+ case '"':
+ case ':':
+ case ';':
+ case '?':
+ case '<':
+ case '>':
+ case ',':
+ case '\n':
+ if (full) {
+ buffer.append('\\');
+ }
+ buffer.append(c);
+ continue;
+ case ' ':
+ buffer.append('\\');
+ buffer.append(c);
+ continue;
+ default:
+ buffer.append(c);
+ continue;
+ }
+ }
+ return buffer.toString();
+ }
+
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ChildInfosCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ChildInfosCommand.java
new file mode 100644
index 00000000000..99ae42e0531
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ChildInfosCommand.java
@@ -0,0 +1,67 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+import com.jcraft.jsch.ChannelSftp.LsEntry;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpException;
+
+public class ChildInfosCommand extends AbstractRemoteCommand<IFileInfo[]> {
+
+ private final IPath fRemotePath;
+
+ public ChildInfosCommand(JSchConnection connection, IPath path) {
+ super(connection);
+ fRemotePath = path;
+ }
+
+ @Override
+ public IFileInfo[] getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 20);
+
+ Vector<LsEntry> files = getResult(fRemotePath.toString(), subMon.newChild(10));
+
+ List<IFileInfo> result = new ArrayList<>();
+
+ if (files != null && !subMon.isCanceled()) {
+ Enumeration<LsEntry> enumeration = files.elements();
+ while (enumeration.hasMoreElements() && !subMon.isCanceled()) {
+ LsEntry entry = enumeration.nextElement();
+ final String fileName = entry.getFilename();
+ if (fileName.equals(".") || fileName.equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$
+ // Ignore parent and current dir entry.
+ continue;
+ }
+ result.add(convertToFileInfo(fileName, fRemotePath, entry.getAttrs(), subMon.newChild(10)));
+ }
+ }
+
+ return result.toArray(new IFileInfo[result.size()]);
+ }
+
+ private Vector<LsEntry> getResult(String path, IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ SftpCallable<Vector<LsEntry>> c = new SftpCallable<>() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public Vector<LsEntry> call() throws JSchException, SftpException {
+ return getChannel().ls(quote(fRemotePath.toString(), true));
+ }
+ };
+ try {
+ return c.getResult(subMon.newChild(10));
+ } catch (SftpException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/DeleteCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/DeleteCommand.java
new file mode 100644
index 00000000000..4183e83ff3a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/DeleteCommand.java
@@ -0,0 +1,30 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+public class DeleteCommand extends AbstractRemoteCommand<Void> {
+
+ private final IPath fRemotePath;
+
+ public DeleteCommand(JSchConnection connection, IPath path) {
+ super(connection);
+ fRemotePath = path;
+ }
+
+ @Override
+ public Void getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 10);
+
+ ExecCommand command = new ExecCommand(getConnection());
+ command.setCommand("/bin/rm -rf " + quote(fRemotePath.toString(), true)); //$NON-NLS-1$
+ String result = command.getResult(subMon.newChild(10));
+ if (!result.equals("")) { //$NON-NLS-1$
+ throw new RemoteConnectionException(result);
+ }
+ return null;
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ExecCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ExecCommand.java
new file mode 100644
index 00000000000..19801e04aa9
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/ExecCommand.java
@@ -0,0 +1,60 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import java.io.ByteArrayOutputStream;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.JSchException;
+
+public class ExecCommand extends AbstractRemoteCommand<String> {
+
+ private String fCommand;
+
+ public ExecCommand(JSchConnection connection) {
+ super(connection);
+ }
+
+ public ExecCommand setCommand(String command) {
+ fCommand = command;
+ return this;
+ }
+
+ @Override
+ public String getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ ExecCallable<String> c = new ExecCallable<>() {
+ @Override
+ public String call() throws JSchException, RemoteConnectionException {
+ getChannel().setCommand(fCommand);
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ByteArrayOutputStream err = new ByteArrayOutputStream();
+ getChannel().setOutputStream(stream);
+ getChannel().setErrStream(err);
+ getChannel().connect();
+ while (!getChannel().isClosed() && !getProgressMonitor().isCanceled()) {
+ synchronized (this) {
+ try {
+ wait(100);
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }
+ }
+ if (getProgressMonitor().isCanceled()) {
+ return ""; //$NON-NLS-1$
+ }
+ if (getChannel().getExitStatus() != 0) {
+ throw new RemoteConnectionException(err.toString());
+ }
+ return stream.toString();
+ }
+ };
+ subMon.subTask(NLS.bind(Messages.ExecCommand_Exec_command, fCommand));
+ return c.getResult(subMon.newChild(10));
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/FetchInfoCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/FetchInfoCommand.java
new file mode 100644
index 00000000000..93494f6bb1f
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/FetchInfoCommand.java
@@ -0,0 +1,47 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.provider.FileInfo;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpATTRS;
+import com.jcraft.jsch.SftpException;
+
+public class FetchInfoCommand extends AbstractRemoteCommand<IFileInfo> {
+
+ private final IPath fRemotePath;
+
+ public FetchInfoCommand(JSchConnection connection, IPath path) {
+ super(connection);
+ fRemotePath = path;
+ }
+
+ @Override
+ public IFileInfo getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 20);
+ SftpCallable<SftpATTRS> c = new SftpCallable<>() {
+ @Override
+ public SftpATTRS call() throws JSchException, SftpException {
+ return getChannel().lstat(fRemotePath.toString());
+ }
+ };
+ SftpATTRS attrs;
+ try {
+ attrs = c.getResult(subMon.newChild(10));
+ return convertToFileInfo(fRemotePath, attrs, subMon.newChild(10));
+ } catch (SftpException e) {
+ if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {
+ FileInfo info = new FileInfo(fRemotePath.lastSegment());
+ info.setExists(false);
+ return info;
+ }
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetInputStreamCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetInputStreamCommand.java
new file mode 100644
index 00000000000..e1636dc2ca6
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetInputStreamCommand.java
@@ -0,0 +1,124 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpException;
+
+/**
+ * The JSch implementation does not support multiple streams open on a single channel, so we must create a new channel for each
+ * subsequent stream. This has the problem that there are usually only a limited number of channels that can be opened
+ * simultaneously, so it is possible that this call will fail unless the open streams are closed first.
+ *
+ * This code will use the initial (command) channel first, or if that is already being used, will open a new stream. It must be
+ * careful not to close the command stream as other threads may still be using it.
+ */
+public class GetInputStreamCommand extends AbstractRemoteCommand<InputStream> {
+ private final IPath fRemotePath;
+
+ private static ChannelSftp commandChannel;
+ private ChannelSftp thisChannel;
+
+ public GetInputStreamCommand(JSchConnection connection, IPath path) {
+ super(connection);
+ fRemotePath = path;
+ }
+
+ @Override
+ public InputStream getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 10);
+
+ final SftpCallable<InputStream> c = new SftpCallable<>() {
+ private ChannelSftp newChannel() throws IOException {
+ synchronized (GetInputStreamCommand.class) {
+ if (commandChannel != null) {
+ try {
+ thisChannel = getConnection().newSftpChannel();
+ return thisChannel;
+ } catch (RemoteConnectionException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+ thisChannel = commandChannel = getChannel();
+ return commandChannel;
+ }
+ }
+
+ @Override
+ public InputStream call() throws JSchException, SftpException, IOException {
+ return newChannel().get(fRemotePath.toString(),
+ new CommandProgressMonitor(
+ NLS.bind(Messages.GetInputStreamCommand_Receiving, fRemotePath.toString()),
+ getProgressMonitor()));
+ }
+ };
+ try {
+ final InputStream stream = c.getResult(subMon.newChild(10));
+ return new InputStream() {
+ @Override
+ public int read() throws IOException {
+ return stream.read();
+ }
+
+ @Override
+ public void close() throws IOException {
+ stream.close();
+ synchronized (GetInputStreamCommand.class) {
+ if (thisChannel != commandChannel) {
+ thisChannel.disconnect();
+ } else {
+ commandChannel = null;
+ }
+ }
+ }
+
+ @Override
+ public int read(byte[] b) throws IOException {
+ return stream.read(b);
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ return stream.read(b, off, len);
+ }
+
+ @Override
+ public long skip(long n) throws IOException {
+ return stream.skip(n);
+ }
+
+ @Override
+ public int available() throws IOException {
+ return stream.available();
+ }
+
+ @Override
+ public synchronized void mark(int readlimit) {
+ stream.mark(readlimit);
+ }
+
+ @Override
+ public synchronized void reset() throws IOException {
+ stream.reset();
+ }
+
+ @Override
+ public boolean markSupported() {
+ return stream.markSupported();
+ }
+ };
+ } catch (SftpException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetOutputStreamCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetOutputStreamCommand.java
new file mode 100644
index 00000000000..91030313e6a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/GetOutputStreamCommand.java
@@ -0,0 +1,73 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+import org.eclipse.remote.internal.jsch.core.messages.Messages;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpException;
+
+public class GetOutputStreamCommand extends AbstractRemoteCommand<OutputStream> {
+ private final IPath fRemotePath;
+ private final int fOptions;
+ private boolean fIsClosed;
+
+ public GetOutputStreamCommand(JSchConnection connection, int options, IPath path) {
+ super(connection);
+ fRemotePath = path;
+ fOptions = options;
+ fIsClosed = false;
+ }
+
+ @Override
+ public OutputStream getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ return new ByteArrayOutputStream() {
+ @Override
+ public void close() throws IOException {
+ if (!fIsClosed) {
+ super.close();
+ final InputStream input = new ByteArrayInputStream(this.toByteArray());
+ try {
+ SftpCallable<Integer> c = new SftpCallable<>() {
+ @Override
+ public Integer call() throws JSchException, SftpException, IOException {
+ try {
+ int mode = ChannelSftp.OVERWRITE;
+ if ((fOptions & EFS.APPEND) != 0) {
+ mode = ChannelSftp.APPEND;
+ }
+ getChannel().put(input, fRemotePath.toString(), new CommandProgressMonitor(
+ NLS.bind(Messages.GetOutputStreamCommand_Sending, fRemotePath.toString()),
+ getProgressMonitor()), mode);
+ input.close();
+ } finally {
+ fIsClosed = true;
+ }
+ return 0;
+ }
+ };
+ c.getResult(subMon.newChild(10));
+ } catch (SftpException e) {
+ throw new IOException(e.getMessage());
+ } catch (CoreException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+ }
+ };
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/MkdirCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/MkdirCommand.java
new file mode 100644
index 00000000000..888c2ebe6d2
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/MkdirCommand.java
@@ -0,0 +1,53 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpException;
+
+public class MkdirCommand extends AbstractRemoteCommand<Void> {
+
+ private final IPath fRemotePath;
+
+ public MkdirCommand(JSchConnection connection, IPath path) {
+ super(connection);
+ fRemotePath = path;
+ }
+
+ @Override
+ public Void getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 20);
+
+ /*
+ * Recursively create parent directories
+ */
+ FetchInfoCommand command = new FetchInfoCommand(getConnection(), fRemotePath.removeLastSegments(1));
+ IFileInfo info = command.getResult(subMon.newChild(10));
+ if (!info.exists()) {
+ MkdirCommand mkdirCommand = new MkdirCommand(getConnection(), fRemotePath.removeLastSegments(1));
+ mkdirCommand.getResult(subMon.newChild(10));
+ }
+
+ /*
+ * Now create directory
+ */
+ SftpCallable<Void> c = new SftpCallable<>() {
+ @Override
+ public Void call() throws JSchException, SftpException {
+ getChannel().mkdir(fRemotePath.toString());
+ return null;
+ }
+ };
+ try {
+ c.getResult(subMon.newChild(10));
+ } catch (SftpException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ return null;
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/PutInfoCommand.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/PutInfoCommand.java
new file mode 100644
index 00000000000..711a035e9f4
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/commands/PutInfoCommand.java
@@ -0,0 +1,121 @@
+package org.eclipse.remote.internal.jsch.core.commands;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpException;
+
+public class PutInfoCommand extends AbstractRemoteCommand<Void> {
+ private static final int S_IRUSR = 0400; // owner has read permission
+ private static final int S_IWUSR = 0200; // owner has write permission
+ private static final int S_IXUSR = 0100; // owner has execute permission
+ private static final int S_IRGRP = 0040; // group has read permission
+ private static final int S_IWGRP = 0020; // group has write permission
+ private static final int S_IXGRP = 0010; // group has execute permission
+ private static final int S_IROTH = 0004; // others have read permission
+ private static final int S_IWOTH = 0002; // others have write permission
+ private static final int S_IXOTH = 0001; // others have execute permission
+
+ private final IPath fRemotePath;
+ private final IFileInfo fFileInfo;
+ private final int fOptions;
+
+ public PutInfoCommand(JSchConnection connection, IFileInfo info, int options, IPath path) {
+ super(connection);
+ fFileInfo = info;
+ fOptions = options;
+ fRemotePath = path;
+ }
+
+ @Override
+ public Void getResult(IProgressMonitor monitor) throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 30);
+
+ FetchInfoCommand command = new FetchInfoCommand(getConnection(), fRemotePath);
+ String quotedPath = quote(fRemotePath.toString(), true);
+ if ((fOptions & EFS.SET_ATTRIBUTES) != 0) {
+ chmod(getPermissions(fFileInfo), quotedPath, subMon.newChild(10));
+ }
+ if ((fOptions & EFS.SET_LAST_MODIFIED) != 0) {
+ IFileInfo info = command.getResult(subMon.newChild(10));
+ long oldMTime = info.getLastModified();
+ int newMTime = (int) (oldMTime / 1000);
+ if (oldMTime != newMTime) {
+ setMTime(newMTime, quotedPath, subMon.newChild(10));
+ }
+ }
+ return null;
+ }
+
+ private void chmod(final int permissions, final String path, IProgressMonitor monitor)
+ throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ SftpCallable<Void> c = new SftpCallable<>() {
+ @Override
+ public Void call() throws JSchException, SftpException {
+ getChannel().chmod(permissions, path);
+ return null;
+ }
+ };
+ try {
+ c.getResult(subMon.newChild(10));
+ } catch (SftpException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ private void setMTime(final int mtime, final String path, IProgressMonitor monitor)
+ throws RemoteConnectionException {
+ final SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ SftpCallable<Void> c = new SftpCallable<>() {
+ @Override
+ public Void call() throws JSchException, SftpException {
+ getChannel().setMtime(path, mtime);
+ return null;
+ }
+ };
+ try {
+ c.getResult(subMon.newChild(10));
+ } catch (SftpException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ private int getPermissions(IFileInfo info) {
+ int permissions = 0;
+ if (info.getAttribute(EFS.ATTRIBUTE_OWNER_READ)) {
+ permissions |= S_IRUSR;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_OWNER_WRITE)) {
+ permissions |= S_IWUSR;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE)) {
+ permissions |= S_IXUSR;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_GROUP_READ)) {
+ permissions |= S_IRGRP;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_GROUP_WRITE)) {
+ permissions |= S_IWGRP;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE)) {
+ permissions |= S_IXGRP;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_OTHER_READ)) {
+ permissions |= S_IROTH;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_OTHER_WRITE)) {
+ permissions |= S_IWOTH;
+ }
+ if (info.getAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE)) {
+ permissions |= S_IXOTH;
+ }
+ return permissions;
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/Messages.java b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/Messages.java
new file mode 100644
index 00000000000..594f25cbf04
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/Messages.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2013 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial Implementation
+ *
+ */
+package org.eclipse.remote.internal.jsch.core.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_ID = "org.eclipse.remote.internal.jsch.core.messages.messages"; //$NON-NLS-1$
+
+ public static String AbstractRemoteCommand_format1;
+ public static String AbstractRemoteCommand_format2;
+ public static String AbstractRemoteCommand_Get_symlink_target;
+ public static String AbstractRemoteCommand_Operation_cancelled_by_user;
+ public static String AuthInfo_Authentication_message;
+ public static String ExecCommand_Exec_command;
+
+ public static String GetInputStreamCommand_Receiving;
+
+ public static String GetOutputStreamCommand_Sending;
+ public static String JSchConnection_0;
+
+ public static String JSchConnection_Connection_was_cancelled;
+ public static String JSchConnection_connectionNotOpen;
+ public static String JSchConnection_Executing_command;
+ public static String JSchConnection_remote_address_must_be_set;
+ public static String JSchConnection_remotePort;
+ public static String JSchConnection_forwarding;
+ public static String JSchConnection_Remote_host_does_not_support_sftp;
+ public static String JSchConnection_Unable_to_open_sftp_channel;
+ public static String JSchConnection_username_must_be_set;
+ public static String JSchConnectionManager_connection_with_name_exists;
+ public static String JSchConnectionManager_cannotRemoveOpenConnection;
+ public static String JSchConnectionManager_invalidConnectionType;
+ public static String JSchConnectionProxyFactory_failed;
+ public static String JSchConnectionProxyFactory_ProxyCommandFailed;
+ public static String JSchConnectionProxyFactory_timedOut;
+ public static String JSchConnectionProxyFactory_wasCanceled;
+ public static String JSchProcess_exitValue_exception_msg;
+ public static String JSchProcessBuilder_Connection_is_not_open;
+ public static String JschFileStore_Connection_is_not_open;
+ public static String JschFileStore_File_doesnt_exist;
+ public static String JschFileStore_Invalid_connection_for_URI;
+ public static String JschFileStore_Is_a_directory;
+ public static String JschFileStore_No_remote_services_found_for_URI;
+ public static String JschFileStore_The_directory_could_not_be_created;
+
+ public static String JschFileStore_A_file_of_name_already_exists;
+ public static String JschFileStore_The_parent_of_directory_does_not_exist;
+
+ static {
+ // load message values from bundle file
+ NLS.initializeMessages(BUNDLE_ID, Messages.class);
+ }
+
+ private Messages() {
+ // cannot create new instance
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/messages.properties b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/messages.properties
new file mode 100644
index 00000000000..8e80c516a45
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.core/src/org/eclipse/remote/internal/jsch/core/messages/messages.properties
@@ -0,0 +1,48 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial implementation
+###############################################################################
+AbstractRemoteCommand_format1={0,number,integer} {1} completed
+AbstractRemoteCommand_format2={0,number,integer} {1} of {2,number,integer} {3} complete ({4,number,percent})
+AbstractRemoteCommand_Get_symlink_target=Get symlink target
+AbstractRemoteCommand_Operation_cancelled_by_user=Operation cancelled by user
+AuthInfo_Authentication_message=Authentication Message
+ExecCommand_Exec_command=Executing command "{0}"
+GetInputStreamCommand_Receiving=Receiving {0}:
+GetOutputStreamCommand_Sending=Sending {0}:
+JSchConnection_0=Connection canceled by user
+JSchConnection_Connection_was_cancelled=Connection was cancelled
+JSchConnection_connectionNotOpen=Connection is not open
+JSchConnection_Executing_command=Executing command "{0}"
+JSchConnection_remote_address_must_be_set=Remote address must be set before opening connection
+JSchConnection_remotePort=Could not allocate remote port
+JSchConnection_forwarding=Setting up remote forwarding
+JSchConnection_Remote_host_does_not_support_sftp=Remote host does not support sftp. Remote functionality requires sftp to be enabled
+JSchConnection_Unable_to_open_sftp_channel=Unable to open sftp channel: check sftp is enabled on remote host
+JSchConnection_username_must_be_set=Username must be set before opening connection
+JSchConnectionManager_connection_with_name_exists=A connection with name \"{0}\" already exists
+JSchConnectionManager_cannotRemoveOpenConnection=Cannot remove an open connection
+JSchConnectionManager_invalidConnectionType=Invalid connection type
+JSchConnectionProxyFactory_failed=failed
+JSchConnectionProxyFactory_ProxyCommandFailed=Proxy command "{0}" {1} and printed message "{2}"
+JSchConnectionProxyFactory_timedOut=timed out
+JSchConnectionProxyFactory_wasCanceled=was canceled
+JSchProcess_exitValue_exception_msg=process has not exited
+JSchProcessBuilder_Connection_is_not_open=Connection is not open
+JschFileStore_Connection_is_not_open=Connection is not open
+JschFileStore_File_doesnt_exist=File {0} doesn't exist
+JschFileStore_Invalid_connection_for_URI=Invalid connection for URI: "{0}"
+JschFileStore_Is_a_directory={0} is a directory
+JschFileStore_No_remote_services_found_for_URI=No remote services found for URI: "{0}"
+JschFileStore_The_directory_could_not_be_created=The directory {0} could not be created
+JschFileStore_A_file_of_name_already_exists=A file of name {0} already exists
+JschFileStore_The_parent_of_directory_does_not_exist=The parent of directory {0} does not exist
diff --git a/remote/org.eclipse.remote.jsch.tests/.classpath b/remote/org.eclipse.remote.jsch.tests/.classpath
new file mode 100644
index 00000000000..a42a828e04a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src">
+ <attributes>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.jsch.tests/.project b/remote/org.eclipse.remote.jsch.tests/.project
new file mode 100644
index 00000000000..05b96bf0a29
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.jsch.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..5b1c443114d
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..51a63ec9988
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=2
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.jsch.tests/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.jsch.tests/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..9f65c5d31f8
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: JSch Remote Tests
+Bundle-SymbolicName: org.eclipse.remote.jsch.tests
+Bundle-Version: 1.0.100.qualifier
+Bundle-Activator: org.eclipse.remote.jsch.tests.Activator
+Bundle-Vendor: Eclipse PTP
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime;bundle-version="3.8.0",
+ org.eclipse.core.filesystem,
+ org.eclipse.remote.core,
+ org.eclipse.remote.jsch.core,
+ org.junit
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
diff --git a/remote/org.eclipse.remote.jsch.tests/about.html b/remote/org.eclipse.remote.jsch.tests/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.tests/build.properties b/remote/org.eclipse.remote.jsch.tests/build.properties
new file mode 100644
index 00000000000..67af4196ea0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ about.html,\
+ .
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/Activator.java b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/Activator.java
new file mode 100644
index 00000000000..58f564dc35a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/Activator.java
@@ -0,0 +1,57 @@
+package org.eclipse.remote.jsch.tests;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.jsch.tests"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ConnectionTests.java b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ConnectionTests.java
new file mode 100644
index 00000000000..b3fcbd1e672
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ConnectionTests.java
@@ -0,0 +1,152 @@
+package org.eclipse.remote.jsch.tests;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+import junit.framework.TestCase;
+
+public class ConnectionTests extends TestCase {
+ private static final String USERNAME = "test"; //$NON-NLS-1$
+ private static final String PASSWORD = ""; //$NON-NLS-1$
+ private static final String HOST = "localhost"; //$NON-NLS-1$
+
+ private IRemoteConnectionType fConnectionType;
+ private IRemoteConnection fRemoteConnection;
+
+ public void testEnv() {
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ assertNotNull(processService);
+ String var = processService.getEnv("SHELL"); //$NON-NLS-1$
+ assertNotNull(var);
+
+ var = processService.getEnv("FOO_VAR_SHOULD_NOT_BE_DEFINED"); //$NON-NLS-1$
+ assertNull(var);
+
+ assertNotNull(fRemoteConnection.getProperty("os.name")); //$NON-NLS-1$
+ assertNotNull(fRemoteConnection.getProperty("os.arch")); //$NON-NLS-1$
+ assertNotNull(fRemoteConnection.getProperty("os.version")); //$NON-NLS-1$
+ assertNotNull(fRemoteConnection.getProperty("file.separator")); //$NON-NLS-1$
+ assertNotNull(fRemoteConnection.getProperty("path.separator")); //$NON-NLS-1$
+ assertNotNull(fRemoteConnection.getProperty("line.separator")); //$NON-NLS-1$
+
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("env"); //$NON-NLS-1$
+ assertNotNull(builder);
+ builder.environment().put("FOO", "BAR"); //$NON-NLS-1$ //$NON-NLS-2$
+ builder.environment().put("USER", "FOO"); //$NON-NLS-1$ //$NON-NLS-2$
+ try {
+ IRemoteProcess proc = builder.start();
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line;
+ while ((line = stdout.readLine()) != null) {
+ String[] kv = line.trim().split("="); //$NON-NLS-1$
+ if (kv.length == 2) {
+ if (kv[0].equals("FOO")) {
+ assertTrue(kv[1].equals("BAR")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (kv[0].equals("USER")) {
+ assertTrue(kv[1].equals("FOO")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ public void testWd() {
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ assertNotNull(processService);
+ /*
+ * Test connection wd
+ */
+ String oldWd = processService.getWorkingDirectory();
+ assertTrue(oldWd.startsWith("/"));
+ String newWd = "/tmp";
+ processService.setWorkingDirectory(newWd);
+ assertTrue(processService.getWorkingDirectory().equals(newWd));
+
+ /*
+ * Test process builder inherits wd from connection
+ */
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("pwd"); //$NON-NLS-1$
+ assertNotNull(builder);
+ try {
+ IRemoteProcess proc = builder.start();
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = stdout.readLine();
+ proc.destroy();
+ assertTrue(line != null && line.equals(newWd));
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+
+ /*
+ * Test process builder wd
+ */
+ final IRemoteFileService fileManager = fRemoteConnection.getService(IRemoteFileService.class);
+ assertNotNull(fileManager);
+ builder = processService.getProcessBuilder("pwd"); //$NON-NLS-1$
+ assertNotNull(builder);
+ builder.directory(fileManager.getResource("/bin"));
+ try {
+ IRemoteProcess proc = builder.start();
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = stdout.readLine();
+ proc.destroy();
+ assertTrue(line != null && line.equals("/bin"));
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ fConnectionType = manager.getConnectionType("org.eclipse.remote.JSch"); //$NON-NLS-1$
+ assertNotNull(fConnectionType);
+
+ IRemoteConnectionWorkingCopy wc = fConnectionType.newConnection("test_connection"); //$NON-NLS-1$
+
+ String host = System.getenv("TEST_HOST");
+ if (host == null) {
+ host = HOST;
+ }
+ wc.setAttribute(JSchConnection.ADDRESS_ATTR, host);
+
+ String username = System.getenv("TEST_USERNAME");
+ if (username == null) {
+ username = USERNAME;
+ }
+ wc.setAttribute(JSchConnection.USERNAME_ATTR, username);
+
+ String password = System.getenv("TEST_PASSWORD");
+ if (password == null) {
+ password = PASSWORD;
+ }
+ wc.setSecureAttribute(JSchConnection.PASSWORD_ATTR, password);
+
+ fRemoteConnection = wc.save();
+ assertNotNull(fRemoteConnection);
+
+ fRemoteConnection.open(new NullProgressMonitor());
+ assertTrue(fRemoteConnection.isOpen());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ fConnectionType.removeConnection(fRemoteConnection);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/FileStoreTests.java b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/FileStoreTests.java
new file mode 100644
index 00000000000..e2de273f002
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/FileStoreTests.java
@@ -0,0 +1,257 @@
+package org.eclipse.remote.jsch.tests;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+import junit.framework.TestCase;
+
+public class FileStoreTests extends TestCase {
+ private static final String CONNECTION_NAME = "test_connection";
+ private static final String USERNAME = "test";
+ private static final String PASSWORD = "";
+ private static final String HOST = "localhost";
+ private static final String LOCAL_DIR = "/tmp/ptp_" + System.getProperty("user.name") + "/filestore_tests";
+ private static final String REMOTE_DIR = "/tmp/ptp_" + USERNAME + "/filestore_tests";
+ private static final String LOCAL_FILE = "local_file";
+ private static final String REMOTE_FILE = "remote_file";
+ private static final String REMOTE_FILE2 = "remote_file2";
+ private static final String TEST_STRING = "a string containing fairly *()(*&^$%## random text";
+ private static final String TEST_STRING2 = "a different string containing fairly *()(*&^$%## random text";
+
+ private IRemoteConnectionType fConnectionType;
+ private IRemoteConnection fRemoteConnection;
+ private IRemoteFileService fRemoteFileManager;
+ private IFileStore fRemoteDir;
+ private IFileStore fLocalDir;
+
+ private void createFile(IFileStore fileStore, String contents) throws CoreException, IOException {
+ OutputStream stream = fileStore.openOutputStream(EFS.NONE, new NullProgressMonitor());
+ assertNotNull(stream);
+ BufferedWriter buf = new BufferedWriter(new OutputStreamWriter(stream));
+ buf.write(contents);
+ buf.close();
+ }
+
+ public void testStreams() {
+ IFileStore remoteFileStore = fRemoteDir.getChild(REMOTE_FILE);
+
+ for (int i = 0; i < 5; i++) {
+ try {
+ remoteFileStore.delete(EFS.NONE, null);
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ }
+
+ assertFalse(remoteFileStore.fetchInfo().exists());
+
+ try {
+ createFile(remoteFileStore, TEST_STRING);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ assertTrue(remoteFileStore.fetchInfo().exists());
+
+ try {
+ InputStream stream = remoteFileStore.openInputStream(EFS.NONE, null);
+ assertNotNull(stream);
+ BufferedReader buf = new BufferedReader(new InputStreamReader(stream));
+ String line = buf.readLine().trim();
+ assertTrue(line.equals(TEST_STRING));
+ buf.close();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ public void testMultiStreams() {
+ IFileStore remoteFileStore = fRemoteDir.getChild(REMOTE_FILE);
+ IFileStore remoteFileStore2 = fRemoteDir.getChild(REMOTE_FILE2);
+
+ try {
+ createFile(remoteFileStore, TEST_STRING);
+ createFile(remoteFileStore2, TEST_STRING2);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ assertTrue(remoteFileStore.fetchInfo().exists());
+ assertTrue(remoteFileStore2.fetchInfo().exists());
+
+ /*
+ * Check how many streams we can open
+ */
+ InputStream streams[] = new InputStream[100];
+ int streamCount = 0;
+
+ for (; streamCount < streams.length; streamCount++) {
+ try {
+ streams[streamCount] = remoteFileStore.openInputStream(EFS.NONE, null);
+ } catch (Exception e) {
+ if (!e.getMessage().endsWith("channel is not opened.")) {
+ fail(e.getMessage());
+ }
+ break;
+ }
+ }
+
+ for (int i = 0; i < streamCount; i++) {
+ try {
+ streams[i].close();
+ } catch (IOException e) {
+ // No need to deal with this
+ }
+ }
+
+ for (int i = 0; i < streamCount / 2; i++) {
+ try {
+ InputStream stream = remoteFileStore.openInputStream(EFS.NONE, null);
+ assertNotNull(stream);
+ BufferedReader buf = new BufferedReader(new InputStreamReader(stream));
+ String line = buf.readLine().trim();
+ assertTrue(line.equals(TEST_STRING));
+
+ InputStream stream2 = remoteFileStore2.openInputStream(EFS.NONE, null);
+ assertNotNull(stream2);
+ BufferedReader buf2 = new BufferedReader(new InputStreamReader(stream2));
+ String line2 = buf2.readLine().trim();
+ assertTrue(line2.equals(TEST_STRING2));
+
+ stream.close();
+ stream2.close();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ public void testCopy() {
+ final IFileStore localFileStore = fLocalDir.getChild(LOCAL_FILE);
+ final IFileStore remoteFileStore = fRemoteDir.getChild(REMOTE_FILE);
+ try {
+ localFileStore.delete(EFS.NONE, new NullProgressMonitor());
+ remoteFileStore.delete(EFS.NONE, new NullProgressMonitor());
+ createFile(localFileStore, "foo\n");
+ localFileStore.copy(remoteFileStore, EFS.NONE, new NullProgressMonitor());
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ IFileInfo srcInfo = localFileStore.fetchInfo();
+ IFileInfo dstInfo = remoteFileStore.fetchInfo();
+ assertTrue(dstInfo.exists());
+ assertTrue(srcInfo.getLength() == dstInfo.getLength());
+ try {
+ InputStream stream = remoteFileStore.openInputStream(EFS.NONE, new NullProgressMonitor());
+ byte[] b = new byte[4];
+ stream.read(b);
+ stream.close();
+ assertTrue(b[0] == 'f');
+ assertTrue(b[1] == 'o');
+ assertTrue(b[2] == 'o');
+ assertTrue(b[3] == '\n');
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ public void testExecutable() {
+ IFileStore fs = fRemoteDir.getChild(REMOTE_FILE);
+ try {
+ fs.delete(EFS.NONE, new NullProgressMonitor());
+ createFile(fs, "contents");
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ IFileInfo fi = fs.fetchInfo();
+ boolean current = fi.getAttribute(EFS.ATTRIBUTE_EXECUTABLE);
+ boolean expected = !current;
+ fi.setAttribute(EFS.ATTRIBUTE_EXECUTABLE, expected);
+ try {
+ fs.putInfo(fi, EFS.SET_ATTRIBUTES, new NullProgressMonitor());
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ }
+ fs = fRemoteDir.getChild(REMOTE_FILE);
+ fi = fs.fetchInfo();
+ assertEquals(expected, fi.getAttribute(EFS.ATTRIBUTE_EXECUTABLE));
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ fConnectionType = manager.getConnectionType("org.eclipse.remote.JSch");
+ assertNotNull(fConnectionType);
+
+ IRemoteConnectionWorkingCopy wc = fConnectionType.newConnection(CONNECTION_NAME);
+
+ String host = System.getenv("TEST_HOST");
+ if (host == null) {
+ host = HOST;
+ }
+ wc.setAttribute(JSchConnection.ADDRESS_ATTR, host);
+
+ String username = System.getenv("TEST_USERNAME");
+ if (username == null) {
+ username = USERNAME;
+ }
+ wc.setAttribute(JSchConnection.USERNAME_ATTR, username);
+
+ String password = System.getenv("TEST_PASSWORD");
+ if (password == null) {
+ password = PASSWORD;
+ }
+ wc.setSecureAttribute(JSchConnection.PASSWORD_ATTR, password);
+
+ fRemoteConnection = wc.save();
+ assertNotNull(fRemoteConnection);
+
+ fRemoteConnection.open(new NullProgressMonitor());
+ assertTrue(fRemoteConnection.isOpen());
+
+ fRemoteFileManager = fRemoteConnection.getService(IRemoteFileService.class);
+ assertNotNull(fRemoteFileManager);
+
+ URI remoteDirUri = fRemoteFileManager.toURI(REMOTE_DIR);
+ URI localDirUri = fRemoteFileManager.toURI(LOCAL_DIR);
+ assertNotNull(remoteDirUri);
+ assertNotNull(localDirUri);
+
+ fRemoteDir = EFS.getStore(fRemoteFileManager.toURI(REMOTE_DIR));
+ fLocalDir = EFS.getLocalFileSystem().getStore(new Path(LOCAL_DIR));
+
+ fRemoteDir.mkdir(EFS.NONE, null);
+ fLocalDir.mkdir(EFS.NONE, null);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ fRemoteDir.delete(EFS.NONE, new NullProgressMonitor());
+ fLocalDir.delete(EFS.NONE, new NullProgressMonitor());
+ fConnectionType.removeConnection(fRemoteConnection);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ProcessTests.java b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ProcessTests.java
new file mode 100644
index 00000000000..477fd286c27
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/ProcessTests.java
@@ -0,0 +1,235 @@
+package org.eclipse.remote.jsch.tests;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.RemoteProcessAdapter;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+
+import junit.framework.TestCase;
+
+public class ProcessTests extends TestCase {
+ private static final String USERNAME = "test"; //$NON-NLS-1$
+ private static final String PASSWORD = ""; //$NON-NLS-1$
+ private static final String HOST = "localhost"; //$NON-NLS-1$
+ private static int NUM_THREADS = 1; // Test currently fails for more than one thread
+
+ private IRemoteConnectionType fConnectionType;
+ private IRemoteConnection fRemoteConnection;
+
+ public void testConcurrentProcess() {
+ Thread[] threads = new Thread[NUM_THREADS];
+
+ for (int t = 0; t < NUM_THREADS; t++) {
+ final String threadNum = Integer.toString(t);
+ Thread thread = new Thread("test thread " + t) {
+ @Override
+ public void run() {
+ final Set<String> results = Collections.synchronizedSet(new HashSet<String>());
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ assertNotNull(processService);
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("perl", "-v", threadNum); //$NON-NLS-1$
+ assertNotNull(builder);
+ builder.redirectErrorStream(true);
+ for (int i = 0; i < 10; i++) {
+ try {
+ IRemoteProcess proc = builder.start();
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line;
+ while ((line = stdout.readLine()) != null) {
+ results.add(line);
+ results.add("\n");
+ }
+ try {
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ assertTrue(results.toString().contains("Larry Wall"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ }
+ }
+
+ };
+ thread.start();
+ threads[t] = thread;
+ }
+ for (Thread t : threads) {
+ try {
+ t.join();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+
+ public void testEnv() {
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ assertNotNull(processService);
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("printenv"); //$NON-NLS-1$
+ assertNotNull(builder);
+ builder.redirectErrorStream(true);
+ String path = builder.environment().get("PATH");
+ builder.environment().clear();
+ builder.environment().put("PATH", path);
+ try {
+ IRemoteProcess proc = builder.start();
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line;
+ String result = null;
+ while ((line = stdout.readLine()) != null) {
+ assertNull(result);
+ result = line;
+ }
+ assertEquals(result, "PATH=" + path);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ }
+
+ public void testEcho() {
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ assertNotNull(processService);
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("cat"); //$NON-NLS-1$
+ assertNotNull(builder);
+ builder.redirectErrorStream(true);
+ final StringBuffer result = new StringBuffer();
+ try {
+ final IRemoteProcess proc = builder.start();
+ Thread readerThread = new Thread("echo reader thread") {
+ @Override
+ public void run() {
+ try {
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line;
+ while ((line = stdout.readLine()) != null) {
+ result.append(line);
+ }
+ try {
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ }
+
+ };
+ Thread writerThread = new Thread("echo writer thread") {
+ @Override
+ public void run() {
+ try {
+ BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
+ for (int i = 0; i < 10; i++) {
+ String line = i + "\n";
+ stdin.append(line);
+ stdin.flush();
+ }
+ proc.getOutputStream().close();
+ try {
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ }
+
+ };
+ writerThread.start();
+ readerThread.start();
+ writerThread.join();
+ readerThread.join();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+
+ assertEquals("0123456789", result.toString());
+ }
+
+ public void testExitValue() {
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ assertNotNull(processService);
+ IRemoteProcessBuilder builder = processService.getProcessBuilder(new String[] { "sleep", "60" }); //$NON-NLS-1$
+ assertNotNull(builder);
+ IRemoteProcess rp = null;
+ try {
+ rp = builder.start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ assertNotNull(rp);
+ Process p = new RemoteProcessAdapter(rp);
+ try {
+ p.exitValue();
+ fail("Process has not exited. Should throws an IllegalThreadStateException exception");
+ } catch (IllegalThreadStateException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ fConnectionType = manager.getConnectionType("org.eclipse.remote.JSch"); //$NON-NLS-1$
+ assertNotNull(fConnectionType);
+
+ IRemoteConnectionWorkingCopy wc = fConnectionType.newConnection("test_connection"); //$NON-NLS-1$
+
+ String host = System.getenv("TEST_HOST");
+ if (host == null) {
+ host = HOST;
+ }
+ wc.setAttribute(JSchConnection.ADDRESS_ATTR, host);
+
+ String username = System.getenv("TEST_USERNAME");
+ if (username == null) {
+ username = USERNAME;
+ }
+ wc.setAttribute(JSchConnection.USERNAME_ATTR, username);
+
+ String password = System.getenv("TEST_PASSWORD");
+ if (password == null) {
+ password = PASSWORD;
+ }
+ wc.setSecureAttribute(JSchConnection.PASSWORD_ATTR, password);
+
+ fRemoteConnection = wc.save();
+ assertNotNull(fRemoteConnection);
+
+ fRemoteConnection.open(new NullProgressMonitor());
+ assertTrue(fRemoteConnection.isOpen());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ fConnectionType.removeConnection(fRemoteConnection);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/RemoteCoreTestSuite.java b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/RemoteCoreTestSuite.java
new file mode 100644
index 00000000000..e1b4f17bd14
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.tests/src/org/eclipse/remote/jsch/tests/RemoteCoreTestSuite.java
@@ -0,0 +1,16 @@
+package org.eclipse.remote.jsch.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class RemoteCoreTestSuite {
+ public static Test suite() {
+ TestSuite suite = new TestSuite(RemoteCoreTestSuite.class.getName());
+
+ suite.addTestSuite(ConnectionTests.class);
+ suite.addTestSuite(FileStoreTests.class);
+ suite.addTestSuite(ProcessTests.class);
+ return suite;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.ui/.classpath b/remote/org.eclipse.remote.jsch.ui/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.jsch.ui/.project b/remote/org.eclipse.remote.jsch.ui/.project
new file mode 100644
index 00000000000..05c0dc929b6
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.jsch.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c3b459ea30a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,42 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.jsch.ui;singleton:=true
+Bundle-Version: 1.1.100.qualifier
+Bundle-Activator: org.eclipse.remote.internal.jsch.ui.Activator
+Bundle-Vendor: %pluginProvider
+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-11
+Import-Package: com.jcraft.jsch,
+ org.eclipse.core.filesystem,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.operation,
+ org.eclipse.jface.preference,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.jface.wizard,
+ org.eclipse.jsch.core,
+ org.eclipse.jsch.ui,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.internal.jsch.core,
+ org.eclipse.remote.ui,
+ org.eclipse.remote.ui.dialogs,
+ org.eclipse.remote.ui.widgets,
+ org.eclipse.swt,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui.dialogs,
+ org.eclipse.ui.forms.events,
+ org.eclipse.ui.forms.widgets,
+ org.eclipse.ui.ide.fileSystem,
+ org.eclipse.ui.plugin,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.jsch.ui/about.html b/remote/org.eclipse.remote.jsch.ui/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.ui/build.properties b/remote/org.eclipse.remote.jsch.ui/build.properties
new file mode 100644
index 00000000000..6a66a469bae
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/build.properties
@@ -0,0 +1,10 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html,\
+ icons/
+src.includes = about.html
+
diff --git a/remote/org.eclipse.remote.jsch.ui/icons/full/obj16/connection.gif b/remote/org.eclipse.remote.jsch.ui/icons/full/obj16/connection.gif
new file mode 100644
index 00000000000..870934b6934
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/icons/full/obj16/connection.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.jsch.ui/icons/ssh.png b/remote/org.eclipse.remote.jsch.ui/icons/ssh.png
new file mode 100644
index 00000000000..8cbd0a13ba8
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/icons/ssh.png
Binary files differ
diff --git a/remote/org.eclipse.remote.jsch.ui/plugin.properties b/remote/org.eclipse.remote.jsch.ui/plugin.properties
new file mode 100644
index 00000000000..acc4f00330a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=JSch UI Remote Support
+pluginProvider=Eclipse PTP
+JSchTransferConnections.name=Remote Connections
+JSchTransferConnections.description=All remote ssh connections \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.ui/plugin.xml b/remote/org.eclipse.remote.jsch.ui/plugin.xml
new file mode 100644
index 00000000000..9668c411bce
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/plugin.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.ide.filesystemSupport">
+ <filesystemContributor
+ class="org.eclipse.remote.internal.jsch.ui.JSchFileSystemContributor"
+ label="JSch"
+ scheme="ssh">
+ </filesystemContributor>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferenceTransfer">
+ <transfer
+ icon="icons/full/obj16/connection.gif"
+ id="org.eclipse.remote.jsch.transfer.connections"
+ name="%JSchTransferConnections.name">
+ <mapping
+ scope="instance">
+ <entry
+ node="org.eclipse.remote.jsch.core/connections">
+ </entry>
+ </mapping>
+ <description>
+ %JSchTransferConnections.description
+ </description>
+ </transfer>
+ </extension>
+ <extension
+ point="org.eclipse.remote.core.authenticator">
+ <authenticator
+ class="org.eclipse.remote.internal.jsch.ui.JSchUserAuthenticator"
+ id="org.eclipse.remote.JSch"
+ priority="0">
+ </authenticator>
+ </extension>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.ui.JSchUIConnectionService$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIConnectionService">
+ </connectionTypeService>
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.ui.RemoteUIFileService$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIFileService">
+ </connectionTypeService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.JSch"
+ factory="org.eclipse.remote.internal.jsch.ui.JSchUserAuthenticator$Factory"
+ service="org.eclipse.remote.core.IUserAuthenticatorService">
+ </connectionService>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/Activator.java b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/Activator.java
new file mode 100644
index 00000000000..5767eed2d3c
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/Activator.java
@@ -0,0 +1,114 @@
+package org.eclipse.remote.internal.jsch.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jsch.core.IJSchService;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ private static final String PLUGIN_ID = "org.eclipse.remote.jsch.ui"; //$NON-NLS-1$
+
+ // Image Keys
+ public static final String IMG_CONNECTION_TYPE = PLUGIN_ID + ".connectionType"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get unique identifier
+ *
+ * @return
+ * @since 5.0
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() == null) {
+ return PLUGIN_ID;
+ }
+ return getDefault().getBundle().getSymbolicName();
+ }
+
+ /**
+ * Logs the specified status with this plug-in's log.
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Logs an internal error with the specified message.
+ *
+ * @param message
+ * the error message to log
+ */
+ public static void log(String message) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
+ }
+
+ /**
+ * Logs an internal error with the specified throwable
+ *
+ * @param e
+ * the exception to be logged
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
+ }
+
+ private IJSchService fJSchService;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+ public IJSchService getService() {
+ return fJSchService;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ ServiceReference<IJSchService> reference = context.getServiceReference(IJSchService.class);
+ fJSchService = context.getService(reference);
+ getImageRegistry().put(IMG_CONNECTION_TYPE, imageDescriptorFromPlugin(PLUGIN_ID, "/icons/ssh.png")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchFileSystemContributor.java b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchFileSystemContributor.java
new file mode 100644
index 00000000000..d12924612c6
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchFileSystemContributor.java
@@ -0,0 +1,66 @@
+/********************************************************************************
+ * Copyright (c) 2002, 2008 IBM Corporation and others.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License 2.0 which accompanies this distribution, and is
+ * available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * Initial Contributors:
+ * The following IBM employees contributed to the Remote System Explorer
+ * component that contains this file: David McKnight, Kushal Munir,
+ * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson,
+ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
+ *
+ * Contributors:
+ * Kushal Munir (IBM) - moved to internal package.
+ * Martin Oberhuber (Wind River) - [181917] EFS Improvements: Avoid unclosed Streams,
+ * - Fix early startup issues by deferring FileStore evaluation and classloading,
+ * - Improve performance by RSEFileStore instance factory and caching IRemoteFile.
+ * - Also remove unnecessary class RSEFileCache and obsolete branding files.
+ * Martin Oberhuber (Wind River) - [188360] renamed from plugin org.eclipse.rse.eclipse.filesystem
+ * Martin Oberhuber (Wind River) - [189441] fix EFS operations on Windows (Local) systems
+ * David Dykstal (IBM) - [235840] externalizing dialog title
+ ********************************************************************************/
+
+package org.eclipse.remote.internal.jsch.ui;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+import org.eclipse.remote.internal.jsch.core.JSchFileSystem;
+import org.eclipse.remote.internal.jsch.ui.messages.Messages;
+import org.eclipse.remote.ui.IRemoteUIFileService;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ide.fileSystem.FileSystemContributor;
+
+public class JSchFileSystemContributor extends FileSystemContributor {
+ @Override
+ public URI browseFileSystem(String initialPath, Shell shell) {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connectionType = manager.getConnectionType(JSchConnection.JSCH_ID);
+ IRemoteUIFileService uiFileMgr = connectionType.getService(IRemoteUIFileService.class);
+ uiFileMgr.showConnections(true);
+ String path = uiFileMgr.browseDirectory(shell, Messages.JSchFileSystemContributor_0, initialPath, 0);
+ if (path != null) {
+ IRemoteConnection conn = uiFileMgr.getConnection();
+ if (conn != null) {
+ return JSchFileSystem.getURIFor(conn.getName(), path);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public URI getURI(String string) {
+ try {
+ return new URI(string);
+ } catch (URISyntaxException e) {
+ // Ignore
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIConnectionService.java b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIConnectionService.java
new file mode 100644
index 00000000000..d31425548a1
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUIConnectionService.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.ui.messages.Messages;
+import org.eclipse.remote.internal.jsch.ui.wizards.JSchConnectionWizard;
+import org.eclipse.remote.ui.AbstractRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+
+public class JSchUIConnectionService extends AbstractRemoteUIConnectionService {
+
+ private final IRemoteConnectionType fConnectionType;
+
+ public JSchUIConnectionService(IRemoteConnectionType connectionType) {
+ fConnectionType = connectionType;
+ }
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (IRemoteUIConnectionService.class.equals(service)) {
+ return (T) new JSchUIConnectionService(connectionType);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return fConnectionType;
+ }
+
+ @Override
+ public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) {
+ return new JSchConnectionWizard(shell, fConnectionType);
+ }
+
+ @Override
+ public void openConnectionWithProgress(Shell shell, IRunnableContext context, final IRemoteConnection connection) {
+ if (!connection.isOpen()) {
+ IRunnableWithProgress op = new IRunnableWithProgress() {
+ @Override
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ connection.open(monitor);
+ } catch (RemoteConnectionException e) {
+ throw new InvocationTargetException(e);
+ }
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+ }
+ };
+ try {
+ if (context != null) {
+ context.run(true, true, op);
+ } else {
+ new ProgressMonitorDialog(shell).run(true, true, op);
+ }
+ } catch (InvocationTargetException e) {
+ ErrorDialog.openError(shell, Messages.JSchUIConnectionManager_Connection_Error,
+ Messages.JSchUIConnectionManager_Could_not_open_connection,
+ new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getCause().getMessage()));
+ } catch (InterruptedException e) {
+ ErrorDialog.openError(shell, Messages.JSchUIConnectionManager_Connection_Error,
+ Messages.JSchUIConnectionManager_Could_not_open_connection,
+ new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+ }
+
+ @Override
+ public ILabelProvider getLabelProvider() {
+ return new DefaultLabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ return Activator.getDefault().getImageRegistry().get(Activator.IMG_CONNECTION_TYPE);
+ }
+ };
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUserAuthenticator.java b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUserAuthenticator.java
new file mode 100644
index 00000000000..8dbeac9e9e2
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/JSchUserAuthenticator.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ * Bernd Hufmann - Implement IRemoteConnection.Service.Factory
+ *******************************************************************************/
+package org.eclipse.remote.internal.jsch.ui;
+
+import java.net.PasswordAuthentication;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jsch.ui.UserInfoPrompter;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IUserAuthenticatorService;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+import org.eclipse.swt.widgets.Display;
+
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+
+public class JSchUserAuthenticator implements IUserAuthenticatorService {
+
+ private final IRemoteConnection remoteConnection;
+ private UserInfoPrompter prompter;
+
+ public JSchUserAuthenticator(IRemoteConnection conn) {
+ this.remoteConnection = conn;
+ try {
+ String username = conn.getAttribute(JSchConnection.USERNAME_ATTR);
+ String address = conn.getAttribute(JSchConnection.ADDRESS_ATTR);
+ prompter = new UserInfoPrompter(new JSch().getSession(username, address));
+ } catch (JSchException e) {
+ // Not allowed
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return remoteConnection;
+ }
+
+ @Override
+ public PasswordAuthentication prompt(String username, String message) {
+ if (prompter.promptPassword(message)) {
+ String sessionUserName = prompter.getSession().getUserName();
+ if (sessionUserName != null) {
+ username = sessionUserName;
+ }
+ PasswordAuthentication auth = new PasswordAuthentication(username, prompter.getPassword().toCharArray());
+ return auth;
+ }
+ return null;
+ }
+
+ @Override
+ public String[] prompt(String destination, String name, String message, String[] prompt, boolean[] echo) {
+ return prompter.promptKeyboardInteractive(destination, name, message, prompt, echo);
+ }
+
+ @Override
+ public int prompt(final int promptType, final String title, final String message, final int[] promptResponses,
+ final int defaultResponseIndex) {
+ final Display display = getDisplay();
+ final int[] retval = new int[1];
+ final String[] buttons = new String[promptResponses.length];
+ for (int i = 0; i < promptResponses.length; i++) {
+ int prompt = promptResponses[i];
+ switch (prompt) {
+ case IDialogConstants.OK_ID:
+ buttons[i] = IDialogConstants.OK_LABEL;
+ break;
+ case IDialogConstants.CANCEL_ID:
+ buttons[i] = IDialogConstants.CANCEL_LABEL;
+ break;
+ case IDialogConstants.NO_ID:
+ buttons[i] = IDialogConstants.NO_LABEL;
+ break;
+ case IDialogConstants.YES_ID:
+ buttons[i] = IDialogConstants.YES_LABEL;
+ break;
+ }
+ }
+
+ display.syncExec(new Runnable() {
+ @Override
+ public void run() {
+ final MessageDialog dialog = new MessageDialog(display.getActiveShell(), title, null /* title image */,
+ message, promptType, buttons, defaultResponseIndex);
+ retval[0] = dialog.open();
+ }
+ });
+ return promptResponses[retval[0]];
+ }
+
+ private Display getDisplay() {
+ Display display = Display.getCurrent();
+ if (display == null) {
+ display = Display.getDefault();
+ }
+ return display;
+ }
+
+ public static class Factory implements IRemoteConnection.Service.Factory {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends IRemoteConnection.Service> T getService(IRemoteConnection connection, Class<T> service) {
+ if (IUserAuthenticatorService.class.equals(service)) {
+ return (T) new JSchUserAuthenticator(connection);
+ } else {
+ return null;
+ }
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/Messages.java b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/Messages.java
new file mode 100644
index 00000000000..b94438f3771
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/Messages.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2013 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial Implementation
+ *
+ */
+package org.eclipse.remote.internal.jsch.ui.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_ID = "org.eclipse.remote.internal.jsch.ui.messages.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ NLS.initializeMessages(BUNDLE_ID, Messages.class);
+ }
+
+ public static String JSchConnectionPage_0;
+ public static String JSchConnectionPage_1;
+ public static String JSchConnectionPage_2;
+ public static String JSchConnectionPage_A_connection_with_that_name_already_exists;
+ public static String JSchConnectionPage_Edit_Connection;
+ public static String JSchConnectionPage_Edit_properties_of_an_existing_connection;
+ public static String JSchConnectionPage_Initial_Message;
+ public static String JSchConnectionPage_Proxy;
+ public static String JSchConnectionPage_Help;
+ public static String JSchConnectionPage_KeysAtSSH2;
+ public static String JSchConnectionPage_SelectCommand;
+ public static String JSchConnectionPage_SelectConnection;
+ public static String JSchConnectionPage_Settings0;
+ public static String JSchConnectionPage_selectProxyConnection;
+ public static String JSchFileSystemContributor_0;
+ public static String JSchNewConnectionPage_Advanced;
+ public static String JSchNewConnectionPage_Connection_name;
+ public static String JSchNewConnectionPage_File_with_private_key;
+ public static String JSchNewConnectionPage_Host;
+ public static String JSchNewConnectionPage_Host_information;
+ public static String JSchNewConnectionPage_Host_name_cannot_be_empty;
+ public static String JSchNewConnectionPage_New_Connection;
+ public static String JSchNewConnectionPage_New_connection_properties;
+ public static String JSchNewConnectionPage_Passphrase;
+ public static String JSchNewConnectionPage_Password;
+ public static String JSchNewConnectionPage_Password_based_authentication;
+ public static String JSchNewConnectionPage_Please_enter_a_connection_name;
+ public static String JSchNewConnectionPage_Port;
+ public static String JSchNewConnectionPage_Port_is_not_valid;
+ public static String JSchNewConnectionPage_Private_key_file_cannot_be_read;
+ public static String JSchNewConnectionPage_Private_key_file_does_not_exist;
+ public static String JSchNewConnectionPage_Private_key_file_is_invalid;
+ public static String JSchNewConnectionPage_Private_key_path_cannot_be_empty;
+ public static String JSchNewConnectionPage_Public_key_based_authentication;
+ public static String JSchNewConnectionPage_Timeout;
+ public static String JSchNewConnectionPage_Timeout_is_not_valid;
+ public static String JSchNewConnectionPage_User;
+ public static String JSchNewConnectionPage_User_name_cannot_be_empty;
+ public static String JSchUIConnectionManager_Connection_Error;
+ public static String JSchUIConnectionManager_Could_not_open_connection;
+
+ private Messages() {
+ // cannot create new instance
+ }
+}
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/messages.properties b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/messages.properties
new file mode 100644
index 00000000000..f782ea96a90
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/messages/messages.properties
@@ -0,0 +1,53 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial implementation
+###############################################################################
+JSchConnectionPage_0=Use login shell
+JSchConnectionPage_1=Login shell command
+JSchConnectionPage_2=Login shell command cannot be empty
+JSchConnectionPage_A_connection_with_that_name_already_exists=A connection with that name already exists
+JSchConnectionPage_Edit_Connection=Edit Connection
+JSchConnectionPage_Edit_properties_of_an_existing_connection=Edit properties of an existing connection
+JSchConnectionPage_Initial_Message=Specify properties of a new connection
+JSchConnectionPage_Proxy=SSH Proxy Settings
+JSchConnectionPage_Help=If 'Local' is selected and proxy command is empty, no proxy is used.\nSee <a>Network Connections</a> for SOCKS and HTTP proxy options.
+JSchConnectionPage_KeysAtSSH2=Keys are set at <a>Network Connections, SSH2</a>
+JSchConnectionPage_SelectCommand=Enter a local or remote command such as 'nc %h %p'. Can be empty for an ssh gateway.
+JSchConnectionPage_SelectConnection=Select 'Remote' for an ssh gateway or a remote proxy command.
+JSchConnectionPage_Settings0=Connection Settings
+JSchConnectionPage_selectProxyConnection=Please select a proxy connection
+JSchFileSystemContributor_0=Browse File System
+JSchNewConnectionPage_Advanced=Advanced
+JSchNewConnectionPage_Connection_name=Connection name:
+JSchNewConnectionPage_File_with_private_key=File with private key:
+JSchNewConnectionPage_Host=Host:
+JSchNewConnectionPage_Host_information=Host information
+JSchNewConnectionPage_Host_name_cannot_be_empty=Host name cannot be empty
+JSchNewConnectionPage_New_Connection=New Connection
+JSchNewConnectionPage_New_connection_properties=New connection properties
+JSchNewConnectionPage_Passphrase=Passphrase:
+JSchNewConnectionPage_Password=Password:
+JSchNewConnectionPage_Password_based_authentication=Password based authentication
+JSchNewConnectionPage_Please_enter_a_connection_name=Please enter a connection name
+JSchNewConnectionPage_Port=Port:
+JSchNewConnectionPage_Port_is_not_valid=Port is not valid
+JSchNewConnectionPage_Private_key_file_cannot_be_read=Private key file cannot be read
+JSchNewConnectionPage_Private_key_file_does_not_exist=Private key file does not exist
+JSchNewConnectionPage_Private_key_file_is_invalid=Private key file is invalid
+JSchNewConnectionPage_Private_key_path_cannot_be_empty=Private key path cannot be empty
+JSchNewConnectionPage_Public_key_based_authentication=Public key based authentication
+JSchNewConnectionPage_Timeout=Timeout:
+JSchNewConnectionPage_Timeout_is_not_valid=Timeout is not valid
+JSchNewConnectionPage_User=User:
+JSchNewConnectionPage_User_name_cannot_be_empty=User name cannot be empty
+JSchUIConnectionManager_Connection_Error=Connection Error
+JSchUIConnectionManager_Could_not_open_connection=Could not open connection
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java
new file mode 100644
index 00000000000..5fb5c2c1a82
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionPage.java
@@ -0,0 +1,585 @@
+/**
+ * Copyright (c) 2013, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial Implementation
+ * Patrick Tasse - [461541] fix handling of default attributes
+ */
+package org.eclipse.remote.internal.jsch.ui.wizards;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+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;
+import org.eclipse.remote.internal.jsch.core.JSchConnection;
+import org.eclipse.remote.internal.jsch.ui.messages.Messages;
+import org.eclipse.remote.ui.widgets.RemoteConnectionWidget;
+import org.eclipse.swt.SWT;
+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.events.SelectionListener;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+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.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.IExpansionListener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+
+public class JSchConnectionPage extends WizardPage {
+
+ private class DataModifyListener implements ModifyListener {
+ @Override
+ public synchronized void modifyText(ModifyEvent e) {
+ validateFields();
+ getContainer().updateButtons();
+ }
+ }
+
+ private Text fConnectionName;
+ private Button fPasswordButton;
+ private Button fPublicKeyButton;
+ private Button fUseLoginShellButton;
+ private Text fHostText;
+ private Text fUserText;
+ private Text fPasswordText;
+ private Text fPassphraseText;
+ private Text fPortText;
+ private Text fTimeoutText;
+ private Text fLoginShellText;
+
+ private String fInitialName = "Remote Host"; //$NON-NLS-1$
+ private Set<String> fInvalidConnectionNames;
+ private final Map<String, String> fInitialAttributes = new HashMap<>();
+ private IRemoteConnectionWorkingCopy fConnection;
+
+ private final IRemoteConnectionType fConnectionType;
+
+ private final DataModifyListener fDataModifyListener = new DataModifyListener();
+ private RemoteConnectionWidget fProxyConnectionWidget;
+ private Text fProxyCommandText;
+ private static final String PREFS_PAGE_ID_NET_PROXY = "org.eclipse.ui.net.NetPreferences"; //$NON-NLS-1$
+
+ public JSchConnectionPage(IRemoteConnectionType connectionType) {
+ super(Messages.JSchNewConnectionPage_New_Connection);
+ fConnectionType = connectionType;
+ setPageComplete(false);
+ }
+
+ /**
+ * Create controls for the bottom (hideable) advanced composite
+ *
+ * @param mold
+ *
+ */
+ private void createAdvancedControls(final Composite parent) {
+ ExpandableComposite expComp = new ExpandableComposite(parent, ExpandableComposite.TWISTIE);
+ expComp.setText(Messages.JSchNewConnectionPage_Advanced);
+ expComp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ expComp.setExpanded(false);
+ expComp.addExpansionListener(new IExpansionListener() {
+
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ for (int i = 0; i < 2; i++) { // sometimes the size compute isn't correct on first try
+ Point newSize = parent.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ Point currentSize = parent.getSize();
+ int deltaY = newSize.y - currentSize.y;
+ Point shellSize = getShell().getSize();
+ shellSize.y += deltaY;
+ getShell().setSize(shellSize);
+ getShell().layout(true, true);
+ }
+ }
+
+ @Override
+ public void expansionStateChanging(ExpansionEvent e) {
+ // Ignore
+ }
+ });
+
+ Composite advancedComp = new Composite(expComp, SWT.NONE);
+ advancedComp.setLayout(new GridLayout(1, false));
+ advancedComp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ Group settingsComp = new Group(advancedComp, SWT.NONE);
+ settingsComp.setText(Messages.JSchConnectionPage_Settings0);
+ settingsComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ settingsComp.setLayout(new GridLayout(2, false));
+
+ Label portLabel = new Label(settingsComp, SWT.NONE);
+ portLabel.setText(Messages.JSchNewConnectionPage_Port);
+ fPortText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
+ fPortText.setText(Integer.toString(JSchConnection.DEFAULT_PORT));
+ fPortText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
+ setTextFieldWidthInChars(fPortText, 5);
+
+ Label timeoutLabel = new Label(settingsComp, SWT.NONE);
+ timeoutLabel.setText(Messages.JSchNewConnectionPage_Timeout);
+ fTimeoutText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
+ fTimeoutText.setText(Integer.toString(JSchConnection.DEFAULT_TIMEOUT));
+ fTimeoutText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
+ setTextFieldWidthInChars(fTimeoutText, 5);
+
+ fUseLoginShellButton = new Button(settingsComp, SWT.CHECK);
+ fUseLoginShellButton.setText(Messages.JSchConnectionPage_0);
+ fUseLoginShellButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+ fUseLoginShellButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateFields();
+ updateEnablement();
+ }
+ });
+ Label loginShellLabel = new Label(settingsComp, SWT.NONE);
+ loginShellLabel.setText(Messages.JSchConnectionPage_1);
+ fLoginShellText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
+ fLoginShellText.setText(JSchConnection.DEFAULT_LOGIN_SHELL_COMMAND);
+ fLoginShellText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ fUseLoginShellButton.setSelection(JSchConnection.DEFAULT_USE_LOGIN_SHELL);
+
+ Group proxyComp = new Group(advancedComp, SWT.NONE);
+ proxyComp.setText(Messages.JSchConnectionPage_Proxy);
+ proxyComp.setLayout(new GridLayout(1, false));
+ proxyComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ createProxyControls(proxyComp);
+
+ expComp.setClient(advancedComp);
+ }
+
+ private void createAuthControls(Composite parent) {
+ Composite controls = new Composite(parent, SWT.NONE);
+ controls.setLayout(new GridLayout(3, false));
+ controls.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Label hostLabel = new Label(controls, SWT.NONE);
+ hostLabel.setText(Messages.JSchNewConnectionPage_Host);
+ fHostText = new Text(controls, SWT.BORDER | SWT.SINGLE);
+ fHostText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ Label userLabel = new Label(controls, SWT.NONE);
+ userLabel.setText(Messages.JSchNewConnectionPage_User);
+ fUserText = new Text(controls, SWT.BORDER | SWT.SINGLE);
+ fUserText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ // Key option box
+ fPublicKeyButton = new Button(controls, SWT.RADIO);
+ fPublicKeyButton.setText(Messages.JSchNewConnectionPage_Public_key_based_authentication);
+ fPublicKeyButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+ fPublicKeyButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateFields();
+ updateEnablement();
+ }
+ });
+
+ Link link = new Link(controls, SWT.WRAP);
+ final GridData linkLayoutData = new GridData(GridData.FILL_HORIZONTAL);
+ link.setLayoutData(linkLayoutData);
+ final String PREFS_PAGE_ID_NET_SSH = "org.eclipse.jsch.ui.SSHPreferences"; //$NON-NLS-1$
+ link.addSelectionListener(new SelectionListener() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(), PREFS_PAGE_ID_NET_SSH,
+ new String[] { PREFS_PAGE_ID_NET_SSH }, null);
+ dlg.open();
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+ link.setText(Messages.JSchConnectionPage_KeysAtSSH2);
+
+ // Passphrase field
+ Label passphraseLabel = new Label(controls, SWT.NONE);
+ passphraseLabel.setText(Messages.JSchNewConnectionPage_Passphrase);
+ fPassphraseText = new Text(controls, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
+ fPassphraseText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ // User option box
+ fPasswordButton = new Button(controls, SWT.RADIO);
+ fPasswordButton.setText(Messages.JSchNewConnectionPage_Password_based_authentication);
+ fPasswordButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1));
+ fPasswordButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateFields();
+ updateEnablement();
+ }
+ });
+
+ // Password field
+ Label passwordLabel = new Label(controls, SWT.NONE);
+ passwordLabel.setText(Messages.JSchNewConnectionPage_Password);
+ fPasswordText = new Text(controls, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
+ fPasswordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ fPasswordButton.setSelection(JSchConnection.DEFAULT_IS_PASSWORD);
+ fPublicKeyButton.setSelection(!JSchConnection.DEFAULT_IS_PASSWORD);
+ controls.setTabList(new Control[] { fHostText, fUserText, fPublicKeyButton, fPassphraseText, fPasswordButton,
+ fPasswordText });
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ if (fConnection == null) {
+ setDescription(Messages.JSchNewConnectionPage_New_connection_properties);
+ setTitle(Messages.JSchNewConnectionPage_New_Connection);
+ setMessage(Messages.JSchConnectionPage_Initial_Message);
+ } else {
+ setDescription(Messages.JSchConnectionPage_Edit_properties_of_an_existing_connection);
+ setTitle(Messages.JSchConnectionPage_Edit_Connection);
+ }
+ setErrorMessage(null);
+
+ GridLayout topLayout = new GridLayout(2, false);
+ final Composite topControl = new Composite(parent, SWT.NONE);
+ setControl(topControl);
+ topControl.setLayout(topLayout);
+
+ Label label = new Label(topControl, SWT.NONE);
+ label.setText(Messages.JSchNewConnectionPage_Connection_name);
+
+ fConnectionName = new Text(topControl, SWT.BORDER | SWT.SINGLE);
+ fConnectionName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ fConnectionName.setEnabled(fConnection == null);
+
+ final Group authGroup = new Group(topControl, SWT.NONE);
+ authGroup.setText(Messages.JSchNewConnectionPage_Host_information);
+ authGroup.setLayout(new GridLayout(1, false));
+ authGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+
+ createAuthControls(authGroup);
+ createAdvancedControls(authGroup);
+
+ try {
+ loadValues();
+ } catch (CoreException e) {
+ Activator.log(e.getStatus());
+ }
+
+ /*
+ * Register listeners after loading values so we don't trigger listeners
+ */
+ registerListeners();
+
+ if (fConnection != null) {
+ validateFields();
+ }
+
+ updateEnablement();
+ }
+
+ /**
+ * Create controls for the bottom (hideable) proxy composite
+ *
+ * @param mold
+ *
+ */
+ private void createProxyControls(final Composite proxyComp) {
+ Label lblConnection = new Label(proxyComp, SWT.WRAP);
+ lblConnection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ lblConnection.setText(Messages.JSchConnectionPage_SelectConnection);
+
+ fProxyConnectionWidget = new RemoteConnectionWidget(proxyComp, SWT.NONE, null, 0);
+ fProxyConnectionWidget.filterConnections(IRemoteConnectionHostService.class,
+ IRemotePortForwardingService.class);
+
+ Label lblCommand = new Label(proxyComp, SWT.WRAP);
+ lblCommand.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ lblCommand.setText(Messages.JSchConnectionPage_SelectCommand);
+
+ fProxyCommandText = new Text(proxyComp, SWT.BORDER);
+ fProxyCommandText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Link link = new Link(proxyComp, SWT.WRAP);
+ final GridData linkLayoutData = new GridData(GridData.FILL_HORIZONTAL);
+ link.setLayoutData(linkLayoutData);
+ link.addSelectionListener(new SelectionListener() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(), PREFS_PAGE_ID_NET_PROXY,
+ new String[] { PREFS_PAGE_ID_NET_PROXY }, null);
+ dlg.open();
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+
+ linkLayoutData.widthHint = 400;
+ link.setText(Messages.JSchConnectionPage_Help);
+ }
+
+ public IRemoteConnectionWorkingCopy getConnection() {
+ return fConnection;
+ }
+
+ /**
+ * Check if the connection name is invalid. This only applies to new connections (when fConnection is null).
+ *
+ * @param name
+ * connection name
+ * @return true if the name is invalid, false otherwise
+ */
+ private boolean isInvalidName(String name) {
+ if (fConnection == null) {
+ if (fInvalidConnectionNames == null) {
+ return fConnectionType.getConnection(name) != null;
+ }
+ return fInvalidConnectionNames.contains(name);
+ }
+ return false;
+ }
+
+ private void loadValues() throws CoreException {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ if (fConnection != null) {
+ fConnectionName.setText(fConnection.getName());
+ fHostText.setText(fConnection.getAttribute(JSchConnection.ADDRESS_ATTR));
+ fUserText.setText(fConnection.getAttribute(JSchConnection.USERNAME_ATTR));
+ String portStr = fConnection.getAttribute(JSchConnection.PORT_ATTR);
+ fPortText.setText(portStr.isEmpty() ? Integer.toString(JSchConnection.DEFAULT_PORT) : portStr);
+ String timeoutStr = fConnection.getAttribute(JSchConnection.TIMEOUT_ATTR);
+ fTimeoutText.setText(timeoutStr.isEmpty() ? Integer.toString(JSchConnection.DEFAULT_TIMEOUT) : timeoutStr);
+ String isPwdStr = fConnection.getAttribute(JSchConnection.IS_PASSWORD_ATTR);
+ boolean isPwd = isPwdStr.isEmpty() ? JSchConnection.DEFAULT_IS_PASSWORD : Boolean.parseBoolean(isPwdStr);
+ fPasswordButton.setSelection(isPwd);
+ fPublicKeyButton.setSelection(!isPwd);
+ fPasswordText.setText(fConnection.getSecureAttribute(JSchConnection.PASSWORD_ATTR));
+ fPassphraseText.setText(fConnection.getSecureAttribute(JSchConnection.PASSPHRASE_ATTR));
+ String useLoginShellStr = fConnection.getAttribute(JSchConnection.USE_LOGIN_SHELL_ATTR);
+ boolean useLoginShell = useLoginShellStr.isEmpty() ? JSchConnection.DEFAULT_USE_LOGIN_SHELL
+ : Boolean.parseBoolean(useLoginShellStr);
+ fUseLoginShellButton.setSelection(useLoginShell);
+ String loginShellStr = fConnection.getAttribute(JSchConnection.LOGIN_SHELL_COMMAND_ATTR);
+ fLoginShellText
+ .setText(loginShellStr.isEmpty() ? JSchConnection.DEFAULT_LOGIN_SHELL_COMMAND : loginShellStr);
+ fProxyCommandText.setText(fConnection.getAttribute(JSchConnection.PROXYCOMMAND_ATTR));
+ JSchConnection proxyConn = fConnection.getService(JSchConnection.class).getProxyConnection();
+ if (proxyConn == null) {
+ // Use local connection
+ fProxyConnectionWidget.setConnection(manager.getLocalConnectionType().getConnections().get(0));
+ } else {
+ fProxyConnectionWidget.setConnection(proxyConn.getRemoteConnection());
+ }
+ } else {
+ fConnectionName.setText(fInitialName);
+ String host = fInitialAttributes.get(JSchConnection.ADDRESS_ATTR);
+ if (host != null) {
+ fHostText.setText(host);
+ }
+ String username = fInitialAttributes.get(JSchConnection.USERNAME_ATTR);
+ if (username != null) {
+ fUserText.setText(username);
+ }
+ String port = fInitialAttributes.get(JSchConnection.PORT_ATTR);
+ if (port != null) {
+ fPortText.setText(port);
+ }
+ String timeout = fInitialAttributes.get(JSchConnection.TIMEOUT_ATTR);
+ if (timeout != null) {
+ fTimeoutText.setText(timeout);
+ }
+ String isPwd = fInitialAttributes.get(JSchConnection.IS_PASSWORD_ATTR);
+ if (isPwd != null) {
+ fPasswordButton.setSelection(Boolean.parseBoolean(isPwd));
+ }
+ String password = fInitialAttributes.get(JSchConnection.PASSWORD_ATTR);
+ if (password != null) {
+ fPasswordText.setText(password);
+ }
+ String passphrase = fInitialAttributes.get(JSchConnection.PASSPHRASE_ATTR);
+ if (passphrase != null) {
+ fPassphraseText.setText(passphrase);
+ }
+ String useLoginShell = fInitialAttributes.get(JSchConnection.USE_LOGIN_SHELL_ATTR);
+ if (useLoginShell != null) {
+ fUseLoginShellButton.setSelection(Boolean.parseBoolean(useLoginShell));
+ }
+ String loginShell = fInitialAttributes.get(JSchConnection.LOGIN_SHELL_COMMAND_ATTR);
+ if (loginShell != null) {
+ fLoginShellText.setText(loginShell);
+ }
+ fProxyConnectionWidget.setConnection(manager.getLocalConnectionType().getConnections().get(0));
+ }
+ }
+
+ private void registerListeners() {
+ fConnectionName.addModifyListener(fDataModifyListener);
+ fHostText.addModifyListener(fDataModifyListener);
+ fUserText.addModifyListener(fDataModifyListener);
+ fPasswordText.addModifyListener(fDataModifyListener);
+ fPassphraseText.addModifyListener(fDataModifyListener);
+ fPortText.addModifyListener(fDataModifyListener);
+ fTimeoutText.addModifyListener(fDataModifyListener);
+ fLoginShellText.addModifyListener(fDataModifyListener);
+ fProxyCommandText.addModifyListener(fDataModifyListener);
+ fProxyConnectionWidget.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateFields();
+ getContainer().updateButtons();
+ }
+ });
+ }
+
+ public void setAddress(String address) {
+ fInitialAttributes.put(JSchConnection.ADDRESS_ATTR, address);
+ }
+
+ public void setAttributes(Map<String, String> attributes) {
+ fInitialAttributes.putAll(attributes);
+ }
+
+ public void setConnection(IRemoteConnectionWorkingCopy connection) {
+ fConnection = connection;
+ }
+
+ public void setConnectionName(String name) {
+ fInitialName = name;
+ }
+
+ public void setInvalidConnectionNames(Set<String> names) {
+ fInvalidConnectionNames = names;
+ }
+
+ @Override
+ public void setPageComplete(boolean complete) {
+ super.setPageComplete(complete);
+ if (complete) {
+ storeValues();
+ }
+ }
+
+ public void setPort(int port) {
+ fInitialAttributes.put(JSchConnection.PORT_ATTR, Integer.toString(port));
+ }
+
+ private void setTextFieldWidthInChars(Text text, int chars) {
+ text.setTextLimit(chars);
+ Object data = text.getLayoutData();
+ if (data instanceof GridData) {
+ GC gc = new GC(text);
+ FontMetrics fm = gc.getFontMetrics();
+ int width = (int) (chars * fm.getAverageCharacterWidth());
+ gc.dispose();
+ ((GridData) data).widthHint = width;
+ }
+ }
+
+ public void setUsername(String username) {
+ fInitialAttributes.put(JSchConnection.USERNAME_ATTR, username);
+ }
+
+ private void storeValues() {
+ if (fConnection == null) {
+ try {
+ fConnection = fConnectionType.newConnection(fConnectionName.getText().trim());
+ } catch (RemoteConnectionException e) {
+ Activator.log(e);
+ }
+ }
+ if (fConnection != null) {
+ fConnection.setName(fConnectionName.getText().trim());
+ fConnection.setAttribute(JSchConnection.ADDRESS_ATTR, fHostText.getText().trim());
+ fConnection.setAttribute(JSchConnection.USERNAME_ATTR, fUserText.getText().trim());
+ fConnection.setSecureAttribute(JSchConnection.PASSWORD_ATTR, fPasswordText.getText().trim());
+ fConnection.setSecureAttribute(JSchConnection.PASSPHRASE_ATTR, fPassphraseText.getText().trim());
+ fConnection.setAttribute(JSchConnection.IS_PASSWORD_ATTR, Boolean.toString(fPasswordButton.getSelection()));
+ fConnection.setAttribute(JSchConnection.TIMEOUT_ATTR, fTimeoutText.getText().trim());
+ fConnection.setAttribute(JSchConnection.PORT_ATTR, fPortText.getText().trim());
+ fConnection.setAttribute(JSchConnection.PROXYCOMMAND_ATTR, fProxyCommandText.getText().trim());
+ fConnection.setAttribute(JSchConnection.USE_LOGIN_SHELL_ATTR,
+ Boolean.toString(fUseLoginShellButton.getSelection()));
+ fConnection.setAttribute(JSchConnection.LOGIN_SHELL_COMMAND_ATTR, fLoginShellText.getText().trim());
+ IRemoteConnection proxyConnection = fProxyConnectionWidget.getConnection();
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ String proxyConnectionName = ""; //$NON-NLS-1$
+ if (proxyConnection != null && proxyConnection.getConnectionType() != manager.getLocalConnectionType()) {
+ proxyConnectionName = proxyConnection.getName();
+ }
+ fConnection.setAttribute(JSchConnection.PROXYCONNECTION_ATTR, proxyConnectionName);
+ }
+ }
+
+ private void updateEnablement() {
+ boolean isPasswordAuth = fPasswordButton.getSelection();
+ fPasswordText.setEnabled(isPasswordAuth);
+ fPassphraseText.setEnabled(!isPasswordAuth);
+ fLoginShellText.setEnabled(fUseLoginShellButton.getSelection());
+ }
+
+ private String validateAdvanced() {
+ try {
+ Integer.parseInt(fPortText.getText().trim());
+ } catch (NumberFormatException ne) {
+ return Messages.JSchNewConnectionPage_Port_is_not_valid;
+ }
+ try {
+ Integer.parseInt(fTimeoutText.getText().trim());
+ } catch (NumberFormatException ne) {
+ return Messages.JSchNewConnectionPage_Timeout_is_not_valid;
+ }
+ return null;
+ }
+
+ private void validateFields() {
+ String message = null;
+ if (fConnectionName.getText().trim().length() == 0) {
+ message = Messages.JSchNewConnectionPage_Please_enter_a_connection_name;
+ } else if (isInvalidName(fConnectionName.getText().trim())) {
+ message = Messages.JSchConnectionPage_A_connection_with_that_name_already_exists;
+ } else if (fHostText.getText().trim().length() == 0) {
+ message = Messages.JSchNewConnectionPage_Host_name_cannot_be_empty;
+ } else if (fUserText.getText().trim().length() == 0) {
+ message = Messages.JSchNewConnectionPage_User_name_cannot_be_empty;
+ } else if (fUseLoginShellButton.getSelection() && fLoginShellText.getText().trim().length() == 0) {
+ message = Messages.JSchConnectionPage_2;
+ } else if (fProxyConnectionWidget.getConnection() == null) {
+ message = Messages.JSchConnectionPage_selectProxyConnection;
+ }
+ if (message == null) {
+ message = validateAdvanced();
+ }
+
+ setErrorMessage(message);
+ setPageComplete(message == null);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionWizard.java b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionWizard.java
new file mode 100644
index 00000000000..93f6f9fbc0a
--- /dev/null
+++ b/remote/org.eclipse.remote.jsch.ui/src/org/eclipse/remote/internal/jsch/ui/wizards/JSchConnectionWizard.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2013 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial Implementation
+ *
+ */
+package org.eclipse.remote.internal.jsch.ui.wizards;
+
+import java.util.Set;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.widgets.Shell;
+
+public class JSchConnectionWizard extends Wizard implements IRemoteUIConnectionWizard {
+
+ private final Shell fShell;
+ private final JSchConnectionPage fPage;
+
+ public JSchConnectionWizard(Shell shell, IRemoteConnectionType connectionType) {
+ fShell = shell;
+ fPage = new JSchConnectionPage(connectionType);
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ addPage(fPage);
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy open() {
+ WizardDialog dialog = new WizardDialog(fShell, this);
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == WizardDialog.OK) {
+ return fPage.getConnection();
+ }
+ return null;
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy getConnection() {
+ return fPage.getConnection();
+ }
+
+ @Override
+ public boolean performCancel() {
+ return true;
+ }
+
+ @Override
+ public boolean performFinish() {
+ return true;
+ }
+
+ @Override
+ public void setConnection(IRemoteConnectionWorkingCopy connection) {
+ fPage.setConnection(connection);
+ }
+
+ @Override
+ public void setConnectionName(String name) {
+ fPage.setConnectionName(name);
+ }
+
+ @Override
+ public void setInvalidConnectionNames(Set<String> names) {
+ fPage.setInvalidConnectionNames(names);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy-feature/.project b/remote/org.eclipse.remote.proxy-feature/.project
new file mode 100644
index 00000000000..144e9faeaef
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy-feature/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy-feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy-feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy-feature/build.properties b/remote/org.eclipse.remote.proxy-feature/build.properties
new file mode 100644
index 00000000000..90b78ae6f71
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy-feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+ feature.properties,\
+ eclipse_update_120.jpg,\
+ epl-v20.html
diff --git a/remote/org.eclipse.remote.proxy-feature/eclipse_update_120.jpg b/remote/org.eclipse.remote.proxy-feature/eclipse_update_120.jpg
new file mode 100644
index 00000000000..bfdf708ad61
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy-feature/eclipse_update_120.jpg
Binary files differ
diff --git a/remote/org.eclipse.remote.proxy-feature/epl-v20.html b/remote/org.eclipse.remote.proxy-feature/epl-v20.html
new file mode 100644
index 00000000000..008b8018db8
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy-feature/epl-v20.html
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+ <h2>Eclipse Foundation Software User Agreement</h2>
+ <p>November 22, 2017</p>
+
+ <h3>Usage Of Content</h3>
+
+ <p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,
+ INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY
+ THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS
+ GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY
+ APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS
+ AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE
+ AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT
+ USE THE CONTENT.</p>
+
+ <h3>Applicable Licenses</h3>
+
+ <p>
+ Unless otherwise indicated, all Content made available by the Eclipse
+ Foundation is provided to you under the terms and conditions of the
+ Eclipse Public License Version 2.0 (&quot;EPL&quot;). A copy of the
+ EPL is provided with this Content and is also available at <a
+ href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>Content includes, but is not limited to, source code, object
+ code, documentation and other files maintained in the Eclipse
+ Foundation source code repository (&quot;Repository&quot;) in software
+ modules (&quot;Modules&quot;) and made available as downloadable
+ archives (&quot;Downloads&quot;).</p>
+
+ <ul>
+ <li>Content may be structured and packaged into modules to
+ facilitate delivering, extending, and upgrading the Content. Typical
+ modules may include plug-ins (&quot;Plug-ins&quot;), plug-in
+ fragments (&quot;Fragments&quot;), and features
+ (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory
+ or JAR (Java&trade; ARchive) in a directory named
+ &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or
+ Fragments and associated material. Each Feature may be packaged as a
+ sub-directory in a directory named &quot;features&quot;. Within a
+ Feature, files named &quot;feature.xml&quot; may contain a list of
+ the names and version numbers of the Plug-ins and/or Fragments
+ associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included
+ Features&quot;). Within a Feature, files named
+ &quot;feature.xml&quot; may contain a list of the names and version
+ numbers of Included Features.</li>
+ </ul>
+
+ <p>The terms and conditions governing Plug-ins and Fragments should
+ be contained in files named &quot;about.html&quot;
+ (&quot;Abouts&quot;). The terms and conditions governing Features and
+ Included Features should be contained in files named
+ &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and
+ Feature Licenses may be located in any directory of a Download or
+ Module including, but not limited to the following locations:</p>
+
+ <ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of
+ certain Plug-ins</li>
+ <li>Feature directories</li>
+ </ul>
+
+ <p>Note: if a Feature made available by the Eclipse Foundation is
+ installed using the Provisioning Technology (as defined below), you
+ must agree to a license (&quot;Feature Update License&quot;) during
+ the installation process. If the Feature contains Included Features,
+ the Feature Update License should either provide you with the terms
+ and conditions governing the Included Features or inform you where you
+ can locate them. Feature Update Licenses may be found in the
+ &quot;license&quot; property of files named
+ &quot;feature.properties&quot; found within a Feature. Such Abouts,
+ Feature Licenses, and Feature Update Licenses contain the terms and
+ conditions (or references to such terms and conditions) that govern
+ your use of the associated Content in that directory.</p>
+
+ <p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY
+ REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND
+ CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT
+ ARE NOT LIMITED TO):</p>
+
+ <ul>
+ <li>Eclipse Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)
+ </li>
+ <li>Eclipse Distribution License Version 1.0 (available at <a
+ href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)
+ </li>
+ <li>Common Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)
+ </li>
+ <li>Apache Software License 1.1 (available at <a
+ href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)
+ </li>
+ <li>Apache Software License 2.0 (available at <a
+ href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)
+ </li>
+ <li>Mozilla Public License Version 1.1 (available at <a
+ href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)
+ </li>
+ </ul>
+
+ <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND
+ CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License,
+ or Feature Update License is provided, please contact the Eclipse
+ Foundation to determine what terms and conditions govern that
+ particular Content.</p>
+
+
+ <h3>Use of Provisioning Technology</h3>
+
+ <p>
+ The Eclipse Foundation makes available provisioning software, examples
+ of which include, but are not limited to, p2 and the Eclipse Update
+ Manager (&quot;Provisioning Technology&quot;) for the purpose of
+ allowing users to install software, documentation, information and/or
+ other materials (collectively &quot;Installable Software&quot;). This
+ capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about
+ packaging Installable Software is available at <a
+ href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+ (&quot;Specification&quot;).
+ </p>
+
+ <p>You may use Provisioning Technology to allow other parties to
+ install Installable Software. You shall be responsible for enabling
+ the applicable license agreements relating to the Installable Software
+ to be presented to, and accepted by, the users of the Provisioning
+ Technology in accordance with the Specification. By using Provisioning
+ Technology in such a manner and making it available in accordance with
+ the Specification, you further acknowledge your agreement to, and the
+ acquisition of all necessary rights to permit the following:</p>
+
+ <ol>
+ <li>A series of actions may occur (&quot;Provisioning
+ Process&quot;) in which a user may execute the Provisioning
+ Technology on a machine (&quot;Target Machine&quot;) with the intent
+ of installing, extending or updating the functionality of an
+ Eclipse-based product.</li>
+ <li>During the Provisioning Process, the Provisioning Technology
+ may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</li>
+ <li>Pursuant to the Specification, you will provide to the user
+ the terms and conditions that govern the use of the Installable
+ Software (&quot;Installable Software Agreement&quot;) and such
+ Installable Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable
+ Software Agreement must inform the user of the terms and conditions
+ that govern the Installable Software and must solicit acceptance by
+ the end user in the manner prescribed in such Installable Software
+ Agreement. Upon such indication of agreement by the user, the
+ provisioning Technology will complete installation of the Installable
+ Software.</li>
+ </ol>
+
+ <h3>Cryptography</h3>
+
+ <p>Content may contain encryption software. The country in which
+ you are currently may have restrictions on the import, possession, and
+ use, and/or re-export to another country, of encryption software.
+ BEFORE using any encryption software, please check the country's laws,
+ regulations and policies concerning the import, possession, or use,
+ and re-export of encryption software, to see if this is permitted.</p>
+
+ <p>
+ <small>Java and all Java-based trademarks are trademarks of
+ Oracle Corporation in the United States, other countries, or both.</small>
+ </p>
+</body>
+</html>
diff --git a/remote/org.eclipse.remote.proxy-feature/feature.properties b/remote/org.eclipse.remote.proxy-feature/feature.properties
new file mode 100644
index 00000000000..3ac43a6c5f1
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy-feature/feature.properties
@@ -0,0 +1,28 @@
+#################################################################################
+# Copyright (c) 2016 Oak Ridge National Laborator and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#################################################################################
+
+# "featureName" property - name of the feature
+featureName=Remote Services Proxy
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse CDT
+
+# "description" property - description of the feature
+description=Provides a proxy for the remote services framework
+
+# copyright
+copyright=\
+Copyright (c) 2016 Oak Ridge National Laboratory and others.\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n
+
diff --git a/remote/org.eclipse.remote.proxy-feature/feature.xml b/remote/org.eclipse.remote.proxy-feature/feature.xml
new file mode 100644
index 00000000000..f6a269ebf23
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy-feature/feature.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.remote.proxy"
+ label="%featureName"
+ version="10.7.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.remote.proxy.ui"
+ license-feature="org.eclipse.license"
+ license-feature-version="0.0.0">
+
+ <description url="http://eclipse.org/ptp">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <plugin
+ id="org.eclipse.remote.proxy.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.proxy.server.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.proxy.server.linux.x86_64"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.remote.proxy.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.proxy.server.macosx.x86_64"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.remote.proxy.protocol.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.proxy.server.linux.ppc64le"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+</feature>
diff --git a/remote/org.eclipse.remote.proxy.core/.classpath b/remote/org.eclipse.remote.proxy.core/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.proxy.core/.project b/remote/org.eclipse.remote.proxy.core/.project
new file mode 100644
index 00000000000..a6208317c9b
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.core/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..bc6047ff5d1
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.proxy.core;singleton:=true
+Bundle-Version: 1.0.200.qualifier
+Bundle-Activator: org.eclipse.remote.internal.proxy.core.Activator
+Bundle-Vendor: %pluginProvider
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.internal.proxy.core;x-friends:="org.eclipse.remote.proxy.ui",
+ org.eclipse.remote.internal.proxy.core.commands;x-friends:="org.eclipse.remote.proxy.ui",
+ org.eclipse.remote.internal.proxy.core.messages;x-friends:="org.eclipse.remote.proxy.ui"
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: com.jcraft.jsch,
+ org.eclipse.core.filesystem,
+ org.eclipse.core.filesystem.provider,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.jsch.core,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.internal.core,
+ org.eclipse.remote.internal.jsch.core,
+ org.eclipse.remote.proxy.protocol.core,
+ org.eclipse.remote.proxy.protocol.core.exceptions,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.proxy.core/about.html b/remote/org.eclipse.remote.proxy.core/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.core/bootstrap.sh b/remote/org.eclipse.remote.proxy.core/bootstrap.sh
new file mode 100755
index 00000000000..976a6352a98
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/bootstrap.sh
@@ -0,0 +1,125 @@
+installdir="$HOME/.eclipsesettings"
+if test ! -d $installdir; then
+ mkdir $installdir
+ if test ! -d $installdir; then
+ echo fail:cannot create $installdir
+ exit 1
+ fi
+fi
+cat > $installdir/bootstrap.sh <<-\EOF
+#!/bin/sh
+installdir="$HOME/.eclipsesettings"
+proxytmp=$installdir/proxy.b64
+success=false
+
+cleanup() {
+ rm -f $installdir/bootstrap.sh
+}
+
+trap 'cleanup' EXIT
+
+parent_is_not_orphan () {
+ parent=`ps -ef|awk '$2=='$$'{print $3}'`
+ let parent=$parent+0
+ if [[ $parent -eq 1 ]]; then
+ return 1
+ fi
+ return 0
+}
+
+do_check() {
+ java_vers=`java -version 2>&1`
+ case "$java_vers" in
+ *"not found")
+ echo "fail:could not find a valid java installation"
+ return
+ ;;
+ esac
+ major=`expr "$java_vers" : ".* version \"\([0-9]*\)\.[0-9]*.*\""`
+ minor=`expr "$java_vers" : ".* version \"[0-9]*\.\([0-9]*\).*\""`
+ if test "$major" -ge 2 -o "$minor" -ge 8; then
+ :
+ else
+ echo "fail:invalid java version $major.$minor; must be >= 1.8"
+ return
+ fi
+ case "`uname`" in
+ Linux)
+ osname="linux";
+ osarch=`uname -m`;
+ proxydir=$installdir/proxy;
+ plugins=$proxydir/plugins;;
+ Darwin)
+ osname="macosx";
+ osarch=`uname -m`;
+ proxydir=$installdir/Proxy.app;
+ plugins=$proxydir/Contents/Eclipse/plugins;;
+ *)
+ echo fail:system not supported;
+ return;;
+ esac
+ proxy=not_found
+ if test -d $proxydir; then
+ bundle="org.eclipse.remote.proxy.server.core_$1.jar"
+ if test -f $plugins/$bundle; then
+ proxy=found
+ else
+ mv $proxydir $proxydir.pre_$1
+ fi
+ fi
+ echo ok:$proxy/$osname/$osarch
+}
+
+do_download() {
+ dd of=$proxytmp ibs=680 count=$1
+ IFS= read -r last
+ echo "$last" >> $proxytmp
+ base64 --decode < $proxytmp | (cd $installdir && tar zxvf -) > /dev/null 2>&1
+ if test $? -eq 0; then
+ echo ok
+ else
+ echo fail:download failed
+ fi
+}
+
+#
+# Start java in background so we can clean up after connection is dropped. The only way to tell if this
+# has happened is to poll if ppid has changed to 1 (i.e. we no longer have a controlling terminal)
+#
+start_server() {
+ # enable debugoptions in order to attach a debugger
+ #debugoptions="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044,quiet=y"
+
+ # use globbing to find launcher version
+ java -cp $plugins/org.eclipse.equinox.launcher_1.*.jar \
+ $debugoptions \
+ org.eclipse.equinox.launcher.Main \
+ -application org.eclipse.remote.proxy.server.core.application \
+ -noExit 0<&0 &
+
+ pid=$!
+
+ trap 'kill $pid; exit' HUP INT TERM
+
+ while parent_is_not_orphan; do
+ sleep 10
+ done
+
+ kill $pid
+}
+
+echo running
+
+while read line arg; do
+ case $line in
+ check) do_check $arg;;
+ download) do_download $arg;;
+ start) start_server;;
+ exit) break;;
+ *) echo fail:unrecognized command:$line; exit 1;;
+ esac
+done
+exit 0
+EOF
+chmod 755 $installdir/bootstrap.sh
+exec $installdir/bootstrap.sh
diff --git a/remote/org.eclipse.remote.proxy.core/build.properties b/remote/org.eclipse.remote.proxy.core/build.properties
new file mode 100644
index 00000000000..9eb007f8285
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/build.properties
@@ -0,0 +1,11 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html,\
+ bootstrap.sh
+src.includes = about.html
+
+
diff --git a/remote/org.eclipse.remote.proxy.core/plugin.properties b/remote/org.eclipse.remote.proxy.core/plugin.properties
new file mode 100644
index 00000000000..7ac8be930eb
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2016 Oak Ridge National Laboratory and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Proxy Support
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.proxy.core/plugin.xml b/remote/org.eclipse.remote.proxy.core/plugin.xml
new file mode 100644
index 00000000000..2de33ec7138
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/plugin.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionType
+ id="org.eclipse.remote.Proxy"
+ name="PROXY"
+ scheme="proxy">
+ </connectionType>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionControlService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionPropertyService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyFileManager$Factory"
+ service="org.eclipse.remote.core.IRemoteFileService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionHostService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyConnection$Factory"
+ service="org.eclipse.remote.internal.proxy.core.ProxyConnection">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteCommandShellService">
+ </connectionService>
+ <processService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessControlService">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessSignalService">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyProcess$Factory"
+ service="org.eclipse.remote.core.IRemoteProcessTerminalService">
+ </processService>
+ <processService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.core.ProxyProcess$Factory"
+ service="org.eclipse.remote.internal.proxy.core.ProxyProcess">
+ </processService>
+ </extension>
+ <extension
+ id="org.eclipse.remote.proxy.filesystem"
+ point="org.eclipse.core.filesystem.filesystems">
+ <filesystem
+ scheme="proxy">
+ <run
+ class="org.eclipse.remote.internal.proxy.core.ProxyFileSystem">
+ </run>
+ </filesystem>
+ </extension>
+</plugin>
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/Activator.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/Activator.java
new file mode 100644
index 00000000000..ec8cce8cd81
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/Activator.java
@@ -0,0 +1,101 @@
+package org.eclipse.remote.internal.proxy.core;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.proxy.core"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get unique identifier
+ *
+ * @return
+ * @since 5.0
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() == null) {
+ return PLUGIN_ID;
+ }
+ return getDefault().getBundle().getSymbolicName();
+ }
+
+ /**
+ * Logs the specified status with this plug-in's log.
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Logs an internal error with the specified message.
+ *
+ * @param message
+ * the error message to log
+ */
+ public static void log(String message) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
+ }
+
+ /**
+ * Logs an internal error with the specified throwable
+ *
+ * @param e
+ * the exception to be logged
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
+ }
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java
new file mode 100644
index 00000000000..f1d5e32b769
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnection.java
@@ -0,0 +1,440 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IRemoteConnectionPropertyService;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.eclipse.remote.core.RemoteServicesUtils;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.proxy.core.commands.ExecCommand;
+import org.eclipse.remote.internal.proxy.core.commands.GetCwdCommand;
+import org.eclipse.remote.internal.proxy.core.commands.GetEnvCommand;
+import org.eclipse.remote.internal.proxy.core.commands.GetPropertiesCommand;
+import org.eclipse.remote.internal.proxy.core.messages.Messages;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.StreamChannelManager;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+import com.jcraft.jsch.ChannelShell;
+
+/**
+ * @since 5.0
+ */
+public class ProxyConnection
+ implements IRemoteConnectionControlService, IRemoteConnectionChangeListener, IRemoteProcessService,
+ IRemoteCommandShellService, IRemoteConnectionHostService, IRemoteConnectionPropertyService {
+ // Connection Type ID
+ public static final String JSCH_ID = "org.eclipse.remote.Proxy"; //$NON-NLS-1$
+
+ public static final int DEFAULT_PORT = 22;
+ public static final int DEFAULT_TIMEOUT = 0;
+ public static final boolean DEFAULT_USE_PASSWORD = false;
+ public static final boolean DEFAULT_USE_DEFAULT_SERVER = true;
+ public static final String DEFAULT_SERVER_COMMAND = "sh .eclipsesettings/proxy.sh"; //$NON-NLS-1$
+
+ public static final String HOSTNAME_ATTR = "PROXY_HOSTNAME__ATTR"; //$NON-NLS-1$
+ public static final String USERNAME_ATTR = "PROXY_USERNAME_ATTR"; //$NON-NLS-1$
+ public static final String PASSWORD_ATTR = "PROXY_PASSWORD_ATTR"; //$NON-NLS-1$
+ public static final String PORT_ATTR = "PROXY_PORT_ATTR"; //$NON-NLS-1$
+ public static final String USE_PASSWORD_ATTR = "PROXY_USE_PASSWORD_ATTR"; //$NON-NLS-1$
+ public static final String PASSPHRASE_ATTR = "PROXY_PASSPHRASE_ATTR"; //$NON-NLS-1$
+ public static final String TIMEOUT_ATTR = "PROXY_TIMEOUT_ATTR"; //$NON-NLS-1$
+ public static final String SERVER_COMMAND_ATTR = "PROXY_SERVER_COMMAND_ATTR"; //$NON-NLS-1$
+ public static final String USE_DEFAULT_SERVER_ATTR = "PROXY_USE_DEFAULT_SERVER_ATTR"; //$NON-NLS-1$
+
+ private String fWorkingDir;
+ private StreamChannelManager channelMux;
+ private StreamChannel commandChannel;
+ private boolean isOpen;
+
+ private final IRemoteConnection fRemoteConnection;
+
+ private final Map<String, String> fEnv = new HashMap<>();
+ private final Map<String, String> fProperties = new HashMap<>();
+
+ private static final Map<IRemoteConnection, ProxyConnection> connectionMap = new HashMap<>();
+
+ public ProxyConnection(IRemoteConnection connection) {
+ fRemoteConnection = connection;
+ connection.addConnectionChangeListener(this);
+ }
+
+ @Override
+ public void connectionChanged(RemoteConnectionChangeEvent event) {
+ if (event.getType() == RemoteConnectionChangeEvent.CONNECTION_REMOVED) {
+ synchronized (connectionMap) {
+ connectionMap.remove(event.getConnection());
+ }
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return fRemoteConnection;
+ }
+
+ public static class Factory implements IRemoteConnection.Service.Factory {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends IRemoteConnection.Service> T getService(IRemoteConnection connection, Class<T> service) {
+ // This little trick creates an instance of this class for a connection
+ // then for each interface it implements, it returns the same object.
+ // This works because the connection caches the service so only one gets created.
+ // As a side effect, it makes this class a service too which can be used
+ // by the this plug-in
+ if (ProxyConnection.class.equals(service)) {
+ synchronized (connectionMap) {
+ ProxyConnection conn = connectionMap.get(connection);
+ if (conn == null) {
+ conn = new ProxyConnection(connection);
+ connectionMap.put(connection, conn);
+ }
+ return (T) conn;
+ }
+ } else if (IRemoteConnectionControlService.class.equals(service)
+ || IRemoteConnectionPropertyService.class.equals(service)
+ || IRemoteConnectionHostService.class.equals(service) || IRemoteProcessService.class.equals(service)
+ || IRemoteCommandShellService.class.equals(service)
+ || IRemoteConnectionPropertyService.class.equals(service)) {
+ return (T) connection.getService(ProxyConnection.class);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ @Override
+ public synchronized void close() {
+ if (isOpen) {
+ channelMux.shutdown();
+ isOpen = false;
+ fRemoteConnection.fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_CLOSED);
+ }
+ }
+
+ @Override
+ public boolean isOpen() {
+ return isOpen;
+ }
+
+ @Override
+ public void open(IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, Messages.ProxyConnection_0, 20);
+ if (!isOpen) {
+ ProxyConnectionBootstrap bootstrap = new ProxyConnectionBootstrap();
+ channelMux = bootstrap.run(getRemoteConnection(), subMon.newChild(10));
+ new Thread(channelMux, "multiplexer").start(); //$NON-NLS-1$
+ try {
+ commandChannel = channelMux.openChannel();
+ initialize(subMon.newChild(10));
+ } catch (RemoteConnectionException | IOException e) {
+ try {
+ commandChannel.close();
+ } catch (IOException e1) {
+ // Ignore
+ }
+ channelMux.shutdown();
+ throw new RemoteConnectionException(e.getMessage());
+ }
+
+ isOpen = true;
+ fRemoteConnection.fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_OPENED);
+ }
+ }
+
+ private void initialize(IProgressMonitor monitor) throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 30);
+ fWorkingDir = getCwd(subMon.newChild(10));
+ if (subMon.isCanceled()) {
+ throw new RemoteConnectionException(Messages.ProxyConnection_2);
+ }
+ fEnv.putAll(loadEnv(subMon.newChild(10)));
+ if (subMon.isCanceled()) {
+ throw new RemoteConnectionException(Messages.ProxyConnection_2);
+ }
+ fProperties.putAll(loadProperties(subMon.newChild(10)));
+ if (subMon.isCanceled()) {
+ throw new RemoteConnectionException(Messages.ProxyConnection_2);
+ }
+ }
+
+ private String getCwd(IProgressMonitor monitor) throws RemoteConnectionException {
+ try {
+ GetCwdCommand cmd = new GetCwdCommand(this);
+ return cmd.getResult(monitor);
+ } catch (ProxyException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ private Map<String, String> loadEnv(IProgressMonitor monitor) throws RemoteConnectionException {
+ try {
+ GetEnvCommand cmd = new GetEnvCommand(this);
+ return cmd.getResult(monitor);
+ } catch (ProxyException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ private Map<String, String> loadProperties(IProgressMonitor monitor) throws RemoteConnectionException {
+ try {
+ GetPropertiesCommand cmd = new GetPropertiesCommand(this);
+ return cmd.getResult(monitor);
+ } catch (ProxyException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ public Map<String, String> getEnv() {
+ return Collections.unmodifiableMap(fEnv);
+ }
+
+ public StreamChannel getCommandChannel() {
+ return commandChannel;
+ }
+
+ public StreamChannel openChannel() throws IOException {
+ return channelMux.openChannel();
+ }
+
+ private StringBuffer stdout = new StringBuffer();
+ private StringBuffer stderr = new StringBuffer();
+
+ @SuppressWarnings("unused")
+ private String executeSshCommand(ChannelShell shell, String command) throws RemoteConnectionException {
+ try {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ByteArrayOutputStream err = new ByteArrayOutputStream();
+ shell.setOutputStream(stream);
+ shell.setExtOutputStream(err);
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(shell.getOutputStream()));
+ writer.write(command);
+ writer.flush();
+ if (err.size() > 0) {
+ throw new RemoteConnectionException(err.toString());
+ }
+ return stream.toString();
+ } catch (IOException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private String executeCommand(List<String> command, IProgressMonitor monitor) throws ProxyException {
+ try {
+ final StreamChannel chanA = channelMux.openChannel();
+ final StreamChannel chanB = channelMux.openChannel();
+ final StreamChannel chanC = channelMux.openChannel();
+ new Thread("cmd stdin reader") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ byte[] buf = new byte[1024];
+ int n;
+ try {
+ while ((n = chanA.getInputStream().read(buf)) >= 0) {
+ stdout.append(new String(buf, 0, n));
+ }
+ } catch (IOException e) {
+ // Finish
+ }
+ }
+ }.start();
+ new Thread("cmd stderr reader") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ byte[] buf = new byte[1024];
+ int n;
+ try {
+ while ((n = chanB.getInputStream().read(buf)) >= 0) {
+ stderr.append(new String(buf, 0, n));
+ }
+ } catch (IOException e) {
+ // Finish
+ }
+ }
+ }.start();
+ ExecCommand cmd = new ExecCommand(this, command, getEnv(), getWorkingDirectory(), false, false,
+ chanA.getId(), chanB.getId(), chanC.getId());
+ cmd.getResult(monitor);
+ DataInputStream status = new DataInputStream(chanC.getInputStream());
+ int stat = status.readInt();
+ if (stat == 0) {
+ return stdout.toString();
+ }
+ return stderr.toString();
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+
+ @Override
+ public String getEnv(String name) {
+ return getEnv().get(name);
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder(List<String> command) {
+ return new ProxyProcessBuilder(this, command);
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder(String... command) {
+ return new ProxyProcessBuilder(this, command);
+ }
+
+ @Override
+ public String getWorkingDirectory() {
+ return fWorkingDir;
+ }
+
+ @Override
+ public void setWorkingDirectory(String path) {
+ if (RemoteServicesUtils.posixPath(path).isAbsolute()) {
+ fWorkingDir = path;
+ }
+ }
+
+ @Override
+ public IRemoteProcess getCommandShell(int flags) throws IOException {
+ return new ProxyProcessBuilder(this).start(flags);
+ }
+
+ @Override
+ public String getHostname() {
+ return fRemoteConnection.getAttribute(HOSTNAME_ATTR);
+ }
+
+ @Override
+ public int getPort() {
+ String portStr = fRemoteConnection.getAttribute(PORT_ATTR);
+ return !portStr.isEmpty() ? Integer.parseInt(portStr) : DEFAULT_PORT;
+ }
+
+ @Override
+ public int getTimeout() {
+ String portStr = fRemoteConnection.getAttribute(TIMEOUT_ATTR);
+ return !portStr.isEmpty() ? Integer.parseInt(portStr) : DEFAULT_TIMEOUT;
+ }
+
+ @Override
+ public String getPassphrase() {
+ return fRemoteConnection.getSecureAttribute(PASSPHRASE_ATTR);
+ }
+
+ @Override
+ public String getPassword() {
+ return fRemoteConnection.getSecureAttribute(PASSWORD_ATTR);
+ }
+
+ @Override
+ public boolean usePassword() {
+ String str = fRemoteConnection.getAttribute(USE_PASSWORD_ATTR);
+ return !str.isEmpty() ? Boolean.parseBoolean(str) : DEFAULT_USE_PASSWORD;
+ }
+
+ @Override
+ public String getUsername() {
+ return fRemoteConnection.getAttribute(USERNAME_ATTR);
+ }
+
+ @Override
+ public boolean useLoginShell() {
+ return false;
+ }
+
+ @Override
+ public void setHostname(String hostname) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(HOSTNAME_ATTR, hostname);
+ }
+ }
+
+ @Override
+ public void setPassphrase(String passphrase) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setSecureAttribute(PASSPHRASE_ATTR, passphrase);
+ }
+ }
+
+ @Override
+ public void setPassword(String password) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setSecureAttribute(PASSWORD_ATTR, password);
+ }
+ }
+
+ @Override
+ public void setPort(int port) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(PORT_ATTR, Integer.toString(port));
+ }
+ }
+
+ @Override
+ public void setTimeout(int timeout) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(TIMEOUT_ATTR, Integer.toString(timeout));
+ }
+ }
+
+ @Override
+ public void setUseLoginShell(boolean useLogingShell) {
+ // Not used
+ }
+
+ @Override
+ public void setUsePassword(boolean usePassword) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(USE_PASSWORD_ATTR, Boolean.toString(usePassword));
+ }
+ }
+
+ @Override
+ public void setUsername(String username) {
+ if (fRemoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) fRemoteConnection;
+ wc.setAttribute(USERNAME_ATTR, username);
+ }
+ }
+
+ @Override
+ public String getProperty(String key) {
+ return fProperties.get(key);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionBootstrap.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionBootstrap.java
new file mode 100644
index 00000000000..5644f5a96fb
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionBootstrap.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Base64;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jsch.core.IJSchService;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IUserAuthenticatorService;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.jsch.core.JSchUserInfo;
+import org.eclipse.remote.internal.proxy.core.messages.Messages;
+import org.eclipse.remote.proxy.protocol.core.StreamChannelManager;
+import org.osgi.framework.Bundle;
+
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+
+public class ProxyConnectionBootstrap {
+ private final IJSchService jSchService;
+ private Session session;
+ private ChannelExec exec;
+
+ private class Context {
+ private State state;
+ private String osName;
+ private String osArch;
+ private String errorMessage;
+
+ private final SubMonitor monitor;
+ private final BufferedReader reader;
+ private final BufferedWriter writer;
+
+ public Context(BufferedReader reader, BufferedWriter writer, IProgressMonitor monitor) {
+ this.reader = reader;
+ this.writer = writer;
+ this.monitor = SubMonitor.convert(monitor);
+ setState(States.INIT);
+ }
+
+ State getState() {
+ return state;
+ }
+
+ SubMonitor getMonitor() {
+ return monitor;
+ }
+
+ void setState(State state) {
+ this.state = state;
+ }
+
+ String getOSName() {
+ return osName;
+ }
+
+ void setOSName(String osName) {
+ this.osName = osName;
+ }
+
+ String getOSArch() {
+ return osArch;
+ }
+
+ void setOSArch(String osArch) {
+ this.osArch = osArch;
+ }
+
+ void setErrorMessage(String message) {
+ this.errorMessage = message;
+ }
+
+ String getErrorMessage() {
+ return errorMessage;
+ }
+ }
+
+ private interface State {
+ /**
+ * @return true to keep processing, false to read more data.
+ */
+ boolean process(Context context) throws IOException;
+ }
+
+ private enum States implements State {
+ INIT {
+ @Override
+ public boolean process(Context context) throws IOException {
+ context.getMonitor().subTask(Messages.ProxyConnectionBootstrap_0);
+ String line = context.reader.readLine();
+ context.getMonitor().worked(1);
+ if (line.equals("running")) { //$NON-NLS-1$
+ context.setState(States.CHECK);
+ return true;
+ }
+ return false;
+ }
+ },
+ CHECK {
+ @Override
+ public boolean process(Context context) throws IOException {
+ context.getMonitor().subTask(Messages.ProxyConnectionBootstrap_1);
+ String bundleName = "org.eclipse.remote.proxy.server.core"; //$NON-NLS-1$
+ Bundle serverBundle = Platform.getBundle(bundleName);
+ if (serverBundle == null) {
+ throw new IOException(NLS.bind(Messages.ProxyConnectionBootstrap_2, bundleName));
+ }
+ context.writer.write("check " + serverBundle.getVersion() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ context.writer.flush();
+ String line = context.reader.readLine();
+ while (line != null) {
+ context.getMonitor().worked(2);
+ String[] parts = line.split(":"); //$NON-NLS-1$
+ switch (parts[0]) {
+ case "ok": //$NON-NLS-1$
+ String[] status = parts[1].split("/"); //$NON-NLS-1$
+ context.setOSName(status[1]);
+ context.setOSArch(status[2]);
+ context.setState(status[0].equals("found") ? States.START : States.DOWNLOAD); //$NON-NLS-1$
+ return true;
+ case "fail": //$NON-NLS-1$
+ context.setErrorMessage(parts[1]);
+ System.out.println("fail:" + parts[1]); //$NON-NLS-1$
+ return false;
+ case "debug": //$NON-NLS-1$
+ System.err.println(line);
+ break;
+ default:
+ System.err.println("Invalid response from bootstrap script: " + line); //$NON-NLS-1$
+ return false;
+ }
+ line = context.reader.readLine();
+ }
+ return false;
+ }
+ },
+ DOWNLOAD {
+ @Override
+ public boolean process(Context context) throws IOException {
+ context.getMonitor().subTask(Messages.ProxyConnectionBootstrap_3);
+ String bundleName = "org.eclipse.remote.proxy.server." + context.getOSName() + "." //$NON-NLS-1$//$NON-NLS-2$
+ + context.getOSArch();
+ Bundle serverBundle = Platform.getBundle(bundleName);
+ if (serverBundle == null) {
+ throw new IOException(NLS.bind(Messages.ProxyConnectionBootstrap_2, bundleName));
+ }
+ URL fileURL = FileLocator.find(serverBundle, new Path("proxy.server.tar.gz"), null); //$NON-NLS-1$
+ if (fileURL == null) {
+ return false;
+ }
+ File file = new File(FileLocator.toFileURL(fileURL).getFile());
+ long count = file.length() / 510;
+ context.writer.write("download " + count + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ context.writer.flush();
+ context.getMonitor().worked(2);
+ if (downloadFile(file, context.writer, context.getMonitor().newChild(5))) {
+ String line = context.reader.readLine();
+ while (line != null) {
+ String[] parts = line.split(":"); //$NON-NLS-1$
+ switch (parts[0]) {
+ case "ok": //$NON-NLS-1$
+ context.setState(States.START);
+ return true;
+ case "fail": //$NON-NLS-1$
+ context.setErrorMessage(parts[1]);
+ System.out.println("fail:" + parts[1]); //$NON-NLS-1$
+ return false;
+ case "debug": //$NON-NLS-1$
+ System.err.println(line);
+ break;
+ default:
+ System.err.println("Invalid response from bootstrap script: " + line); //$NON-NLS-1$
+ return false;
+ }
+ line = context.reader.readLine();
+ }
+ }
+ return false;
+ }
+
+ private boolean downloadFile(File file, BufferedWriter writer, IProgressMonitor monitor) {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ try {
+ Base64.Encoder encoder = Base64.getEncoder();
+ FileInputStream in = new FileInputStream(file);
+ byte[] buf = new byte[510]; // Multiple of 3
+ int n;
+ while ((n = in.read(buf)) >= 0) {
+ if (n < 510) {
+ writer.write(encoder.encodeToString(Arrays.copyOf(buf, n)) + "\n"); //$NON-NLS-1$
+ } else {
+ writer.write(encoder.encodeToString(buf));
+ }
+ subMon.setWorkRemaining(8);
+ }
+ writer.flush();
+ in.close();
+ return true;
+ } catch (IOException e) {
+ return false;
+ }
+ }
+ },
+ START {
+ @Override
+ public boolean process(Context context) throws IOException {
+ context.getMonitor().subTask(Messages.ProxyConnectionBootstrap_4);
+ context.writer.write("start\n"); //$NON-NLS-1$
+ context.writer.flush();
+ return false; // Finished
+ }
+ }
+ }
+
+ public ProxyConnectionBootstrap() {
+ jSchService = Activator.getService(IJSchService.class);
+ }
+
+ public StreamChannelManager run(IRemoteConnection connection, IProgressMonitor monitor)
+ throws RemoteConnectionException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 20);
+ try {
+ final Channel chan = openChannel(connection, subMon.newChild(10));
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(chan.getOutputStream()));
+ BufferedReader reader = new BufferedReader(new InputStreamReader(chan.getInputStream()));
+ subMon.beginTask(Messages.ProxyConnectionBootstrap_5, 10);
+ subMon.subTask(Messages.ProxyConnectionBootstrap_9);
+ URL fileURL = FileLocator.find(Activator.getDefault().getBundle(), new Path("bootstrap.sh"), null); //$NON-NLS-1$
+ if (fileURL == null) {
+ throw new RemoteConnectionException(Messages.ProxyConnectionBootstrap_6);
+ }
+ File file = new File(FileLocator.toFileURL(fileURL).getFile());
+ BufferedReader scriptReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+ String line;
+ while ((line = scriptReader.readLine()) != null) {
+ writer.write(line + "\n"); //$NON-NLS-1$
+ }
+ scriptReader.close();
+ writer.flush();
+ subMon.worked(2);
+ Context context = new Context(reader, writer, subMon.newChild(8));
+ while (context.getState().process(context)) {
+ // do state machine
+ }
+ if (context.getState() != States.START) {
+ context.writer.write("exit\n"); //$NON-NLS-1$
+ context.writer.flush();
+ throw new RemoteConnectionException(
+ NLS.bind(Messages.ProxyConnectionBootstrap_7, context.getErrorMessage()));
+ }
+ new Thread("server error stream") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(chan.getExtInputStream()));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ System.err.println("server: " + line); //$NON-NLS-1$
+ }
+ } catch (IOException e) {
+ // Ignore and terminate thread
+ }
+ }
+ }.start();
+ return new StreamChannelManager(chan.getInputStream(), chan.getOutputStream());
+ } catch (IOException | CoreException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ private Channel openChannel(IRemoteConnection connection, IProgressMonitor monitor)
+ throws RemoteConnectionException {
+ IRemoteConnectionWorkingCopy wc = connection.getWorkingCopy();
+ IRemoteConnectionHostService hostService = wc.getService(IRemoteConnectionHostService.class);
+ IUserAuthenticatorService authService = wc.getService(IUserAuthenticatorService.class);
+ try {
+ session = jSchService.createSession(hostService.getHostname(), hostService.getPort(),
+ hostService.getUsername());
+ session.setUserInfo(new JSchUserInfo(hostService, authService));
+ if (hostService.usePassword()) {
+ session.setConfig("PreferredAuthentications", //$NON-NLS-1$
+ "password,keyboard-interactive,gssapi-with-mic,publickey"); //$NON-NLS-1$
+ } else {
+ session.setConfig("PreferredAuthentications", //$NON-NLS-1$
+ "publickey,gssapi-with-mic,password,keyboard-interactive"); //$NON-NLS-1$
+ }
+ String password = hostService.getPassword();
+ if (!password.isEmpty()) {
+ session.setPassword(password);
+ }
+ jSchService.connect(session, hostService.getTimeout() * 1000, monitor);
+ if (monitor.isCanceled()) {
+ throw new RemoteConnectionException(Messages.ProxyConnectionBootstrap_8);
+ }
+ exec = (ChannelExec) session.openChannel("exec"); //$NON-NLS-1$
+ exec.setCommand("/bin/bash -l"); //$NON-NLS-1$
+ exec.connect();
+ return exec;
+ } catch (JSchException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionProviderService.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionProviderService.java
new file mode 100644
index 00000000000..68e228bff33
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyConnectionProviderService.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+* Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core;
+
+import org.eclipse.remote.core.IRemoteConnectionProviderService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+
+public class ProxyConnectionProviderService implements IRemoteConnectionProviderService {
+
+ private IRemoteConnectionType connectionType;
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (service.equals(IRemoteConnectionProviderService.class)) {
+ return (T) new ProxyConnectionProviderService(connectionType);
+ }
+ return null;
+ }
+ }
+
+ public ProxyConnectionProviderService(IRemoteConnectionType connectionType) {
+ this.connectionType = connectionType;
+ }
+
+ @Override
+ public void init() {
+ // Nothing
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileManager.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileManager.java
new file mode 100644
index 00000000000..f0dd21191a6
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileManager.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.RemoteServicesUtils;
+
+public class ProxyFileManager implements IRemoteFileService {
+ private final IRemoteConnection fConnection;
+
+ private ProxyFileManager(IRemoteConnection connection) {
+ fConnection = connection;
+ }
+
+ public static class Factory implements IRemoteFileService.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (IRemoteFileService.class.equals(service)) {
+ return (T) new ProxyFileManager(remoteConnection);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return fConnection;
+ }
+
+ @Override
+ public String getDirectorySeparator() {
+ return "/"; //$NON-NLS-1$
+ }
+
+ @Override
+ public IFileStore getResource(String pathStr) {
+ IPath path = RemoteServicesUtils.posixPath(pathStr);
+ if (!path.isAbsolute()) {
+ path = RemoteServicesUtils.posixPath(getBaseDirectory()).append(path);
+ }
+ return ProxyFileStore.getInstance(ProxyFileSystem.getURIFor(fConnection.getName(), path.toString()));
+ }
+
+ @Override
+ public String getBaseDirectory() {
+ return fConnection.getService(IRemoteProcessService.class).getWorkingDirectory();
+ }
+
+ @Override
+ public void setBaseDirectory(String path) {
+ fConnection.getService(IRemoteProcessService.class).setWorkingDirectory(path);
+ }
+
+ @Override
+ public String toPath(URI uri) {
+ return uri.getPath();
+ }
+
+ @Override
+ public URI toURI(IPath path) {
+ try {
+ return ProxyFileSystem.getURIFor(fConnection.getName(), path.toString());
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ @Override
+ public URI toURI(String path) {
+ return toURI(RemoteServicesUtils.posixPath(path));
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileStore.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileStore.java
new file mode 100644
index 00000000000..91df470fd8b
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileStore.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.filesystem.provider.FileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.RemoteServicesUtils;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.proxy.core.commands.ChildInfosCommand;
+import org.eclipse.remote.internal.proxy.core.commands.DeleteCommand;
+import org.eclipse.remote.internal.proxy.core.commands.FetchInfoCommand;
+import org.eclipse.remote.internal.proxy.core.commands.GetInputStreamCommand;
+import org.eclipse.remote.internal.proxy.core.commands.GetOutputStreamCommand;
+import org.eclipse.remote.internal.proxy.core.commands.MkdirCommand;
+import org.eclipse.remote.internal.proxy.core.commands.PutInfoCommand;
+import org.eclipse.remote.internal.proxy.core.messages.Messages;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ProxyFileStore extends FileStore {
+ /**
+ * Public factory method for obtaining ProxyFileStore instances.
+ *
+ * @param uri
+ * URI to get a fileStore for
+ * @return an ProxyFileStore instance for the URI.
+ */
+ public static ProxyFileStore getInstance(URI uri) {
+ synchronized (instanceMap) {
+ ProxyFileStore store = instanceMap.get(uri.toString());
+ if (store == null) {
+ store = new ProxyFileStore(uri);
+ instanceMap.put(uri.toString(), store);
+ }
+ return store;
+ }
+ }
+
+ private static Map<String, ProxyFileStore> instanceMap = new HashMap<>();
+
+ private final IPath fRemotePath;
+ private final URI fURI;
+
+ private ProxyFileStore(URI uri) {
+ fURI = uri;
+ fRemotePath = RemoteServicesUtils.posixPath(uri.getPath());
+ }
+
+ private ProxyConnection checkConnection(IProgressMonitor monitor) throws RemoteConnectionException {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connectionType = manager.getConnectionType(fURI);
+ if (connectionType == null) {
+ throw new RemoteConnectionException(NLS.bind(Messages.ProxyFileStore_0, fURI));
+ }
+
+ try {
+ IRemoteConnection connection = connectionType.getConnection(fURI);
+ if (connection == null) {
+ throw new RemoteConnectionException(NLS.bind(Messages.ProxyFileStore_1, fURI));
+ }
+ if (!connection.isOpen()) {
+ connection.open(monitor);
+ if (!connection.isOpen()) {
+ throw new RemoteConnectionException(Messages.ProxyFileStore_2);
+ }
+ }
+ return connection.getService(ProxyConnection.class);
+ } catch (CoreException e) {
+ throw new RemoteConnectionException(e);
+ }
+ }
+
+ @Override
+ public IFileInfo[] childInfos(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ ProxyConnection connection = checkConnection(subMon.newChild(1));
+ ChildInfosCommand command = new ChildInfosCommand(connection, fRemotePath.toString());
+ try {
+ return command.getResult(subMon.newChild(9));
+ } catch (ProxyException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+
+ @Override
+ public String[] childNames(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ IFileInfo[] infos = childInfos(options, subMon.newChild(10));
+ String[] names = new String[infos.length];
+ for (int i = 0; i < infos.length; i++) {
+ names[i] = infos[i].getName();
+ }
+ return names;
+ }
+
+ @Override
+ public void delete(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 20);
+ ProxyConnection connection = checkConnection(subMon.newChild(1));
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(9));
+ if (!subMon.isCanceled() && info.exists()) {
+ DeleteCommand command = new DeleteCommand(connection, options, fRemotePath.toString());
+ try {
+ command.getResult(subMon.newChild(10));
+ } catch (ProxyException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+ subMon.setWorkRemaining(0);
+ }
+
+ @Override
+ public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ ProxyConnection connection = checkConnection(subMon.newChild(1));
+ FetchInfoCommand command = new FetchInfoCommand(connection, fRemotePath.toString());
+ try {
+ return command.getResult(subMon.newChild(9));
+ } catch (ProxyException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+
+ @Override
+ public IFileStore getChild(String name) {
+ URI uri = ProxyFileSystem.getURIFor(ProxyFileSystem.getConnectionNameFor(fURI),
+ fRemotePath.append(name).toString());
+ return getInstance(uri);
+ }
+
+ @Override
+ public String getName() {
+ return getNameFromPath(fRemotePath);
+ }
+
+ /**
+ * Utility routing to get the file name from an absolute path.
+ *
+ * @param path
+ * path to extract file name from
+ * @return last segment of path, or the full path if it is root
+ */
+ private String getNameFromPath(IPath path) {
+ if (path.isRoot()) {
+ return path.toString();
+ }
+ return path.lastSegment();
+ }
+
+ @Override
+ public IFileStore getParent() {
+ if (fRemotePath.isRoot()) {
+ return null;
+ }
+ String parentPath = fRemotePath.toString();
+ if (fRemotePath.segmentCount() > 0) {
+ parentPath = fRemotePath.removeLastSegments(1).toString();
+ }
+ return getInstance(ProxyFileSystem.getURIFor(ProxyFileSystem.getConnectionNameFor(fURI), parentPath));
+ }
+
+ @Override
+ public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 16);
+ ProxyConnection connection = checkConnection(subMon.newChild(1));
+
+ if ((options & EFS.SHALLOW) == EFS.SHALLOW) {
+ IFileStore parent = getParent();
+ if (parent != null && !parent.fetchInfo(EFS.NONE, subMon.newChild(5)).exists()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRITE,
+ NLS.bind(Messages.ProxyFileStore_3, fRemotePath.toString()), null));
+ }
+ if (subMon.isCanceled()) {
+ return this;
+ }
+ }
+ subMon.setWorkRemaining(10);
+
+ try {
+ MkdirCommand command = new MkdirCommand(connection, options, fRemotePath.toString());
+ command.getResult(subMon.newChild(5));
+ } catch (Exception e) {
+ // Ignore any exceptions
+ }
+ if (!subMon.isCanceled()) {
+ /*
+ * Check if the result exists and is a directory, throw an exception if neither.
+ */
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(5));
+ if (!subMon.isCanceled()) {
+ if (!info.exists()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRITE,
+ NLS.bind(Messages.ProxyFileStore_4, fRemotePath.toString()), null));
+ }
+ if (!info.isDirectory()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(),
+ EFS.ERROR_WRONG_TYPE, NLS.bind(Messages.ProxyFileStore_5, fRemotePath.toString()), null));
+ }
+ }
+ }
+
+ return this;
+ }
+
+ @Override
+ public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 20);
+ ProxyConnection connection = checkConnection(subMon.newChild(1));
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(9));
+ if (!subMon.isCanceled()) {
+ if (!info.exists()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_READ,
+ NLS.bind(Messages.ProxyFileStore_6, fRemotePath.toString()), null));
+ }
+ if (info.isDirectory()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRONG_TYPE,
+ NLS.bind(Messages.ProxyFileStore_7, fRemotePath.toString()), null));
+ }
+ GetInputStreamCommand command = new GetInputStreamCommand(connection, options, fRemotePath.toString());
+ try {
+ return command.getResult(subMon.newChild(10));
+ } catch (ProxyException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 20);
+ ProxyConnection connection = checkConnection(subMon.newChild(1));
+ IFileInfo info = fetchInfo(EFS.NONE, subMon.newChild(9));
+ if (!subMon.isCanceled()) {
+ if (info.isDirectory()) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), EFS.ERROR_WRONG_TYPE,
+ NLS.bind(Messages.ProxyFileStore_7, fRemotePath.toString()), null));
+ }
+ GetOutputStreamCommand command = new GetOutputStreamCommand(connection, options, fRemotePath.toString());
+ try {
+ return command.getResult(subMon.newChild(10));
+ } catch (ProxyException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void putInfo(IFileInfo info, int options, IProgressMonitor monitor) throws CoreException {
+ SubMonitor subMon = SubMonitor.convert(monitor, 10);
+ ProxyConnection connection = checkConnection(subMon.newChild(1));
+ PutInfoCommand command = new PutInfoCommand(connection, info, options, fRemotePath.toString());
+ try {
+ command.getResult(subMon.newChild(9));
+ } catch (ProxyException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+
+ @Override
+ public URI toURI() {
+ return fURI;
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileSystem.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileSystem.java
new file mode 100644
index 00000000000..8af4820efd8
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyFileSystem.java
@@ -0,0 +1,86 @@
+/********************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License 2.0 which accompanies this distribution, and is
+ * available at https://www.eclipse.org/legal/epl-2.0/
+ ********************************************************************************/
+
+package org.eclipse.remote.internal.proxy.core;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.filesystem.provider.FileSystem;
+import org.eclipse.core.runtime.IPath;
+
+public class ProxyFileSystem extends FileSystem {
+ /**
+ * Return the connection name encoded in the URI.
+ *
+ * @param uri
+ * URI specifying a remote tools connection
+ * @return name of the connection or null if the URI is invalid
+ * @since 4.0
+ */
+ public static String getConnectionNameFor(URI uri) {
+ return uri.getAuthority();
+ }
+
+ /**
+ * Return an URI uniquely naming a remote tools remote resource.
+ *
+ * @param connectionName
+ * remote tools connection name
+ * @param path
+ * absolute path to resource as valid on the remote system
+ * @return an URI uniquely naming the remote resource.
+ */
+ public static URI getURIFor(String connectionName, String path) {
+ try {
+ return new URI("proxy", connectionName, path, null, null); //$NON-NLS-1$
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Default constructor.
+ */
+ public ProxyFileSystem() {
+ super();
+ }
+
+ @Override
+ public int attributes() {
+ // Attributes supported by JSch IFileService
+ return EFS.ATTRIBUTE_READ_ONLY | EFS.ATTRIBUTE_EXECUTABLE | EFS.ATTRIBUTE_SYMLINK | EFS.ATTRIBUTE_LINK_TARGET;
+ }
+
+ @Override
+ public boolean canDelete() {
+ return true;
+ }
+
+ @Override
+ public boolean canWrite() {
+ return true;
+ }
+
+ @Override
+ public IFileStore getStore(IPath path) {
+ return EFS.getNullFileSystem().getStore(path);
+ }
+
+ @Override
+ public IFileStore getStore(URI uri) {
+ try {
+ return ProxyFileStore.getInstance(uri);
+ } catch (Exception e) {
+ // Could be an URI format exception
+ Activator.log(e);
+ return EFS.getNullFileSystem().getStore(uri);
+ }
+ }
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java
new file mode 100644
index 00000000000..74b64b3a4a8
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcess.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessControlService;
+import org.eclipse.remote.core.IRemoteProcessSignalService;
+import org.eclipse.remote.core.IRemoteProcessTerminalService;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+
+public class ProxyProcess implements IRemoteProcessControlService, IRemoteProcessTerminalService {
+ private IRemoteProcess remoteProcess;
+
+ private final StreamChannel stdIOChan;
+ private final StreamChannel stdErrChan;
+ private final StreamChannel controlChan;
+ private final DataOutputStream cmdStream;
+ private final DataInputStream resultStream;
+ private final Thread cmdThread;
+
+ private volatile int exitValue;
+ private volatile boolean isCompleted;
+
+ public static class Factory implements IRemoteProcess.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends IRemoteProcess.Service> T getService(IRemoteProcess remoteProcess, Class<T> service) {
+ if (ProxyProcess.class.equals(service)) {
+ return (T) new ProxyProcess(remoteProcess);
+ }
+ if (IRemoteProcessControlService.class.equals(service) || IRemoteProcessSignalService.class.equals(service)
+ || IRemoteProcessTerminalService.class.equals(service)) {
+ return (T) remoteProcess.getService(ProxyProcess.class);
+ }
+ return null;
+ }
+ }
+
+ protected ProxyProcess(IRemoteProcess process) {
+ remoteProcess = process;
+ ProxyProcessBuilder builder = (ProxyProcessBuilder) process.getProcessBuilder();
+ List<StreamChannel> streams = builder.getStreams();
+ controlChan = streams.get(0);
+ stdIOChan = streams.get(1);
+ stdErrChan = streams.size() > 2 ? streams.get(2) : null;
+ cmdStream = new DataOutputStream(controlChan.getOutputStream());
+ resultStream = new DataInputStream(controlChan.getInputStream());
+ isCompleted = false;
+ exitValue = 0;
+
+ cmdThread = new Thread("process result reader") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ try {
+ exitValue = resultStream.readInt();
+ } catch (IOException e) {
+ // Finish
+ }
+ isCompleted = true;
+ try {
+ stdIOChan.close();
+ } catch (IOException e1) {
+ // Ignore
+ }
+ try {
+ if (stdErrChan != null) {
+ stdErrChan.close();
+ }
+ } catch (IOException e1) {
+ // Ignore
+ }
+ try {
+ controlChan.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ };
+ cmdThread.start();
+ }
+
+ @Override
+ public void destroy() {
+ try {
+ cmdStream.writeByte(Protocol.CONTROL_KILL);
+ cmdStream.flush();
+ } catch (IOException e) {
+ isCompleted = true;
+ }
+ }
+
+ @Override
+ public int exitValue() {
+ if (!isCompleted) {
+ throw new IllegalThreadStateException();
+ }
+ return exitValue;
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ if (stdErrChan == null) {
+ return new InputStream() {
+ @Override
+ public int read() throws IOException {
+ return -1;
+ }
+
+ @Override
+ public int available() {
+ return 0;
+ }
+ };
+ }
+ return stdErrChan.getInputStream();
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return stdIOChan.getInputStream();
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ return stdIOChan.getOutputStream();
+ }
+
+ @Override
+ public int waitFor() throws InterruptedException {
+ cmdThread.join();
+ return exitValue;
+ }
+
+ @Override
+ public boolean isCompleted() {
+ return isCompleted;
+ }
+
+ @Override
+ public IRemoteProcess getRemoteProcess() {
+ return remoteProcess;
+ }
+
+ @Override
+ public void setTerminalSize(int cols, int rows, int pwidth, int pheight) {
+ try {
+ cmdStream.writeByte(Protocol.CONTROL_SETTERMINALSIZE);
+ cmdStream.writeInt(cols);
+ cmdStream.writeInt(rows);
+ cmdStream.writeInt(pwidth);
+ cmdStream.writeInt(pheight);
+ cmdStream.flush();
+ } catch (IOException e) {
+ // Dealt with somewhere else hopefully
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcessBuilder.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcessBuilder.java
new file mode 100644
index 00000000000..f37985e8259
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/ProxyProcessBuilder.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.remote.core.AbstractRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.internal.proxy.core.commands.ExecCommand;
+import org.eclipse.remote.internal.proxy.core.commands.ShellCommand;
+import org.eclipse.remote.internal.proxy.core.messages.Messages;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ProxyProcessBuilder extends AbstractRemoteProcessBuilder {
+ private final ProxyConnection proxyConnection;
+ private Map<String, String> remoteEnv;
+ private List<StreamChannel> streams = new ArrayList<>();
+
+ public ProxyProcessBuilder(ProxyConnection connection, List<String> command) {
+ super(connection.getRemoteConnection(), command);
+ proxyConnection = connection;
+ IRemoteFileService fileSvc = proxyConnection.getRemoteConnection().getService(IRemoteFileService.class);
+ if (fileSvc != null) {
+ directory(fileSvc.getResource(proxyConnection.getWorkingDirectory()));
+ }
+ }
+
+ public ProxyProcessBuilder(ProxyConnection connection, String... command) {
+ this(connection, Arrays.asList(command));
+ }
+
+ /**
+ * Constructor for creating command shell
+ * @param connection
+ */
+ public ProxyProcessBuilder(ProxyConnection connection) {
+ super(connection.getRemoteConnection(), (List<String>) null);
+ proxyConnection = connection;
+ redirectErrorStream(true);
+ }
+
+ @Override
+ public Map<String, String> environment() {
+ if (remoteEnv == null) {
+ remoteEnv = new HashMap<>(proxyConnection.getEnv());
+ }
+ return remoteEnv;
+ }
+
+ @Override
+ public int getSupportedFlags() {
+ return NONE;
+ }
+
+ @Override
+ public IRemoteProcess start(int flags) throws IOException {
+ final ProxyConnection conn = getRemoteConnection().getService(ProxyConnection.class);
+ if (conn == null) {
+ throw new IOException(Messages.ProxyProcessBuilder_0);
+ }
+
+ Job job;
+
+ final List<String> cmdArgs = command();
+ if (cmdArgs != null) {
+ if (cmdArgs.size() < 1) {
+ throw new IOException(Messages.ProxyProcessBuilder_1);
+ }
+ /*
+ * If environment has not been touched, then don't send anything
+ */
+ final Map<String, String> env = new HashMap<>();
+ if (remoteEnv != null) {
+ env.putAll(remoteEnv);
+ }
+
+ final boolean append = (flags & IRemoteProcessBuilder.APPEND_ENVIRONMENT) != 0 || remoteEnv == null;
+
+ streams.add(conn.openChannel());
+ streams.add(conn.openChannel());
+ streams.add(conn.openChannel());
+
+ job = new Job("process executor") { //$NON-NLS-1$
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ ExecCommand cmd = new ExecCommand(conn, cmdArgs, env, directory().toURI().getPath(),
+ redirectErrorStream(), append, streams.get(0).getId(), streams.get(1).getId(),
+ streams.get(2).getId());
+ try {
+ cmd.getResult(monitor);
+ } catch (ProxyException e) {
+ return new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage());
+ }
+ return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
+ }
+ };
+ } else {
+ /*
+ * Start command shell
+ */
+ streams.add(conn.openChannel());
+ streams.add(conn.openChannel());
+
+ job = new Job("process executor") { //$NON-NLS-1$
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ ShellCommand cmd = new ShellCommand(conn, streams.get(0).getId(), streams.get(1).getId());
+ try {
+ cmd.getResult(monitor);
+ } catch (ProxyException e) {
+ return new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage());
+ }
+ return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS;
+ }
+ };
+ }
+
+ job.schedule();
+ try {
+ job.join();
+ } catch (InterruptedException e) {
+ throw new IOException(e.getMessage());
+ }
+ if (!job.getResult().isOK()) {
+ throw new IOException(job.getResult().getMessage());
+ }
+
+ return newRemoteProcess();
+ }
+
+ public List<StreamChannel> getStreams() {
+ return streams;
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/AbstractCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/AbstractCommand.java
new file mode 100644
index 00000000000..c588d4ceebc
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/AbstractCommand.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.IOException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.internal.proxy.core.messages.Messages;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public abstract class AbstractCommand<T> implements Callable<T> {
+ private IProgressMonitor progressMonitor;
+
+ private static ExecutorService executors = Executors.newSingleThreadExecutor();
+
+ private final ProxyConnection connection;
+
+ private Future<T> asyncCmdInThread() throws ProxyException {
+ return executors.submit(this);
+ }
+
+ public StreamChannel openChannel() throws IOException {
+ return connection.openChannel();
+ }
+
+ public IProgressMonitor getProgressMonitor() {
+ return progressMonitor;
+ }
+
+ /**
+ * Function opens exec channel and then executes the exec operation. If
+ * run on the main thread it executes it on a separate thread
+ */
+ public T getResult(IProgressMonitor monitor) throws ProxyException {
+ Future<T> future = null;
+ progressMonitor = SubMonitor.convert(monitor, 10);
+ future = asyncCmdInThread();
+ return waitCmdInThread(future);
+ }
+
+ private T waitCmdInThread(Future<T> future) throws ProxyException {
+ boolean bInterrupted = Thread.interrupted();
+ while (!getProgressMonitor().isCanceled()) {
+ try {
+ return future.get(100, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ bInterrupted = true;
+ } catch (TimeoutException e) {
+ // ignore
+ } catch (ExecutionException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ getProgressMonitor().worked(1);
+ }
+ if (bInterrupted) {
+ Thread.currentThread().interrupt(); // set current thread flag
+ }
+ future.cancel(true);
+ throw new ProxyException(Messages.AbstractCommand_0);
+ }
+
+ @Override
+ public abstract T call() throws ProxyException;
+
+ public AbstractCommand(ProxyConnection conn) {
+ this.connection = conn;
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ChildInfosCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ChildInfosCommand.java
new file mode 100644
index 00000000000..7f6bdaf0d61
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ChildInfosCommand.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.SerializableFileInfo;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ChildInfosCommand extends AbstractCommand<IFileInfo[]> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final String path;
+
+ public ChildInfosCommand(ProxyConnection conn, String path) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.path = path;
+ }
+
+ @Override
+ public IFileInfo[] call() throws ProxyException {
+ try {
+ final StreamChannel chan = openChannel();
+
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_CHILDINFOS);
+ out.writeByte(chan.getId());
+ out.writeUTF(path);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+
+ DataInputStream resultStream = new DataInputStream(chan.getInputStream());
+ int length = resultStream.readInt();
+ SerializableFileInfo sInfo = new SerializableFileInfo();
+ IFileInfo[] infos = new IFileInfo[length];
+ for (int i = 0; i < length; i++) {
+ sInfo.readObject(resultStream);
+ infos[i] = sInfo.getIFileInfo();
+ }
+ chan.close();
+ return infos;
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/DeleteCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/DeleteCommand.java
new file mode 100644
index 00000000000..a4a7adfaea8
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/DeleteCommand.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class DeleteCommand extends AbstractCommand<Void> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final int options;
+ private final String path;
+
+ public DeleteCommand(ProxyConnection conn, int options, String path) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.options = options;
+ this.path = path;
+ }
+
+ @Override
+ public Void call() throws ProxyException {
+ try {
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_DELETE);
+ out.writeInt(options);
+ out.writeUTF(path);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+ return null;
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ExecCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ExecCommand.java
new file mode 100644
index 00000000000..9cd6d04d4b4
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ExecCommand.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ExecCommand extends AbstractCommand<Void> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final List<String> command;
+ private final Map<String, String> env;
+ private final String directory;
+ private final boolean appendEnv;
+ private final boolean redirect;
+ private final int cmdChan;
+ private final int ioChan;
+ private final int errChan;
+
+ public ExecCommand(ProxyConnection conn, List<String> command, Map<String, String> env, String directory,
+ boolean redirect, boolean appendEnv, int cmdChan, int ioChan, int errChan) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.command = command;
+ this.env = env;
+ this.directory = directory;
+ this.redirect = redirect;
+ this.appendEnv = appendEnv;
+ this.cmdChan = cmdChan;
+ this.ioChan = ioChan;
+ this.errChan = errChan;
+ }
+
+ @Override
+ public Void call() throws ProxyException {
+ try {
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_EXEC);
+ out.writeByte(cmdChan);
+ out.writeByte(ioChan);
+ out.writeByte(errChan);
+ out.writeInt(command.size());
+ for (String arg : command) {
+ out.writeUTF(arg);
+ }
+ out.writeInt(env.size());
+ for (Map.Entry<String, String> entry : env.entrySet()) {
+ out.writeUTF(entry.getKey());
+ out.writeUTF(entry.getValue());
+ }
+ out.writeUTF(directory);
+ out.writeBoolean(redirect);
+ out.writeBoolean(appendEnv);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ return null;
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/FetchInfoCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/FetchInfoCommand.java
new file mode 100644
index 00000000000..b17fdfa0664
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/FetchInfoCommand.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.SerializableFileInfo;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class FetchInfoCommand extends AbstractCommand<IFileInfo> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final String path;
+
+ public FetchInfoCommand(ProxyConnection conn, String path) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.path = path;
+ }
+
+ @Override
+ public IFileInfo call() throws ProxyException {
+ try {
+ final StreamChannel chan = openChannel();
+
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_FETCHINFO);
+ out.writeByte(chan.getId());
+ out.writeUTF(path);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+
+ DataInputStream resultStream = new DataInputStream(chan.getInputStream());
+ SerializableFileInfo info = new SerializableFileInfo();
+ info.readObject(resultStream);
+ chan.close();
+ return info.getIFileInfo();
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetCwdCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetCwdCommand.java
new file mode 100644
index 00000000000..d10956d2f3f
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetCwdCommand.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class GetCwdCommand extends AbstractCommand<String> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+
+ public GetCwdCommand(ProxyConnection conn) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ }
+
+ @Override
+ public String call() throws ProxyException {
+ try {
+ final StreamChannel chan = openChannel();
+ DataInputStream resultStream = new DataInputStream(chan.getInputStream());
+
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_GETCWD);
+ out.writeByte(chan.getId());
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+
+ String cwd = resultStream.readUTF();
+ chan.close();
+ return cwd;
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetEnvCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetEnvCommand.java
new file mode 100644
index 00000000000..ec245d2aa28
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetEnvCommand.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class GetEnvCommand extends AbstractCommand<Map<String, String>> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+
+ public GetEnvCommand(ProxyConnection conn) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ }
+
+ @Override
+ public Map<String, String> call() throws ProxyException {
+ try {
+ final StreamChannel chan = openChannel();
+ DataInputStream resultStream = new DataInputStream(chan.getInputStream());
+
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_GETENV);
+ out.writeByte(chan.getId());
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+
+ int len = resultStream.readInt();
+ Map<String, String> env = new HashMap<>(len);
+ for (int i = 0; i < len; i++) {
+ String key = resultStream.readUTF();
+ String value = resultStream.readUTF();
+ env.put(key, value);
+ }
+ chan.close();
+ return env;
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetInputStreamCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetInputStreamCommand.java
new file mode 100644
index 00000000000..6bd9dfdf54f
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetInputStreamCommand.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class GetInputStreamCommand extends AbstractCommand<InputStream> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final int options;
+ private final String path;
+
+ public GetInputStreamCommand(ProxyConnection conn, int options, String path) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.options = options;
+ this.path = path;
+ }
+
+ @Override
+ public InputStream call() throws ProxyException {
+ try {
+ StreamChannel chan = openChannel();
+
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_GETINPUTSTREAM);
+ out.writeByte(chan.getId());
+ out.writeInt(options);
+ out.writeUTF(path);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+
+ return new BufferedInputStream(chan.getInputStream());
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetOutputStreamCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetOutputStreamCommand.java
new file mode 100644
index 00000000000..f50515b62c0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetOutputStreamCommand.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class GetOutputStreamCommand extends AbstractCommand<OutputStream> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final int options;
+ private final String path;
+
+ public GetOutputStreamCommand(ProxyConnection conn, int options, String path) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.options = options;
+ this.path = path;
+ }
+
+ @Override
+ public OutputStream call() throws ProxyException {
+ try {
+ StreamChannel chan = openChannel();
+
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_GETOUTPUTSTREAM);
+ out.writeByte(chan.getId());
+ out.writeInt(options);
+ out.writeUTF(path);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+
+ return new BufferedOutputStream(chan.getOutputStream());
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetPropertiesCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetPropertiesCommand.java
new file mode 100644
index 00000000000..f7e416b4f9b
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/GetPropertiesCommand.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class GetPropertiesCommand extends AbstractCommand<Map<String, String>> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+
+ public GetPropertiesCommand(ProxyConnection conn) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ }
+
+ @Override
+ public Map<String, String> call() throws ProxyException {
+ try {
+ final StreamChannel chan = openChannel();
+ DataInputStream resultStream = new DataInputStream(chan.getInputStream());
+
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_GETPROPERTIES);
+ out.writeByte(chan.getId());
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+
+ int len = resultStream.readInt();
+ Map<String, String> props = new HashMap<>(len);
+ for (int i = 0; i < len; i++) {
+ String key = resultStream.readUTF();
+ String value = resultStream.readUTF();
+ props.put(key, value);
+ }
+ chan.close();
+ return props;
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/MkdirCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/MkdirCommand.java
new file mode 100644
index 00000000000..6fcffd6ec78
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/MkdirCommand.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class MkdirCommand extends AbstractCommand<Void> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final int options;
+ private final String path;
+
+ public MkdirCommand(ProxyConnection conn, int options, String path) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.options = options;
+ this.path = path;
+ }
+
+ @Override
+ public Void call() throws ProxyException {
+ try {
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_MKDIR);
+ out.writeInt(options);
+ out.writeUTF(path);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+ return null;
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/PutInfoCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/PutInfoCommand.java
new file mode 100644
index 00000000000..1e87466054b
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/PutInfoCommand.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.SerializableFileInfo;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class PutInfoCommand extends AbstractCommand<Void> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final IFileInfo info;
+ private final int options;
+ private final String path;
+
+ public PutInfoCommand(ProxyConnection conn, IFileInfo info, int options, String path) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.info = info;
+ this.options = options;
+ this.path = path;
+ }
+
+ @Override
+ public Void call() throws ProxyException {
+ try {
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_PUTINFO);
+ out.writeInt(options);
+ out.writeUTF(path);
+ SerializableFileInfo sInfo = new SerializableFileInfo(info);
+ sInfo.writeObject(out);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+ return null;
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ShellCommand.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ShellCommand.java
new file mode 100644
index 00000000000..a47039d6987
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/commands/ShellCommand.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.core.commands;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ShellCommand extends AbstractCommand<Void> {
+
+ private final DataOutputStream out;
+ private final DataInputStream in;
+ private final int cmdChan;
+ private final int ioChan;
+
+ public ShellCommand(ProxyConnection conn, int cmdChan, int ioChan) {
+ super(conn);
+ this.out = new DataOutputStream(conn.getCommandChannel().getOutputStream());
+ this.in = new DataInputStream(conn.getCommandChannel().getInputStream());
+ this.cmdChan = cmdChan;
+ this.ioChan = ioChan;
+ }
+
+ @Override
+ public Void call() throws ProxyException {
+ try {
+ out.writeByte(Protocol.PROTO_COMMAND);
+ out.writeShort(Protocol.CMD_SHELL);
+ out.writeByte(cmdChan);
+ out.writeByte(ioChan);
+ out.flush();
+
+ byte res = in.readByte();
+ if (res != Protocol.PROTO_OK) {
+ String errMsg = in.readUTF();
+ throw new ProxyException(errMsg);
+ }
+ } catch (IOException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ return null;
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/Messages.java b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/Messages.java
new file mode 100644
index 00000000000..b3f9947b80c
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/Messages.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2013 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial Implementation
+ *
+ */
+package org.eclipse.remote.internal.proxy.core.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_ID = "org.eclipse.remote.internal.proxy.core.messages.messages"; //$NON-NLS-1$
+
+ public static String AbstractCommand_0;
+
+ public static String AbstractRemoteCommand_format1;
+ public static String AbstractRemoteCommand_format2;
+ public static String AbstractRemoteCommand_Get_symlink_target;
+ public static String AbstractRemoteCommand_Operation_cancelled_by_user;
+ public static String AuthInfo_Authentication_message;
+ public static String ExecCommand_Exec_command;
+
+ public static String GetInputStreamCommand_Receiving;
+
+ public static String GetOutputStreamCommand_Sending;
+ public static String JSchConnection_0;
+
+ public static String JSchConnection_Connection_was_cancelled;
+ public static String JSchConnection_connectionNotOpen;
+ public static String JSchConnection_Executing_command;
+ public static String JSchConnection_remote_address_must_be_set;
+ public static String JSchConnection_remotePort;
+ public static String JSchConnection_forwarding;
+ public static String JSchConnection_Remote_host_does_not_support_sftp;
+ public static String JSchConnection_Unable_to_open_sftp_channel;
+ public static String JSchConnection_username_must_be_set;
+ public static String JSchConnectionManager_connection_with_name_exists;
+ public static String JSchConnectionManager_cannotRemoveOpenConnection;
+ public static String JSchConnectionManager_invalidConnectionType;
+ public static String JSchConnectionProxyFactory_failed;
+ public static String JSchConnectionProxyFactory_ProxyCommandFailed;
+ public static String JSchConnectionProxyFactory_timedOut;
+ public static String JSchConnectionProxyFactory_wasCanceled;
+ public static String JSchProcess_exitValue_exception_msg;
+ public static String JSchProcessBuilder_Connection_is_not_open;
+ public static String JschFileStore_Connection_is_not_open;
+ public static String JschFileStore_File_doesnt_exist;
+ public static String JschFileStore_Invalid_connection_for_URI;
+ public static String JschFileStore_Is_a_directory;
+ public static String JschFileStore_No_remote_services_found_for_URI;
+ public static String JschFileStore_The_directory_could_not_be_created;
+
+ public static String JschFileStore_A_file_of_name_already_exists;
+ public static String JschFileStore_The_parent_of_directory_does_not_exist;
+
+ public static String ProxyCommandShell_0;
+
+ public static String ProxyConnection_0;
+
+ public static String ProxyConnection_2;
+
+ public static String ProxyConnectionBootstrap_0;
+
+ public static String ProxyConnectionBootstrap_1;
+
+ public static String ProxyConnectionBootstrap_2;
+
+ public static String ProxyConnectionBootstrap_3;
+
+ public static String ProxyConnectionBootstrap_4;
+
+ public static String ProxyConnectionBootstrap_5;
+
+ public static String ProxyConnectionBootstrap_6;
+
+ public static String ProxyConnectionBootstrap_7;
+
+ public static String ProxyConnectionBootstrap_8;
+
+ public static String ProxyConnectionBootstrap_9;
+
+ public static String ProxyFileStore_0;
+
+ public static String ProxyFileStore_1;
+
+ public static String ProxyFileStore_2;
+
+ public static String ProxyFileStore_3;
+
+ public static String ProxyFileStore_4;
+
+ public static String ProxyFileStore_5;
+
+ public static String ProxyFileStore_6;
+
+ public static String ProxyFileStore_7;
+
+ public static String ProxyProcessBuilder_0;
+
+ public static String ProxyProcessBuilder_1;
+
+ static {
+ // load message values from bundle file
+ NLS.initializeMessages(BUNDLE_ID, Messages.class);
+ }
+
+ private Messages() {
+ // cannot create new instance
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/messages.properties b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/messages.properties
new file mode 100644
index 00000000000..518d8f97b5f
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.core/src/org/eclipse/remote/internal/proxy/core/messages/messages.properties
@@ -0,0 +1,72 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial implementation
+###############################################################################
+AbstractCommand_0=Operation cancelled by user
+AbstractRemoteCommand_format1={0,number,integer} {1} completed
+AbstractRemoteCommand_format2={0,number,integer} {1} of {2,number,integer} {3} complete ({4,number,percent})
+AbstractRemoteCommand_Get_symlink_target=Get symlink target
+AbstractRemoteCommand_Operation_cancelled_by_user=Operation cancelled by user
+AuthInfo_Authentication_message=Authentication Message
+ExecCommand_Exec_command=Executing command "{0}"
+GetInputStreamCommand_Receiving=Receiving {0}:
+GetOutputStreamCommand_Sending=Sending {0}:
+JSchConnection_0=Connection canceled by user
+JSchConnection_Connection_was_cancelled=Connection was cancelled
+JSchConnection_connectionNotOpen=Connection is not open
+JSchConnection_Executing_command=Executing command "{0}"
+JSchConnection_remote_address_must_be_set=Remote address must be set before opening connection
+JSchConnection_remotePort=Could not allocate remote port
+JSchConnection_forwarding=Setting up remote forwarding
+JSchConnection_Remote_host_does_not_support_sftp=Remote host does not support sftp. Remote functionality requires sftp to be enabled
+JSchConnection_Unable_to_open_sftp_channel=Unable to open sftp channel: check sftp is enabled on remote host
+JSchConnection_username_must_be_set=Username must be set before opening connection
+JSchConnectionManager_connection_with_name_exists=A connection with name \"{0}\" already exists
+JSchConnectionManager_cannotRemoveOpenConnection=Cannot remove an open connection
+JSchConnectionManager_invalidConnectionType=Invalid connection type
+JSchConnectionProxyFactory_failed=failed
+JSchConnectionProxyFactory_ProxyCommandFailed=Proxy command "{0}" {1} and printed message "{2}"
+JSchConnectionProxyFactory_timedOut=timed out
+JSchConnectionProxyFactory_wasCanceled=was canceled
+JSchProcess_exitValue_exception_msg=process has not exited
+JSchProcessBuilder_Connection_is_not_open=Connection is not open
+JschFileStore_Connection_is_not_open=Connection is not open
+JschFileStore_File_doesnt_exist=File {0} doesn't exist
+JschFileStore_Invalid_connection_for_URI=Invalid connection for URI: "{0}"
+JschFileStore_Is_a_directory={0} is a directory
+JschFileStore_No_remote_services_found_for_URI=No remote services found for URI: "{0}"
+JschFileStore_The_directory_could_not_be_created=The directory {0} could not be created
+JschFileStore_A_file_of_name_already_exists=A file of name {0} already exists
+JschFileStore_The_parent_of_directory_does_not_exist=The parent of directory {0} does not exist
+ProxyCommandShell_0=Unable to locate connection for command shell
+ProxyConnection_0=Opening connection...
+ProxyConnection_2=User canceled opening connection
+ProxyConnectionBootstrap_0=Initializing
+ProxyConnectionBootstrap_1=Validating environment
+ProxyConnectionBootstrap_2=Unable to locate server bundle {0}
+ProxyConnectionBootstrap_3=Updating server proxy
+ProxyConnectionBootstrap_4=Starting server
+ProxyConnectionBootstrap_5=Checking server installation
+ProxyConnectionBootstrap_6=Unable to locate bootstrap shell
+ProxyConnectionBootstrap_7=Unable to start server: {0}
+ProxyConnectionBootstrap_8=User canceled connection open
+ProxyConnectionBootstrap_9=Loading bootstrap shell
+ProxyFileStore_0=No remote services found for URI {0}
+ProxyFileStore_1=Invalid connection for URI {0}
+ProxyFileStore_2=Connection is not open
+ProxyFileStore_3=The parent of directory {0} does not exist
+ProxyFileStore_4=The directory {0} could not be created
+ProxyFileStore_5=A file of name {0} already exists
+ProxyFileStore_6=File {0} does not exist
+ProxyFileStore_7={0} is a directory
+ProxyProcessBuilder_0=Unable to located connection for this process
+ProxyProcessBuilder_1=No command to run\!
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.classpath b/remote/org.eclipse.remote.proxy.protocol.core/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.project b/remote/org.eclipse.remote.proxy.protocol.core/.project
new file mode 100644
index 00000000000..8a48fee1d62
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.protocol.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.protocol.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..9c387125423
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.proxy.protocol.core;singleton:=true
+Bundle-Version: 2.0.200.qualifier
+Bundle-Activator: org.eclipse.remote.internal.proxy.protocol.core.Activator
+Bundle-Vendor: %pluginProvider
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.proxy.protocol.core,
+ org.eclipse.remote.proxy.protocol.core.exceptions
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: org.eclipse.core.filesystem,
+ org.eclipse.core.filesystem.provider,
+ org.eclipse.core.runtime,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/about.html b/remote/org.eclipse.remote.proxy.protocol.core/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/build.properties b/remote/org.eclipse.remote.proxy.protocol.core/build.properties
new file mode 100644
index 00000000000..f946f4ece5a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/build.properties
@@ -0,0 +1,9 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.properties,\
+ about.html
+src.includes = about.html
+
+
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/plugin.properties b/remote/org.eclipse.remote.proxy.protocol.core/plugin.properties
new file mode 100644
index 00000000000..030ad74eb9f
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2016 Oak Ridge National Laboratory and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Proxy Protocol Support
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/internal/proxy/protocol/core/Activator.java b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/internal/proxy/protocol/core/Activator.java
new file mode 100644
index 00000000000..b0a3d71ecfa
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/internal/proxy/protocol/core/Activator.java
@@ -0,0 +1,101 @@
+package org.eclipse.remote.internal.proxy.protocol.core;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.proxy.protocol.core"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get unique identifier
+ *
+ * @return
+ * @since 5.0
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() == null) {
+ return PLUGIN_ID;
+ }
+ return getDefault().getBundle().getSymbolicName();
+ }
+
+ /**
+ * Logs the specified status with this plug-in's log.
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Logs an internal error with the specified message.
+ *
+ * @param message
+ * the error message to log
+ */
+ public static void log(String message) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
+ }
+
+ /**
+ * Logs an internal error with the specified throwable
+ *
+ * @param e
+ * the exception to be logged
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
+ }
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/Protocol.java b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/Protocol.java
new file mode 100644
index 00000000000..23eb1474f5e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/Protocol.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.proxy.protocol.core;
+
+public class Protocol {
+ public static final int MAGIC = 0xAFFA;
+
+ public final static byte PROTO_COMMAND = 1;
+ public final static byte PROTO_SHUTDOWN = 2;
+ public final static byte PROTO_ERROR = 126;
+ public final static byte PROTO_OK = 0;
+
+ public final static short CmdBase = 100;
+
+ public final static short CMD_EXEC = CmdBase + 1;
+ public final static short CMD_SHELL = CmdBase + 2;
+ public final static short CMD_GETCWD = CmdBase + 3;
+ public final static short CMD_GETENV = CmdBase + 4;
+ public final static short CMD_CHILDINFOS = CmdBase + 5;
+ public final static short CMD_DELETE = CmdBase + 6;
+ public final static short CMD_FETCHINFO = CmdBase + 7;
+ public final static short CMD_GETINPUTSTREAM = CmdBase + 8;
+ public final static short CMD_GETOUTPUTSTREAM = CmdBase + 9;
+ public final static short CMD_MKDIR = CmdBase + 10;
+ public final static short CMD_PUTINFO = CmdBase + 11;
+ public final static short CMD_GETPROPERTIES = CmdBase + 12;
+
+ /**
+ * @since 2.0
+ */
+ public final static byte CONTROL_KILL = 0;
+ /**
+ * @since 2.0
+ */
+ public final static byte CONTROL_SETTERMINALSIZE = 1;
+}
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/SerializableFileInfo.java b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/SerializableFileInfo.java
new file mode 100644
index 00000000000..6a20c5e1ee6
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/SerializableFileInfo.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.proxy.protocol.core;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.provider.FileInfo;
+
+public class SerializableFileInfo implements Serializable {
+ private static final long serialVersionUID = -1986643088683154145L;
+
+ private IFileInfo info;
+
+ public SerializableFileInfo() {
+ }
+
+ public SerializableFileInfo(IFileInfo info) {
+ setIFileInfo(info);
+ }
+
+ public void setIFileInfo(IFileInfo info) {
+ this.info = info;
+ }
+
+ public IFileInfo getIFileInfo() {
+ return info;
+ }
+
+ public void writeObject(DataOutputStream out) throws IOException {
+ out.writeUTF(info.getName());
+ boolean symlink = info.getAttribute(EFS.ATTRIBUTE_SYMLINK);
+ out.writeBoolean(symlink);
+ if (symlink) {
+ out.writeUTF(info.getStringAttribute(EFS.ATTRIBUTE_LINK_TARGET));
+ }
+ out.writeBoolean(info.exists());
+ out.writeLong(info.getLastModified());
+ out.writeLong(info.getLength());
+ out.writeBoolean(info.isDirectory());
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_GROUP_READ));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_GROUP_WRITE));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_OTHER_READ));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_OTHER_WRITE));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_OWNER_READ));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_OWNER_WRITE));
+ out.writeBoolean(info.getAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE));
+ }
+
+ public void readObject(DataInputStream in) throws IOException {
+ FileInfo newInfo = new FileInfo();
+
+ try {
+ newInfo.setName(in.readUTF());
+ boolean symlink = in.readBoolean();
+ newInfo.setAttribute(EFS.ATTRIBUTE_SYMLINK, symlink);
+ if (symlink) {
+ newInfo.setStringAttribute(EFS.ATTRIBUTE_LINK_TARGET, in.readUTF());
+ }
+ newInfo.setExists(in.readBoolean());
+ newInfo.setLastModified(in.readLong());
+ newInfo.setLength(in.readLong());
+ newInfo.setDirectory(in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_GROUP_READ, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_GROUP_WRITE, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_OTHER_READ, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_OTHER_WRITE, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_OWNER_READ, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_OWNER_WRITE, in.readBoolean());
+ newInfo.setAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE, in.readBoolean());
+ } catch (IOException e) {
+ newInfo.setError(IFileInfo.IO_ERROR);
+ }
+
+ setIFileInfo(newInfo);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannel.java b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannel.java
new file mode 100644
index 00000000000..09de286f9a7
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannel.java
@@ -0,0 +1,369 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ *******************************************************************************/
+package org.eclipse.remote.proxy.protocol.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class StreamChannel {
+ public static final int CAPACITY = 8192;
+
+ private class ChannelInputStream extends InputStream {
+ private final Lock lock = new ReentrantLock();
+ private final Condition cond = lock.newCondition();
+ private final StreamChannel channel;
+
+ private int currentPos;
+ private int currentSize;
+ private boolean connected = true;
+ private int inputRequestCount;
+ private byte[] buffer = new byte[CAPACITY];
+
+ public ChannelInputStream(StreamChannel channel) {
+ this.channel = channel;
+ }
+
+ @Override
+ public synchronized int read() throws IOException {
+ byte[] b = new byte[1];
+ if (read(b, 0, 1) != 1) {
+ return -1;
+ }
+ return b[0] & 0xff;
+ }
+
+ @Override
+ public int available() throws IOException {
+ lock.lock();
+ try {
+ return currentSize - currentPos;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public synchronized int read(byte b[], int off, int len) throws IOException {
+ if (len <= 0) {
+ return 0;
+ }
+ int moreSpace;
+ lock.lock();
+ try {
+ if (currentPos >= currentSize) {
+ currentPos = currentSize = 0;
+ } else if (currentPos >= CAPACITY / 2) {
+ System.arraycopy(buffer, currentPos, buffer, 0, currentSize - currentPos);
+ currentSize -= currentPos;
+ currentPos = 0;
+ }
+ int freeSpace = CAPACITY - currentSize;
+ moreSpace = Math.max(freeSpace - inputRequestCount, 0);
+ } finally {
+ lock.unlock();
+ }
+ if (moreSpace > 0) {
+ mux.sendRequestCmd(StreamChannel.this, moreSpace);
+ }
+ lock.lock();
+ try {
+ inputRequestCount += moreSpace;
+ while (currentPos >= currentSize && connected) {
+ try {
+ cond.await();
+ } catch (InterruptedException e) {
+ }
+ }
+ if (!connected && currentPos >= currentSize) {
+ return -1;
+ }
+
+ int available = currentSize - currentPos;
+ if (len < available) {
+ System.arraycopy(buffer, currentPos, b, off, len);
+ currentPos += len;
+ return len;
+ } else {
+ System.arraycopy(buffer, currentPos, b, off, available);
+ currentPos = currentSize = 0;
+ return available;
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ channel.closeOutput();
+ disconnect();
+ }
+
+ void receive(byte[] buf, int len) throws IOException {
+ lock.lock();
+ try {
+ if (currentPos > 0 && (CAPACITY - currentSize) < len) {
+ System.arraycopy(buffer, currentPos, buffer, 0, currentSize - currentPos);
+ currentSize -= currentPos;
+ currentPos = 0;
+ }
+ if (CAPACITY - currentSize < len) {
+ throw new IOException("Receive buffer overflow");
+ }
+ System.arraycopy(buf, 0, buffer, currentSize, len);
+ currentSize += len;
+ inputRequestCount -= len;
+ cond.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ void disconnect() {
+ lock.lock();
+ try {
+ connected = false;
+ cond.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ boolean isConnected() {
+ lock.lock();
+ try {
+ return connected;
+ } finally {
+ lock.unlock();
+ }
+ }
+ }
+
+ private class ChannelOutputStream extends OutputStream {
+ private final Lock lock = new ReentrantLock();
+ private final Condition cond = lock.newCondition();
+ private final StreamChannel channel;
+
+ private int currentPos;
+ private byte[] buffer = new byte[CAPACITY];
+ private boolean connected = true;
+ private int outputRequestCount;
+
+ public ChannelOutputStream(StreamChannel channel) {
+ this.channel = channel;
+ }
+
+ @Override
+ public synchronized void write(int b) throws IOException {
+ while (currentPos >= CAPACITY) {
+ send();
+ }
+ buffer[currentPos++] = (byte) b;
+ }
+
+ @Override
+ public synchronized void flush() throws IOException {
+ while (currentPos > 0) {
+ send();
+ }
+ }
+
+ @Override
+ public synchronized void write(byte[] b, int off, int len) throws IOException {
+ if (len <= 0) {
+ return;
+ }
+ if (len <= CAPACITY - currentPos) {
+ System.arraycopy(b, off, buffer, currentPos, len);
+ currentPos += len;
+ return;
+ }
+ flush();
+ int canSend;
+ while (true) {
+ lock.lock();
+ try {
+ while ((canSend = outputRequestCount) == 0 && connected) {
+ try {
+ cond.await();
+ } catch (InterruptedException e) {
+ }
+ }
+ if (!connected) {
+ throw new IOException("channel closed");
+ }
+ } finally {
+ lock.unlock();
+ }
+
+ if (canSend < len) {
+ mux.sendTransmitCmd(StreamChannel.this, b, off, canSend);
+ off += canSend;
+ len -= canSend;
+ lock.lock();
+ outputRequestCount -= canSend;
+ lock.unlock();
+ } else {
+ mux.sendTransmitCmd(StreamChannel.this, b, off, len);
+ lock.lock();
+ outputRequestCount -= len;
+ lock.unlock();
+ break;
+ }
+ }
+ }
+
+ void send() throws IOException {
+ int canSend;
+ lock.lock();
+ try {
+ while ((canSend = outputRequestCount) == 0 && connected) {
+ try {
+ cond.await();
+ } catch (InterruptedException e) {
+ }
+ }
+ if (!connected) {
+ throw new IOException("channel closed");
+ }
+ } finally {
+ lock.unlock();
+ }
+ if (canSend < currentPos) {
+ mux.sendTransmitCmd(StreamChannel.this, buffer, 0, canSend);
+ currentPos -= canSend;
+ System.arraycopy(buffer, canSend, buffer, 0, currentPos);
+ lock.lock();
+ outputRequestCount -= canSend;
+ lock.unlock();
+ } else {
+ mux.sendTransmitCmd(StreamChannel.this, buffer, 0, currentPos);
+ lock.lock();
+ outputRequestCount -= currentPos;
+ lock.unlock();
+ currentPos = 0;
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ flush();
+ channel.closeInput();
+ disconnect();
+ }
+
+ void request(int len) {
+ lock.lock();
+ outputRequestCount += len;
+ cond.signalAll();
+ lock.unlock();
+ }
+
+ void disconnect() {
+ lock.lock();
+ try {
+ connected = false;
+ cond.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ boolean isConnected() {
+ lock.lock();
+ try {
+ return connected;
+ } finally {
+ lock.unlock();
+ }
+
+ }
+ }
+
+ private final StreamChannelManager mux;
+ private final int channelId;
+ private final ChannelInputStream min = new ChannelInputStream(this);
+ private final ChannelOutputStream mout = new ChannelOutputStream(this);
+
+ private boolean open;
+
+ public StreamChannel(StreamChannelManager mux, int id) {
+ this.mux = mux;
+ channelId = id;
+ open = true;
+ }
+
+ public int getId() {
+ return channelId;
+ }
+
+ public InputStream getInputStream() {
+ return min;
+ }
+
+ public OutputStream getOutputStream() {
+ return mout;
+ }
+
+ public boolean isOpen() {
+ return open;
+ }
+
+ public void close() throws IOException {
+ mux.sendCloseCmd(this);
+ }
+
+ void receive(byte[] buf, int len) throws IOException {
+ min.receive(buf, len);
+ }
+
+ void request(int len) {
+ mout.request(len);
+ }
+
+ void disconnect() {
+ min.disconnect();
+ mout.disconnect();
+ }
+
+ void setClosed() {
+ open = false;
+ }
+
+ void disconnectInput() {
+ min.disconnect();
+ }
+
+ void disconnectOutput() {
+ mout.disconnect();
+ }
+
+ void closeInput() throws IOException {
+ mux.sendCloseInputCmd(this);
+ }
+
+ void closeOutput() throws IOException {
+ mux.sendCloseOutputCmd(this);
+ }
+
+ boolean isInputConnected() {
+ return min.isConnected();
+ }
+
+ boolean isOutputConnected() {
+ return mout.isConnected();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannelManager.java b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannelManager.java
new file mode 100644
index 00000000000..854972e0e45
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/StreamChannelManager.java
@@ -0,0 +1,567 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ *******************************************************************************/
+package org.eclipse.remote.proxy.protocol.core;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class StreamChannelManager implements Runnable {
+ public interface IChannelListener {
+ public void newChannel(StreamChannel chan);
+
+ public void closeChannel(StreamChannel chan);
+ }
+
+ private class Sender implements Runnable {
+ private OutputStream out;
+ private BlockingQueue<ByteArrayOutputStream> queue = new LinkedBlockingQueue<>();
+ private boolean running = true;
+
+ public Sender(OutputStream out) {
+ this.out = out;
+ }
+
+ public void sendOpenCmd(int id) throws IOException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ DataOutputStream data = new DataOutputStream(bytes);
+ data.writeByte(CMD_OPEN);
+ data.writeByte(id);
+ try {
+ queue.put(bytes);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void sendTransmitCmd(int id, byte buf[], int off, int len) throws IOException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ DataOutputStream data = new DataOutputStream(bytes);
+ data.writeByte(CMD_TRANSMIT);
+ data.writeByte(id);
+ data.writeInt(len);
+ data.write(buf, off, len);
+ try {
+ queue.put(bytes);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void sendCloseCmd(int id) throws IOException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ DataOutputStream data = new DataOutputStream(bytes);
+ data.writeByte(CMD_CLOSE);
+ data.writeByte(id);
+ try {
+ queue.put(bytes);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void sendCloseAckCmd(int id) throws IOException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ DataOutputStream data = new DataOutputStream(bytes);
+ data.writeByte(CMD_CLOSEACK);
+ data.writeByte(id);
+ try {
+ queue.put(bytes);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void sendRequestCmd(int id, int len) throws IOException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ DataOutputStream data = new DataOutputStream(bytes);
+ data.writeByte(CMD_REQUEST);
+ data.writeByte(id);
+ data.writeInt(len);
+ try {
+ queue.put(bytes);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void sendCloseInputCmd(int id) throws IOException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ DataOutputStream data = new DataOutputStream(bytes);
+ data.writeByte(CMD_CLOSE_INPUT);
+ data.writeByte(id);
+ try {
+ queue.put(bytes);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void sendCloseOutputCmd(int id) throws IOException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ DataOutputStream data = new DataOutputStream(bytes);
+ data.writeByte(CMD_CLOSE_OUTPUT);
+ data.writeByte(id);
+ try {
+ queue.put(bytes);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void shutdown() {
+ running = false;
+ try {
+ queue.put(new ByteArrayOutputStream());
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (running) {
+ ByteArrayOutputStream bytes = queue.take();
+ if (bytes != null) {
+ bytes.writeTo(out);
+ out.flush();
+ }
+ }
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+ private boolean isMyChannel(int id) {
+ return !(isServer ^ ((id & SERVER_ID_MASK) == SERVER_ID_MASK));
+ }
+
+ private class Receiver implements Runnable {
+ private DataInputStream dataIn;
+
+ public Receiver(InputStream in) {
+ this.dataIn = new DataInputStream(in);
+ }
+
+ @Override
+ public void run() {
+ StreamChannel chan;
+ running = true;
+ try {
+ while (true) {
+ debugPrint("start read");
+ int cmd = dataIn.readByte() & 0xff;
+ int id = dataIn.readByte() & 0xff;
+
+ switch (cmd) {
+ case CMD_OPEN:
+ debugPrint("received cmd=OPEN id=" + id);
+ chan = channels.get(id);
+ if (chan != null) {
+ throw new IOException("Channel already exists");
+ }
+ if (!isServer && (id & SERVER_ID_MASK) != SERVER_ID_MASK) {
+ throw new IOException("Client received invalid server channel id: " + id);
+ }
+ if (isServer && (id & SERVER_ID_MASK) == SERVER_ID_MASK) {
+ throw new IOException("Server received invalid client channel id: " + id);
+ }
+ chan = new StreamChannel(StreamChannelManager.this, id);
+ channels.put(id, chan);
+ newChannelCallback(chan);
+ break;
+
+ case CMD_CLOSE:
+ /*
+ * Received a command to close the channel.
+ * Clean up channel and free channel ID if we allocated it.
+ */
+ debugPrint("received cmd=CLOSE id=" + id);
+ chan = channels.get(id);
+ if (chan == null) {
+ throw new IOException("CLOSE: Invalid channel id: " + id);
+ }
+ chan.disconnect();
+ if (chan.isOpen()) {
+ sendCloseAckCmd(chan);
+ }
+ closeChannelCallback(chan);
+ channels.remove(id);
+ if (isMyChannel(id)) {
+ freeId(id);
+ }
+ break;
+
+ case CMD_CLOSEACK:
+ /*
+ * Received acknowledgement for our close command.
+ * Clean up channel and free channel ID if we allocated it.
+ */
+ debugPrint("received cmd=CLOSEACK id=" + id);
+ chan = channels.get(id);
+ if (chan == null) {
+ throw new IOException("CLOSEACK: Invalid channel id");
+ }
+ if (chan.isOpen()) {
+ throw new IOException("Channel is still open");
+ }
+ chan.disconnect();
+ channels.remove(id);
+ if (isMyChannel(id)) {
+ freeId(id);
+ }
+ break;
+
+ case CMD_TRANSMIT:
+ debugPrint("received cmd=TRANSMIT id=" + id);
+ chan = channels.get(id);
+ if (chan == null) {
+ throw new IOException("TRANSMIT: Invalid channel id: " + id);
+ }
+ int len = dataIn.readInt();
+ byte[] buf = new byte[len];
+ dataIn.readFully(buf, 0, len);
+ chan.receive(buf, len);
+ break;
+
+ case CMD_REQUEST:
+ chan = channels.get(id);
+ if (chan == null) {
+ throw new IOException("REQUEST: Invalid channel id: " + id);
+ }
+ int req = dataIn.readInt();
+ debugPrint("received cmd=REQUEST id=" + id + " len=" + req);
+ chan.request(req);
+ break;
+
+ case CMD_CLOSE_INPUT:
+ /*
+ * Received a command to close the input side of the channel.
+ */
+ debugPrint("received cmd=CLOSE_INPUT id=" + id);
+ chan = channels.get(id);
+ if (chan == null) {
+ throw new IOException("CLOSE: Invalid channel id: " + id);
+ }
+ chan.disconnectInput();
+ break;
+
+ case CMD_CLOSE_OUTPUT:
+ /*
+ * Received a command to close the output side of the channel.
+ */
+ debugPrint("received cmd=CLOSE_OUTPUT id=" + id);
+ chan = channels.get(id);
+ if (chan == null) {
+ throw new IOException("CLOSE: Invalid channel id: " + id);
+ }
+ chan.disconnectOutput();
+ break;
+
+ default:
+ synchronized (System.err) {
+ System.err.print("invalid command: " + dump_byte((byte) cmd) + dump_byte((byte) id));
+ }
+ try {
+ while (true) {
+ byte b = dataIn.readByte();
+ System.err.print(dump_byte(b));
+ }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ throw new IOException("Invalid command: " + cmd);
+ }
+ }
+ } catch (EOFException e) {
+ // Finish
+ } catch (Exception e) {
+ e.printStackTrace();
+ debugPrint("run got exception:" + e.getMessage());
+ } finally {
+ debugPrint("shutting down manager");
+ StreamChannelManager.this.shutdown();
+ }
+ }
+
+ public void shutdown() {
+ try {
+ dataIn.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+
+ private final static int CMD_OPEN = 0xA1; // Open a new channel
+ private final static int CMD_CLOSE = 0xA2; // Close a channel; acknowledgement required
+ private final static int CMD_CLOSEACK = 0xA3; // Channel close acknowledgement
+ private final static int CMD_REQUEST = 0xA4; // Request buffer space
+ private final static int CMD_TRANSMIT = 0xA5; // Transmit a buffer
+ private final static int CMD_CLOSE_INPUT = 0xA6; // Close input side of the channel; no acknowledgement required
+ private final static int CMD_CLOSE_OUTPUT = 0xA7; // Close output side of the channel; no acknowledgement required
+
+ private final static int SERVER_ID_MASK = 1 << 15;
+ private final static int MAX_CHANNELS = SERVER_ID_MASK >> 1;
+
+ private final Map<Integer, StreamChannel> channels = Collections
+ .synchronizedMap(new HashMap<Integer, StreamChannel>());
+ private final List<IChannelListener> listeners = Collections.synchronizedList(new ArrayList<IChannelListener>());
+
+ private Set<Short> usedIds = new HashSet<>();
+ private int nextUnusedChannelId;
+ private boolean isServer;
+
+ private volatile boolean running = true;
+
+ private Sender sender;
+ private Receiver receiver;
+
+ private boolean debug = false;
+
+ public StreamChannelManager(InputStream in, OutputStream out) {
+ sender = new Sender(new BufferedOutputStream(out));
+ receiver = new Receiver(new BufferedInputStream(in));
+ }
+
+ /**
+ * Clients allocate IDs with leading bit 0
+ * Servers allocate IDs with leading bit 1
+ *
+ * Reuse an ID if it is not longer being used.
+ *
+ * @return new ID
+ */
+ synchronized int newId() throws IOException {
+ if (!usedIds.isEmpty()) {
+ Short id = usedIds.iterator().next();
+ usedIds.remove(id);
+ debugPrint("recover id=" + id);
+ return id;
+ }
+ int nextId = nextUnusedChannelId;
+ if (nextUnusedChannelId++ > (MAX_CHANNELS - 1)) {
+ throw new IOException("Maximum number of channels exceeded");
+ }
+ return nextId | (isServer ? SERVER_ID_MASK : 0);
+ }
+
+ synchronized void freeId(int id) {
+ debugPrint("free id=" + id);
+ usedIds.add((short) id);
+ }
+
+ void dump_buf(String pref, byte[] b, int off, int len) {
+ System.err.print(pref + ": ");
+ for (int i = off; i < len + off; i++) {
+ if (b[i] <= 32 || b[i] > 126) {
+ System.err.print(String.format(" 0x%02x ", b[i]));
+ } else {
+ System.err.print((char) b[i]);
+ }
+ }
+ System.err.println();
+ }
+
+ public boolean isServer() {
+ return isServer;
+ }
+
+ public void setServer(boolean server) {
+ isServer = server;
+ }
+
+ public void addListener(IChannelListener listener) {
+ if (!listeners.contains(listener)) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(IChannelListener listener) {
+ if (listeners.contains(listener)) {
+ listeners.remove(listener);
+ }
+ }
+
+ protected void newChannelCallback(StreamChannel chan) {
+ for (IChannelListener listener : listeners.toArray(new IChannelListener[listeners.size()])) {
+ listener.newChannel(chan);
+ }
+ }
+
+ protected void closeChannelCallback(StreamChannel chan) {
+ for (IChannelListener listener : listeners.toArray(new IChannelListener[listeners.size()])) {
+ listener.closeChannel(chan);
+ }
+ }
+
+ public String dump_byte(byte b) {
+ if (b <= 32 || b > 126) {
+ return String.format(" 0x%02x ", b);
+ }
+
+ return String.valueOf((char) b);
+ }
+
+ public StreamChannel openChannel() throws IOException {
+ if (!running) {
+ throw new IOException("Multiplexer is not running");
+ }
+
+ StreamChannel chan = new StreamChannel(this, newId());
+ channels.put(chan.getId(), chan);
+
+ debugPrint("send cmd=OPEN id=" + chan.getId());
+ sender.sendOpenCmd(chan.getId());
+
+ return chan;
+ }
+
+ synchronized void sendTransmitCmd(StreamChannel chan, byte buf[], int off, int len) throws IOException {
+ if (running && chan.isOpen()) {
+ debugPrint(
+ "send cmd=TRANSMIT id=" + chan.getId() + " len=" + len + " off=" + off + " buflen=" + buf.length);
+ sender.sendTransmitCmd(chan.getId(), buf, off, len);
+ }
+ }
+
+ synchronized void sendCloseCmd(StreamChannel chan) throws IOException {
+ if (running && chan.isOpen()) {
+ debugPrint("send cmd=CLOSE id=" + chan.getId());
+ chan.disconnect();
+ sender.sendCloseCmd(chan.getId());
+ chan.setClosed();
+ }
+ }
+
+ synchronized void sendCloseAckCmd(StreamChannel chan) throws IOException {
+ if (running && chan.isOpen()) {
+ debugPrint("send cmd=CLOSEACK id=" + chan.getId());
+ sender.sendCloseAckCmd(chan.getId());
+ chan.setClosed();
+ }
+ }
+
+ synchronized void sendRequestCmd(StreamChannel chan, int len) throws IOException {
+ if (running && chan.isOpen()) {
+ debugPrint("send cmd=REQUEST id=" + chan.getId() + " len=" + len);
+ sender.sendRequestCmd(chan.getId(), len);
+ }
+ }
+
+ synchronized void sendCloseInputCmd(StreamChannel chan) throws IOException {
+ if (running && chan.isOpen()) {
+ if (!chan.isOutputConnected()) {
+ sendCloseCmd(chan);
+ } else {
+ debugPrint("send cmd=CLOSE_INPUT id=" + chan.getId());
+ sender.sendCloseInputCmd(chan.getId());
+ }
+ }
+ }
+
+ synchronized void sendCloseOutputCmd(StreamChannel chan) throws IOException {
+ if (running && chan.isOpen()) {
+ if (!chan.isInputConnected()) {
+ sendCloseCmd(chan);
+ } else {
+ debugPrint("send cmd=CLOSE_OUTPUT id=" + chan.getId());
+ sender.sendCloseOutputCmd(chan.getId());
+ }
+ }
+ }
+
+ public void debugPrint(String x) {
+ if (debug) {
+ synchronized (System.err) {
+ System.err.println(x);
+ }
+ }
+ }
+
+ public void shutdown() {
+ if (!running) {
+ return;
+ }
+ running = false;
+
+ synchronized (channels) {
+ for (StreamChannel c : channels.values()) {
+ c.disconnect();
+ }
+ }
+ channels.clear();
+
+ sender.shutdown();
+ receiver.shutdown();
+ debugPrint("chan mpx stopped");
+ // Should in and out be closed also?
+ }
+
+ private String asString(int v) {
+ switch (v) {
+ case CMD_OPEN:
+ return "OPEN";
+
+ case CMD_CLOSE:
+ return "CLOSE";
+
+ case CMD_CLOSEACK:
+ return "CLOSEACK";
+
+ case CMD_TRANSMIT:
+ return "TRANSMIT";
+
+ case CMD_REQUEST:
+ return "REQUEST";
+ }
+ return "<UNKNOWN>";
+ }
+
+ @Override
+ public void run() {
+ debugPrint("mux starting");
+ new Thread(sender, "mux sender").start();
+ receiver.run();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/exceptions/ProxyException.java b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/exceptions/ProxyException.java
new file mode 100644
index 00000000000..e32e8fd7ff6
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.protocol.core/src/org/eclipse/remote/proxy/protocol/core/exceptions/ProxyException.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.proxy.protocol.core.exceptions;
+
+public class ProxyException extends Exception {
+
+ private static final long serialVersionUID = 1L;
+
+ public ProxyException(String message) {
+ super(message);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/.classpath b/remote/org.eclipse.remote.proxy.server.core/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.proxy.server.core/.project b/remote/org.eclipse.remote.proxy.server.core/.project
new file mode 100644
index 00000000000..591801c1a12
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.server.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.core.prefs b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..d40b9600d07
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=true
+resolve.requirebundle=false
diff --git a/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.server.core/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.server.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..e9d2baa1937
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.proxy.server.core;singleton:=true
+Bundle-Version: 1.0.200.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: org.eclipse.core.filesystem,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.adaptor,
+ org.eclipse.equinox.app,
+ org.eclipse.remote.core,
+ org.eclipse.remote.proxy.protocol.core,
+ org.eclipse.remote.proxy.protocol.core.exceptions,
+ org.osgi.framework,
+ org.osgi.framework.launch
+Bundle-Vendor: %pluginProvider
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.cdt.core.native
diff --git a/remote/org.eclipse.remote.proxy.server.core/about.html b/remote/org.eclipse.remote.proxy.server.core/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.server.core/build.properties b/remote/org.eclipse.remote.proxy.server.core/build.properties
new file mode 100644
index 00000000000..7b3c227b84a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.proxy.server.core/plugin.properties b/remote/org.eclipse.remote.proxy.server.core/plugin.properties
new file mode 100644
index 00000000000..896e3fcdef7
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2016 Oak Ridge National Laboratory and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Proxy Server Support
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.proxy.server.core/plugin.xml b/remote/org.eclipse.remote.proxy.server.core/plugin.xml
new file mode 100644
index 00000000000..43ce2939415
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/plugin.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="application"
+ point="org.eclipse.core.runtime.applications">
+ <application
+ cardinality="singleton-global"
+ thread="main"
+ visible="true">
+ <run
+ class="org.eclipse.remote.internal.proxy.server.core.Application">
+ </run>
+ </application>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Application.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Application.java
new file mode 100644
index 00000000000..7fb9defe377
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Application.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core;
+
+import java.nio.ByteBuffer;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+
+/**
+ * This class controls all aspects of the application's execution
+ */
+public class Application implements IApplication {
+ private Server server = new Server();
+
+ @Override
+ public Object start(IApplicationContext context) throws Exception {
+ String[] args = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
+ for (String arg : args) {
+ if (arg.equals("-magic")) { //$NON-NLS-1$
+ ByteBuffer b = ByteBuffer.allocate(4);
+ b.putInt(Protocol.MAGIC);
+ System.out.write(b.array());
+ }
+ }
+ server.start();
+ server.waitFor();
+ return IApplication.EXIT_OK;
+ }
+
+ @Override
+ public void stop() {
+ // Nothing
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/CommandServer.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/CommandServer.java
new file mode 100644
index 00000000000..56f7d38ee07
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/CommandServer.java
@@ -0,0 +1,295 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.remote.internal.proxy.server.core.commands.AbstractServerCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerChildInfosCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerDeleteCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerExecCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerFetchInfoCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerGetCwdCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerGetEnvCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerGetInputStreamCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerGetOutputStreamCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerGetPropertiesCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerMkdirCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerPutInfoCommand;
+import org.eclipse.remote.internal.proxy.server.core.commands.ServerShellCommand;
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.SerializableFileInfo;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class CommandServer implements Runnable {
+ private Server server;
+ private DataInputStream cmdIn;
+ private DataOutputStream cmdOut;
+ private boolean running = true;
+ private StreamChannel chan;
+
+ public CommandServer(StreamChannel chan, Server server) {
+ this.chan = chan;
+ this.server = server;
+ this.cmdIn = new DataInputStream(chan.getInputStream());
+ this.cmdOut = new DataOutputStream(chan.getOutputStream());
+ }
+
+ @Override
+ public void run() {
+ new Thread("cmd reader") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ try {
+ while (running) {
+ byte proto = cmdIn.readByte();
+ switch (proto) {
+ case Protocol.PROTO_COMMAND:
+ try {
+ dispatchCommand(cmdIn);
+ sendOKResult();
+ } catch (ProxyException e) {
+ sendErrorResult(e.getMessage());
+ }
+ break;
+
+ case Protocol.PROTO_SHUTDOWN:
+ running = false;
+ break;
+
+ default:
+ System.err.println("Invalid protocol ID: " + proto);
+ break;
+ }
+ }
+ } catch (EOFException e) {
+ // Exit server
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } finally {
+ running = false;
+ }
+ }
+ }.start();
+ }
+
+ private void sendOKResult() throws IOException {
+ cmdOut.writeByte(Protocol.PROTO_OK);
+ cmdOut.flush();
+ }
+
+ private void sendErrorResult(String error) throws IOException {
+ cmdOut.writeByte(Protocol.PROTO_ERROR);
+ cmdOut.writeUTF(error);
+ cmdOut.flush();
+ }
+
+ /**
+ * TODO replace with dynamic dispatcher
+ */
+ private void dispatchCommand(DataInputStream in) throws ProxyException, IOException {
+ AbstractServerCommand serverCmd;
+
+ short cmd = in.readShort();
+ switch (cmd) {
+ case Protocol.CMD_CHILDINFOS:
+ serverCmd = cmdChildInfos(in);
+ break;
+
+ case Protocol.CMD_DELETE:
+ serverCmd = cmdDelete(in);
+ break;
+
+ case Protocol.CMD_EXEC:
+ serverCmd = cmdExec(in);
+ break;
+
+ case Protocol.CMD_SHELL:
+ serverCmd = cmdShell(in);
+ break;
+
+ case Protocol.CMD_FETCHINFO:
+ serverCmd = cmdFetchInfo(in);
+ break;
+
+ case Protocol.CMD_GETCWD:
+ serverCmd = cmdGetCwd(in);
+ break;
+
+ case Protocol.CMD_GETENV:
+ serverCmd = cmdGetEnv(in);
+ break;
+
+ case Protocol.CMD_GETINPUTSTREAM:
+ serverCmd = cmdGetInputStream(in);
+ break;
+
+ case Protocol.CMD_GETOUTPUTSTREAM:
+ serverCmd = cmdGetOutputStream(in);
+ break;
+
+ case Protocol.CMD_GETPROPERTIES:
+ serverCmd = cmdGetProperties(in);
+ break;
+
+ case Protocol.CMD_MKDIR:
+ serverCmd = cmdMkdir(in);
+ break;
+
+ case Protocol.CMD_PUTINFO:
+ serverCmd = cmdPutInfo(in);
+ break;
+
+ default:
+ System.err.println("Invalid command ID: " + cmd);
+ throw new ProxyException("Invalid command ID: " + cmd); //$NON-NLS-1$
+ }
+
+ serverCmd.exec();
+ }
+
+ private AbstractServerCommand cmdExec(DataInputStream in) throws ProxyException, IOException {
+ int cmdChanId = in.readByte();
+ int ioChanId = in.readByte();
+ int errChanId = in.readByte();
+ int length = in.readInt();
+ List<String> command = new ArrayList<>(length);
+ for (int i = 0; i < length; i++) {
+ command.add(in.readUTF());
+ }
+ length = in.readInt();
+ Map<String, String> env = new HashMap<>(length);
+ for (int i = 0; i < length; i++) {
+ String key = in.readUTF();
+ String val = in.readUTF();
+ env.put(key, val);
+ }
+ String dir = in.readUTF();
+ boolean redirect = in.readBoolean();
+ boolean appendEnv = in.readBoolean();
+ StreamChannel cmdChan = server.getChannel(cmdChanId);
+ StreamChannel ioChan = server.getChannel(ioChanId);
+ StreamChannel errChan = server.getChannel(errChanId);
+ if (cmdChan == null || ioChan == null || errChan == null) {
+ throw new ProxyException("Unable to locate channels for command"); //$NON-NLS-1$
+ }
+ return new ServerExecCommand(command, env, dir, redirect, appendEnv, cmdChan, ioChan, errChan);
+ }
+
+ private AbstractServerCommand cmdShell(DataInputStream in) throws ProxyException, IOException {
+ int cmdChanId = in.readByte();
+ int ioChanId = in.readByte();
+ StreamChannel cmdChan = server.getChannel(cmdChanId);
+ StreamChannel ioChan = server.getChannel(ioChanId);
+ if (cmdChan == null || ioChan == null) {
+ throw new ProxyException("Unable to locate channels for command"); //$NON-NLS-1$
+ }
+ return new ServerShellCommand(cmdChan, ioChan);
+ }
+
+ private AbstractServerCommand cmdGetCwd(DataInputStream in) throws ProxyException, IOException {
+ int chanId = in.readByte();
+ StreamChannel chan = server.getChannel(chanId);
+ if (chan == null) {
+ throw new ProxyException("Unable to locate channel for command"); //$NON-NLS-1$
+ }
+ return new ServerGetCwdCommand(chan);
+ }
+
+ private AbstractServerCommand cmdGetEnv(DataInputStream in) throws ProxyException, IOException {
+ int chanId = in.readByte();
+ StreamChannel chan = server.getChannel(chanId);
+ if (chan == null) {
+ throw new ProxyException("Unable to locate channel for command"); //$NON-NLS-1$
+ }
+ return new ServerGetEnvCommand(chan);
+ }
+
+ private AbstractServerCommand cmdGetProperties(DataInputStream in) throws ProxyException, IOException {
+ int chanId = in.readByte();
+ StreamChannel chan = server.getChannel(chanId);
+ if (chan == null) {
+ throw new ProxyException("Unable to locate channel for command"); //$NON-NLS-1$
+ }
+ return new ServerGetPropertiesCommand(chan);
+ }
+
+ private AbstractServerCommand cmdChildInfos(DataInputStream in) throws ProxyException, IOException {
+ int chanId = in.readByte();
+ StreamChannel chan = server.getChannel(chanId);
+ if (chan == null) {
+ throw new ProxyException("Unable to locate channel for command"); //$NON-NLS-1$
+ }
+ String path = in.readUTF();
+ return new ServerChildInfosCommand(chan, path);
+ }
+
+ private AbstractServerCommand cmdFetchInfo(DataInputStream in) throws ProxyException, IOException {
+ int chanId = in.readByte();
+ StreamChannel chan = server.getChannel(chanId);
+ if (chan == null) {
+ throw new ProxyException("Unable to locate channel for command"); //$NON-NLS-1$
+ }
+ String path = in.readUTF();
+ return new ServerFetchInfoCommand(chan, path);
+ }
+
+ private AbstractServerCommand cmdGetInputStream(DataInputStream in) throws ProxyException, IOException {
+ int chanId = in.readByte();
+ StreamChannel chan = server.getChannel(chanId);
+ if (chan == null) {
+ throw new ProxyException("Unable to locate channel for command"); //$NON-NLS-1$
+ }
+ int options = in.readInt();
+ String path = in.readUTF();
+ return new ServerGetInputStreamCommand(chan, options, path);
+ }
+
+ private AbstractServerCommand cmdGetOutputStream(DataInputStream in) throws ProxyException, IOException {
+ int chanId = in.readByte();
+ StreamChannel chan = server.getChannel(chanId);
+ if (chan == null) {
+ throw new ProxyException("Unable to locate channel for command"); //$NON-NLS-1$
+ }
+ int options = in.readInt();
+ String path = in.readUTF();
+ return new ServerGetOutputStreamCommand(chan, options, path);
+ }
+
+ private AbstractServerCommand cmdDelete(DataInputStream in) throws ProxyException, IOException {
+ int options = in.readInt();
+ String path = in.readUTF();
+ return new ServerDeleteCommand(options, path);
+ }
+
+ private AbstractServerCommand cmdMkdir(DataInputStream in) throws ProxyException, IOException {
+ int options = in.readInt();
+ String path = in.readUTF();
+ return new ServerMkdirCommand(options, path);
+ }
+
+ private AbstractServerCommand cmdPutInfo(DataInputStream in) throws ProxyException, IOException {
+ int options = in.readInt();
+ String path = in.readUTF();
+ SerializableFileInfo info = new SerializableFileInfo();
+ info.readObject(in);
+ return new ServerPutInfoCommand(info.getIFileInfo(), options, path);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Server.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Server.java
new file mode 100644
index 00000000000..1a2c679b36e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/Server.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.StreamChannelManager;
+import org.eclipse.remote.proxy.protocol.core.StreamChannelManager.IChannelListener;
+
+public class Server {
+ private volatile boolean running;
+ private Thread serverThread;
+ private StreamChannel cmdChannel;
+ private Map<Integer, StreamChannel> auxChannel = Collections.synchronizedMap(new HashMap<Integer, StreamChannel>());
+
+ public void start() {
+ final StreamChannelManager mux = new StreamChannelManager(System.in, System.out);
+ mux.setServer(true);
+ mux.addListener(new IChannelListener() {
+
+ @Override
+ public void newChannel(StreamChannel chan) {
+ Runnable runnable;
+ System.err.println("newChannel: " + chan.getId());
+ // First channel opened becomes command channel
+ if (cmdChannel == null) {
+ cmdChannel = chan;
+ runnable = new CommandServer(chan, Server.this);
+ new Thread(runnable).start();
+ } else {
+ auxChannel.put(chan.getId(), chan);
+ }
+ }
+
+ @Override
+ public void closeChannel(StreamChannel chan) {
+ System.err.println("closeChannel: " + chan.getId());
+ auxChannel.remove(chan.getId());
+ }
+
+ });
+ serverThread = new Thread(mux) {
+ @Override
+ public void run() {
+ running = true;
+ mux.run();
+ running = false;
+ }
+ };
+ serverThread.start();
+ }
+
+ public StreamChannel getChannel(int id) {
+ System.err.println("getChannel: " + id);
+ return auxChannel.get(id);
+ }
+
+ public void waitFor() {
+ if (running && serverThread != null) {
+ try {
+ serverThread.join();
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerCommand.java
new file mode 100644
index 00000000000..eabaae84dc7
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerCommand.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public abstract class AbstractServerCommand {
+ public abstract void exec() throws ProxyException;
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerExecCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerExecCommand.java
new file mode 100644
index 00000000000..1a80ad718c7
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/AbstractServerExecCommand.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedWriter;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.remote.proxy.protocol.core.Protocol;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public abstract class AbstractServerExecCommand extends AbstractServerCommand {
+
+ private class CommandRunner implements Runnable {
+ @Override
+ public void run() {
+ try {
+ int exit = 0;
+ try {
+ proc = doRun();
+ Forwarder stdoutFwd = startForwarder("stdout", proc.getInputStream(), stdoutChan); //$NON-NLS-1$
+ Forwarder stderrFwd = null;
+ if (!redirect) {
+ stderrFwd = startForwarder("stderr", proc.getErrorStream(), stderrChan); //$NON-NLS-1$
+ }
+ startForwarder("stdin", stdinChan, proc.getOutputStream()); //$NON-NLS-1$
+ new Thread(new ProcMonitor(), "process monitor").start(); //$NON-NLS-1$
+ exit = proc.waitFor();
+ /*
+ * After the process has finished, wait for the stdout and stderr forwarders to finish to
+ * ensure that all output is flushed.
+ */
+ stdoutFwd.waitFor();
+ if (stderrFwd != null) {
+ stderrFwd.waitFor();
+ }
+ } catch (IOException e) {
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stderrChan));
+ try {
+ writer.write(e.getMessage());
+ writer.flush();
+ } catch (IOException e1) {
+ // Things look pretty hopeless
+ }
+ exit = -1;
+ }
+ try {
+ resultStream.writeInt(exit);
+ resultStream.flush();
+ } catch (IOException e) {
+ // We're finished anyway
+ }
+ } catch (InterruptedException e) {
+ // Ignore?
+ }
+ }
+ }
+
+ private class ProcMonitor implements Runnable {
+ @Override
+ public void run() {
+ try {
+ switch (cmdStream.readByte()) {
+ case Protocol.CONTROL_KILL:
+ doKill(proc);
+ break;
+ case Protocol.CONTROL_SETTERMINALSIZE:
+ int cols = cmdStream.readInt();
+ int rows = cmdStream.readInt();
+ cmdStream.readInt(); // pixel dimensions not supported
+ cmdStream.readInt(); // pixel dimensions not supported
+ doSetTerminalSize(proc, cols, rows);
+ break;
+ }
+ } catch (IOException e) {
+ // Finish
+ }
+ }
+ }
+
+ private class Forwarder implements Runnable {
+ private final InputStream in;
+ private final OutputStream out;
+ private final String name;
+
+ private boolean running = true;
+
+ private final Lock lock = new ReentrantLock();
+ private final Condition cond = lock.newCondition();
+
+ public Forwarder(String name, InputStream in, OutputStream out) {
+ this.name = name;
+ this.in = new BufferedInputStream(in);
+ this.out = new BufferedOutputStream(out);
+ }
+
+ @Override
+ public void run() {
+ byte[] buf = new byte[8192];
+ int n;
+ try {
+ while (running) {
+ n = in.read(buf);
+ if (n > 0) {
+ out.write(buf, 0, n);
+ out.flush();
+ }
+ if (n < 0)
+ break;
+ }
+ } catch (IOException e) {
+ // Finish
+ }
+
+ lock.lock();
+ try {
+ running = false;
+ try {
+ out.close();
+ } catch (IOException e) {
+ // Best effort
+ }
+ cond.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public synchronized void waitFor() {
+ lock.lock();
+ try {
+ while (running) {
+ try {
+ cond.await();
+ } catch (InterruptedException e) {
+ // Check terminated flag
+ }
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+ }
+
+ private final List<String> command;
+ private final Map<String, String> env;
+ private final boolean redirect;
+ private final boolean appendEnv;
+ private final String directory;
+
+ private final InputStream stdinChan;
+ private final OutputStream stdoutChan;
+ private final OutputStream stderrChan;
+
+ private final DataInputStream cmdStream;
+ private final DataOutputStream resultStream;
+
+ private Process proc;
+
+ public AbstractServerExecCommand(List<String> command, Map<String, String> env, String directory, boolean redirect,
+ boolean appendEnv, StreamChannel cmdChan, StreamChannel ioChan, StreamChannel errChan) {
+ this.command = command;
+ this.env = env;
+ this.directory = directory;
+ this.redirect = redirect;
+ this.appendEnv = appendEnv;
+
+ this.stdinChan = ioChan.getInputStream();
+ this.stdoutChan = ioChan.getOutputStream();
+
+ this.stderrChan = errChan != null ? errChan.getOutputStream() : this.stdoutChan;
+
+ this.resultStream = new DataOutputStream(cmdChan.getOutputStream());
+ this.cmdStream = new DataInputStream(cmdChan.getInputStream());
+ }
+
+ protected abstract Process doRun() throws IOException;
+
+ protected abstract void doKill(Process proc);
+
+ protected abstract void doSetTerminalSize(Process proc, int col, int rows);
+
+ protected List<String> getCommand() {
+ return command;
+ }
+
+ protected Map<String, String> getEnv() {
+ return env;
+ }
+
+ protected boolean isRedirect() {
+ return redirect;
+ }
+
+ protected boolean isAppendEnv() {
+ return appendEnv;
+ }
+
+ protected String getDirectory() {
+ return directory;
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ new Thread(new CommandRunner()).start();
+ }
+
+ private Forwarder startForwarder(String name, InputStream in, OutputStream out) {
+ Forwarder forwarder = new Forwarder(name, in, out);
+ Thread thread = new Thread(forwarder, forwarder.getName());
+ thread.start();
+ return forwarder;
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerChildInfosCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerChildInfosCommand.java
new file mode 100644
index 00000000000..2f0ab124449
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerChildInfosCommand.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.remote.proxy.protocol.core.SerializableFileInfo;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerChildInfosCommand extends AbstractServerCommand {
+ private IFileInfo[] infos;
+
+ private final URI uri;
+ private final OutputStream out;
+
+ private class CommandRunner implements Runnable {
+ @Override
+ public void run() {
+ try {
+ DataOutputStream result = new DataOutputStream(out);
+ result.writeInt(infos.length);
+ for (int i = 0; i < infos.length; i++) {
+ SerializableFileInfo sInfo = new SerializableFileInfo(infos[i]);
+ sInfo.writeObject(result);
+ }
+ result.flush();
+ } catch (IOException e) {
+ // Failed
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public ServerChildInfosCommand(StreamChannel chan, String path) {
+ this.out = chan.getOutputStream();
+ this.uri = URI.create("file:" + path); //$NON-NLS-1$
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ try {
+ infos = EFS.getStore(uri).childInfos(EFS.NONE, null);
+ } catch (CoreException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ new Thread(new CommandRunner()).start();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerDeleteCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerDeleteCommand.java
new file mode 100644
index 00000000000..cf207323762
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerDeleteCommand.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerDeleteCommand extends AbstractServerCommand {
+ private final int options;
+ private final URI uri;
+
+ public ServerDeleteCommand(int options, String path) {
+ this.options = options;
+ this.uri = URI.create("file:" + path); //$NON-NLS-1$
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ try {
+ EFS.getStore(uri).delete(options, new NullProgressMonitor());
+ } catch (CoreException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerExecCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerExecCommand.java
new file mode 100644
index 00000000000..06ebe5e1ef6
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerExecCommand.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+
+/**
+ * TODO: Fix hang if command fails...
+ *
+ */
+public class ServerExecCommand extends AbstractServerExecCommand {
+ @Override
+ public Process doRun() throws IOException {
+ System.err.print("exec: ");
+ for (String arg : getCommand()) {
+ System.err.print(arg + " ");
+ }
+ System.err.println();
+ ProcessBuilder builder = new ProcessBuilder(getCommand());
+ try {
+ if (!isAppendEnv()) {
+ builder.environment().clear();
+ builder.environment().putAll(getEnv());
+ } else {
+ for (Map.Entry<String, String> entry : getEnv().entrySet()) {
+ String val = builder.environment().get(entry.getKey());
+ if (val == null || !val.equals(entry.getValue())) {
+ builder.environment().put(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ } catch (UnsupportedOperationException | IllegalArgumentException e) {
+ // Leave environment untouched
+ }
+ File dir = new File(getDirectory());
+ if (dir.exists() && dir.isAbsolute()) {
+ builder.directory(dir);
+ }
+ builder.redirectErrorStream(isRedirect());
+ return builder.start();
+ }
+
+ @Override
+ protected void doKill(Process proc) {
+ if (proc.isAlive()) {
+ proc.destroyForcibly();
+ }
+ }
+
+ @Override
+ protected void doSetTerminalSize(Process proc, int cols, int rows) {
+ // Not supported
+ }
+
+ public ServerExecCommand(List<String> command, Map<String, String> env, String directory, boolean redirect,
+ boolean appendEnv, StreamChannel cmdChan, StreamChannel ioChan, StreamChannel errChan) {
+ super(command, env, directory, redirect, appendEnv, cmdChan, ioChan, errChan);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerFetchInfoCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerFetchInfoCommand.java
new file mode 100644
index 00000000000..7b32c6bbad2
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerFetchInfoCommand.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.remote.proxy.protocol.core.SerializableFileInfo;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerFetchInfoCommand extends AbstractServerCommand {
+ private IFileInfo info;
+
+ private final URI uri;
+ private final OutputStream out;
+
+ private class CommandRunner implements Runnable {
+ @Override
+ public void run() {
+ try {
+ DataOutputStream result = new DataOutputStream(out);
+ SerializableFileInfo sInfo = new SerializableFileInfo(info);
+ sInfo.writeObject(result);
+ result.flush();
+ } catch (IOException e) {
+ // Failed
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public ServerFetchInfoCommand(StreamChannel chan, String path) {
+ this.out = chan.getOutputStream();
+ this.uri = URI.create("file:" + path); //$NON-NLS-1$
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ try {
+ info = EFS.getStore(uri).fetchInfo();
+ } catch (CoreException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ new Thread(new CommandRunner()).start();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetCwdCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetCwdCommand.java
new file mode 100644
index 00000000000..f4b8a2655ae
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetCwdCommand.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerGetCwdCommand extends AbstractServerCommand {
+
+ private String cwd;
+ private final DataOutputStream result;
+
+ private class CommandRunner implements Runnable {
+ @Override
+ public void run() {
+ try {
+ result.writeUTF(cwd);
+ result.flush();
+ } catch (IOException e) {
+ // Failed
+ }
+ }
+ }
+
+ public ServerGetCwdCommand(StreamChannel chan) {
+ this.result = new DataOutputStream(chan.getOutputStream());
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ cwd = System.getProperty("user.dir"); //$NON-NLS-1$
+ new Thread(new CommandRunner()).start();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetEnvCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetEnvCommand.java
new file mode 100644
index 00000000000..256222dcab8
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetEnvCommand.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerGetEnvCommand extends AbstractServerCommand {
+
+ private final DataOutputStream result;
+
+ private class CommandRunner implements Runnable {
+ @Override
+ public void run() {
+ try {
+ Map<String, String> env = System.getenv();
+ result.writeInt(env.size());
+ for (Map.Entry<String, String> entry : env.entrySet()) {
+ result.writeUTF(entry.getKey());
+ result.writeUTF(entry.getValue());
+ }
+ result.flush();
+ } catch (IOException e) {
+ // Failed
+ }
+ }
+ }
+
+ public ServerGetEnvCommand(StreamChannel chan) {
+ this.result = new DataOutputStream(chan.getOutputStream());
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ new Thread(new CommandRunner()).start();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetInputStreamCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetInputStreamCommand.java
new file mode 100644
index 00000000000..cb0fb5b4aed
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetInputStreamCommand.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+/**
+ * TODO: Fix hang if command fails...
+ *
+ */
+public class ServerGetInputStreamCommand extends AbstractServerCommand {
+
+ private final OutputStream out;
+ private final URI uri;
+ private final int options;
+
+ private class Forwarder implements Runnable {
+ private final InputStream in;
+ private final OutputStream out;
+
+ public Forwarder(InputStream in, OutputStream out) {
+ this.in = in;
+ this.out = out;
+ }
+
+ @Override
+ public void run() {
+ byte[] buf = new byte[8192];
+ int n;
+ try {
+ while ((n = in.read(buf)) >= 0) {
+ if (n > 0) {
+ out.write(buf, 0, n); // should block if no-one is reading
+ out.flush();
+ }
+ }
+ } catch (IOException e) {
+ // Finish
+ }
+ try {
+ out.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ try {
+ in.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+
+ public ServerGetInputStreamCommand(StreamChannel chan, int options, String path) {
+ this.out = chan.getOutputStream();
+ this.options = options;
+ this.uri = URI.create("file:" + path); //$NON-NLS-1$
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ try {
+ InputStream in = new BufferedInputStream(
+ EFS.getStore(uri).openInputStream(options, new NullProgressMonitor()));
+ startForwarder(in, out);
+ } catch (Exception e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+
+ private void startForwarder(InputStream in, OutputStream out) {
+ Forwarder forwarder = new Forwarder(in, out);
+ new Thread(forwarder).start();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetOutputStreamCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetOutputStreamCommand.java
new file mode 100644
index 00000000000..930fb4d69fe
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetOutputStreamCommand.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+/**
+ * TODO: Fix hang if command fails...
+ *
+ */
+public class ServerGetOutputStreamCommand extends AbstractServerCommand {
+
+ private final InputStream in;
+ private final URI uri;
+ private final int options;
+
+ private class Forwarder implements Runnable {
+ private final InputStream in;
+ private final OutputStream out;
+
+ public Forwarder(InputStream in, OutputStream out) {
+ this.in = in;
+ this.out = out;
+ }
+
+ @Override
+ public void run() {
+ byte[] buf = new byte[8192];
+ int n;
+ try {
+ while ((n = in.read(buf)) >= 0) {
+ if (n > 0) {
+ out.write(buf, 0, n); // should block if no-one is reading
+ }
+ }
+ out.flush();
+ } catch (IOException e) {
+ // Finish
+ }
+ try {
+ out.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ try {
+ in.close();
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
+
+ public ServerGetOutputStreamCommand(StreamChannel chan, int options, String path) {
+ this.in = chan.getInputStream();
+ this.options = options;
+ this.uri = URI.create("file:" + path); //$NON-NLS-1$
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ try {
+ OutputStream out = new BufferedOutputStream(
+ EFS.getStore(uri).openOutputStream(options, new NullProgressMonitor()));
+ startForwarder(in, out);
+ } catch (CoreException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+
+ private void startForwarder(InputStream in, OutputStream out) {
+ Forwarder forwarder = new Forwarder(in, out);
+ new Thread(forwarder).start();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetPropertiesCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetPropertiesCommand.java
new file mode 100644
index 00000000000..46d538c3082
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerGetPropertiesCommand.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerGetPropertiesCommand extends AbstractServerCommand {
+
+ private final DataOutputStream result;
+
+ private class CommandRunner implements Runnable {
+ @Override
+ public void run() {
+ try {
+ Map<String, String> props = new HashMap<>();
+ props.put(IRemoteConnection.FILE_SEPARATOR_PROPERTY,
+ System.getProperty(IRemoteConnection.FILE_SEPARATOR_PROPERTY));
+ props.put(IRemoteConnection.PATH_SEPARATOR_PROPERTY,
+ System.getProperty(IRemoteConnection.PATH_SEPARATOR_PROPERTY));
+ props.put(IRemoteConnection.LINE_SEPARATOR_PROPERTY,
+ System.getProperty(IRemoteConnection.LINE_SEPARATOR_PROPERTY));
+ props.put(IRemoteConnection.USER_HOME_PROPERTY,
+ System.getProperty(IRemoteConnection.USER_HOME_PROPERTY));
+ props.put(IRemoteConnection.OS_NAME_PROPERTY, System.getProperty(IRemoteConnection.OS_NAME_PROPERTY));
+ props.put(IRemoteConnection.OS_VERSION_PROPERTY,
+ System.getProperty(IRemoteConnection.OS_VERSION_PROPERTY));
+ props.put(IRemoteConnection.OS_ARCH_PROPERTY, System.getProperty(IRemoteConnection.OS_ARCH_PROPERTY));
+ props.put(IRemoteConnection.LOCALE_CHARMAP_PROPERTY, System.getProperty("file.encoding")); //$NON-NLS-1$
+
+ result.writeInt(props.size());
+ for (Map.Entry<String, String> entry : props.entrySet()) {
+ result.writeUTF(entry.getKey());
+ result.writeUTF(entry.getValue());
+ }
+ result.flush();
+ } catch (IOException e) {
+ // Failed
+ }
+ }
+ }
+
+ public ServerGetPropertiesCommand(StreamChannel chan) {
+ this.result = new DataOutputStream(chan.getOutputStream());
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ new Thread(new CommandRunner()).start();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerMkdirCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerMkdirCommand.java
new file mode 100644
index 00000000000..3f193f8b29c
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerMkdirCommand.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerMkdirCommand extends AbstractServerCommand {
+ private final int options;
+ private final URI uri;
+
+ public ServerMkdirCommand(int options, String path) {
+ this.options = options;
+ this.uri = URI.create("file:" + path); //$NON-NLS-1$
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ try {
+ EFS.getStore(uri).mkdir(options, new NullProgressMonitor());
+ } catch (CoreException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerPutInfoCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerPutInfoCommand.java
new file mode 100644
index 00000000000..6647589df9f
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerPutInfoCommand.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.proxy.protocol.core.exceptions.ProxyException;
+
+public class ServerPutInfoCommand extends AbstractServerCommand {
+ private final IFileInfo info;
+ private final int options;
+ private final URI uri;
+
+ public ServerPutInfoCommand(IFileInfo info, int options, String path) {
+ this.info = info;
+ this.options = options;
+ this.uri = URI.create("file:" + path); //$NON-NLS-1$
+ }
+
+ @Override
+ public void exec() throws ProxyException {
+ try {
+ EFS.getStore(uri).putInfo(info, options, new NullProgressMonitor());
+
+ } catch (CoreException e) {
+ throw new ProxyException(e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerShellCommand.java b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerShellCommand.java
new file mode 100644
index 00000000000..eb2b93e7f77
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.core/src/org/eclipse/remote/internal/proxy/server/core/commands/ServerShellCommand.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.server.core.commands;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+
+import org.eclipse.cdt.utils.pty.PTY;
+import org.eclipse.cdt.utils.pty.PTY.Mode;
+import org.eclipse.cdt.utils.spawner.ProcessFactory;
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+
+/**
+ * TODO: Fix hang if command fails...
+ *
+ */
+public class ServerShellCommand extends AbstractServerExecCommand {
+ private class ShellProcess extends Process {
+ private final Process proc;
+ private final PTY pty;
+
+ public ShellProcess(Process proc, PTY pty) {
+ this.proc = proc;
+ this.pty = pty;
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ if (pty != null) {
+ return pty.getOutputStream();
+ }
+ return proc.getOutputStream();
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ if (pty != null) {
+ return pty.getInputStream();
+ }
+ return proc.getInputStream();
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ if (pty != null) {
+ return pty.getInputStream();
+ }
+ return proc.getErrorStream();
+ }
+
+ @Override
+ public int waitFor() throws InterruptedException {
+ return proc.waitFor();
+ }
+
+ @Override
+ public int exitValue() {
+ return proc.exitValue();
+ }
+
+ @Override
+ public void destroy() {
+ proc.destroy();
+ }
+
+ public void setTerminalSize(int cols, int rows) {
+ if (pty != null) {
+ pty.setTerminalSize(cols, rows);
+ }
+ }
+ }
+
+ public ServerShellCommand(StreamChannel cmdChan, StreamChannel ioChan) {
+ super(null, null, null, true, false, cmdChan, ioChan, null);
+ }
+
+ @Override
+ public Process doRun() throws IOException {
+ String shell = findLoginShell();
+
+ if (PTY.isSupported(Mode.TERMINAL)) {
+ PTY pty = new PTY(Mode.TERMINAL);
+ Process p = ProcessFactory.getFactory().exec(new String[] { shell, "-l" }, null, null, pty); //$NON-NLS-1$
+ return new ShellProcess(p, pty);
+ }
+
+ return ProcessFactory.getFactory().exec(new String[] { shell, "-l" }, null, null); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void doKill(Process proc) {
+ if (proc.isAlive()) {
+ proc.destroyForcibly();
+ }
+ }
+
+ @Override
+ protected void doSetTerminalSize(Process proc, int cols, int rows) {
+ if (proc.isAlive() && proc instanceof ShellProcess) {
+ ShellProcess shell = (ShellProcess) proc;
+ shell.setTerminalSize(cols, rows);
+ }
+ }
+
+ /**
+ * Find the login shell.
+ *
+ * On Linux, use `getent passwd $USER`
+ * On Mac OSX, use `dscl . -read /Users/$USER UserShell`
+ *
+ * @return
+ */
+ private String findLoginShell() throws IOException {
+ String res;
+
+ String osName = System.getProperty("os.name"); //$NON-NLS-1$
+ String userName = System.getProperty("user.name"); //$NON-NLS-1$
+ if (osName == null || userName == null) {
+ throw new IOException("Unable to obtain information needed to find login shell"); //$NON-NLS-1$
+ }
+ switch (osName) {
+ case "Mac OS X": //$NON-NLS-1$
+ res = executeCommand("dscl . -read /Users/" + userName + " UserShell"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (res != null) {
+ String[] vals = res.split(" "); //$NON-NLS-1$
+ if (vals.length == 2) {
+ return vals[1];
+ }
+ }
+ break;
+ case "Linux": //$NON-NLS-1$
+ res = executeCommand("getent passwd " + userName); //$NON-NLS-1$
+ if (res != null) {
+ String[] vals = res.split(":"); //$NON-NLS-1$
+ if (vals.length == 7) {
+ return vals[6];
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ throw new IOException("Unable to find login shell for os=" + osName + " user=" + userName); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private String executeCommand(String command) throws IOException {
+ String line;
+ StringBuffer output = new StringBuffer();
+
+ Process p;
+ try {
+ p = Runtime.getRuntime().exec(command);
+ } catch (Exception e) {
+ throw new IOException(e.getMessage());
+ }
+ try {
+ p.waitFor();
+ } catch (InterruptedException e) {
+ throw new IOException(e.getMessage());
+ }
+ BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ line = reader.readLine();
+ while (line != null) {
+ output.append(line);
+ line = reader.readLine();
+ if (line != null) {
+ output.append("\n"); //$NON-NLS-1$
+ }
+ }
+
+ return output.toString();
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.gitignore b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.gitignore
new file mode 100644
index 00000000000..22ddaadc2eb
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.gitignore
@@ -0,0 +1 @@
+/proxy.server.tar.gz
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.project b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.project
new file mode 100644
index 00000000000..19aa35e59de
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.server.linux.ppc64le</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.core.prefs b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..f29e940a005
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..76c99c1fff2
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.proxy.server.linux.ppc64le
+Bundle-Version: 1.0.200.qualifier
+Bundle-Vendor: %pluginProvider
+Bundle-Localization: plugin
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/about.html b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/build.properties b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/build.properties
new file mode 100644
index 00000000000..0c81c8bc303
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/build.properties
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+ proxy.server.tar.gz,\
+ plugin.properties,\
+ about.html
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/plugin.properties b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/plugin.properties
new file mode 100644
index 00000000000..fcffde1896b
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2016 Oak Ridge National Laboratory and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Proxy Server Linux ppc64le Component
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.proxy.server.linux.ppc64le/pom.xml b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/pom.xml
new file mode 100644
index 00000000000..42e5ae1bbdb
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.ppc64le/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2021 Kichwa Coders Canada Inc. and others.
+
+ This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+-->
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.cdt</groupId>
+ <artifactId>cdt-parent</artifactId>
+ <version>10.7.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <version>1.0.200-SNAPSHOT</version>
+ <artifactId>org.eclipse.remote.proxy.server.linux.ppc64le</artifactId>
+ <packaging>eclipse-plugin</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-proxy-server-from-product-to-bundle</id>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <phase>process-resources</phase>
+ <configuration>
+ <target name="copy-proxy-server-from-product-to-bundle">
+ <copy file="${basedir}/../org.eclipse.remote.proxy.server.product/target/products/proxy.server-linux.gtk.ppc64le.tar.gz"
+ tofile="${basedir}/proxy.server.tar.gz"/>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/.gitignore b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.gitignore
new file mode 100644
index 00000000000..22ddaadc2eb
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.gitignore
@@ -0,0 +1 @@
+/proxy.server.tar.gz
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/.project b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.project
new file mode 100644
index 00000000000..eb7c18084dd
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.server.linux.x86_64</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.core.prefs b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..f29e940a005
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.server.linux.x86_64/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..110167a2482
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.proxy.server.linux.x86_64
+Bundle-Version: 1.0.200.qualifier
+Bundle-Vendor: %pluginProvider
+Bundle-Localization: plugin
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/about.html b/remote/org.eclipse.remote.proxy.server.linux.x86_64/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/build.properties b/remote/org.eclipse.remote.proxy.server.linux.x86_64/build.properties
new file mode 100644
index 00000000000..0c81c8bc303
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/build.properties
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+ proxy.server.tar.gz,\
+ plugin.properties,\
+ about.html
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/plugin.properties b/remote/org.eclipse.remote.proxy.server.linux.x86_64/plugin.properties
new file mode 100644
index 00000000000..72cb494a492
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2016 Oak Ridge National Laboratory and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Proxy Server Linux x86_64 Component
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.proxy.server.linux.x86_64/pom.xml b/remote/org.eclipse.remote.proxy.server.linux.x86_64/pom.xml
new file mode 100644
index 00000000000..9529a67982b
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.linux.x86_64/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2021 Kichwa Coders Canada Inc. and others.
+
+ This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+-->
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.cdt</groupId>
+ <artifactId>cdt-parent</artifactId>
+ <version>10.7.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <version>1.0.200-SNAPSHOT</version>
+ <artifactId>org.eclipse.remote.proxy.server.linux.x86_64</artifactId>
+ <packaging>eclipse-plugin</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-proxy-server-from-product-to-bundle</id>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <phase>process-resources</phase>
+ <configuration>
+ <target name="copy-proxy-server-from-product-to-bundle">
+ <copy file="${basedir}/../org.eclipse.remote.proxy.server.product/target/products/proxy.server-linux.gtk.x86_64.tar.gz"
+ tofile="${basedir}/proxy.server.tar.gz"/>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.gitignore b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.gitignore
new file mode 100644
index 00000000000..22ddaadc2eb
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.gitignore
@@ -0,0 +1 @@
+/proxy.server.tar.gz
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.project b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.project
new file mode 100644
index 00000000000..1cd20fb4f09
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.server.macosx.x86_64</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.core.prefs b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..f29e940a005
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..16eaf6cef77
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.proxy.server.macosx.x86_64
+Bundle-Version: 1.0.200.qualifier
+Bundle-Vendor: %pluginProvider
+Bundle-Localization: plugin
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/about.html b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/build.properties b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/build.properties
new file mode 100644
index 00000000000..0c81c8bc303
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/build.properties
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+ proxy.server.tar.gz,\
+ plugin.properties,\
+ about.html
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/plugin.properties b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/plugin.properties
new file mode 100644
index 00000000000..0e193487c25
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2016 Oak Ridge National Laboratory and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Proxy Server Mac OS X x86_64 Component
+pluginProvider=Eclipse PTP
diff --git a/remote/org.eclipse.remote.proxy.server.macosx.x86_64/pom.xml b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/pom.xml
new file mode 100644
index 00000000000..71751a36fe1
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.macosx.x86_64/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2021 Kichwa Coders Canada Inc. and others.
+
+ This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+-->
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.cdt</groupId>
+ <artifactId>cdt-parent</artifactId>
+ <version>10.7.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <version>1.0.200-SNAPSHOT</version>
+ <artifactId>org.eclipse.remote.proxy.server.macosx.x86_64</artifactId>
+ <packaging>eclipse-plugin</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-proxy-server-from-product-to-bundle</id>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <phase>process-resources</phase>
+ <configuration>
+ <target name="copy-proxy-server-from-product-to-bundle">
+ <copy file="${basedir}/../org.eclipse.remote.proxy.server.product/target/products/proxy.server-macosx.cocoa.x86_64.tar.gz"
+ tofile="${basedir}/proxy.server.tar.gz"/>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/remote/org.eclipse.remote.proxy.server.product/.project b/remote/org.eclipse.remote.proxy.server.product/.project
new file mode 100644
index 00000000000..cf484fa252c
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.product/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.server.product</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.server.product/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.server.product/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.product/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.server.product/pom.xml b/remote/org.eclipse.remote.proxy.server.product/pom.xml
new file mode 100644
index 00000000000..6f3073bbefb
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.product/pom.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.cdt</groupId>
+ <artifactId>cdt-parent</artifactId>
+ <version>10.7.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.remote.proxy.server.product</artifactId>
+ <version>1.0.100</version>
+ <packaging>eclipse-repository</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-repository-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <createArtifactRepository>false</createArtifactRepository>
+ <includeAllDependencies>true</includeAllDependencies>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>not-production</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-director-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <formats>
+ <win32>zip</win32>
+ <linux>tar.gz</linux>
+ <macosx>tar.gz</macosx>
+ </formats>
+ <products>
+ <product>
+ <id>proxy.server</id>
+ <rootFolder>proxy</rootFolder>
+ <rootFolders>
+ <macosx>Proxy.app</macosx>
+ </rootFolders>
+ </product>
+ </products>
+ </configuration>
+ <executions>
+ <execution>
+ <id>materialize-products</id>
+ <goals>
+ <goal>materialize-products</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>archive-products</id>
+ <goals>
+ <goal>archive-products</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>production</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-director-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <formats>
+ <win32>zip</win32>
+ <linux>tar.gz</linux>
+ <macosx>tar.gz</macosx>
+ </formats>
+ <products>
+ <product>
+ <id>proxy.server</id>
+ <rootFolder>proxy</rootFolder>
+ <rootFolders>
+ <macosx>Proxy.app</macosx>
+ </rootFolders>
+ </product>
+ </products>
+ </configuration>
+ <executions>
+ <execution>
+ <id>materialize-products</id>
+ <goals>
+ <goal>materialize-products</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>archive-products</id>
+ <!-- must run after signing -->
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>archive-products</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.cbi.maven.plugins</groupId>
+ <artifactId>eclipse-macsigner-plugin</artifactId>
+ <version>${cbi-plugins.version}</version>
+ <executions>
+ <execution>
+ <id>sign</id>
+ <phase>package</phase>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ <configuration>
+ <baseSearchDir>${project.build.directory}/products/proxy.server/macosx</baseSearchDir>
+ <fileNames>
+ <fileName>Proxy.app</fileName>
+ </fileNames>
+ <timeoutMillis>300000</timeoutMillis>
+ <entitlements>${project.basedir}/product.entitlements</entitlements>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
diff --git a/remote/org.eclipse.remote.proxy.server.product/product.entitlements b/remote/org.eclipse.remote.proxy.server.product/product.entitlements
new file mode 100644
index 00000000000..6fdb9d33d10
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.product/product.entitlements
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>com.apple.security.cs.allow-jit</key>
+ <true/>
+ <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
+ <true/>
+ <key>com.apple.security.cs.disable-executable-page-protection</key>
+ <true/>
+ <key>com.apple.security.cs.allow-dyld-environment-variables</key>
+ <true/>
+ <key>com.apple.security.cs.disable-library-validation</key>
+ <true/>
+ <key>com.apple.security.cs.debugger</key>
+ <true/>
+</dict>
+</plist> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.server.product/proxy.server.product b/remote/org.eclipse.remote.proxy.server.product/proxy.server.product
new file mode 100644
index 00000000000..3376d126d2c
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.server.product/proxy.server.product
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product uid="proxy.server" application="org.eclipse.remote.proxy.server.core.application" version="1.0.0" useFeatures="false" includeLaunchers="true">
+
+ <configIni use="default">
+ </configIni>
+
+ <launcherArgs>
+ <programArgsWin>-consoleLog
+ </programArgsWin>
+ <vmArgs>-Declipse.ignoreApp=true -Dosgi.noShutdown=true
+ </vmArgs>
+ </launcherArgs>
+
+ <windowImages/>
+
+ <launcher name="proxy">
+ <win useIco="false">
+ <bmp/>
+ </win>
+ </launcher>
+
+ <vm>
+ <macos include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7</macos>
+ </vm>
+
+ <plugins>
+ <plugin id="com.ibm.icu"/>
+ <plugin id="org.eclipse.cdt.core.macosx" fragment="true"/>
+ <plugin id="org.eclipse.cdt.core.linux.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.cdt.core.linux.ppc64le" fragment="true"/>
+ <plugin id="org.eclipse.cdt.core.native"/>
+ <plugin id="org.eclipse.core.contenttype"/>
+ <plugin id="org.eclipse.core.expressions"/>
+ <plugin id="org.eclipse.core.filesystem"/>
+ <plugin id="org.eclipse.core.filesystem.macosx" fragment="true"/>
+ <plugin id="org.eclipse.core.jobs"/>
+ <plugin id="org.eclipse.core.resources"/>
+ <plugin id="org.eclipse.core.runtime"/>
+ <plugin id="org.eclipse.core.variables"/>
+ <plugin id="org.eclipse.debug.core"/>
+ <plugin id="org.eclipse.equinox.app"/>
+ <plugin id="org.eclipse.equinox.common"/>
+ <plugin id="org.eclipse.equinox.event"/>
+ <plugin id="org.eclipse.equinox.preferences"/>
+ <plugin id="org.eclipse.equinox.registry"/>
+ <plugin id="org.eclipse.equinox.security"/>
+ <plugin id="org.eclipse.equinox.security.macosx" fragment="true"/>
+ <plugin id="org.eclipse.osgi"/>
+ <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
+ <plugin id="org.eclipse.osgi.services"/>
+ <plugin id="org.eclipse.remote.core"/>
+ <plugin id="org.eclipse.remote.proxy.protocol.core"/>
+ <plugin id="org.eclipse.remote.proxy.server.core"/>
+ </plugins>
+
+ <configurations>
+ <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
+ <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
+ <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" />
+ <plugin id="org.eclipse.equinox.event" autoStart="true" startLevel="2" />
+ <plugin id="org.eclipse.equinox.registry" autoStart="true" startLevel="2" />
+ </configurations>
+
+ <preferencesInfo>
+ <targetfile overwrite="false"/>
+ </preferencesInfo>
+
+ <cssInfo>
+ </cssInfo>
+
+</product>
diff --git a/remote/org.eclipse.remote.proxy.tests/.classpath b/remote/org.eclipse.remote.proxy.tests/.classpath
new file mode 100644
index 00000000000..a42a828e04a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src">
+ <attributes>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.proxy.tests/.project b/remote/org.eclipse.remote.proxy.tests/.project
new file mode 100644
index 00000000000..41c1372aa28
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..5b1c443114d
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..51a63ec9988
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=2
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.tests/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.tests/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..61c35eb4b4b
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Remote Proxy Tests
+Bundle-SymbolicName: org.eclipse.remote.proxy.tests
+Bundle-Version: 1.0.100.qualifier
+Bundle-Activator: org.eclipse.remote.proxy.tests.Activator
+Bundle-Vendor: Eclipse PTP
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.filesystem,
+ org.eclipse.remote.core,
+ org.eclipse.remote.proxy.core,
+ org.junit,
+ org.eclipse.remote.proxy.protocol.core
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
+Import-Package: com.jcraft.jsch;version="0.1.53",
+ org.eclipse.jsch.core,
+ org.eclipse.jsch.ui
diff --git a/remote/org.eclipse.remote.proxy.tests/about.html b/remote/org.eclipse.remote.proxy.tests/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.tests/build.properties b/remote/org.eclipse.remote.proxy.tests/build.properties
new file mode 100644
index 00000000000..67af4196ea0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ about.html,\
+ .
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/Activator.java b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/Activator.java
new file mode 100644
index 00000000000..02ff2019936
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/Activator.java
@@ -0,0 +1,57 @@
+package org.eclipse.remote.proxy.tests;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.proxy.tests"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ConnectionTests.java b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ConnectionTests.java
new file mode 100644
index 00000000000..b1100eb7af4
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ConnectionTests.java
@@ -0,0 +1,258 @@
+package org.eclipse.remote.proxy.tests;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.Arrays;
+import java.util.Base64;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jsch.core.IJSchService;
+import org.eclipse.jsch.ui.UserInfoPrompter;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.ChannelShell;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+
+import junit.framework.TestCase;
+
+public class ConnectionTests extends TestCase {
+
+ private IRemoteConnectionType connType;
+
+ class Context {
+ private String line;
+ private State state;
+ private BufferedReader reader;
+ private BufferedWriter writer;
+
+ public Context(BufferedReader reader, BufferedWriter writer) {
+ this.reader = reader;
+ this.writer = writer;
+ setState(States.INIT);
+ }
+
+ String getLine() {
+ return line;
+ }
+
+ void setLine(String line) {
+ this.line = line;
+ }
+
+ State getState() {
+ return state;
+ }
+
+ void setState(State state) {
+ this.state = state;
+ }
+ }
+
+ interface State {
+ /**
+ * @return true to keep processing, false to read more data.
+ */
+ boolean process(Context context) throws IOException;
+ }
+
+ enum States implements State {
+ INIT {
+ @Override
+ public boolean process(Context context) throws IOException {
+ System.out.println("state=" + INIT);
+ String line = context.reader.readLine();
+ System.out.println("got " + line);
+ if (line.equals("running")) {
+ context.setState(States.CHECK);
+ return true;
+ }
+ return false;
+ }
+ },
+ CHECK {
+ @Override
+ public boolean process(Context context) throws IOException {
+ System.out.println("state=" + CHECK);
+ context.writer.write("check\n");
+ context.writer.flush();
+ String line = context.reader.readLine();
+ String[] parts = line.split(":");
+ switch (parts[0]) {
+ case "ok":
+ context.setState(States.START);
+ return true;
+ case "warning":
+ context.setState(States.DOWNLOAD);
+ return true;
+ }
+ System.out.println("fail:" + parts[1]);
+ return false;
+ }
+ },
+ DOWNLOAD {
+ @Override
+ public boolean process(Context context) throws IOException {
+ System.out.println("state=" + DOWNLOAD);
+ File file = new File("proxy.server-linux.gtk.x86_64.tar.gz");
+ long count = file.length() / 510;
+ System.out.println("download " + count);
+ context.writer.write("download " + count + "\n");
+ context.writer.flush();
+ if (downloadFile(file, context.writer)) {
+ String line = context.reader.readLine();
+ String[] parts = line.split(":");
+ switch (parts[0]) {
+ case "ok":
+ context.setState(States.START);
+ return true;
+ case "fail":
+ System.out.println("fail:" + parts[1]);
+ return false;
+ }
+ }
+ return false;
+ }
+
+ private boolean downloadFile(File file, BufferedWriter writer) {
+ try {
+ Base64.Encoder encoder = Base64.getEncoder();
+ FileInputStream in = new FileInputStream(file);
+ byte[] buf = new byte[510]; // Multiple of 3
+ int n;
+ while ((n = in.read(buf)) >= 0) {
+ if (n < 510) {
+ writer.write(encoder.encodeToString(Arrays.copyOf(buf, n)) + "\n");
+ } else {
+ writer.write(encoder.encodeToString(buf));
+ }
+ }
+ writer.flush();
+ in.close();
+ return true;
+ } catch (IOException e) {
+ return false;
+ }
+ }
+ },
+ START {
+ @Override
+ public boolean process(Context context) throws IOException {
+ System.out.println("state=" + START);
+ context.writer.write("start\n");
+ context.writer.flush();
+ return false;
+ }
+ }
+ }
+
+ public void testProxyConnection() {
+ try {
+ IJSchService jService = Activator.getService(IJSchService.class);
+ Session session = jService.createSession("titan.ccs.ornl.gov", 22, "gw6");
+ session.setConfig("PreferredAuthentications", "password,keyboard-interactive,gssapi-with-mic,publickey"); //$NON-NLS-1$ //$NON-NLS-2$
+ new UserInfoPrompter(session);
+ jService.connect(session, 0, new NullProgressMonitor());
+ ChannelExec server = (ChannelExec) session.openChannel("exec");
+ server.setCommand("/bin/sh");
+ server.connect();
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
+ BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
+ FileReader script = new FileReader("bootstrap.sh");
+ BufferedReader scriptReader = new BufferedReader(script);
+ String line;
+ while ((line = scriptReader.readLine()) != null) {
+ writer.write(line + "\n");
+ }
+ scriptReader.close();
+ writer.flush();
+ Context context = new Context(reader, writer);
+ while (context.getState().process(context)) {
+ // do state machine
+ }
+ } catch (JSchException | IOException e) {
+ fail(e.getMessage());
+ }
+
+ // try {
+ // final Process proc = Runtime.getRuntime().exec("java"
+ // + " -cp /Users/gw6/Work/git/org.eclipse.remote/releng/org.eclipse.remote.proxy.server.product/target/products/proxy.server/macosx/cocoa/x86_64/Proxy.app/Contents/Eclipse/plugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar"
+ // + " org.eclipse.equinox.launcher.Main"
+ // + " -application org.eclipse.remote.proxy.server.core.application"
+ // + " -noExit");
+ // assertTrue(proc.isAlive());
+ //
+ // new Thread("stderr") {
+ // private byte[] buf = new byte[1024];
+ // @Override
+ // public void run() {
+ // int n;
+ // BufferedInputStream err = new BufferedInputStream(proc.getErrorStream());
+ // try {
+ // while ((n = err.read(buf)) >= 0) {
+ // if (n > 0) {
+ // System.err.println("server: " + new String(buf, 0, n));
+ // }
+ // }
+ // } catch (IOException e) {
+ // // TODO Auto-generated catch block
+ // e.printStackTrace();
+ // }
+ // }
+ //
+ // }.start();
+ //
+ // IRemoteConnection conn = connType.newConnection("test");
+ // assertNotNull(conn);
+ // IRemoteProxyService proxy = conn.getService(IRemoteProxyService.class);
+ // assertNotNull(proxy);
+ // proxy.setStreams(proc.getInputStream(), proc.getOutputStream());
+ // conn.open(new NullProgressMonitor());
+ // conn.close();
+ //
+ // proc.destroy();
+ // proc.waitFor();
+ // assertEquals(false, proc.isAlive());
+ // } catch (IOException | RemoteConnectionException | InterruptedException e) {
+ // fail(e.getMessage());
+ // }
+ }
+
+ private String executeSshCommand(ChannelShell shell, String command) throws RemoteConnectionException {
+ try {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ByteArrayOutputStream err = new ByteArrayOutputStream();
+ shell.setOutputStream(stream);
+ shell.setExtOutputStream(err);
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(shell.getOutputStream()));
+ writer.write(command);
+ writer.flush();
+ if (err.size() > 0) {
+ throw new RemoteConnectionException(err.toString());
+ }
+ return stream.toString();
+ } catch (IOException e) {
+ throw new RemoteConnectionException(e.getMessage());
+ }
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ // IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ // connType = manager.getConnectionType("org.eclipse.remote.Proxy"); //$NON-NLS-1$
+ // assertNotNull(connType);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/FileStoreTests.java b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/FileStoreTests.java
new file mode 100644
index 00000000000..875b83d1007
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/FileStoreTests.java
@@ -0,0 +1,279 @@
+package org.eclipse.remote.proxy.tests;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.URI;
+import java.util.UUID;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+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.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteServicesManager;
+
+import junit.framework.TestCase;
+
+public class FileStoreTests extends TestCase {
+ private static final String CONNECTION_NAME = "test_connection";
+ private static final String LOCAL_DIR = "/tmp/ptp_" + UUID.randomUUID();
+ private static final String REMOTE_DIR = "/tmp/ptp_" + UUID.randomUUID();
+ private static final String DIR_NAME = "filestore_tests";
+ private static final String LOCAL_FILE = "local_file";
+ private static final String REMOTE_FILE = "remote_file";
+ private static final String REMOTE_FILE2 = "remote_file2";
+ private static final String TEST_CONTENTS = "a string containing fairly *()(*&^$%##\n random text\n with some newlines\n";
+ private static final String TEST_CONTENTS2 = "a different string containing \nfairly *()(*&^$%## random text\n with some newlines\n";
+
+ private IFileStore remoteParent;
+ private IFileStore localParent;
+ private IFileStore remoteDir;
+ private IFileStore localDir;
+
+ private static IRemoteFileService fileService;
+ private static IRemoteConnection connection;
+
+ private void createFile(IFileStore fileStore, String contents) throws CoreException, IOException {
+ OutputStream stream = fileStore.openOutputStream(EFS.NONE, new NullProgressMonitor());
+ assertNotNull(stream);
+ BufferedWriter buf = new BufferedWriter(new OutputStreamWriter(stream));
+ buf.write(contents);
+ buf.close();
+ }
+
+ public void testStreams() {
+ IFileStore remoteFileStore = remoteDir.getChild(REMOTE_FILE);
+
+ for (int i = 0; i < 5; i++) {
+ try {
+ remoteFileStore.delete(EFS.NONE, null);
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ }
+
+ assertFalse(remoteFileStore.fetchInfo().exists());
+
+ try {
+ createFile(remoteFileStore, TEST_CONTENTS);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ assertTrue(remoteFileStore.fetchInfo().exists());
+
+ try {
+ InputStream stream = remoteFileStore.openInputStream(EFS.NONE, null);
+ assertNotNull(stream);
+ BufferedReader buf = new BufferedReader(new InputStreamReader(stream));
+ String line = buf.readLine();
+ assertEquals(line, TEST_CONTENTS.split("\n")[0]);
+
+ buf.close();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ public void testMultiStreams() {
+ IFileStore remoteFileStore = remoteDir.getChild(REMOTE_FILE);
+ IFileStore remoteFileStore2 = remoteDir.getChild(REMOTE_FILE2);
+
+ try {
+ createFile(remoteFileStore, TEST_CONTENTS);
+ createFile(remoteFileStore2, TEST_CONTENTS2);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ assertTrue(remoteFileStore.fetchInfo().exists());
+ assertTrue(remoteFileStore2.fetchInfo().exists());
+
+ /*
+ * Check how many streams we can open
+ */
+ InputStream streams[] = new InputStream[10];
+ int streamCount = 0;
+
+ for (; streamCount < streams.length; streamCount++) {
+ try {
+ streams[streamCount] = remoteFileStore.openInputStream(EFS.NONE, null);
+ } catch (Exception e) {
+ if (!e.getMessage().endsWith("channel is not opened.")) {
+ fail(e.getMessage());
+ }
+ break;
+ }
+ }
+
+ for (int i = 0; i < streamCount; i++) {
+ try {
+ streams[i].close();
+ } catch (IOException e) {
+ // No need to deal with this
+ }
+ }
+
+ for (int i = 0; i < streamCount / 2; i++) {
+ try {
+ InputStream stream = remoteFileStore.openInputStream(EFS.NONE, null);
+ assertNotNull(stream);
+ BufferedReader buf = new BufferedReader(new InputStreamReader(stream));
+ String line = buf.readLine();
+ assertEquals(line, TEST_CONTENTS.split("\n")[0]);
+
+ InputStream stream2 = remoteFileStore2.openInputStream(EFS.NONE, null);
+ assertNotNull(stream2);
+ BufferedReader buf2 = new BufferedReader(new InputStreamReader(stream2));
+ String line2 = buf2.readLine();
+ assertEquals(line2, TEST_CONTENTS2.split("\n")[0]);
+
+ stream.close();
+ stream2.close();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ public void testCopy() {
+ final IFileStore localFileStore = localDir.getChild(LOCAL_FILE);
+ final IFileStore remoteFileStore = remoteDir.getChild(REMOTE_FILE);
+ try {
+ localFileStore.delete(EFS.NONE, new NullProgressMonitor());
+ remoteFileStore.delete(EFS.NONE, new NullProgressMonitor());
+ createFile(localFileStore, "foo\n");
+ localFileStore.copy(remoteFileStore, EFS.NONE, new NullProgressMonitor());
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ IFileInfo srcInfo = localFileStore.fetchInfo();
+ IFileInfo dstInfo = remoteFileStore.fetchInfo();
+ assertTrue(dstInfo.exists());
+ assertTrue(srcInfo.getLength() == dstInfo.getLength());
+ try {
+ InputStream stream = remoteFileStore.openInputStream(EFS.NONE, new NullProgressMonitor());
+ byte[] b = new byte[4];
+ stream.read(b);
+ stream.close();
+ assertTrue(b[0] == 'f');
+ assertTrue(b[1] == 'o');
+ assertTrue(b[2] == 'o');
+ assertTrue(b[3] == '\n');
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ public void testExecutable() {
+ IFileStore fs = remoteDir.getChild(REMOTE_FILE);
+ try {
+ fs.delete(EFS.NONE, new NullProgressMonitor());
+ createFile(fs, "contents");
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ IFileInfo fi = fs.fetchInfo();
+ boolean current = fi.getAttribute(EFS.ATTRIBUTE_EXECUTABLE);
+ boolean expected = !current;
+ fi.setAttribute(EFS.ATTRIBUTE_EXECUTABLE, expected);
+ try {
+ fs.putInfo(fi, EFS.SET_ATTRIBUTES, new NullProgressMonitor());
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ }
+ fs = remoteDir.getChild(REMOTE_FILE);
+ fi = fs.fetchInfo();
+ assertEquals(expected, fi.getAttribute(EFS.ATTRIBUTE_EXECUTABLE));
+ }
+
+ public void xtestLargeFile() {
+ IFileStore local = EFS.getLocalFileSystem().getStore(new Path("/usr/bin/php"));
+ IFileStore remote = remoteDir.getChild("php.xxx");
+ try {
+ remote.delete(0, new NullProgressMonitor());
+ InputStream inp = local.openInputStream(0, new NullProgressMonitor());
+ OutputStream out = remote.openOutputStream(0, new NullProgressMonitor());
+ byte[] b = new byte[1024];
+ int len;
+ while ((len = inp.read(b)) > 0) {
+ out.write(b, 0, len);
+ }
+ inp.close();
+ out.close();
+ IFileInfo linfo = local.fetchInfo();
+ IFileInfo rinfo = remote.fetchInfo();
+ assertEquals(linfo.getLength(), rinfo.getLength());
+ } catch (CoreException | IOException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ public void testCopyLargeFile() {
+ IFileStore local = EFS.getLocalFileSystem().getStore(new Path("/usr/bin/php"));
+ IFileStore remote = remoteDir.getChild("php.xxx");
+ try {
+ local.copy(remote, EFS.OVERWRITE, new NullProgressMonitor());
+ IFileInfo linfo = local.fetchInfo();
+ IFileInfo rinfo = remote.fetchInfo();
+ assertEquals(linfo.getLength(), rinfo.getLength());
+ } catch (CoreException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ if (connection == null) {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connType = manager.getConnectionType("org.eclipse.remote.Proxy"); //$NON-NLS-1$
+ assertNotNull(connType);
+ IRemoteConnectionWorkingCopy wc = connType.newConnection(CONNECTION_NAME);
+ IRemoteConnectionHostService host = wc.getService(IRemoteConnectionHostService.class);
+ host.setHostname("titan-ext1.ccs.ornl.gov");
+ // host.setHostname("localhost");
+ host.setUsername("gw6");
+ connection = wc.save();
+ assertNotNull(connection);
+ connection.open(new NullProgressMonitor());
+ assertTrue(connection.isOpen());
+ fileService = connection.getService(IRemoteFileService.class);
+ assertNotNull(fileService);
+ }
+
+ URI remoteDirUri = fileService.toURI(REMOTE_DIR);
+ URI localDirUri = fileService.toURI(LOCAL_DIR);
+ assertNotNull(remoteDirUri);
+ assertNotNull(localDirUri);
+
+ remoteParent = EFS.getStore(fileService.toURI(REMOTE_DIR));
+ remoteDir = remoteParent.getChild(DIR_NAME);
+ localParent = EFS.getLocalFileSystem().getStore(new Path(LOCAL_DIR));
+ localDir = localParent.getChild(DIR_NAME);
+
+ remoteDir.mkdir(EFS.NONE, null);
+ localDir.mkdir(EFS.NONE, null);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ remoteParent.delete(EFS.NONE, new NullProgressMonitor());
+ localParent.delete(EFS.NONE, new NullProgressMonitor());
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexServerTests.java b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexServerTests.java
new file mode 100644
index 00000000000..9ff7172a240
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexServerTests.java
@@ -0,0 +1,193 @@
+package org.eclipse.remote.proxy.tests;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.StreamChannelManager;
+
+import junit.framework.TestCase;
+
+public class MultiplexServerTests extends TestCase {
+ private static final int NUM_CHANS = 5;
+
+ private class ChanReader implements Runnable {
+ private byte[] buf = new byte[8192];
+ private StreamChannel chan;
+ private StringBuffer[] recvBufs;
+ private String name;
+
+ public ChanReader(StreamChannel chan, StringBuffer[] recvBufs, String name) {
+ this.chan = chan;
+ this.recvBufs = recvBufs;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void run() {
+ try {
+ synchronized (MultiplexServerTests.this) {
+ System.out.println(getName() + " started");
+ }
+ int n;
+ while ((n = chan.getInputStream().read(buf)) >= 0) {
+ if (n > 0) {
+ String s = new String(buf, 0, n);
+ recvBufs[chan.getId()].append(s);
+ }
+ }
+ synchronized (MultiplexServerTests.this) {
+ System.out.println(getName() + " finished");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private class ChanWriter implements Runnable {
+ private StreamChannel chan;
+ private StringBuffer[] sentBufs;
+ private Random r = new Random();
+ private String name;
+
+ public ChanWriter(StreamChannel chan, StringBuffer[] sentBufs, String name) {
+ this.chan = chan;
+ this.sentBufs = sentBufs;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void run() {
+ try {
+ synchronized (MultiplexServerTests.this) {
+ System.out.println(getName() + " started");
+ }
+ for (int i = 0; i < 100; i++) {
+ String s = String.format("%05d\n", i);
+ chan.getOutputStream().write(s.getBytes());
+ // chan.getOutputStream().flush();
+ sentBufs[chan.getId()].append(s);
+ try {
+ Thread.sleep(r.nextInt(100));
+ } catch (InterruptedException e) {
+ fail(e.getMessage());
+ }
+ }
+ chan.getOutputStream().flush();
+ synchronized (MultiplexServerTests.this) {
+ System.out.println(getName() + " finished");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void testChannels() {
+ try {
+ final StringBuffer[] clntSentBufs = new StringBuffer[NUM_CHANS];
+ final StringBuffer[] clntRecvBufs = new StringBuffer[NUM_CHANS];
+
+ final Thread[] clntReaders = new Thread[NUM_CHANS];
+ final Thread[] clntWriters = new Thread[NUM_CHANS];
+
+ for (int i = 0; i < NUM_CHANS; i++) {
+ clntSentBufs[i] = new StringBuffer();
+ clntRecvBufs[i] = new StringBuffer();
+ }
+
+ final Process proc = Runtime.getRuntime().exec("java -jar /Users/gw6/Desktop/Server.jar");
+ assertTrue(proc.isAlive());
+
+ new Thread("stderr") {
+ private byte[] buf = new byte[1024];
+
+ @Override
+ public void run() {
+ int n;
+ BufferedInputStream err = new BufferedInputStream(proc.getErrorStream());
+ try {
+ while ((n = err.read(buf)) >= 0) {
+ if (n > 0) {
+ System.err.println("server: " + new String(buf, 0, n));
+ }
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ }.start();
+
+ StreamChannelManager mpxClnt = startMpxClient(proc.getInputStream(), proc.getOutputStream());
+
+ List<StreamChannel> channels = runChannelTest(mpxClnt, clntReaders, clntWriters, clntSentBufs,
+ clntRecvBufs);
+
+ for (int i = 0; i < NUM_CHANS; i++) {
+ clntWriters[i].join();
+ }
+
+ for (StreamChannel channel : channels) {
+ channel.close();
+ }
+
+ for (int i = 0; i < NUM_CHANS; i++) {
+ if (clntReaders[i] != null) {
+ clntReaders[i].join();
+ }
+ }
+
+ proc.destroy();
+ proc.waitFor();
+ assertEquals(0, proc.exitValue());
+ } catch (IOException | InterruptedException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ private List<StreamChannel> runChannelTest(StreamChannelManager mpx, Thread[] readers, Thread[] writers,
+ final StringBuffer[] sentBufs, final StringBuffer[] recvBufs) throws IOException {
+ List<StreamChannel> channels = new ArrayList<>();
+ for (int i = 0; i < NUM_CHANS; i++) {
+ StreamChannel chan = mpx.openChannel(); // needs to be in same thread as reader
+ // ChanReader reader = new ChanReader(chan, recvBufs, "clnt reader thread " + chan.getId());
+ // readers[chan.getId()] = new Thread(reader, reader.getName());
+ ChanWriter writer = new ChanWriter(chan, sentBufs, "clnt writer thread " + chan.getId());
+ writers[chan.getId()] = new Thread(writer, writer.getName());
+ // readers[chan.getId()].start();
+ writers[chan.getId()].start();
+ channels.add(chan);
+ }
+ return channels;
+ }
+
+ private StreamChannelManager startMpxClient(InputStream in, OutputStream out) {
+ final StreamChannelManager mpx = new StreamChannelManager(in, out);
+ new Thread(mpx, "client multiplexer").start();
+ return mpx;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexTests.java b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexTests.java
new file mode 100644
index 00000000000..cf5597d76b7
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/MultiplexTests.java
@@ -0,0 +1,283 @@
+package org.eclipse.remote.proxy.tests;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.eclipse.remote.proxy.protocol.core.StreamChannel;
+import org.eclipse.remote.proxy.protocol.core.StreamChannelManager;
+import org.eclipse.remote.proxy.protocol.core.StreamChannelManager.IChannelListener;
+
+import junit.framework.TestCase;
+
+public class MultiplexTests extends TestCase {
+ private static final int NUM_CHANS_PER_THREAD = 5;
+ private static final int NUM_THREADS = 5;
+ private static final int FINISH = -1;
+
+ private class ChanReader implements Runnable {
+ private DataInputStream in;
+ private List<Integer> recvBufs;
+ private String name;
+
+ public ChanReader(StreamChannel chan, List<Integer> recvBufs, String name) {
+ this.in = new DataInputStream(chan.getInputStream());
+ this.recvBufs = recvBufs;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void run() {
+ try {
+ synchronized (MultiplexTests.this) {
+ System.out.println(getName() + " started");
+ }
+ try {
+ while (true) {
+ int val = in.readInt();
+ if (val == FINISH) {
+ break;
+ }
+ recvBufs.add(val);
+ }
+ } catch (EOFException e) {
+ // Finish
+ }
+ synchronized (MultiplexTests.this) {
+ System.out.println(getName() + " finished");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private class ChanWriter implements Runnable {
+ private DataOutputStream out;
+ private List<Integer> sentBufs;
+ private Random r = new Random();
+ private String name;
+
+ public ChanWriter(StreamChannel chan, List<Integer> sentBufs, String name) {
+ this.out = new DataOutputStream(chan.getOutputStream());
+ this.sentBufs = sentBufs;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void run() {
+ try {
+ synchronized (MultiplexTests.this) {
+ System.out.println(getName() + " started");
+ }
+ for (int i = 0; i < 100; i++) {
+ int val = r.nextInt(1024);
+ out.writeInt(val);
+ out.flush();
+ sentBufs.add(val);
+ try {
+ Thread.sleep(r.nextInt(100));
+ } catch (InterruptedException e) {
+ fail(e.getMessage());
+ }
+ }
+ out.writeInt(FINISH);
+ out.flush();
+ synchronized (MultiplexTests.this) {
+ System.out.println(getName() + " finished");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private class ChanReaderWriter implements Runnable {
+ private DataInputStream in;
+ private DataOutputStream out;
+ private String name;
+
+ public ChanReaderWriter(StreamChannel chan, String name) {
+ this.in = new DataInputStream(chan.getInputStream());
+ this.out = new DataOutputStream(chan.getOutputStream());
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void run() {
+ try {
+ synchronized (MultiplexTests.this) {
+ System.out.println(getName() + " started");
+ }
+ try {
+ while (true) {
+ int val = in.readInt();
+ out.writeInt(val);
+ out.flush();
+ }
+ } catch (EOFException e) {
+ // Finish
+ }
+ synchronized (MultiplexTests.this) {
+ System.out.println(getName() + " finished");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void testChannels() {
+ try {
+ final PipedInputStream inClnt = new PipedInputStream();
+ final PipedInputStream inSvr = new PipedInputStream();
+ final PipedOutputStream outClnt = new PipedOutputStream(inSvr);
+ final PipedOutputStream outSvr = new PipedOutputStream(inClnt);
+
+ final List<List<Integer>> clntSentBufs = new ArrayList<>();
+ final List<List<Integer>> clntRecvBufs = new ArrayList<>();
+
+ final Thread[][] clntReaders = new Thread[NUM_THREADS][NUM_CHANS_PER_THREAD];
+ final Thread[][] clntWriters = new Thread[NUM_THREADS][NUM_CHANS_PER_THREAD];
+ final Thread[] svrRW = new Thread[NUM_THREADS * NUM_CHANS_PER_THREAD];
+ final Thread[] testers = new Thread[NUM_THREADS];
+
+ for (int i = 0; i < NUM_CHANS_PER_THREAD * NUM_THREADS; i++) {
+ clntSentBufs.add(new ArrayList<Integer>());
+ clntRecvBufs.add(new ArrayList<Integer>());
+ }
+
+ // Must start server first or it will miss the new channel message
+ StreamChannelManager mpxSvr = startMpxServer(inSvr, outSvr, svrRW);
+
+ StreamChannelManager mpxClnt = startMpxClient(inClnt, outClnt);
+
+ List<StreamChannel> channels = runChannelTest(mpxClnt, testers, clntReaders, clntWriters, clntSentBufs,
+ clntRecvBufs);
+
+ // Make sure all the testers have finished
+ for (int i = 0; i < NUM_THREADS; i++) {
+ testers[i].join();
+ }
+
+ // Wait for the readers and writers to complete
+ for (int i = 0; i < NUM_THREADS; i++) {
+ for (int j = 0; j < NUM_CHANS_PER_THREAD; j++) {
+ clntWriters[i][j].join();
+ clntReaders[i][j].join();
+ }
+ }
+
+ for (StreamChannel channel : channels) {
+ channel.close();
+ }
+
+ for (int i = 0; i < NUM_THREADS * NUM_CHANS_PER_THREAD; i++) {
+ svrRW[i].join();
+ }
+
+ for (int i = 0; i < NUM_CHANS_PER_THREAD * NUM_THREADS; i++) {
+ assertEquals(clntSentBufs.get(i), clntRecvBufs.get(i));
+ }
+ } catch (IOException | InterruptedException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ private List<StreamChannel> runChannelTest(final StreamChannelManager mpx, final Thread[] testers,
+ final Thread[][] readers, final Thread[][] writers, final List<List<Integer>> sentBufs,
+ final List<List<Integer>> recvBufs) throws IOException {
+ final List<StreamChannel> channels = new ArrayList<>();
+ for (int i = 0; i < NUM_THREADS; i++) {
+ final int thread = i;
+ testers[i] = new Thread("client test thread " + thread) {
+ @Override
+ public void run() {
+ try {
+ for (int j = 0; j < NUM_CHANS_PER_THREAD; j++) {
+ StreamChannel chan = mpx.openChannel();
+ ChanReader reader = new ChanReader(chan, recvBufs.get(thread * NUM_CHANS_PER_THREAD + j),
+ "clnt reader thread=" + thread + " chan=" + chan.getId());
+ readers[thread][j] = new Thread(reader, reader.getName());
+ ChanWriter writer = new ChanWriter(chan, sentBufs.get(thread * NUM_CHANS_PER_THREAD + j),
+ "clnt writer thread=" + thread + " chan=" + chan.getId());
+ writers[thread][j] = new Thread(writer, writer.getName());
+ readers[thread][j].start();
+ writers[thread][j].start();
+ channels.add(chan);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ };
+ testers[i].start();
+ }
+ return channels;
+ }
+
+ private StreamChannelManager startMpxClient(InputStream in, OutputStream out) {
+ final StreamChannelManager mpx = new StreamChannelManager(in, out);
+ new Thread(mpx, "client multiplexer").start();
+ return mpx;
+ }
+
+ private StreamChannelManager startMpxServer(InputStream in, OutputStream out, final Thread[] rws)
+ throws IOException {
+ final StreamChannelManager mpx = new StreamChannelManager(in, out);
+ mpx.setServer(true);
+ mpx.addListener(new IChannelListener() {
+ private int numThreadChans;
+
+ @Override
+ public void newChannel(final StreamChannel chan) {
+ synchronized (MultiplexTests.this) {
+ System.out.println("newChannel " + chan.getId());
+ }
+
+ ChanReaderWriter rw = new ChanReaderWriter(chan, "svr rw thread " + numThreadChans);
+ rws[numThreadChans] = new Thread(rw, rw.getName());
+ rws[numThreadChans++].start();
+ }
+
+ @Override
+ public void closeChannel(StreamChannel chan) {
+ // readers[idx].interrupt();
+ // writers[idx].interrupt();
+ synchronized (MultiplexTests.this) {
+ System.out.println("closeChannel " + chan.getId());
+ }
+ }
+ });
+ new Thread(mpx, "server multiplexer").start();
+ return mpx;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java
new file mode 100644
index 00000000000..b22c2cc2b76
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/ProcessTests.java
@@ -0,0 +1,259 @@
+package org.eclipse.remote.proxy.tests;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+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.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.RemoteProcessAdapter;
+
+import junit.framework.TestCase;
+
+public class ProcessTests extends TestCase {
+ private static final String CONNECTION_NAME = "test_connection";
+ private static final int NUM_THREADS = 1;
+
+ private static IRemoteConnection connection;
+ private static IRemoteProcessService processService;
+
+ private boolean threadFailed = false;
+
+ public void testStreamHalfClose() {
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("perl", "-v"); //$NON-NLS-1$
+ try {
+ final Set<String> results = new HashSet<>();
+ IRemoteProcess proc = builder.start();
+ proc.getOutputStream().close(); // close stdin to make sure half closed channel works
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line;
+ while ((line = stdout.readLine()) != null) {
+ results.add(line);
+ results.add("\n");
+ }
+ try {
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ assertTrue(results.toString().contains("Larry Wall"));
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+
+ }
+
+ public void testConcurrentProcess() {
+ Thread[] threads = new Thread[NUM_THREADS];
+
+ for (int t = 0; t < NUM_THREADS; t++) {
+ final String threadNum = Integer.toString(t);
+ Thread thread = new Thread("test thread " + t) {
+ @Override
+ public void run() {
+ final Set<String> results = Collections.synchronizedSet(new HashSet<String>());
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("perl", "-v"); //$NON-NLS-1$
+ assertNotNull(builder);
+ // builder.redirectErrorStream(true);
+ for (int i = 0; i < 1; i++) {
+ try {
+ IRemoteProcess proc = builder.start();
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line;
+ while ((line = stdout.readLine()) != null) {
+ System.out.println("read " + line);
+ results.add(line);
+ results.add("\n");
+ }
+ try {
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ fail(e.getMessage());
+ }
+ if (!results.toString().contains("Larry Wall")) {
+ threadFailed = true;
+ }
+ assertTrue(results.toString().contains("Larry Wall"));
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ };
+ thread.start();
+ threads[t] = thread;
+ }
+ for (Thread t : threads) {
+ try {
+ t.join();
+ } catch (InterruptedException e) {
+ }
+ }
+ assertFalse(threadFailed);
+ }
+
+ public void testEnv() {
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("printenv"); //$NON-NLS-1$
+ assertNotNull(builder);
+ builder.redirectErrorStream(true);
+ String path = builder.environment().get("PATH");
+ builder.environment().clear();
+ builder.environment().put("PATH", path);
+ try {
+ IRemoteProcess proc = builder.start();
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line;
+ String result = null;
+ while ((line = stdout.readLine()) != null) {
+ assertNull(result);
+ result = line;
+ break;
+ }
+ assertEquals("PATH=" + path, result);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ }
+
+ public void testEcho() {
+ IRemoteProcessBuilder builder = processService.getProcessBuilder("cat"); //$NON-NLS-1$
+ assertNotNull(builder);
+ builder.redirectErrorStream(true);
+ final StringBuffer result = new StringBuffer();
+ try {
+ final IRemoteProcess proc = builder.start();
+ Thread readerThread = new Thread("echo reader thread") {
+ @Override
+ public void run() {
+ try {
+ BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = stdout.readLine();
+ int count = Integer.parseInt(line);
+ for (int i = 0; i < count; i++) {
+ line = stdout.readLine();
+ if (line == null) {
+ break;
+ }
+ result.append(line);
+ System.out.println(line);
+ }
+ try {
+ proc.destroy();
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ }
+
+ };
+ Thread writerThread = new Thread("echo writer thread") {
+ @Override
+ public void run() {
+ try {
+ BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
+ int count = 10;
+ String line = count + "\n";
+ stdin.write(line);
+ stdin.flush();
+ for (int i = 0; i < count; i++) {
+ line = i + "\n";
+ stdin.write(line);
+ stdin.flush();
+ }
+ try {
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ }
+
+ };
+ writerThread.start();
+ readerThread.start();
+ writerThread.join();
+ readerThread.join();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+
+ assertEquals("0123456789", result.toString());
+ }
+
+ public void testExitValue() {
+ IRemoteProcessBuilder builder = processService.getProcessBuilder(new String[] { "sleep", "50" }); //$NON-NLS-1$
+ assertNotNull(builder);
+ IRemoteProcess rp = null;
+ try {
+ rp = builder.start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getLocalizedMessage());
+ }
+ assertNotNull(rp);
+ Process p = new RemoteProcessAdapter(rp);
+ try {
+ p.exitValue();
+ fail("Process has not exited. Should throws an IllegalThreadStateException exception");
+ } catch (IllegalThreadStateException e) {
+ // Ok
+ }
+ try {
+ p.destroyForcibly();
+ p.waitFor();
+ } catch (InterruptedException e) {
+ fail(e.getMessage());
+ }
+ assertFalse(p.isAlive());
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ if (connection == null) {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connType = manager.getConnectionType("org.eclipse.remote.Proxy"); //$NON-NLS-1$
+ assertNotNull(connType);
+ IRemoteConnectionWorkingCopy wc = connType.newConnection(CONNECTION_NAME);
+ IRemoteConnectionHostService host = wc.getService(IRemoteConnectionHostService.class);
+ host.setHostname("localhost");
+ // host.setHostname("titan-ext1.ccs.ornl.gov");
+ host.setUsername("gw6");
+ connection = wc.save();
+ assertNotNull(connection);
+ connection.open(new NullProgressMonitor());
+ assertTrue(connection.isOpen());
+ processService = connection.getService(IRemoteProcessService.class);
+ assertNotNull(processService);
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/RemoteCoreTestSuite.java b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/RemoteCoreTestSuite.java
new file mode 100644
index 00000000000..2d9151705a4
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.tests/src/org/eclipse/remote/proxy/tests/RemoteCoreTestSuite.java
@@ -0,0 +1,13 @@
+package org.eclipse.remote.proxy.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class RemoteCoreTestSuite {
+ public static Test suite() {
+ TestSuite suite = new TestSuite(RemoteCoreTestSuite.class.getName());
+
+ return suite;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy.ui/.classpath b/remote/org.eclipse.remote.proxy.ui/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.proxy.ui/.project b/remote/org.eclipse.remote.proxy.ui/.project
new file mode 100644
index 00000000000..1979ba08863
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.proxy.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.proxy.ui/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.proxy.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..bc677565ba5
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,42 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.proxy.ui;singleton:=true
+Bundle-Version: 1.0.200.qualifier
+Bundle-Activator: org.eclipse.remote.internal.proxy.ui.Activator
+Bundle-Vendor: %pluginProvider
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.internal.proxy.ui;x-internal:=true,
+ org.eclipse.remote.internal.proxy.ui.messages;x-internal:=true
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: com.jcraft.jsch,
+ org.eclipse.core.filesystem,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.operation,
+ org.eclipse.jface.preference,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.jface.wizard,
+ org.eclipse.jsch.core,
+ org.eclipse.jsch.ui,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.internal.proxy.core,
+ org.eclipse.remote.ui,
+ org.eclipse.remote.ui.dialogs,
+ org.eclipse.remote.ui.widgets,
+ org.eclipse.swt,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui.dialogs,
+ org.eclipse.ui.forms.events,
+ org.eclipse.ui.forms.widgets,
+ org.eclipse.ui.ide.fileSystem,
+ org.eclipse.ui.plugin,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.proxy.ui/about.html b/remote/org.eclipse.remote.proxy.ui/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.ui/about.ini b/remote/org.eclipse.remote.proxy.ui/about.ini
new file mode 100644
index 00000000000..e07a7bb377e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/about.ini
@@ -0,0 +1,24 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=cdt_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.proxy.ui/about.mappings b/remote/org.eclipse.remote.proxy.ui/about.mappings
new file mode 100644
index 00000000000..936a8039c3e
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/about.mappings
@@ -0,0 +1,9 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20200106-1728"
+# This value will be added automatically via the build scripts
+0=${buildId}
diff --git a/remote/org.eclipse.remote.proxy.ui/about.properties b/remote/org.eclipse.remote.proxy.ui/about.properties
new file mode 100644
index 00000000000..08450260a0a
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/about.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+# NOTE TO TRANSLATOR: Please do not translate the featureVersion variable.
+
+
+blurb=Remote Services Proxy\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+\n\
+See the NOTICE file(s) distributed with this work for additional\n\
+information regarding copyright ownership.\n\
+\n\
+Visit http://www.eclipse.org/cdt
diff --git a/remote/org.eclipse.remote.proxy.ui/build.properties b/remote/org.eclipse.remote.proxy.ui/build.properties
new file mode 100644
index 00000000000..a021be1bfe6
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/build.properties
@@ -0,0 +1,14 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ cdt_logo_icon32.png,\
+ icons/
+src.includes = about.html
+
diff --git a/remote/org.eclipse.remote.proxy.ui/cdt_logo_icon32.png b/remote/org.eclipse.remote.proxy.ui/cdt_logo_icon32.png
new file mode 100644
index 00000000000..470ca81b327
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/cdt_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.proxy.ui/icons/full/obj16/connection.gif b/remote/org.eclipse.remote.proxy.ui/icons/full/obj16/connection.gif
new file mode 100644
index 00000000000..870934b6934
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/icons/full/obj16/connection.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.proxy.ui/icons/ssh.png b/remote/org.eclipse.remote.proxy.ui/icons/ssh.png
new file mode 100644
index 00000000000..8cbd0a13ba8
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/icons/ssh.png
Binary files differ
diff --git a/remote/org.eclipse.remote.proxy.ui/plugin.properties b/remote/org.eclipse.remote.proxy.ui/plugin.properties
new file mode 100644
index 00000000000..2df15ff1a0d
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2016 Oak Ridge National Laboratory and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Proxy UI Remote Support
+pluginProvider=Eclipse PTP
+ProxyTransferConnections.name=Remote Connections
+ProxyTransferConnections.description=All remote proxy connections \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.ui/plugin.xml b/remote/org.eclipse.remote.proxy.ui/plugin.xml
new file mode 100644
index 00000000000..8c2b5b2704c
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/plugin.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.ide.filesystemSupport">
+ <filesystemContributor
+ class="org.eclipse.remote.internal.proxy.ui.ProxyFileSystemContributor"
+ label="Proxy"
+ scheme="proxy">
+ </filesystemContributor>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferenceTransfer">
+ <transfer
+ icon="icons/full/obj16/connection.gif"
+ id="org.eclipse.remote.proxy.transfer.connections"
+ name="%ProxyTransferConnections.name">
+ <mapping
+ scope="instance">
+ <entry
+ node="org.eclipse.remote.proxy.core/connections">
+ </entry>
+ </mapping>
+ <description>
+ %ProxyTransferConnections.description
+ </description>
+ </transfer>
+ </extension>
+ <extension
+ point="org.eclipse.remote.core.authenticator">
+ <authenticator
+ class="org.eclipse.remote.internal.proxy.ui.ProxyUserAuthenticator"
+ id="org.eclipse.remote.Proxy"
+ priority="0">
+ </authenticator>
+ </extension>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.ui.ProxyUIConnectionService$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIConnectionService">
+ </connectionTypeService>
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.ui.RemoteUIFileService$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIFileService">
+ </connectionTypeService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.Proxy"
+ factory="org.eclipse.remote.internal.proxy.ui.ProxyUserAuthenticator$Factory"
+ service="org.eclipse.remote.core.IUserAuthenticatorService">
+ </connectionService>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/Activator.java b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/Activator.java
new file mode 100644
index 00000000000..78b23735369
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/Activator.java
@@ -0,0 +1,114 @@
+package org.eclipse.remote.internal.proxy.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jsch.core.IJSchService;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ private static final String PLUGIN_ID = "org.eclipse.remote.jsch.ui"; //$NON-NLS-1$
+
+ // Image Keys
+ public static final String IMG_CONNECTION_TYPE = PLUGIN_ID + ".connectionType"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get unique identifier
+ *
+ * @return
+ * @since 5.0
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() == null) {
+ return PLUGIN_ID;
+ }
+ return getDefault().getBundle().getSymbolicName();
+ }
+
+ /**
+ * Logs the specified status with this plug-in's log.
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Logs an internal error with the specified message.
+ *
+ * @param message
+ * the error message to log
+ */
+ public static void log(String message) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
+ }
+
+ /**
+ * Logs an internal error with the specified throwable
+ *
+ * @param e
+ * the exception to be logged
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
+ }
+
+ private IJSchService fJSchService;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+ public IJSchService getService() {
+ return fJSchService;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ ServiceReference<IJSchService> reference = context.getServiceReference(IJSchService.class);
+ fJSchService = context.getService(reference);
+ getImageRegistry().put(IMG_CONNECTION_TYPE, imageDescriptorFromPlugin(PLUGIN_ID, "/icons/ssh.png")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyFileSystemContributor.java b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyFileSystemContributor.java
new file mode 100644
index 00000000000..1c9dc72da16
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyFileSystemContributor.java
@@ -0,0 +1,50 @@
+/********************************************************************************
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ * This program and the accompanying materials are made available under the terms
+ * of the Eclipse Public License 2.0 which accompanies this distribution, and is
+ * available at https://www.eclipse.org/legal/epl-2.0/
+ ********************************************************************************/
+
+package org.eclipse.remote.internal.proxy.ui;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.internal.proxy.core.ProxyFileSystem;
+import org.eclipse.remote.internal.proxy.ui.messages.Messages;
+import org.eclipse.remote.ui.IRemoteUIFileService;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ide.fileSystem.FileSystemContributor;
+
+public class ProxyFileSystemContributor extends FileSystemContributor {
+ @Override
+ public URI browseFileSystem(String initialPath, Shell shell) {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connectionType = manager.getConnectionType(ProxyConnection.JSCH_ID);
+ IRemoteUIFileService uiFileMgr = connectionType.getService(IRemoteUIFileService.class);
+ uiFileMgr.showConnections(true);
+ String path = uiFileMgr.browseDirectory(shell, Messages.ProxyFileSystemContributor_0, initialPath, 0);
+ if (path != null) {
+ IRemoteConnection conn = uiFileMgr.getConnection();
+ if (conn != null) {
+ return ProxyFileSystem.getURIFor(conn.getName(), path);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public URI getURI(String string) {
+ try {
+ return new URI(string);
+ } catch (URISyntaxException e) {
+ // Ignore
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUIConnectionService.java b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUIConnectionService.java
new file mode 100644
index 00000000000..daa7a78cddc
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUIConnectionService.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2016, 2020 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.proxy.ui.messages.Messages;
+import org.eclipse.remote.internal.proxy.ui.wizards.ProxyConnectionWizard;
+import org.eclipse.remote.ui.AbstractRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+
+public class ProxyUIConnectionService extends AbstractRemoteUIConnectionService {
+
+ private final IRemoteConnectionType fConnectionType;
+
+ public ProxyUIConnectionService(IRemoteConnectionType connectionType) {
+ fConnectionType = connectionType;
+ }
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (IRemoteUIConnectionService.class.equals(service)) {
+ return (T) new ProxyUIConnectionService(connectionType);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return fConnectionType;
+ }
+
+ @Override
+ public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) {
+ return new ProxyConnectionWizard(shell, fConnectionType);
+ }
+
+ @Override
+ public void openConnectionWithProgress(Shell shell, IRunnableContext context, final IRemoteConnection connection) {
+ if (!connection.isOpen()) {
+ IRunnableWithProgress op = monitor -> {
+ try {
+ connection.open(monitor);
+ } catch (RemoteConnectionException e) {
+ throw new InvocationTargetException(e);
+ }
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+ };
+ try {
+ if (context != null) {
+ context.run(true, true, op);
+ } else {
+ new ProgressMonitorDialog(shell).run(true, true, op);
+ }
+ } catch (InvocationTargetException e) {
+ ErrorDialog.openError(shell, Messages.ProxyUIConnectionManager_Connection_Error,
+ Messages.ProxyUIConnectionManager_Could_not_open_connection,
+ new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getCause().getMessage()));
+ } catch (InterruptedException e) {
+ ErrorDialog.openError(shell, Messages.ProxyUIConnectionManager_Connection_Error,
+ Messages.ProxyUIConnectionManager_Could_not_open_connection,
+ new Status(IStatus.ERROR, Activator.getUniqueIdentifier(), e.getMessage()));
+ }
+ }
+ }
+
+ @Override
+ public ILabelProvider getLabelProvider() {
+ return new DefaultLabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ return Activator.getDefault().getImageRegistry().get(Activator.IMG_CONNECTION_TYPE);
+ }
+ };
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUserAuthenticator.java b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUserAuthenticator.java
new file mode 100644
index 00000000000..79b3be3bc45
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/ProxyUserAuthenticator.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2016, 2020 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.remote.internal.proxy.ui;
+
+import java.net.PasswordAuthentication;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jsch.ui.UserInfoPrompter;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IUserAuthenticatorService;
+import org.eclipse.swt.widgets.Display;
+
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+
+public class ProxyUserAuthenticator implements IUserAuthenticatorService {
+
+ private final IRemoteConnection remoteConnection;
+ private UserInfoPrompter prompter;
+
+ public ProxyUserAuthenticator(IRemoteConnection conn) {
+ this.remoteConnection = conn;
+ IRemoteConnectionHostService hostService = conn.getService(IRemoteConnectionHostService.class);
+ if (hostService != null) {
+ try {
+ prompter = new UserInfoPrompter(
+ new JSch().getSession(hostService.getUsername(), hostService.getHostname()));
+ } catch (JSchException e) {
+ // Not allowed
+ }
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return remoteConnection;
+ }
+
+ @Override
+ public PasswordAuthentication prompt(String username, String message) {
+ if (prompter.promptPassword(message)) {
+ String sessionUserName = prompter.getSession().getUserName();
+ if (sessionUserName != null) {
+ username = sessionUserName;
+ }
+ PasswordAuthentication auth = new PasswordAuthentication(username, prompter.getPassword().toCharArray());
+ return auth;
+ }
+ return null;
+ }
+
+ @Override
+ public String[] prompt(String destination, String name, String message, String[] prompt, boolean[] echo) {
+ return prompter.promptKeyboardInteractive(destination, name, message, prompt, echo);
+ }
+
+ @Override
+ public int prompt(final int promptType, final String title, final String message, final int[] promptResponses,
+ final int defaultResponseIndex) {
+ final Display display = getDisplay();
+ final int[] retval = new int[1];
+ final String[] buttons = new String[promptResponses.length];
+ for (int i = 0; i < promptResponses.length; i++) {
+ int prompt = promptResponses[i];
+ switch (prompt) {
+ case IDialogConstants.OK_ID:
+ buttons[i] = IDialogConstants.OK_LABEL;
+ break;
+ case IDialogConstants.CANCEL_ID:
+ buttons[i] = IDialogConstants.CANCEL_LABEL;
+ break;
+ case IDialogConstants.NO_ID:
+ buttons[i] = IDialogConstants.NO_LABEL;
+ break;
+ case IDialogConstants.YES_ID:
+ buttons[i] = IDialogConstants.YES_LABEL;
+ break;
+ }
+ }
+
+ display.syncExec(() -> {
+ final MessageDialog dialog = new MessageDialog(display.getActiveShell(), title, null /* title image */,
+ message, promptType, buttons, defaultResponseIndex);
+ retval[0] = dialog.open();
+ });
+ return promptResponses[retval[0]];
+ }
+
+ private Display getDisplay() {
+ Display display = Display.getCurrent();
+ if (display == null) {
+ display = Display.getDefault();
+ }
+ return display;
+ }
+
+ public static class Factory implements IRemoteConnection.Service.Factory {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends IRemoteConnection.Service> T getService(IRemoteConnection connection, Class<T> service) {
+ if (IUserAuthenticatorService.class.equals(service)) {
+ return (T) new ProxyUserAuthenticator(connection);
+ } else {
+ return null;
+ }
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/Messages.java b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/Messages.java
new file mode 100644
index 00000000000..45bb17e1e2f
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/Messages.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2013 IBM Corporation.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial Implementation
+ *
+ */
+package org.eclipse.remote.internal.proxy.ui.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_ID = "org.eclipse.remote.internal.proxy.ui.messages.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ NLS.initializeMessages(BUNDLE_ID, Messages.class);
+ }
+
+ public static String ProxyConnectionPage_0;
+ public static String ProxyConnectionPage_1;
+ public static String ProxyConnectionPage_2;
+ public static String ProxyConnectionPage_A_connection_with_that_name_already_exists;
+ public static String ProxyConnectionPage_Edit_Connection;
+ public static String ProxyConnectionPage_Edit_properties_of_an_existing_connection;
+ public static String ProxyConnectionPage_Initial_Message;
+ public static String ProxyConnectionPage_Proxy;
+ public static String ProxyConnectionPage_Help;
+ public static String ProxyConnectionPage_KeysAtSSH2;
+ public static String ProxyConnectionPage_SelectCommand;
+ public static String ProxyConnectionPage_SelectConnection;
+ public static String ProxyConnectionPage_Settings0;
+ public static String ProxyConnectionPage_selectProxyConnection;
+ public static String ProxyFileSystemContributor_0;
+ public static String ProxyNewConnectionPage_Advanced;
+ public static String ProxyNewConnectionPage_Connection_name;
+ public static String ProxyNewConnectionPage_File_with_private_key;
+ public static String ProxyNewConnectionPage_Host;
+ public static String ProxyNewConnectionPage_Host_information;
+ public static String ProxyNewConnectionPage_Host_name_cannot_be_empty;
+ public static String ProxyNewConnectionPage_New_Connection;
+ public static String ProxyNewConnectionPage_New_connection_properties;
+ public static String ProxyNewConnectionPage_Passphrase;
+ public static String ProxyNewConnectionPage_Password;
+ public static String ProxyNewConnectionPage_Password_based_authentication;
+ public static String ProxyNewConnectionPage_Please_enter_a_connection_name;
+ public static String ProxyNewConnectionPage_Port;
+ public static String ProxyNewConnectionPage_Port_is_not_valid;
+ public static String ProxyNewConnectionPage_Private_key_file_cannot_be_read;
+ public static String ProxyNewConnectionPage_Private_key_file_does_not_exist;
+ public static String ProxyNewConnectionPage_Private_key_file_is_invalid;
+ public static String ProxyNewConnectionPage_Private_key_path_cannot_be_empty;
+ public static String ProxyNewConnectionPage_Public_key_based_authentication;
+ public static String ProxyNewConnectionPage_Timeout;
+ public static String ProxyNewConnectionPage_Timeout_is_not_valid;
+ public static String ProxyNewConnectionPage_User;
+ public static String ProxyNewConnectionPage_User_name_cannot_be_empty;
+ public static String ProxyUIConnectionManager_Connection_Error;
+ public static String ProxyUIConnectionManager_Could_not_open_connection;
+
+ private Messages() {
+ // cannot create new instance
+ }
+}
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/messages.properties b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/messages.properties
new file mode 100644
index 00000000000..7f2ff286db8
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/messages/messages.properties
@@ -0,0 +1,53 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial implementation
+###############################################################################
+ProxyConnectionPage_0=Use login shell
+ProxyConnectionPage_1=Login shell command
+ProxyConnectionPage_2=Login shell command cannot be empty
+ProxyConnectionPage_A_connection_with_that_name_already_exists=A connection with that name already exists
+ProxyConnectionPage_Edit_Connection=Edit Connection
+ProxyConnectionPage_Edit_properties_of_an_existing_connection=Edit properties of an existing connection
+ProxyConnectionPage_Initial_Message=Specify properties of a new connection
+ProxyConnectionPage_Proxy=SSH Proxy Settings
+ProxyConnectionPage_Help=If 'Local' is selected and proxy command is empty, no proxy is used.\nSee <a>Network Connections</a> for SOCKS and HTTP proxy options.
+ProxyConnectionPage_KeysAtSSH2=Keys are set at <a>Network Connections, SSH2</a>
+ProxyConnectionPage_SelectCommand=Enter a local or remote command such as 'nc %h %p'. Can be empty for an ssh gateway.
+ProxyConnectionPage_SelectConnection=Select 'Remote' for an ssh gateway or a remote proxy command.
+ProxyConnectionPage_Settings0=Connection Settings
+ProxyConnectionPage_selectProxyConnection=Please select a proxy connection
+ProxyFileSystemContributor_0=Browse File System
+ProxyNewConnectionPage_Advanced=Advanced
+ProxyNewConnectionPage_Connection_name=Connection name:
+ProxyNewConnectionPage_File_with_private_key=File with private key:
+ProxyNewConnectionPage_Host=Host:
+ProxyNewConnectionPage_Host_information=Host information
+ProxyNewConnectionPage_Host_name_cannot_be_empty=Host name cannot be empty
+ProxyNewConnectionPage_New_Connection=New Connection
+ProxyNewConnectionPage_New_connection_properties=New connection properties
+ProxyNewConnectionPage_Passphrase=Passphrase:
+ProxyNewConnectionPage_Password=Password:
+ProxyNewConnectionPage_Password_based_authentication=Password based authentication
+ProxyNewConnectionPage_Please_enter_a_connection_name=Please enter a connection name
+ProxyNewConnectionPage_Port=Port:
+ProxyNewConnectionPage_Port_is_not_valid=Port is not valid
+ProxyNewConnectionPage_Private_key_file_cannot_be_read=Private key file cannot be read
+ProxyNewConnectionPage_Private_key_file_does_not_exist=Private key file does not exist
+ProxyNewConnectionPage_Private_key_file_is_invalid=Private key file is invalid
+ProxyNewConnectionPage_Private_key_path_cannot_be_empty=Private key path cannot be empty
+ProxyNewConnectionPage_Public_key_based_authentication=Public key based authentication
+ProxyNewConnectionPage_Timeout=Timeout:
+ProxyNewConnectionPage_Timeout_is_not_valid=Timeout is not valid
+ProxyNewConnectionPage_User=User:
+ProxyNewConnectionPage_User_name_cannot_be_empty=User name cannot be empty
+ProxyUIConnectionManager_Connection_Error=Connection Error
+ProxyUIConnectionManager_Could_not_open_connection=Could not open connection
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionPage.java b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionPage.java
new file mode 100644
index 00000000000..8c3d2494d76
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionPage.java
@@ -0,0 +1,497 @@
+/**
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.remote.internal.proxy.ui.wizards;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.proxy.core.ProxyConnection;
+import org.eclipse.remote.internal.proxy.ui.Activator;
+import org.eclipse.remote.internal.proxy.ui.messages.Messages;
+import org.eclipse.swt.SWT;
+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.events.SelectionListener;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+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.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.IExpansionListener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+
+public class ProxyConnectionPage extends WizardPage {
+
+ private class DataModifyListener implements ModifyListener {
+ @Override
+ public synchronized void modifyText(ModifyEvent e) {
+ validateFields();
+ getContainer().updateButtons();
+ }
+ }
+
+ private Text fConnectionName;
+ private Button fPasswordButton;
+ private Button fPublicKeyButton;
+ private Button fDefaultServerButton;
+ private Text fHostText;
+ private Text fUserText;
+ private Text fPasswordText;
+ private Text fPassphraseText;
+ private Text fPortText;
+ private Text fTimeoutText;
+ private Text fServerCommandText;
+
+ private String fInitialName = "Remote Host"; //$NON-NLS-1$
+ private Set<String> fInvalidConnectionNames;
+ private final Map<String, String> fInitialAttributes = new HashMap<>();
+ private IRemoteConnectionWorkingCopy fConnection;
+
+ private final IRemoteConnectionType fConnectionType;
+
+ private final DataModifyListener fDataModifyListener = new DataModifyListener();
+
+ public ProxyConnectionPage(IRemoteConnectionType connectionType) {
+ super(Messages.ProxyNewConnectionPage_New_connection_properties);
+ fConnectionType = connectionType;
+ setPageComplete(false);
+ }
+
+ /**
+ * Create controls for the bottom (hideable) advanced composite
+ *
+ * @param mold
+ *
+ */
+ private void createAdvancedControls(final Composite parent) {
+ ExpandableComposite expComp = new ExpandableComposite(parent, ExpandableComposite.TWISTIE);
+ expComp.setText(Messages.ProxyNewConnectionPage_Advanced);
+ expComp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ expComp.setExpanded(false);
+ expComp.addExpansionListener(new IExpansionListener() {
+
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ for (int i = 0; i < 2; i++) { // sometimes the size compute isn't correct on first try
+ Point newSize = parent.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ Point currentSize = parent.getSize();
+ int deltaY = newSize.y - currentSize.y;
+ Point shellSize = getShell().getSize();
+ shellSize.y += deltaY;
+ getShell().setSize(shellSize);
+ getShell().layout(true, true);
+ }
+ }
+
+ @Override
+ public void expansionStateChanging(ExpansionEvent e) {
+ // Ignore
+ }
+ });
+
+ Composite advancedComp = new Composite(expComp, SWT.NONE);
+ advancedComp.setLayout(new GridLayout(1, false));
+ advancedComp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ Group settingsComp = new Group(advancedComp, SWT.NONE);
+ settingsComp.setText(Messages.ProxyConnectionPage_Settings0);
+ settingsComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ settingsComp.setLayout(new GridLayout(2, false));
+
+ Label portLabel = new Label(settingsComp, SWT.NONE);
+ portLabel.setText(Messages.ProxyNewConnectionPage_Port);
+ fPortText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
+ fPortText.setText(Integer.toString(ProxyConnection.DEFAULT_PORT));
+ fPortText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
+ setTextFieldWidthInChars(fPortText, 5);
+
+ Label timeoutLabel = new Label(settingsComp, SWT.NONE);
+ timeoutLabel.setText(Messages.ProxyNewConnectionPage_Timeout);
+ fTimeoutText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
+ fTimeoutText.setText(Integer.toString(ProxyConnection.DEFAULT_TIMEOUT));
+
+ fDefaultServerButton = new Button(settingsComp, SWT.CHECK);
+ fDefaultServerButton.setText("Use default server");
+ fDefaultServerButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+ fDefaultServerButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateFields();
+ updateEnablement();
+ }
+ });
+ Label serverLabel = new Label(settingsComp, SWT.NONE);
+ serverLabel.setText("Server command");
+ fServerCommandText = new Text(settingsComp, SWT.BORDER | SWT.SINGLE);
+ fServerCommandText.setText(ProxyConnection.DEFAULT_SERVER_COMMAND);
+ fServerCommandText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ fDefaultServerButton.setSelection(ProxyConnection.DEFAULT_USE_DEFAULT_SERVER);
+
+ expComp.setClient(advancedComp);
+ }
+
+ private void createAuthControls(Composite parent) {
+ Composite controls = new Composite(parent, SWT.NONE);
+ controls.setLayout(new GridLayout(3, false));
+ controls.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Label hostLabel = new Label(controls, SWT.NONE);
+ hostLabel.setText(Messages.ProxyNewConnectionPage_Host);
+ fHostText = new Text(controls, SWT.BORDER | SWT.SINGLE);
+ fHostText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ Label userLabel = new Label(controls, SWT.NONE);
+ userLabel.setText(Messages.ProxyNewConnectionPage_User);
+ fUserText = new Text(controls, SWT.BORDER | SWT.SINGLE);
+ fUserText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ // Key option box
+ fPublicKeyButton = new Button(controls, SWT.RADIO);
+ fPublicKeyButton.setText(Messages.ProxyNewConnectionPage_Public_key_based_authentication);
+ fPublicKeyButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+ fPublicKeyButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateFields();
+ updateEnablement();
+ }
+ });
+
+ Link link = new Link(controls, SWT.WRAP);
+ final GridData linkLayoutData = new GridData(GridData.FILL_HORIZONTAL);
+ link.setLayoutData(linkLayoutData);
+ final String PREFS_PAGE_ID_NET_SSH = "org.eclipse.jsch.ui.SSHPreferences"; //$NON-NLS-1$
+ link.addSelectionListener(new SelectionListener() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(), PREFS_PAGE_ID_NET_SSH,
+ new String[] { PREFS_PAGE_ID_NET_SSH }, null);
+ dlg.open();
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+ link.setText(Messages.ProxyConnectionPage_KeysAtSSH2);
+
+ // Passphrase field
+ Label passphraseLabel = new Label(controls, SWT.NONE);
+ passphraseLabel.setText(Messages.ProxyNewConnectionPage_Passphrase);
+ fPassphraseText = new Text(controls, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
+ fPassphraseText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ // User option box
+ fPasswordButton = new Button(controls, SWT.RADIO);
+ fPasswordButton.setText(Messages.ProxyNewConnectionPage_Password_based_authentication);
+ fPasswordButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1));
+ fPasswordButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validateFields();
+ updateEnablement();
+ }
+ });
+
+ // Password field
+ Label passwordLabel = new Label(controls, SWT.NONE);
+ passwordLabel.setText(Messages.ProxyNewConnectionPage_Password);
+ fPasswordText = new Text(controls, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
+ fPasswordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+ fPasswordButton.setSelection(ProxyConnection.DEFAULT_USE_PASSWORD);
+ fPublicKeyButton.setSelection(!ProxyConnection.DEFAULT_USE_PASSWORD);
+ controls.setTabList(new Control[] { fHostText, fUserText, fPublicKeyButton, fPassphraseText, fPasswordButton,
+ fPasswordText });
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ if (fConnection == null) {
+ setDescription(Messages.ProxyNewConnectionPage_New_connection_properties);
+ setTitle(Messages.ProxyNewConnectionPage_New_connection_properties);
+ setMessage(Messages.ProxyConnectionPage_Initial_Message);
+ } else {
+ setDescription(Messages.ProxyConnectionPage_Edit_properties_of_an_existing_connection);
+ setTitle(Messages.ProxyConnectionPage_Edit_Connection);
+ }
+ setErrorMessage(null);
+
+ GridLayout topLayout = new GridLayout(2, false);
+ final Composite topControl = new Composite(parent, SWT.NONE);
+ setControl(topControl);
+ topControl.setLayout(topLayout);
+
+ Label label = new Label(topControl, SWT.NONE);
+ label.setText(Messages.ProxyNewConnectionPage_Connection_name);
+
+ fConnectionName = new Text(topControl, SWT.BORDER | SWT.SINGLE);
+ fConnectionName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ fConnectionName.setEnabled(fConnection == null);
+
+ final Group authGroup = new Group(topControl, SWT.NONE);
+ authGroup.setText(Messages.ProxyNewConnectionPage_Host_information);
+ authGroup.setLayout(new GridLayout(1, false));
+ authGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+
+ createAuthControls(authGroup);
+ createAdvancedControls(authGroup);
+
+ try {
+ loadValues();
+ } catch (CoreException e) {
+ Activator.log(e.getStatus());
+ }
+
+ /*
+ * Register listeners after loading values so we don't trigger listeners
+ */
+ registerListeners();
+
+ if (fConnection != null) {
+ validateFields();
+ }
+
+ updateEnablement();
+ }
+
+ public IRemoteConnectionWorkingCopy getConnection() {
+ return fConnection;
+ }
+
+ /**
+ * Check if the connection name is invalid. This only applies to new connections (when fConnection is null).
+ *
+ * @param name
+ * connection name
+ * @return true if the name is invalid, false otherwise
+ */
+ private boolean isInvalidName(String name) {
+ if (fConnection == null) {
+ if (fInvalidConnectionNames == null) {
+ return fConnectionType.getConnection(name) != null;
+ }
+ return fInvalidConnectionNames.contains(name);
+ }
+ return false;
+ }
+
+ private void loadValues() throws CoreException {
+ IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class);
+ if (fConnection != null) {
+ fConnectionName.setText(fConnection.getName());
+ fHostText.setText(fConnection.getAttribute(ProxyConnection.HOSTNAME_ATTR));
+ fUserText.setText(fConnection.getAttribute(ProxyConnection.USERNAME_ATTR));
+ String portStr = fConnection.getAttribute(ProxyConnection.PORT_ATTR);
+ fPortText.setText(portStr.isEmpty() ? Integer.toString(ProxyConnection.DEFAULT_PORT) : portStr);
+ String timeoutStr = fConnection.getAttribute(ProxyConnection.TIMEOUT_ATTR);
+ fTimeoutText.setText(timeoutStr.isEmpty() ? Integer.toString(ProxyConnection.DEFAULT_TIMEOUT) : timeoutStr);
+ String isPwdStr = fConnection.getAttribute(ProxyConnection.USE_PASSWORD_ATTR);
+ boolean isPwd = isPwdStr.isEmpty() ? ProxyConnection.DEFAULT_USE_PASSWORD : Boolean.parseBoolean(isPwdStr);
+ fPasswordButton.setSelection(isPwd);
+ fPublicKeyButton.setSelection(!isPwd);
+ fPasswordText.setText(fConnection.getSecureAttribute(ProxyConnection.PASSWORD_ATTR));
+ fPassphraseText.setText(fConnection.getSecureAttribute(ProxyConnection.PASSPHRASE_ATTR));
+ String useDefaultServerStr = fConnection.getAttribute(ProxyConnection.USE_DEFAULT_SERVER_ATTR);
+ boolean useDefaultServer = useDefaultServerStr.isEmpty() ? ProxyConnection.DEFAULT_USE_DEFAULT_SERVER
+ : Boolean.parseBoolean(useDefaultServerStr);
+ fDefaultServerButton.setSelection(useDefaultServer);
+ String serverCommandStr = fConnection.getAttribute(ProxyConnection.SERVER_COMMAND_ATTR);
+ fServerCommandText
+ .setText(serverCommandStr.isEmpty() ? ProxyConnection.DEFAULT_SERVER_COMMAND : serverCommandStr);
+
+ } else {
+ fConnectionName.setText(fInitialName);
+ String host = fInitialAttributes.get(ProxyConnection.HOSTNAME_ATTR);
+ if (host != null) {
+ fHostText.setText(host);
+ }
+ String username = fInitialAttributes.get(ProxyConnection.USERNAME_ATTR);
+ if (username != null) {
+ fUserText.setText(username);
+ }
+ String port = fInitialAttributes.get(ProxyConnection.PORT_ATTR);
+ if (port != null) {
+ fPortText.setText(port);
+ }
+ String timeout = fInitialAttributes.get(ProxyConnection.TIMEOUT_ATTR);
+ if (timeout != null) {
+ fTimeoutText.setText(timeout);
+ }
+ String isPwd = fInitialAttributes.get(ProxyConnection.USE_PASSWORD_ATTR);
+ if (isPwd != null) {
+ fPasswordButton.setSelection(Boolean.parseBoolean(isPwd));
+ }
+ String password = fInitialAttributes.get(ProxyConnection.PASSWORD_ATTR);
+ if (password != null) {
+ fPasswordText.setText(password);
+ }
+ String passphrase = fInitialAttributes.get(ProxyConnection.PASSPHRASE_ATTR);
+ if (passphrase != null) {
+ fPassphraseText.setText(passphrase);
+ }
+ String useDefaultServer = fInitialAttributes.get(ProxyConnection.USE_DEFAULT_SERVER_ATTR);
+ if (useDefaultServer != null) {
+ fDefaultServerButton.setSelection(Boolean.parseBoolean(useDefaultServer));
+ }
+ String serverCommand = fInitialAttributes.get(ProxyConnection.SERVER_COMMAND_ATTR);
+ if (serverCommand != null) {
+ fServerCommandText.setText(serverCommand);
+ }
+ }
+ }
+
+ private void registerListeners() {
+ fConnectionName.addModifyListener(fDataModifyListener);
+ fHostText.addModifyListener(fDataModifyListener);
+ fUserText.addModifyListener(fDataModifyListener);
+ fPasswordText.addModifyListener(fDataModifyListener);
+ fPassphraseText.addModifyListener(fDataModifyListener);
+ fPortText.addModifyListener(fDataModifyListener);
+ fTimeoutText.addModifyListener(fDataModifyListener);
+ fServerCommandText.addModifyListener(fDataModifyListener);
+ }
+
+ public void setAddress(String address) {
+ fInitialAttributes.put(ProxyConnection.HOSTNAME_ATTR, address);
+ }
+
+ public void setAttributes(Map<String, String> attributes) {
+ fInitialAttributes.putAll(attributes);
+ }
+
+ public void setConnection(IRemoteConnectionWorkingCopy connection) {
+ fConnection = connection;
+ }
+
+ public void setConnectionName(String name) {
+ fInitialName = name;
+ }
+
+ public void setInvalidConnectionNames(Set<String> names) {
+ fInvalidConnectionNames = names;
+ }
+
+ @Override
+ public void setPageComplete(boolean complete) {
+ super.setPageComplete(complete);
+ if (complete) {
+ storeValues();
+ }
+ }
+
+ public void setPort(int port) {
+ fInitialAttributes.put(ProxyConnection.PORT_ATTR, Integer.toString(port));
+ }
+
+ private void setTextFieldWidthInChars(Text text, int chars) {
+ text.setTextLimit(chars);
+ Object data = text.getLayoutData();
+ if (data instanceof GridData) {
+ GC gc = new GC(text);
+ FontMetrics fm = gc.getFontMetrics();
+ int width = (int) (chars * fm.getAverageCharacterWidth());
+ gc.dispose();
+ ((GridData) data).widthHint = width;
+ }
+ }
+
+ public void setUsername(String username) {
+ fInitialAttributes.put(ProxyConnection.USERNAME_ATTR, username);
+ }
+
+ private void storeValues() {
+ if (fConnection == null) {
+ try {
+ fConnection = fConnectionType.newConnection(fConnectionName.getText().trim());
+ } catch (RemoteConnectionException e) {
+ Activator.log(e);
+ }
+ }
+ if (fConnection != null) {
+ fConnection.setName(fConnectionName.getText().trim());
+ fConnection.setAttribute(ProxyConnection.HOSTNAME_ATTR, fHostText.getText().trim());
+ fConnection.setAttribute(ProxyConnection.USERNAME_ATTR, fUserText.getText().trim());
+ fConnection.setSecureAttribute(ProxyConnection.PASSWORD_ATTR, fPasswordText.getText().trim());
+ fConnection.setSecureAttribute(ProxyConnection.PASSPHRASE_ATTR, fPassphraseText.getText().trim());
+ fConnection.setAttribute(ProxyConnection.USE_PASSWORD_ATTR,
+ Boolean.toString(fPasswordButton.getSelection()));
+ fConnection.setAttribute(ProxyConnection.TIMEOUT_ATTR, fTimeoutText.getText().trim());
+ fConnection.setAttribute(ProxyConnection.PORT_ATTR, fPortText.getText().trim());
+ fConnection.setAttribute(ProxyConnection.USE_DEFAULT_SERVER_ATTR,
+ Boolean.toString(fDefaultServerButton.getSelection()));
+ fConnection.setAttribute(ProxyConnection.SERVER_COMMAND_ATTR, fServerCommandText.getText().trim());
+ }
+ }
+
+ private void updateEnablement() {
+ boolean isPasswordAuth = fPasswordButton.getSelection();
+ fPasswordText.setEnabled(isPasswordAuth);
+ fPassphraseText.setEnabled(!isPasswordAuth);
+ fServerCommandText.setEnabled(!fDefaultServerButton.getSelection());
+ }
+
+ private String validateAdvanced() {
+ try {
+ Integer.parseInt(fPortText.getText().trim());
+ } catch (NumberFormatException ne) {
+ return Messages.ProxyNewConnectionPage_Port_is_not_valid;
+ }
+ try {
+ Integer.parseInt(fTimeoutText.getText().trim());
+ } catch (NumberFormatException ne) {
+ return Messages.ProxyNewConnectionPage_Timeout_is_not_valid;
+ }
+ return null;
+ }
+
+ private void validateFields() {
+ String message = null;
+ if (fConnectionName.getText().trim().length() == 0) {
+ message = Messages.ProxyNewConnectionPage_Please_enter_a_connection_name;
+ } else if (isInvalidName(fConnectionName.getText().trim())) {
+ message = Messages.ProxyConnectionPage_A_connection_with_that_name_already_exists;
+ } else if (fHostText.getText().trim().length() == 0) {
+ message = Messages.ProxyNewConnectionPage_Host_name_cannot_be_empty;
+ } else if (fUserText.getText().trim().length() == 0) {
+ message = Messages.ProxyNewConnectionPage_User_name_cannot_be_empty;
+ } else if (!fDefaultServerButton.getSelection() && fServerCommandText.getText().trim().length() == 0) {
+ message = "Server command cannot be empty";
+ }
+ if (message == null) {
+ message = validateAdvanced();
+ }
+
+ setErrorMessage(message);
+ setPageComplete(message == null);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionWizard.java b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionWizard.java
new file mode 100644
index 00000000000..522a832ac46
--- /dev/null
+++ b/remote/org.eclipse.remote.proxy.ui/src/org/eclipse/remote/internal/proxy/ui/wizards/ProxyConnectionWizard.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2016 Oak Ridge National Laboratory and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.remote.internal.proxy.ui.wizards;
+
+import java.util.Set;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.widgets.Shell;
+
+public class ProxyConnectionWizard extends Wizard implements IRemoteUIConnectionWizard {
+
+ private final Shell fShell;
+ private final ProxyConnectionPage fPage;
+
+ public ProxyConnectionWizard(Shell shell, IRemoteConnectionType connectionType) {
+ fShell = shell;
+ fPage = new ProxyConnectionPage(connectionType);
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ addPage(fPage);
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy open() {
+ WizardDialog dialog = new WizardDialog(fShell, this);
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == WizardDialog.OK) {
+ return fPage.getConnection();
+ }
+ return null;
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy getConnection() {
+ return fPage.getConnection();
+ }
+
+ @Override
+ public boolean performCancel() {
+ return true;
+ }
+
+ @Override
+ public boolean performFinish() {
+ return true;
+ }
+
+ @Override
+ public void setConnection(IRemoteConnectionWorkingCopy connection) {
+ fPage.setConnection(connection);
+ }
+
+ @Override
+ public void setConnectionName(String name) {
+ fPage.setConnectionName(name);
+ }
+
+ @Override
+ public void setInvalidConnectionNames(Set<String> names) {
+ fPage.setInvalidConnectionNames(names);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial-feature/.project b/remote/org.eclipse.remote.serial-feature/.project
new file mode 100644
index 00000000000..15b7923f8a4
--- /dev/null
+++ b/remote/org.eclipse.remote.serial-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.serial-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.serial-feature/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.serial-feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.serial-feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.serial-feature/build.properties b/remote/org.eclipse.remote.serial-feature/build.properties
new file mode 100644
index 00000000000..adcc4e399d4
--- /dev/null
+++ b/remote/org.eclipse.remote.serial-feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+ feature.properties,\
+ epl-v20.html,\
+ eclipse_update_120.jpg
diff --git a/remote/org.eclipse.remote.serial-feature/eclipse_update_120.jpg b/remote/org.eclipse.remote.serial-feature/eclipse_update_120.jpg
new file mode 100644
index 00000000000..bfdf708ad61
--- /dev/null
+++ b/remote/org.eclipse.remote.serial-feature/eclipse_update_120.jpg
Binary files differ
diff --git a/remote/org.eclipse.remote.serial-feature/epl-v20.html b/remote/org.eclipse.remote.serial-feature/epl-v20.html
new file mode 100644
index 00000000000..008b8018db8
--- /dev/null
+++ b/remote/org.eclipse.remote.serial-feature/epl-v20.html
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+ <h2>Eclipse Foundation Software User Agreement</h2>
+ <p>November 22, 2017</p>
+
+ <h3>Usage Of Content</h3>
+
+ <p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,
+ INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY
+ THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS
+ GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY
+ APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS
+ AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE
+ AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT
+ USE THE CONTENT.</p>
+
+ <h3>Applicable Licenses</h3>
+
+ <p>
+ Unless otherwise indicated, all Content made available by the Eclipse
+ Foundation is provided to you under the terms and conditions of the
+ Eclipse Public License Version 2.0 (&quot;EPL&quot;). A copy of the
+ EPL is provided with this Content and is also available at <a
+ href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>Content includes, but is not limited to, source code, object
+ code, documentation and other files maintained in the Eclipse
+ Foundation source code repository (&quot;Repository&quot;) in software
+ modules (&quot;Modules&quot;) and made available as downloadable
+ archives (&quot;Downloads&quot;).</p>
+
+ <ul>
+ <li>Content may be structured and packaged into modules to
+ facilitate delivering, extending, and upgrading the Content. Typical
+ modules may include plug-ins (&quot;Plug-ins&quot;), plug-in
+ fragments (&quot;Fragments&quot;), and features
+ (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory
+ or JAR (Java&trade; ARchive) in a directory named
+ &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or
+ Fragments and associated material. Each Feature may be packaged as a
+ sub-directory in a directory named &quot;features&quot;. Within a
+ Feature, files named &quot;feature.xml&quot; may contain a list of
+ the names and version numbers of the Plug-ins and/or Fragments
+ associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included
+ Features&quot;). Within a Feature, files named
+ &quot;feature.xml&quot; may contain a list of the names and version
+ numbers of Included Features.</li>
+ </ul>
+
+ <p>The terms and conditions governing Plug-ins and Fragments should
+ be contained in files named &quot;about.html&quot;
+ (&quot;Abouts&quot;). The terms and conditions governing Features and
+ Included Features should be contained in files named
+ &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and
+ Feature Licenses may be located in any directory of a Download or
+ Module including, but not limited to the following locations:</p>
+
+ <ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of
+ certain Plug-ins</li>
+ <li>Feature directories</li>
+ </ul>
+
+ <p>Note: if a Feature made available by the Eclipse Foundation is
+ installed using the Provisioning Technology (as defined below), you
+ must agree to a license (&quot;Feature Update License&quot;) during
+ the installation process. If the Feature contains Included Features,
+ the Feature Update License should either provide you with the terms
+ and conditions governing the Included Features or inform you where you
+ can locate them. Feature Update Licenses may be found in the
+ &quot;license&quot; property of files named
+ &quot;feature.properties&quot; found within a Feature. Such Abouts,
+ Feature Licenses, and Feature Update Licenses contain the terms and
+ conditions (or references to such terms and conditions) that govern
+ your use of the associated Content in that directory.</p>
+
+ <p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY
+ REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND
+ CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT
+ ARE NOT LIMITED TO):</p>
+
+ <ul>
+ <li>Eclipse Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)
+ </li>
+ <li>Eclipse Distribution License Version 1.0 (available at <a
+ href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)
+ </li>
+ <li>Common Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)
+ </li>
+ <li>Apache Software License 1.1 (available at <a
+ href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)
+ </li>
+ <li>Apache Software License 2.0 (available at <a
+ href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)
+ </li>
+ <li>Mozilla Public License Version 1.1 (available at <a
+ href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)
+ </li>
+ </ul>
+
+ <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND
+ CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License,
+ or Feature Update License is provided, please contact the Eclipse
+ Foundation to determine what terms and conditions govern that
+ particular Content.</p>
+
+
+ <h3>Use of Provisioning Technology</h3>
+
+ <p>
+ The Eclipse Foundation makes available provisioning software, examples
+ of which include, but are not limited to, p2 and the Eclipse Update
+ Manager (&quot;Provisioning Technology&quot;) for the purpose of
+ allowing users to install software, documentation, information and/or
+ other materials (collectively &quot;Installable Software&quot;). This
+ capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about
+ packaging Installable Software is available at <a
+ href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+ (&quot;Specification&quot;).
+ </p>
+
+ <p>You may use Provisioning Technology to allow other parties to
+ install Installable Software. You shall be responsible for enabling
+ the applicable license agreements relating to the Installable Software
+ to be presented to, and accepted by, the users of the Provisioning
+ Technology in accordance with the Specification. By using Provisioning
+ Technology in such a manner and making it available in accordance with
+ the Specification, you further acknowledge your agreement to, and the
+ acquisition of all necessary rights to permit the following:</p>
+
+ <ol>
+ <li>A series of actions may occur (&quot;Provisioning
+ Process&quot;) in which a user may execute the Provisioning
+ Technology on a machine (&quot;Target Machine&quot;) with the intent
+ of installing, extending or updating the functionality of an
+ Eclipse-based product.</li>
+ <li>During the Provisioning Process, the Provisioning Technology
+ may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</li>
+ <li>Pursuant to the Specification, you will provide to the user
+ the terms and conditions that govern the use of the Installable
+ Software (&quot;Installable Software Agreement&quot;) and such
+ Installable Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable
+ Software Agreement must inform the user of the terms and conditions
+ that govern the Installable Software and must solicit acceptance by
+ the end user in the manner prescribed in such Installable Software
+ Agreement. Upon such indication of agreement by the user, the
+ provisioning Technology will complete installation of the Installable
+ Software.</li>
+ </ol>
+
+ <h3>Cryptography</h3>
+
+ <p>Content may contain encryption software. The country in which
+ you are currently may have restrictions on the import, possession, and
+ use, and/or re-export to another country, of encryption software.
+ BEFORE using any encryption software, please check the country's laws,
+ regulations and policies concerning the import, possession, or use,
+ and re-export of encryption software, to see if this is permitted.</p>
+
+ <p>
+ <small>Java and all Java-based trademarks are trademarks of
+ Oracle Corporation in the United States, other countries, or both.</small>
+ </p>
+</body>
+</html>
diff --git a/remote/org.eclipse.remote.serial-feature/feature.properties b/remote/org.eclipse.remote.serial-feature/feature.properties
new file mode 100644
index 00000000000..748b1ce4b90
--- /dev/null
+++ b/remote/org.eclipse.remote.serial-feature/feature.properties
@@ -0,0 +1,27 @@
+#################################################################################
+# Copyright (c) 2015 QNX Software Systems Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#################################################################################
+
+# "featureName" property - name of the feature
+featureName=Serial Port Remote Services
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse CDT
+
+# "description" property - description of the feature
+description=Provides serial port services for the remote framework
+
+# copyright
+copyright=\
+Copyright (c) 2015 QNX Software Corporation.\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n
diff --git a/remote/org.eclipse.remote.serial-feature/feature.xml b/remote/org.eclipse.remote.serial-feature/feature.xml
new file mode 100644
index 00000000000..3fcbce867b2
--- /dev/null
+++ b/remote/org.eclipse.remote.serial-feature/feature.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.remote.serial"
+ label="%featureName"
+ version="10.7.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.remote.serial.ui"
+ license-feature="org.eclipse.license"
+ license-feature-version="0.0.0">
+
+ <description>
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <plugin
+ id="org.eclipse.remote.serial.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.serial.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/remote/org.eclipse.remote.serial.core/.classpath b/remote/org.eclipse.remote.serial.core/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.serial.core/.project b/remote/org.eclipse.remote.serial.core/.project
new file mode 100644
index 00000000000..8b8d788adb1
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.serial.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.serial.core/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.serial.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c84f9017310
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %bundleName
+Bundle-SymbolicName: org.eclipse.remote.serial.core;singleton:=true
+Bundle-Version: 1.1.100.qualifier
+Bundle-Activator: org.eclipse.remote.serial.internal.core.Activator
+Bundle-Vendor: %providerName
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.serial.core
+Bundle-Localization: plugin
+Import-Package: org.eclipse.cdt.serial,
+ org.eclipse.core.runtime,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.serial.core/about.html b/remote/org.eclipse.remote.serial.core/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.serial.core/about.ini b/remote/org.eclipse.remote.serial.core/about.ini
new file mode 100644
index 00000000000..5bd1defab8b
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/about.ini
@@ -0,0 +1,27 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=ptp_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (not translated)
+# needed for primary features only
+
+# Property "welcomePage" contains path to welcome page (special XML-based format)
+# optional
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.serial.core/about.mappings b/remote/org.eclipse.remote.serial.core/about.mappings
new file mode 100644
index 00000000000..bddaab43109
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/about.mappings
@@ -0,0 +1,6 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+0=@build@ \ No newline at end of file
diff --git a/remote/org.eclipse.remote.serial.core/about.properties b/remote/org.eclipse.remote.serial.core/about.properties
new file mode 100644
index 00000000000..fe59955ba93
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/about.properties
@@ -0,0 +1,25 @@
+###############################################################################
+# Copyright (c) 2015 QNX Software Systems and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# QNX Software Systems - initial API and implementation
+###############################################################################
+
+# NLS_MESSAGEFORMAT_NONE
+# NLS_ENCODING=UTF-8
+
+blurb=Serial Port Remote Services\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2015 QNX Software Systems, and others.\n\
+Visit http://www.eclipse.org/ptp\n
+
diff --git a/remote/org.eclipse.remote.serial.core/build.properties b/remote/org.eclipse.remote.serial.core/build.properties
new file mode 100644
index 00000000000..d213cef4be1
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/build.properties
@@ -0,0 +1,12 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ ptp_logo_icon32.png,\
+ plugin.properties
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.serial.core/plugin.properties b/remote/org.eclipse.remote.serial.core/plugin.properties
new file mode 100644
index 00000000000..a8a8ec291cb
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/plugin.properties
@@ -0,0 +1,2 @@
+bundleName = Remote Serial Port Services
+providerName = Eclipse PTP
diff --git a/remote/org.eclipse.remote.serial.core/plugin.xml b/remote/org.eclipse.remote.serial.core/plugin.xml
new file mode 100644
index 00000000000..2f226dccdd5
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/plugin.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionType
+ id="org.eclipse.remote.serial.core.connectionType"
+ name="Serial Port">
+ </connectionType>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.serial.core.connectionType"
+ factory="org.eclipse.remote.serial.core.SerialPortConnection$Factory"
+ service="org.eclipse.remote.serial.core.ISerialPortService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.serial.core.connectionType"
+ factory="org.eclipse.remote.serial.core.SerialPortConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteCommandShellService">
+ </connectionService>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.serial.core/ptp_logo_icon32.png b/remote/org.eclipse.remote.serial.core/ptp_logo_icon32.png
new file mode 100644
index 00000000000..e8ec57270f3
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/ptp_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/ISerialPortService.java b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/ISerialPortService.java
new file mode 100644
index 00000000000..39f6d3cc2c2
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/ISerialPortService.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.core;
+
+import org.eclipse.cdt.serial.SerialPort;
+import org.eclipse.remote.core.IRemoteConnection;
+
+public interface ISerialPortService extends IRemoteConnection.Service {
+
+ static final String CONNECTION_TYPE_ID = "org.eclipse.remote.serial.core.connectionType"; //$NON-NLS-1$
+ static final String PORT_NAME_ATTR = "serial.portName"; //$NON-NLS-1$
+ static final String BAUD_RATE_ATTR = "serial.baudRate"; //$NON-NLS-1$
+ static final String BYTE_SIZE_ATTR = "serial.byteSize"; //$NON-NLS-1$
+ static final String PARITY_ATTR = "serial.parity"; //$NON-NLS-1$
+ static final String STOP_BITS_ATTR = "serial.stopBits"; //$NON-NLS-1$
+
+ SerialPort getSerialPort();
+
+}
diff --git a/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortCommandShell.java b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortCommandShell.java
new file mode 100644
index 00000000000..bbb07ae35fe
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortCommandShell.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.eclipse.cdt.serial.SerialPort;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.serial.internal.core.Activator;
+
+public class SerialPortCommandShell implements IRemoteProcess {
+
+ private final IRemoteConnection remoteConnection;
+ private final SerialPort serialPort;
+
+ public SerialPortCommandShell(IRemoteConnection remoteConnection, SerialPort serialPort) throws IOException {
+ this.remoteConnection = remoteConnection;
+ this.serialPort = serialPort;
+ serialPort.open();
+ }
+
+ @Override
+ public synchronized void destroy() {
+ if (serialPort.isOpen()) {
+ try {
+ serialPort.close();
+ } catch (IOException e) {
+ Activator.log(e);
+ }
+ notifyAll();
+ }
+ }
+
+ @Override
+ public int exitValue() {
+ return 0;
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ return new InputStream() {
+ @Override
+ public int read() throws IOException {
+ synchronized (SerialPortCommandShell.this) {
+ if (serialPort.isOpen()) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ return 0;
+ }
+ };
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return serialPort.getInputStream();
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ return serialPort.getOutputStream();
+ }
+
+ @Override
+ public synchronized int waitFor() throws InterruptedException {
+ if (serialPort.isOpen()) {
+ wait();
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isCompleted() {
+ return false;
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return remoteConnection;
+ }
+
+ @Override
+ public <T extends Service> T getService(Class<T> service) {
+ return null;
+ }
+
+ @Override
+ public <T extends Service> boolean hasService(Class<T> service) {
+ return false;
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder() {
+ return null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortConnection.java b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortConnection.java
new file mode 100644
index 00000000000..5360f24cefb
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/core/SerialPortConnection.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.core;
+
+import java.io.IOException;
+
+import org.eclipse.cdt.serial.BaudRate;
+import org.eclipse.cdt.serial.ByteSize;
+import org.eclipse.cdt.serial.Parity;
+import org.eclipse.cdt.serial.SerialPort;
+import org.eclipse.cdt.serial.StopBits;
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.eclipse.remote.serial.internal.core.Activator;
+import org.eclipse.remote.serial.internal.core.Messages;
+
+public class SerialPortConnection implements ISerialPortService, IRemoteCommandShellService {
+
+ private final IRemoteConnection remoteConnection;
+ private SerialPort serialPort;
+
+ private SerialPortConnection(IRemoteConnection remoteConnection) {
+ this.remoteConnection = remoteConnection;
+ this.remoteConnection.addConnectionChangeListener(new IRemoteConnectionChangeListener() {
+
+ @Override
+ public void connectionChanged(RemoteConnectionChangeEvent event) {
+ if (event.getType() == RemoteConnectionChangeEvent.ATTRIBUTES_CHANGED) {
+ serialPort = null;
+ }
+ }
+ });
+ }
+
+ public static class Factory implements IRemoteConnection.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (ISerialPortService.class.equals(service)) {
+ return (T) new SerialPortConnection(remoteConnection);
+ } else if (IRemoteCommandShellService.class.equals(service)) {
+ return (T) getService(remoteConnection, ISerialPortService.class);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return remoteConnection;
+ }
+
+ @Override
+ public SerialPort getSerialPort() {
+ if (serialPort == null) {
+ String portName = remoteConnection.getAttribute(PORT_NAME_ATTR);
+ if (portName != null) {
+ serialPort = new SerialPort(portName);
+ try {
+ serialPort.setBaudRate(
+ BaudRate.fromStringIndex(Integer.parseInt(remoteConnection.getAttribute(BAUD_RATE_ATTR))));
+ serialPort.setByteSize(
+ ByteSize.fromStringIndex(Integer.parseInt(remoteConnection.getAttribute(BYTE_SIZE_ATTR))));
+ serialPort.setParity(
+ Parity.fromStringIndex(Integer.parseInt(remoteConnection.getAttribute(PARITY_ATTR))));
+ serialPort.setStopBits(
+ StopBits.fromStringIndex(Integer.parseInt(remoteConnection.getAttribute(STOP_BITS_ATTR))));
+ } catch (IOException e) {
+ Activator.log(e);
+ }
+ }
+ }
+ return serialPort;
+ }
+
+ @Override
+ public IRemoteProcess getCommandShell(int flags) throws IOException {
+ SerialPort serialPort = getSerialPort();
+ if (serialPort == null) {
+ throw new IOException(Messages.SerialPortConnection_SerialPortNotAvailable);
+ }
+ return new SerialPortCommandShell(remoteConnection, getSerialPort());
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Activator.java b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Activator.java
new file mode 100644
index 00000000000..90ab8c2109e
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Activator.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.internal.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends Plugin {
+
+ private static Plugin plugin;
+
+ @Override
+ public void start(BundleContext bundleContext) throws Exception {
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext bundleContext) throws Exception {
+ plugin = null;
+ }
+
+ public static void log(IStatus status) {
+ plugin.getLog().log(status);
+ }
+
+ public static void log(Exception exception) {
+ if (exception instanceof CoreException) {
+ log(((CoreException) exception).getStatus());
+ } else {
+ log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), exception.getLocalizedMessage(),
+ exception));
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Messages.java b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Messages.java
new file mode 100644
index 00000000000..b4bf7be3f38
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.internal.core;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.serial.internal.core.messages"; //$NON-NLS-1$
+ public static String SerialPortConnection_SerialPortNotAvailable;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/messages.properties b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/messages.properties
new file mode 100644
index 00000000000..5c01c5263a9
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.core/src/org/eclipse/remote/serial/internal/core/messages.properties
@@ -0,0 +1,14 @@
+################################################################################
+# Copyright (c) 2015 QNX Software Systems, and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# QNX Software Systems - initial contribution
+################################################################################
+SerialPortConnection_SerialPortNotAvailable=Serial port not available.
diff --git a/remote/org.eclipse.remote.serial.ui/.classpath b/remote/org.eclipse.remote.serial.ui/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.serial.ui/.project b/remote/org.eclipse.remote.serial.ui/.project
new file mode 100644
index 00000000000..6c7fbb37598
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.serial.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.serial.ui/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.serial.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..31cf1557301
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,35 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %bundleName
+Bundle-SymbolicName: org.eclipse.remote.serial.ui;singleton:=true
+Bundle-Version: 1.0.200.qualifier
+Bundle-Activator: org.eclipse.remote.serial.internal.ui.Activator
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.remote.serial.ui
+Import-Package: org.eclipse.cdt.serial,
+ org.eclipse.core.expressions,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.operation,
+ org.eclipse.jface.preference,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.jface.wizard,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.serial.core,
+ org.eclipse.remote.ui,
+ org.eclipse.swt,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.eclipse.ui.dialogs,
+ org.eclipse.ui.plugin,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.serial.ui/about.html b/remote/org.eclipse.remote.serial.ui/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.serial.ui/about.ini b/remote/org.eclipse.remote.serial.ui/about.ini
new file mode 100644
index 00000000000..e07a7bb377e
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/about.ini
@@ -0,0 +1,24 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=cdt_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.serial.ui/about.mappings b/remote/org.eclipse.remote.serial.ui/about.mappings
new file mode 100644
index 00000000000..936a8039c3e
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/about.mappings
@@ -0,0 +1,9 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20200106-1728"
+# This value will be added automatically via the build scripts
+0=${buildId}
diff --git a/remote/org.eclipse.remote.serial.ui/about.properties b/remote/org.eclipse.remote.serial.ui/about.properties
new file mode 100644
index 00000000000..544df0e4828
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/about.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+# NOTE TO TRANSLATOR: Please do not translate the featureVersion variable.
+
+
+blurb=Serial Port Remote Services\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+\n\
+See the NOTICE file(s) distributed with this work for additional\n\
+information regarding copyright ownership.\n\
+\n\
+Visit http://www.eclipse.org/cdt
diff --git a/remote/org.eclipse.remote.serial.ui/build.properties b/remote/org.eclipse.remote.serial.ui/build.properties
new file mode 100644
index 00000000000..ed7e7fb3471
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/build.properties
@@ -0,0 +1,13 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ cdt_logo_icon32.png,\
+ icons/,\
+ plugin.properties
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.serial.ui/cdt_logo_icon32.png b/remote/org.eclipse.remote.serial.ui/cdt_logo_icon32.png
new file mode 100644
index 00000000000..470ca81b327
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/cdt_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.serial.ui/icons/serial.png b/remote/org.eclipse.remote.serial.ui/icons/serial.png
new file mode 100644
index 00000000000..55927362f66
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/icons/serial.png
Binary files differ
diff --git a/remote/org.eclipse.remote.serial.ui/plugin.properties b/remote/org.eclipse.remote.serial.ui/plugin.properties
new file mode 100644
index 00000000000..214fce2774e
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/plugin.properties
@@ -0,0 +1,2 @@
+bundleName = Remote Serial Port Services UI
+providerName = Eclipse PTP
diff --git a/remote/org.eclipse.remote.serial.ui/plugin.xml b/remote/org.eclipse.remote.serial.ui/plugin.xml
new file mode 100644
index 00000000000..ea286af5ecc
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/plugin.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.serial.core.connectionType"
+ factory="org.eclipse.remote.serial.internal.ui.SerialPortConnectionsUI$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIConnectionService">
+ </connectionTypeService>
+ </extension>
+ <extension
+ point="org.eclipse.ui.propertyPages">
+ <page
+ class="org.eclipse.remote.serial.ui.SerialPortConnectionPropertyPage"
+ id="org.eclipse.remote.serial.ui.targetPropertyPage"
+ name="Serial Port Settings"
+ selectionFilter="single">
+ <enabledWhen>
+ <adapt type="org.eclipse.remote.core.IRemoteConnection">
+ <test
+ property="org.eclipse.remote.core.isConnectionType"
+ value="org.eclipse.remote.serial.core.connectionType"/>
+ </adapt>
+ </enabledWhen>
+ </page>
+ </extension>
+</plugin>
diff --git a/remote/org.eclipse.remote.serial.ui/ptp_logo_icon32.png b/remote/org.eclipse.remote.serial.ui/ptp_logo_icon32.png
new file mode 100644
index 00000000000..e8ec57270f3
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/ptp_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Activator.java b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Activator.java
new file mode 100644
index 00000000000..1e6f51ed8e2
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Activator.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.internal.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.serial.ui"; //$NON-NLS-1$
+
+ // Image keys
+ public static final String IMG_CONNECTION_TYPE = PLUGIN_ID + ".connectionType"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ getImageRegistry().put(IMG_CONNECTION_TYPE, imageDescriptorFromPlugin(PLUGIN_ID, "/icons/serial.png")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ public static void log(IStatus status) {
+ plugin.getLog().log(status);
+ }
+
+ public static void log(Exception e) {
+ if (e instanceof CoreException) {
+ log(((CoreException) e).getStatus());
+ } else {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, e.getLocalizedMessage(), e));
+ }
+ }
+
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Messages.java b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Messages.java
new file mode 100644
index 00000000000..1f95311b3ee
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/Messages.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.internal.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.serial.internal.ui.messages"; //$NON-NLS-1$
+ public static String NewSerialPortConnectionWizardPage_BaudRateLabel;
+ public static String NewSerialPortConnectionWizardPage_ByteSizeLabel;
+ public static String NewSerialPortConnectionWizardPage_Description;
+ public static String NewSerialPortConnectionWizardPage_NameLabel;
+ public static String NewSerialPortConnectionWizardPage_ParityLabel;
+ public static String NewSerialPortConnectionWizardPage_PortLabel;
+ public static String NewSerialPortConnectionWizardPage_StopBitsLabel;
+ public static String NewSerialPortConnectionWizardPage_Title;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/SerialPortConnectionsUI.java b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/SerialPortConnectionsUI.java
new file mode 100644
index 00000000000..ae2155d1aa6
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/SerialPortConnectionsUI.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2015, 2020 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.internal.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.serial.ui.NewSerialPortConnectionWizard;
+import org.eclipse.remote.ui.AbstractRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+
+public class SerialPortConnectionsUI extends AbstractRemoteUIConnectionService {
+
+ private final IRemoteConnectionType connectionType;
+
+ private SerialPortConnectionsUI(IRemoteConnectionType connectionType) {
+ this.connectionType = connectionType;
+ }
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (IRemoteUIConnectionService.class.equals(service)) {
+ return (T) new SerialPortConnectionsUI(connectionType);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+ @Override
+ public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) {
+ return new NewSerialPortConnectionWizard(shell, connectionType);
+ }
+
+ @Override
+ public void openConnectionWithProgress(Shell shell, IRunnableContext context, final IRemoteConnection connection) {
+ try {
+ context.run(false, true, monitor -> {
+ try {
+ connection.open(monitor);
+ } catch (RemoteConnectionException e) {
+ Activator.log(e.getStatus());
+ }
+ });
+ } catch (InvocationTargetException | InterruptedException e) {
+ Activator.log(e);
+ }
+ }
+
+ @Override
+ public ILabelProvider getLabelProvider() {
+ return new DefaultLabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ return Activator.getDefault().getImageRegistry().get(Activator.IMG_CONNECTION_TYPE);
+ }
+ };
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/messages.properties b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/messages.properties
new file mode 100644
index 00000000000..f073d286682
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/internal/ui/messages.properties
@@ -0,0 +1,21 @@
+################################################################################
+# Copyright (c) 2015 QNX Software Systems, and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# QNX Software Systems - initial contribution
+################################################################################
+NewSerialPortConnectionWizardPage_BaudRateLabel=Baud rate:
+NewSerialPortConnectionWizardPage_ByteSizeLabel=Data size:
+NewSerialPortConnectionWizardPage_Description=New serial port connection settings
+NewSerialPortConnectionWizardPage_NameLabel=Connection name:
+NewSerialPortConnectionWizardPage_ParityLabel=Parity:
+NewSerialPortConnectionWizardPage_PortLabel=Serial port:
+NewSerialPortConnectionWizardPage_StopBitsLabel=Stop bits:
+NewSerialPortConnectionWizardPage_Title=New Serial Port Connection
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizard.java b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizard.java
new file mode 100644
index 00000000000..0bdb50d3765
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizard.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.ui;
+
+import java.util.Set;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.serial.core.ISerialPortService;
+import org.eclipse.remote.serial.internal.ui.Activator;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.widgets.Shell;
+
+public class NewSerialPortConnectionWizard extends Wizard implements IRemoteUIConnectionWizard {
+
+ private NewSerialPortConnectionWizardPage page;
+ private IRemoteConnectionWorkingCopy workingCopy;
+ private Shell shell;
+ private IRemoteConnectionType connectionType;
+
+ public NewSerialPortConnectionWizard(Shell shell, IRemoteConnectionType connectionType) {
+ this.shell = shell;
+ this.connectionType = connectionType;
+ }
+
+ @Override
+ public void addPages() {
+ page = new NewSerialPortConnectionWizardPage();
+ addPage(page);
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (getConnection() == null) {
+ return false;
+ }
+
+ workingCopy.setAttribute(ISerialPortService.PORT_NAME_ATTR, page.getPortName());
+ workingCopy.setAttribute(ISerialPortService.BAUD_RATE_ATTR, Integer.toString(page.getBaudRateIndex()));
+ workingCopy.setAttribute(ISerialPortService.BYTE_SIZE_ATTR, Integer.toString(page.getByteSizeIndex()));
+ workingCopy.setAttribute(ISerialPortService.PARITY_ATTR, Integer.toString(page.getParityIndex()));
+ workingCopy.setAttribute(ISerialPortService.STOP_BITS_ATTR, Integer.toString(page.getStopBitsIndex()));
+
+ return true;
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy open() {
+ WizardDialog dialog = new WizardDialog(shell, this);
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == WizardDialog.OK) {
+ return getConnection();
+ }
+ return null;
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy getConnection() {
+ if (workingCopy == null) {
+ try {
+ workingCopy = connectionType.newConnection(page.getConnectionName());
+ } catch (RemoteConnectionException e) {
+ Activator.log(e.getStatus());
+ }
+ }
+ return workingCopy;
+ }
+
+ @Override
+ public void setConnection(IRemoteConnectionWorkingCopy connection) {
+ workingCopy = connection;
+ }
+
+ @Override
+ public void setConnectionName(String name) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setInvalidConnectionNames(Set<String> names) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizardPage.java b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizardPage.java
new file mode 100644
index 00000000000..2657543cbb4
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/NewSerialPortConnectionWizardPage.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.ui;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.remote.serial.internal.ui.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+public class NewSerialPortConnectionWizardPage extends WizardPage {
+
+ protected SerialPortConnectionBlock block;
+
+ public NewSerialPortConnectionWizardPage() {
+ super(NewSerialPortConnectionWizardPage.class.getName());
+ setDescription(Messages.NewSerialPortConnectionWizardPage_Description);
+ setTitle(Messages.NewSerialPortConnectionWizardPage_Title);
+ block = new SerialPortConnectionBlock();
+ block.addUpdateListener(block.new SerialBlockUpdateListener() {
+
+ @Override
+ public void update() {
+ setPageComplete(block.isComplete());
+ }
+
+ });
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ block.createBlock(comp, null);
+ setControl(comp);
+ }
+
+ public String getConnectionName() {
+ return block.getConnectionName();
+ }
+
+ public String getPortName() {
+ return block.getPortName();
+ }
+
+ public int getBaudRateIndex() {
+ return block.getBaudRateIndex();
+ }
+
+ public int getByteSizeIndex() {
+ return block.getByteSizeIndex();
+ }
+
+ public int getParityIndex() {
+ return block.getParityIndex();
+ }
+
+ public int getStopBitsIndex() {
+ return block.getStopBitsIndex();
+ }
+
+}
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionBlock.java b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionBlock.java
new file mode 100644
index 00000000000..cec2147fa18
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionBlock.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * Copyright (c) 2016 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.ui;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.cdt.serial.BaudRate;
+import org.eclipse.cdt.serial.ByteSize;
+import org.eclipse.cdt.serial.Parity;
+import org.eclipse.cdt.serial.SerialPort;
+import org.eclipse.cdt.serial.StopBits;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.serial.core.ISerialPortService;
+import org.eclipse.remote.serial.internal.ui.Activator;
+import org.eclipse.remote.serial.internal.ui.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class SerialPortConnectionBlock {
+
+ private String name;
+ private String portName;
+ private int baudRateIndex;
+ private int byteSizeIndex;
+ private int parityIndex;
+ private int stopBitsIndex;
+
+ private String[] portNames;
+
+ private Text nameText;
+ private Combo portCombo;
+ private Combo baudRateCombo;
+ private Combo byteSizeCombo;
+ private Combo parityCombo;
+ private Combo stopBitsCombo;
+
+ private boolean isComplete;
+ private List<SerialBlockUpdateListener> listeners = new ArrayList<>();
+
+ /**
+ * Creates the UI elements for the SerialPortConnectionBlock
+ *
+ * @param comp - parent composite
+ * @param wc - an IRemoteConnectionWorkingCopy to populate the default values from. Can be null.
+ */
+ public void createBlock(Composite comp, IRemoteConnectionWorkingCopy wc) {
+
+ String name = "";
+ String connectionPortName = "";
+ int baudRateStringIndex = BaudRate.getStringIndex(BaudRate.getDefault());
+ int byteSizeStringIndex = ByteSize.getStringIndex(ByteSize.getDefault());
+ int parityStringIndex = Parity.getStringIndex(Parity.getDefault());
+ int stopBitsStringIndex = StopBits.getStringIndex(StopBits.getDefault());
+
+ if (wc != null) {
+ name = wc.getName();
+ connectionPortName = wc.getAttribute(ISerialPortService.PORT_NAME_ATTR);
+ baudRateStringIndex = Integer.parseInt(wc.getAttribute(ISerialPortService.BAUD_RATE_ATTR));
+ byteSizeStringIndex = Integer.parseInt(wc.getAttribute(ISerialPortService.BYTE_SIZE_ATTR));
+ parityStringIndex = Integer.parseInt(wc.getAttribute(ISerialPortService.PARITY_ATTR));
+ stopBitsStringIndex = Integer.parseInt(wc.getAttribute(ISerialPortService.STOP_BITS_ATTR));
+ }
+
+ Label nameLabel = new Label(comp, SWT.NONE);
+ nameLabel.setText(Messages.NewSerialPortConnectionWizardPage_NameLabel);
+
+ nameText = new Text(comp, SWT.BORDER | SWT.SINGLE);
+ nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ nameText.setText(name); //$NON-NLS-1$
+ nameText.addKeyListener(new KeyListener() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ updateStatus();
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ }
+ });
+
+ Label portLabel = new Label(comp, SWT.NONE);
+ portLabel.setText(Messages.NewSerialPortConnectionWizardPage_PortLabel);
+
+ portCombo = new Combo(comp, SWT.READ_ONLY);
+ portCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ try {
+ portNames = SerialPort.list();
+ } catch (IOException e) {
+ Activator.log(e);
+ }
+ int index = 0;
+ int portNameIndex = 0;
+ for (String portName : portNames) {
+ portCombo.add(portName);
+ if (portName.equals(connectionPortName))
+ portNameIndex = index;
+ index++;
+ }
+ portCombo.select(portNameIndex);
+ portCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateStatus();
+ }
+ });
+
+ Label baudRateLabel = new Label(comp, SWT.NONE);
+ baudRateLabel.setText(Messages.NewSerialPortConnectionWizardPage_BaudRateLabel);
+
+ baudRateCombo = new Combo(comp, SWT.READ_ONLY);
+ baudRateCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ for (String baudRateStr : BaudRate.getStrings()) {
+ baudRateCombo.add(baudRateStr);
+ }
+
+ baudRateCombo.select(baudRateStringIndex);
+ baudRateCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateStatus();
+ }
+ });
+
+ Label byteSizeLabel = new Label(comp, SWT.NONE);
+ byteSizeLabel.setText(Messages.NewSerialPortConnectionWizardPage_ByteSizeLabel);
+
+ byteSizeCombo = new Combo(comp, SWT.READ_ONLY);
+ byteSizeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ for (String byteSizeStr : ByteSize.getStrings()) {
+ byteSizeCombo.add(byteSizeStr);
+ }
+ byteSizeCombo.select(byteSizeStringIndex);
+ byteSizeCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateStatus();
+ }
+ });
+
+ Label parityLabel = new Label(comp, SWT.NONE);
+ parityLabel.setText(Messages.NewSerialPortConnectionWizardPage_ParityLabel);
+
+ parityCombo = new Combo(comp, SWT.READ_ONLY);
+ parityCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ for (String parityStr : Parity.getStrings()) {
+ parityCombo.add(parityStr);
+ }
+ parityCombo.select(parityStringIndex);
+ parityCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateStatus();
+ }
+ });
+
+ Label stopBitsLabel = new Label(comp, SWT.NONE);
+ stopBitsLabel.setText(Messages.NewSerialPortConnectionWizardPage_StopBitsLabel);
+
+ stopBitsCombo = new Combo(comp, SWT.READ_ONLY);
+ stopBitsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ for (String stopBitsStr : StopBits.getStrings()) {
+ stopBitsCombo.add(stopBitsStr);
+ }
+ stopBitsCombo.select(stopBitsStringIndex);
+ stopBitsCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateStatus();
+ }
+ });
+
+ updateStatus();
+ }
+
+ private void updateStatus() {
+ name = nameText.getText();
+
+ int portIndex = portCombo.getSelectionIndex();
+ portName = portIndex < 0 ? null : portNames[portIndex];
+
+ baudRateIndex = baudRateCombo.getSelectionIndex();
+ byteSizeIndex = byteSizeCombo.getSelectionIndex();
+ parityIndex = parityCombo.getSelectionIndex();
+ stopBitsIndex = stopBitsCombo.getSelectionIndex();
+
+ isComplete = (!name.isEmpty() && portName != null);
+
+ for (SerialBlockUpdateListener listener : listeners) {
+ listener.update();
+ }
+ }
+
+ public String getConnectionName() {
+ return name;
+ }
+
+ public String getPortName() {
+ return portName;
+ }
+
+ public int getBaudRateIndex() {
+ return baudRateIndex;
+ }
+
+ public int getByteSizeIndex() {
+ return byteSizeIndex;
+ }
+
+ public int getParityIndex() {
+ return parityIndex;
+ }
+
+ public int getStopBitsIndex() {
+ return stopBitsIndex;
+ }
+
+ public boolean isComplete() {
+ return isComplete;
+ }
+
+ public void addUpdateListener(SerialBlockUpdateListener listener) {
+ if (listener != null && !listeners.contains(listener))
+ listeners.add(listener);
+ }
+
+ public void removeUpdateListener(SerialBlockUpdateListener listener) {
+ listeners.remove(listener);
+ }
+
+ public abstract class SerialBlockUpdateListener {
+ public abstract void update();
+ }
+}
diff --git a/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionPropertyPage.java b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionPropertyPage.java
new file mode 100644
index 00000000000..512d4d682e3
--- /dev/null
+++ b/remote/org.eclipse.remote.serial.ui/src/org/eclipse/remote/serial/ui/SerialPortConnectionPropertyPage.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2016 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.serial.ui;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.serial.core.ISerialPortService;
+import org.eclipse.remote.serial.internal.ui.Activator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+public class SerialPortConnectionPropertyPage extends PropertyPage implements IWorkbenchPropertyPage {
+
+ protected SerialPortConnectionBlock block;
+ protected IRemoteConnectionWorkingCopy workingCopy;
+
+ public SerialPortConnectionPropertyPage() {
+ super();
+ block = new SerialPortConnectionBlock();
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+
+ block.addUpdateListener(block.new SerialBlockUpdateListener() {
+
+ @Override
+ public void update() {
+ setValid(block.isComplete());
+ }
+
+ });
+
+ IRemoteConnection remoteConnection = getElement().getAdapter(IRemoteConnection.class);
+ if (remoteConnection != null)
+ workingCopy = remoteConnection.getWorkingCopy();
+ else
+ workingCopy = null;
+
+ block.createBlock(comp, workingCopy);
+ return comp;
+ }
+
+ @Override
+ public boolean performOk() {
+ if (workingCopy != null) {
+
+ workingCopy.setName(block.getConnectionName());
+ workingCopy.setAttribute(ISerialPortService.PORT_NAME_ATTR, block.getPortName());
+ workingCopy.setAttribute(ISerialPortService.BAUD_RATE_ATTR, Integer.toString(block.getBaudRateIndex()));
+ workingCopy.setAttribute(ISerialPortService.BYTE_SIZE_ATTR, Integer.toString(block.getByteSizeIndex()));
+ workingCopy.setAttribute(ISerialPortService.PARITY_ATTR, Integer.toString(block.getParityIndex()));
+ workingCopy.setAttribute(ISerialPortService.STOP_BITS_ATTR, Integer.toString(block.getStopBitsIndex()));
+ try {
+ workingCopy.save();
+ } catch (RemoteConnectionException e) {
+ Activator.log(e);
+ return false;
+ }
+
+ }
+
+ return true;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.telnet-feature/.project b/remote/org.eclipse.remote.telnet-feature/.project
new file mode 100644
index 00000000000..3951b60a149
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.telnet-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.telnet-feature/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.telnet-feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet-feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.telnet-feature/build.properties b/remote/org.eclipse.remote.telnet-feature/build.properties
new file mode 100644
index 00000000000..adcc4e399d4
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet-feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+ feature.properties,\
+ epl-v20.html,\
+ eclipse_update_120.jpg
diff --git a/remote/org.eclipse.remote.telnet-feature/eclipse_update_120.jpg b/remote/org.eclipse.remote.telnet-feature/eclipse_update_120.jpg
new file mode 100644
index 00000000000..bfdf708ad61
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet-feature/eclipse_update_120.jpg
Binary files differ
diff --git a/remote/org.eclipse.remote.telnet-feature/epl-v20.html b/remote/org.eclipse.remote.telnet-feature/epl-v20.html
new file mode 100644
index 00000000000..008b8018db8
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet-feature/epl-v20.html
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+ <h2>Eclipse Foundation Software User Agreement</h2>
+ <p>November 22, 2017</p>
+
+ <h3>Usage Of Content</h3>
+
+ <p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,
+ INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY
+ THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS
+ GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY
+ APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
+ BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS
+ AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE
+ AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT
+ USE THE CONTENT.</p>
+
+ <h3>Applicable Licenses</h3>
+
+ <p>
+ Unless otherwise indicated, all Content made available by the Eclipse
+ Foundation is provided to you under the terms and conditions of the
+ Eclipse Public License Version 2.0 (&quot;EPL&quot;). A copy of the
+ EPL is provided with this Content and is also available at <a
+ href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>Content includes, but is not limited to, source code, object
+ code, documentation and other files maintained in the Eclipse
+ Foundation source code repository (&quot;Repository&quot;) in software
+ modules (&quot;Modules&quot;) and made available as downloadable
+ archives (&quot;Downloads&quot;).</p>
+
+ <ul>
+ <li>Content may be structured and packaged into modules to
+ facilitate delivering, extending, and upgrading the Content. Typical
+ modules may include plug-ins (&quot;Plug-ins&quot;), plug-in
+ fragments (&quot;Fragments&quot;), and features
+ (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory
+ or JAR (Java&trade; ARchive) in a directory named
+ &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or
+ Fragments and associated material. Each Feature may be packaged as a
+ sub-directory in a directory named &quot;features&quot;. Within a
+ Feature, files named &quot;feature.xml&quot; may contain a list of
+ the names and version numbers of the Plug-ins and/or Fragments
+ associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included
+ Features&quot;). Within a Feature, files named
+ &quot;feature.xml&quot; may contain a list of the names and version
+ numbers of Included Features.</li>
+ </ul>
+
+ <p>The terms and conditions governing Plug-ins and Fragments should
+ be contained in files named &quot;about.html&quot;
+ (&quot;Abouts&quot;). The terms and conditions governing Features and
+ Included Features should be contained in files named
+ &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and
+ Feature Licenses may be located in any directory of a Download or
+ Module including, but not limited to the following locations:</p>
+
+ <ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of
+ certain Plug-ins</li>
+ <li>Feature directories</li>
+ </ul>
+
+ <p>Note: if a Feature made available by the Eclipse Foundation is
+ installed using the Provisioning Technology (as defined below), you
+ must agree to a license (&quot;Feature Update License&quot;) during
+ the installation process. If the Feature contains Included Features,
+ the Feature Update License should either provide you with the terms
+ and conditions governing the Included Features or inform you where you
+ can locate them. Feature Update Licenses may be found in the
+ &quot;license&quot; property of files named
+ &quot;feature.properties&quot; found within a Feature. Such Abouts,
+ Feature Licenses, and Feature Update Licenses contain the terms and
+ conditions (or references to such terms and conditions) that govern
+ your use of the associated Content in that directory.</p>
+
+ <p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY
+ REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND
+ CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT
+ ARE NOT LIMITED TO):</p>
+
+ <ul>
+ <li>Eclipse Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)
+ </li>
+ <li>Eclipse Distribution License Version 1.0 (available at <a
+ href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)
+ </li>
+ <li>Common Public License Version 1.0 (available at <a
+ href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)
+ </li>
+ <li>Apache Software License 1.1 (available at <a
+ href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)
+ </li>
+ <li>Apache Software License 2.0 (available at <a
+ href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)
+ </li>
+ <li>Mozilla Public License Version 1.1 (available at <a
+ href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)
+ </li>
+ </ul>
+
+ <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND
+ CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License,
+ or Feature Update License is provided, please contact the Eclipse
+ Foundation to determine what terms and conditions govern that
+ particular Content.</p>
+
+
+ <h3>Use of Provisioning Technology</h3>
+
+ <p>
+ The Eclipse Foundation makes available provisioning software, examples
+ of which include, but are not limited to, p2 and the Eclipse Update
+ Manager (&quot;Provisioning Technology&quot;) for the purpose of
+ allowing users to install software, documentation, information and/or
+ other materials (collectively &quot;Installable Software&quot;). This
+ capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about
+ packaging Installable Software is available at <a
+ href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+ (&quot;Specification&quot;).
+ </p>
+
+ <p>You may use Provisioning Technology to allow other parties to
+ install Installable Software. You shall be responsible for enabling
+ the applicable license agreements relating to the Installable Software
+ to be presented to, and accepted by, the users of the Provisioning
+ Technology in accordance with the Specification. By using Provisioning
+ Technology in such a manner and making it available in accordance with
+ the Specification, you further acknowledge your agreement to, and the
+ acquisition of all necessary rights to permit the following:</p>
+
+ <ol>
+ <li>A series of actions may occur (&quot;Provisioning
+ Process&quot;) in which a user may execute the Provisioning
+ Technology on a machine (&quot;Target Machine&quot;) with the intent
+ of installing, extending or updating the functionality of an
+ Eclipse-based product.</li>
+ <li>During the Provisioning Process, the Provisioning Technology
+ may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</li>
+ <li>Pursuant to the Specification, you will provide to the user
+ the terms and conditions that govern the use of the Installable
+ Software (&quot;Installable Software Agreement&quot;) and such
+ Installable Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable
+ Software Agreement must inform the user of the terms and conditions
+ that govern the Installable Software and must solicit acceptance by
+ the end user in the manner prescribed in such Installable Software
+ Agreement. Upon such indication of agreement by the user, the
+ provisioning Technology will complete installation of the Installable
+ Software.</li>
+ </ol>
+
+ <h3>Cryptography</h3>
+
+ <p>Content may contain encryption software. The country in which
+ you are currently may have restrictions on the import, possession, and
+ use, and/or re-export to another country, of encryption software.
+ BEFORE using any encryption software, please check the country's laws,
+ regulations and policies concerning the import, possession, or use,
+ and re-export of encryption software, to see if this is permitted.</p>
+
+ <p>
+ <small>Java and all Java-based trademarks are trademarks of
+ Oracle Corporation in the United States, other countries, or both.</small>
+ </p>
+</body>
+</html>
diff --git a/remote/org.eclipse.remote.telnet-feature/feature.properties b/remote/org.eclipse.remote.telnet-feature/feature.properties
new file mode 100644
index 00000000000..bf96c9d224c
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet-feature/feature.properties
@@ -0,0 +1,27 @@
+#################################################################################
+# Copyright (c) 2015 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#################################################################################
+
+# "featureName" property - name of the feature
+featureName=Telnet Remote Services
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse CDT
+
+# "description" property - description of the feature
+description=Provides telnet services for the remote framework
+
+# copyright
+copyright=\
+Copyright (c) 2015 IBM Corporation.\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n
diff --git a/remote/org.eclipse.remote.telnet-feature/feature.xml b/remote/org.eclipse.remote.telnet-feature/feature.xml
new file mode 100644
index 00000000000..f0cd9f55e97
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet-feature/feature.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.remote.telnet"
+ label="%featureName"
+ version="10.7.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.remote.telnet.ui"
+ license-feature="org.eclipse.license"
+ license-feature-version="0.0.0">
+
+ <description>
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <plugin
+ id="org.eclipse.remote.telnet.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.remote.telnet.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.classpath b/remote/org.eclipse.remote.telnet.core.tests/.classpath
new file mode 100644
index 00000000000..a42a828e04a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src">
+ <attributes>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.project b/remote/org.eclipse.remote.telnet.core.tests/.project
new file mode 100644
index 00000000000..5a2fef9d7b9
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.telnet.core.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..5b1c443114d
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..51a63ec9988
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=2
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.telnet.core.tests/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.telnet.core.tests/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..0d695cf1c4a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Remote Telnet tests
+Bundle-SymbolicName: org.eclipse.remote.telnet.core.tests
+Bundle-Version: 1.0.100.qualifier
+Bundle-Activator: org.eclipse.remote.telnet.core.tests.Activator
+Bundle-Vendor: Eclipse PTP
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.remote.telnet.core;bundle-version="1.0.0",
+ org.junit;bundle-version="4.12.0",
+ org.eclipse.remote.core;bundle-version="2.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
diff --git a/remote/org.eclipse.remote.telnet.core.tests/about.html b/remote/org.eclipse.remote.telnet.core.tests/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.telnet.core.tests/build.properties b/remote/org.eclipse.remote.telnet.core.tests/build.properties
new file mode 100644
index 00000000000..67af4196ea0
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ about.html,\
+ .
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/Activator.java b/remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/Activator.java
new file mode 100644
index 00000000000..464be259a87
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/Activator.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Wainer dos Santos Moschetta (IBM Corp.) - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.core.tests;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class Activator implements BundleActivator {
+
+ private static BundleContext context;
+
+ static BundleContext getContext() {
+ return context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext bundleContext) throws Exception {
+ Activator.context = bundleContext;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext bundleContext) throws Exception {
+ Activator.context = null;
+ }
+
+ public static <T> T getService(Class<T> service) {
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/TelnetConnectionTests.java b/remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/TelnetConnectionTests.java
new file mode 100644
index 00000000000..bdb2c8abb1d
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core.tests/src/org/eclipse/remote/telnet/core/tests/TelnetConnectionTests.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Wainer dos Santos Moschetta (IBM Corp.) - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.core.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+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.IRemoteProcessBuilder;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.telnet.core.TelnetCommandShell;
+import org.eclipse.remote.telnet.core.TelnetConnection;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class TelnetConnectionTests {
+
+ private static final String TELNET_CONN_TYPE_ID = "org.eclipse.remote.telnet.core.connectionType";
+ private static String hostname = "localhost";
+ private static String username = "test";
+ private static String password = "";
+ private static String TEST_CONN_NAME = "NewTelnetConnection";
+ private final String expected_connType_name = "Telnet";
+ private final int expected_telnet_default_port = 23;
+ private final int expected_telnet_default_timeout = 0;
+ private static TelnetConnection telnet;
+
+ @BeforeClass
+ public static void setup() {
+ String host = System.getenv("TEST_HOSTNAME");
+ if (host != null) {
+ hostname = host;
+ }
+ String user = System.getenv("TEST_USERNAME");
+ if (user != null) {
+ username = user;
+ }
+ String passwd = System.getenv("TEST_PASSWORD");
+ if (user != null) {
+ password = passwd;
+ }
+ IRemoteServicesManager services = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connType = services.getConnectionType(TELNET_CONN_TYPE_ID);
+ assertNotNull(connType);
+ IRemoteConnectionWorkingCopy workingCopy = null;
+ IRemoteConnection connection = null;
+ try {
+ workingCopy = connType.newConnection(TEST_CONN_NAME);
+ assertNotNull(workingCopy);
+ IRemoteConnectionHostService hostService = workingCopy.getService(IRemoteConnectionHostService.class);
+ hostService.setHostname(hostname);
+ connection = workingCopy.save();
+ assertNotNull(connection);
+ } catch (RemoteConnectionException e) {
+ fail("Failed to create a Telnet connection: " + e.getMessage());
+ }
+ telnet = connection.getService(TelnetConnection.class);
+ assertNotNull(telnet);
+ }
+
+ @Test
+ public void testTelnetConnection() throws RemoteConnectionException {
+ IRemoteConnectionType connType = telnet.getRemoteConnection().getConnectionType();
+ assertEquals("Connection type name", expected_connType_name, connType.getName());
+ assertEquals("Default Telnet over TCP port", expected_telnet_default_port, telnet.getPort());
+ assertEquals("Default connection timeout", expected_telnet_default_timeout, telnet.getTimeout());
+ telnet.open(new NullProgressMonitor());
+ assertTrue("Connection should be open", telnet.isOpen());
+ telnet.close();
+ assertTrue("Connection should be closed", !telnet.isOpen());
+ }
+
+ @Test
+ public void testTelnetCommandShell() {
+ try {
+ telnet.open(new NullProgressMonitor());
+ } catch (RemoteConnectionException e) {
+ e.printStackTrace();
+ fail("Failed to open telnet connection");
+ }
+ TelnetCommandShell commandShell = null;
+ try {
+ commandShell = (TelnetCommandShell) telnet.getCommandShell(IRemoteProcessBuilder.ALLOCATE_PTY);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail("Failed to get command shell");
+ }
+ try {
+ commandShell.connect();
+ } catch (RemoteConnectionException e) {
+ e.printStackTrace();
+ fail("Unabled to connect with command shell");
+ }
+ OutputStream os = commandShell.getOutputStream();
+ assertNotNull("Command shel output stream", os);
+ InputStream is = commandShell.getInputStream();
+ assertNotNull("Command shel input stream");
+ if (!username.isEmpty() && !password.isEmpty()) {
+ try {
+ // Assume that a login prompt appears
+ readPrompt(is);
+ os.write((username + "\r\n").getBytes());
+ readPrompt(is);
+ os.write((password + "\r\n").getBytes());
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ br.readLine();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail("Failed to log in");
+ }
+ }
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ IRemoteServicesManager services = Activator.getService(IRemoteServicesManager.class);
+ IRemoteConnectionType connType = services.getConnectionType(TELNET_CONN_TYPE_ID);
+ try {
+ connType.removeConnection(telnet.getRemoteConnection());
+ IRemoteConnection conn = connType.getConnection(TEST_CONN_NAME);
+ assertTrue("Connection should had been deleted", conn == null);
+ } catch (RemoteConnectionException e) {
+ e.printStackTrace();
+ fail("Failed to delete the Telnet connection");
+ }
+ }
+
+ /*
+ * Consume characters until prompt delimite ":" has been found.
+ */
+ private void readPrompt(InputStream is) {
+ int v;
+ try {
+ v = is.read();
+ while ((v != -1) && (v != ':')) {
+ v = is.read();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail("Failed to read prompt: " + e.getMessage());
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core/.classpath b/remote/org.eclipse.remote.telnet.core/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.telnet.core/.project b/remote/org.eclipse.remote.telnet.core/.project
new file mode 100644
index 00000000000..5ceada3a77e
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.telnet.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.telnet.core/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.telnet.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..2dd175879fb
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %bundleName
+Bundle-SymbolicName: org.eclipse.remote.telnet.core;singleton:=true
+Bundle-Version: 1.1.100.qualifier
+Bundle-Activator: org.eclipse.remote.telnet.internal.core.Activator
+Bundle-Vendor: %providerName
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.telnet.core,
+ org.eclipse.remote.telnet.internal.core;x-internal:=true
+Bundle-Localization: plugin
+Import-Package: org.eclipse.core.runtime,
+ org.eclipse.osgi.service.debug;version="1.2.0",
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.telnet.core/about.html b/remote/org.eclipse.remote.telnet.core/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.telnet.core/about.ini b/remote/org.eclipse.remote.telnet.core/about.ini
new file mode 100644
index 00000000000..5bd1defab8b
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/about.ini
@@ -0,0 +1,27 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=ptp_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (not translated)
+# needed for primary features only
+
+# Property "welcomePage" contains path to welcome page (special XML-based format)
+# optional
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.telnet.core/about.mappings b/remote/org.eclipse.remote.telnet.core/about.mappings
new file mode 100644
index 00000000000..bddaab43109
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/about.mappings
@@ -0,0 +1,6 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+0=@build@ \ No newline at end of file
diff --git a/remote/org.eclipse.remote.telnet.core/about.properties b/remote/org.eclipse.remote.telnet.core/about.properties
new file mode 100644
index 00000000000..781e4e7e3a3
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/about.properties
@@ -0,0 +1,25 @@
+###############################################################################
+# Copyright (c) 2015 QNX Software Systems and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# QNX Software Systems - initial API and implementation
+###############################################################################
+
+# NLS_MESSAGEFORMAT_NONE
+# NLS_ENCODING=UTF-8
+
+blurb=Telnet Remote Services\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2015 IBM Corporation, and others.\n\
+Visit http://www.eclipse.org/ptp\n
+
diff --git a/remote/org.eclipse.remote.telnet.core/build.properties b/remote/org.eclipse.remote.telnet.core/build.properties
new file mode 100644
index 00000000000..d213cef4be1
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/build.properties
@@ -0,0 +1,12 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ ptp_logo_icon32.png,\
+ plugin.properties
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.telnet.core/plugin.properties b/remote/org.eclipse.remote.telnet.core/plugin.properties
new file mode 100644
index 00000000000..a8a8ec291cb
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/plugin.properties
@@ -0,0 +1,2 @@
+bundleName = Remote Serial Port Services
+providerName = Eclipse PTP
diff --git a/remote/org.eclipse.remote.telnet.core/plugin.xml b/remote/org.eclipse.remote.telnet.core/plugin.xml
new file mode 100644
index 00000000000..0d03a26753a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/plugin.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionType
+ id="org.eclipse.remote.telnet.core.connectionType"
+ name="Telnet">
+ </connectionType>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.telnet.core.connectionType"
+ factory="org.eclipse.remote.telnet.core.TelnetConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionControlService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.telnet.core.connectionType"
+ factory="org.eclipse.remote.telnet.core.TelnetConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteConnectionHostService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.telnet.core.connectionType"
+ factory="org.eclipse.remote.telnet.core.TelnetConnection$Factory"
+ service="org.eclipse.remote.core.IRemoteCommandShellService">
+ </connectionService>
+ <connectionService
+ connectionTypeId="org.eclipse.remote.telnet.core.connectionType"
+ factory="org.eclipse.remote.telnet.core.TelnetConnection$Factory"
+ service="org.eclipse.remote.telnet.core.TelnetConnection">
+ </connectionService>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.telnet.core/ptp_logo_icon32.png b/remote/org.eclipse.remote.telnet.core/ptp_logo_icon32.png
new file mode 100644
index 00000000000..e8ec57270f3
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/ptp_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCodes.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCodes.java
new file mode 100644
index 00000000000..a22f6148b00
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCodes.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2015 Wind River Systems, Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Fran Litterio (Wind River) - initial API and implementation
+ * Helmut Haigermoser (Wind River) - repackaged
+ * Ted Williams (Wind River) - repackaged into org.eclipse namespace
+ * Michael Scharf (Wind River) - split into core, view and connector plugins
+ * Martin Oberhuber (Wind River) - fixed copyright headers and beautified
+ * Greg Watson (IBM) - Adapted for org.eclipse.remote
+ *******************************************************************************/
+package org.eclipse.remote.telnet.core;
+
+/**
+ * This interface defines symbolic constants for numeric TELNET protocol command and
+ * option codes. Any class that needs to use these constants must implement this
+ * interface. The meanings of these constants are defined in the various TELNET RFCs
+ * (RFC 854 to RFC 861, and others).
+ */
+interface TelnetCodes {
+ /** Command code: Subnegotiation End. */
+ static final byte TELNET_SE = (byte) 240;
+
+ /** Command code: No-op. */
+ static final byte TELNET_NOP = (byte) 241;
+
+ /** Command code: Data Mark. */
+ static final byte TELNET_DM = (byte) 242;
+
+ /** Command code: Break. */
+ static final byte TELNET_BREAK = (byte) 243;
+
+ /** Command code: Interrupt Process. */
+ static final byte TELNET_IP = (byte) 244;
+
+ /** Command code: Abort Output. */
+ static final byte TELNET_AO = (byte) 245;
+
+ /** Command code: Are You There. */
+ static final byte TELNET_AYT = (byte) 246;
+
+ /** Command code: Erase Character. */
+ static final byte TELNET_EC = (byte) 247;
+
+ /** Command code: Erase Line. */
+ static final byte TELNET_EL = (byte) 248;
+
+ /** Command code: Go Ahead. */
+ static final byte TELNET_GA = (byte) 249;
+
+ /** Command code: Subnegotiation Begin. */
+ static final byte TELNET_SB = (byte) 250;
+
+ /** Command code: Will. */
+ static final byte TELNET_WILL = (byte) 251;
+
+ /** Command code: Won't. */
+ static final byte TELNET_WONT = (byte) 252;
+
+ /** Command code: Do. */
+ static final byte TELNET_DO = (byte) 253;
+
+ /** Command code: Don't. */
+ static final byte TELNET_DONT = (byte) 254;
+
+ /** Command code: Interpret As Command. */
+ static final byte TELNET_IAC = (byte) 255;
+
+ /** Command code: IS. */
+ static final byte TELNET_IS = 0;
+
+ /** Command code: SEND. */
+ static final byte TELNET_SEND = 1;
+
+ /** Option code: Transmit Binary option. */
+ static final byte TELNET_OPTION_TRANSMIT_BINARY = 0;
+
+ /** Option code: Echo option. */
+ static final byte TELNET_OPTION_ECHO = 1;
+
+ /** Option code: Suppress Go Ahead option. */
+ static final byte TELNET_OPTION_SUPPRESS_GA = 3;
+
+ /** Option code: Terminal Type */
+ static final byte TELNET_OPTION_TERMINAL_TYPE = 24;
+
+ /** Option code: Negotitate About Window Size (NAWS) */
+ static final byte TELNET_OPTION_NAWS = 31;
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCommandShell.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCommandShell.java
new file mode 100644
index 00000000000..b0341986848
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetCommandShell.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.net.ConnectException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.net.UnknownHostException;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.IRemoteProcessBuilder;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.telnet.internal.core.Logger;
+import org.eclipse.remote.telnet.internal.core.messages.Messages;
+
+public class TelnetCommandShell implements IRemoteProcess {
+ private final TelnetConnection telnetConnection;
+ private TelnetProtocol protocol;
+
+ public TelnetCommandShell(IRemoteConnection remoteConnection, TelnetConnection telnetConnection) {
+ this.telnetConnection = telnetConnection;
+ assert (remoteConnection.getService(IRemoteConnectionHostService.class) != null);
+ }
+
+ @Override
+ public void destroy() {
+ if (protocol != null) {
+ protocol.interrupt();
+ }
+ }
+
+ @Override
+ public int exitValue() {
+ return 0;
+ }
+
+ @Override
+ public InputStream getErrorStream() {
+ return null;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ if (protocol != null) {
+ PipedOutputStream pipedOutput = new PipedOutputStream();
+ protocol.setClientOutputStream(pipedOutput);
+ try {
+ return new PipedInputStream(pipedOutput);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public OutputStream getOutputStream() {
+ if (protocol != null) {
+ return protocol.getOutputStream();
+ }
+ return null;
+ }
+
+ @Override
+ public int waitFor() throws InterruptedException {
+ if (protocol != null && protocol.isConnected()) {
+ wait();
+ }
+ return 0;
+ }
+
+ @Override
+ public boolean isCompleted() {
+ return protocol == null || !protocol.isAlive();
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return telnetConnection.getRemoteConnection();
+ }
+
+ @Override
+ public <T extends Service> T getService(Class<T> service) {
+ return null;
+ }
+
+ @Override
+ public <T extends Service> boolean hasService(Class<T> service) {
+ return false;
+ }
+
+ @Override
+ public IRemoteProcessBuilder getProcessBuilder() {
+ return null;
+ }
+
+ public void connect() throws RemoteConnectionException {
+ IRemoteConnectionHostService hostSvc = telnetConnection.getRemoteConnection()
+ .getService(IRemoteConnectionHostService.class);
+
+ // Retry the connect after a little pause in case the
+ // remote telnet server isn't ready. ConnectExceptions might
+ // happen if the telnet server process did not initialized itself.
+ // This is seen especially if the telnet server is a process
+ // providing it's input and output via a built in telnet server.
+ int remaining = 10;
+
+ while (remaining >= 0) {
+ // Pause before we re-try if the remaining tries are less than the initial value
+ if (remaining < 10) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ /* ignored on purpose */ }
+ }
+
+ try {
+ int nTimeout = hostSvc.getTimeout() * 1000;
+ String strHost = hostSvc.getHostname();
+ int nPort = hostSvc.getPort();
+ InetSocketAddress address = new InetSocketAddress(strHost, nPort);
+ Socket socket = new Socket();
+
+ socket.connect(address, nTimeout);
+
+ // If we get to this point, the connect succeeded and we will
+ // force the remaining counter to be 0.
+ remaining = 0;
+
+ // This next call causes reads on the socket to see TCP urgent data
+ // inline with the rest of the non-urgent data. Without this call, TCP
+ // urgent data is silently dropped by Java. This is required for
+ // TELNET support, because when the TELNET server sends "IAC DM", the
+ // IAC byte is TCP urgent data. If urgent data is silently dropped, we
+ // only see the DM, which looks like an ISO Latin-1 '�' character.
+
+ socket.setOOBInline(true);
+ socket.setKeepAlive(true);
+
+ protocol = new TelnetProtocol(socket, this);
+ protocol.start();
+ } catch (UnknownHostException ex) {
+ // No re-try in case of UnknownHostException, there is no indication that
+ // the DNS will fix itself
+ throw new RemoteConnectionException(Messages.TelnetCommandShell_0 + ex.getMessage());
+ } catch (SocketTimeoutException socketTimeoutException) {
+ // Time out occurred. No re-try in this case either. Time out can
+ // be increased by the user. Multiplying the timeout with the remaining
+ // counter is not desired.
+ throw new RemoteConnectionException(socketTimeoutException.getMessage());
+ } catch (ConnectException connectException) {
+ // In case of a ConnectException, do a re-try. The server could have been
+ // simply not ready yet and the worker would give up to early. If the terminal
+ // control is already closed (disconnected), don't print "Connection refused" errors
+ if (remaining == 0) {
+ throw new RemoteConnectionException(connectException.getMessage());
+ }
+ } catch (Exception exception) {
+ // Any other exception on connect. No re-try in this case either
+ // Log the exception
+ Logger.logException(exception);
+ // And signal failed
+ throw new RemoteConnectionException(exception.getMessage());
+ } finally {
+ remaining--;
+ }
+ }
+ }
+
+ protected void terminated() {
+ telnetConnection.terminated(this);
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetConnection.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetConnection.java
new file mode 100644
index 00000000000..7b1e1e2939a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetConnection.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.core;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.remote.core.IRemoteCommandShellService;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnection.Service;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteProcess;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+
+public class TelnetConnection implements IRemoteConnectionControlService, IRemoteCommandShellService,
+ IRemoteConnectionHostService, IRemoteConnectionChangeListener {
+ public static int DEFAULT_PORT = 23;
+ public static int DEFAULT_TIMEOUT = 0; // Infinite
+
+ public static final String HOSTNAME_ATTR = "telnet.hostname.attr"; //$NON-NLS-1$
+ public static final String USERNAME_ATTR = "telnet.username.attr"; //$NON-NLS-1$
+ public static final String PASSWORD_ATTR = "telnet.password.attr"; //$NON-NLS-1$
+ public static final String PORT_ATTR = "telnet.port.attr"; //$NON-NLS-1$
+ public static final String TIMEOUT_ATTR = "telnet.timeout.attr"; //$NON-NLS-1$
+
+ private final IRemoteConnection remoteConnection;
+ private final List<TelnetCommandShell> shells = Collections.synchronizedList(new ArrayList<TelnetCommandShell>());
+ private boolean isOpen;
+
+ private TelnetConnection(IRemoteConnection remoteConnection) {
+ this.remoteConnection = remoteConnection;
+ remoteConnection.addConnectionChangeListener(this);
+ }
+
+ public static class Factory implements IRemoteConnection.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnection remoteConnection, Class<T> service) {
+ if (TelnetConnection.class.equals(service)) {
+ return (T) new TelnetConnection(remoteConnection);
+ } else if (IRemoteConnectionControlService.class.equals(service)
+ || IRemoteConnectionHostService.class.equals(service)
+ || IRemoteCommandShellService.class.equals(service)) {
+ return (T) remoteConnection.getService(TelnetConnection.class);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnection getRemoteConnection() {
+ return remoteConnection;
+ }
+
+ @Override
+ public IRemoteProcess getCommandShell(int flags) throws IOException {
+ if (isOpen) {
+ TelnetCommandShell shell = new TelnetCommandShell(remoteConnection, this);
+ try {
+ shell.connect();
+ } catch (RemoteConnectionException e) {
+ throw new IOException(e.getMessage());
+ }
+ shells.add(shell);
+ return shell;
+ }
+ return null;
+ }
+
+ @Override
+ public int getPort() {
+ try {
+ String portStr = remoteConnection.getAttribute(PORT_ATTR);
+ return !portStr.isEmpty() ? Integer.parseInt(portStr) : DEFAULT_PORT;
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+
+ @Override
+ public int getTimeout() {
+ try {
+ String timeoutStr = remoteConnection.getAttribute(TIMEOUT_ATTR);
+ return !timeoutStr.isEmpty() ? Integer.parseInt(timeoutStr) : DEFAULT_TIMEOUT;
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+
+ @Override
+ public void close() {
+ synchronized (shells) {
+ for (TelnetCommandShell shell : shells) {
+ shell.destroy();
+ }
+ }
+ isOpen = false;
+ }
+
+ @Override
+ public String getHostname() {
+ return remoteConnection.getAttribute(HOSTNAME_ATTR);
+ }
+
+ @Override
+ public boolean useLoginShell() {
+ return true;
+ }
+
+ @Override
+ public String getUsername() {
+ return remoteConnection.getAttribute(USERNAME_ATTR);
+ }
+
+ @Override
+ public void setHostname(String hostname) {
+ if (remoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) remoteConnection;
+ wc.setAttribute(HOSTNAME_ATTR, hostname);
+ }
+ }
+
+ @Override
+ public void setPassphrase(String passphrase) {
+ // Ignore
+ }
+
+ @Override
+ public void setPassword(String password) {
+ if (remoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) remoteConnection;
+ wc.setSecureAttribute(PASSWORD_ATTR, password);
+ }
+ }
+
+ @Override
+ public void setPort(int port) {
+ if (remoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) remoteConnection;
+ wc.setAttribute(PORT_ATTR, Integer.toString(port));
+ }
+ }
+
+ @Override
+ public void setTimeout(int timeout) {
+ if (remoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) remoteConnection;
+ wc.setAttribute(TIMEOUT_ATTR, Integer.toString(timeout));
+ }
+ }
+
+ @Override
+ public void setUseLoginShell(boolean useLogingShell) {
+ // Ignore
+ }
+
+ @Override
+ public void setUsePassword(boolean usePassword) {
+ // Ignore
+ }
+
+ @Override
+ public void setUsername(String username) {
+ if (remoteConnection instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) remoteConnection;
+ wc.setAttribute(USERNAME_ATTR, username);
+ }
+ }
+
+ @Override
+ public void open(IProgressMonitor monitor) throws RemoteConnectionException {
+ isOpen = true;
+ }
+
+ @Override
+ public boolean isOpen() {
+ return isOpen;
+ }
+
+ @Override
+ public void connectionChanged(RemoteConnectionChangeEvent event) {
+ switch (event.getType()) {
+ case RemoteConnectionChangeEvent.CONNECTION_OPENED:
+ isOpen = true;
+ break;
+
+ case RemoteConnectionChangeEvent.CONNECTION_ABORTED:
+ case RemoteConnectionChangeEvent.CONNECTION_CLOSED:
+ isOpen = false;
+ break;
+ }
+ }
+
+ protected void terminated(TelnetCommandShell shell) {
+ shells.remove(shell);
+ }
+
+ @Override
+ public String getPassphrase() {
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getPassword() {
+ return remoteConnection.getSecureAttribute(PASSWORD_ATTR);
+ }
+
+ @Override
+ public boolean usePassword() {
+ return true;
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetOption.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetOption.java
new file mode 100644
index 00000000000..58620cb579a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetOption.java
@@ -0,0 +1,727 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2015 Wind River Systems, Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Initial Contributors:
+ * The following Wind River employees contributed to the Terminal component
+ * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb,
+ * Helmut Haigermoser and Ted Williams.
+ *
+ * Contributors:
+ * Michael Scharf (Wind River) - split into core, view and connector plugins
+ * Martin Oberhuber (Wind River) - fixed copyright headers and beautified
+ * Martin Oberhuber (Wind River) - [267181] Fix telnet option negotiation loop
+ * Anton Leherbauer (Wind River) - [453393] Add support for copying wrapped lines without line break
+ * Greg Watson (IBM) - Adapted for org.eclipse.remote
+ *******************************************************************************/
+package org.eclipse.remote.telnet.core;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+
+import org.eclipse.remote.telnet.internal.core.Logger;
+
+/**
+ * This class represents a single TELNET protocol option at one endpoint of a TELNET
+ * connection. This class encapsulates the endpoint associated with the option (local
+ * or remote), the current state of the option (enabled or disabled), the desired state
+ * of the option, the current state of the negotiation, an OutputStream that allows
+ * communication with the remote endpoint, and the number of negotiations that have
+ * started within this connection.
+ * <p>
+ *
+ * In addition to encapsulating the above state, this class performs option negotiation
+ * to attempt to achieve the desired option state. For some options, this class also
+ * performs option sub-negotiation.
+ * <p>
+ *
+ * IMPORTANT: Understanding this code requires understanding the TELNET protocol and
+ * TELNET option processing.
+ * <p>
+ *
+ * @author Fran Litterio (francis.litterio@windriver.com)
+ */
+class TelnetOption implements TelnetCodes {
+ /**
+ * This array of Strings maps an integer TELNET option code value to the symbolic
+ * name of the option. Array elements of the form "?" represent unassigned option
+ * values.
+ */
+ protected static final String[] optionNames = { "BINARY", // 0 //$NON-NLS-1$
+ "ECHO", // 1 //$NON-NLS-1$
+ "RECONNECTION", // 2 //$NON-NLS-1$
+ "SUPPRESS GO AHEAD", // 3 //$NON-NLS-1$
+ "MSG SIZE NEGOTIATION", // 4 //$NON-NLS-1$
+ "STATUS", // 5 //$NON-NLS-1$
+ "TIMING MARK", // 6 //$NON-NLS-1$
+ "REMOTE CTRL TRANS+ECHO", // 7 //$NON-NLS-1$
+ "OUTPUT LINE WIDTH", // 8 //$NON-NLS-1$
+ "OUTPUT PAGE SIZE", // 9 //$NON-NLS-1$
+ "OUTPUT CR DISPOSITION", // 10 //$NON-NLS-1$
+ "OUTPUT HORIZ TABSTOPS", // 11 //$NON-NLS-1$
+ "OUTPUT HORIZ TAB DISPOSITION", // 12 //$NON-NLS-1$
+ "OUTPUT FORMFEED DISPOSITION", // 13 //$NON-NLS-1$
+ "OUTPUT VERTICAL TABSTOPS", // 14 //$NON-NLS-1$
+ "OUTPUT VT DISPOSITION", // 15 //$NON-NLS-1$
+ "OUTPUT LF DISPOSITION", // 16 //$NON-NLS-1$
+ "EXTENDED ASCII", // 17 //$NON-NLS-1$
+ "LOGOUT", // 18 //$NON-NLS-1$
+ "BYTE MACRO", // 19 //$NON-NLS-1$
+ "DATA ENTRY TERMINAL", // 20 //$NON-NLS-1$
+ "SUPDUP", // 21 //$NON-NLS-1$
+ "SUPDUP OUTPUT", // 22 //$NON-NLS-1$
+ "SEND LOCATION", // 23 //$NON-NLS-1$
+ "TERMINAL TYPE", // 24 //$NON-NLS-1$
+ "END OF RECORD", // 25 //$NON-NLS-1$
+ "TACACS USER IDENTIFICATION", // 26 //$NON-NLS-1$
+ "OUTPUT MARKING", // 27 //$NON-NLS-1$
+ "TERMINAL LOCATION NUMBER", // 28 //$NON-NLS-1$
+ "3270 REGIME", // 29 //$NON-NLS-1$
+ "X.3 PAD", // 30 //$NON-NLS-1$
+ "NEGOTIATE ABOUT WINDOW SIZE", // 31 //$NON-NLS-1$
+ "TERMINAL SPEED", // 32 //$NON-NLS-1$
+ "REMOTE FLOW CONTROL", // 33 //$NON-NLS-1$
+ "LINEMODE", // 34 //$NON-NLS-1$
+ "X DISPLAY LOCATION", // 35 //$NON-NLS-1$
+ "ENVIRONMENT OPTION", // 36 //$NON-NLS-1$
+ "AUTHENTICATION OPTION", // 37 //$NON-NLS-1$
+ "ENCRYPTION OPTION", // 38 //$NON-NLS-1$
+ "NEW ENVIRONMENT OPTION", // 39 //$NON-NLS-1$
+ "TN3270E", // 40 //$NON-NLS-1$
+ "XAUTH", // 41 //$NON-NLS-1$
+ "CHARSET", // 42 //$NON-NLS-1$
+ "REMOTE SERIAL PORT", // 43 //$NON-NLS-1$
+ "COM PORT CONTROL OPTION", // 44 //$NON-NLS-1$
+ "SUPPRESS LOCAL ECHO", // 45 //$NON-NLS-1$
+ "START TLS", // 46 //$NON-NLS-1$
+ "KERMIT", // 47 //$NON-NLS-1$
+ "SEND URL", // 48 //$NON-NLS-1$
+ "FORWARD X", // 49 //$NON-NLS-1$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", // 50 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ // ...
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", // ... //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
+ // 137
+ "TELOPT PRAGMA LOGON", // 138 //$NON-NLS-1$
+ "TELOPT SSPI LOGON", // 139 //$NON-NLS-1$
+ "TELOPT PRAGMA HEARTBEAT", // 140 //$NON-NLS-1$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", // 141 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ // ...
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "?", "?", "?", "?", // ... 254 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ "EXTENDED OPTIONS LIST" // 255 //$NON-NLS-1$
+ };
+
+ /**
+ * Negotiation state: Negotiation not yet started for this option.
+ * <p>
+ *
+ * This constant and the others having similar names represent the states of a
+ * finite state automaton (FSA) that tracks the negotiation state of this option.
+ * The initial state is NEGOTIATION_NOT_STARTED. The state machine is as follows
+ * (with transitions labeled with letters in parentheses):
+ * <p>
+ *
+ * <pre>
+ * NEGOTIATION_NOT_STARTED -----> {@link #NEGOTIATION_IN_PROGRESS}
+ * | (A) | ^
+ * (C)| (B)| |(D)
+ * | V |
+ * +--------> {@link #NEGOTIATION_DONE}
+ * </pre>
+ * <p>
+ *
+ * Once the FSA leaves state NEGOTIATION_NOT_STARTED, it never returns to that
+ * state. Transition A happens when the local endpoint sends an option command
+ * before receiving a command for the same option from the remote endpoint.
+ * <p>
+ *
+ * Transition B happens when the local endpoint receives a reply to an option
+ * command sent earlier by the local endpoint. Receipt of that reply terminates
+ * the negotiation.
+ * <p>
+ *
+ * Transition D happens after negotiation is done and "something changes" (see the
+ * RFCs for the definition of "something changes"). Either endpoint can
+ * re-negotiate an option after a previous negotiation, but only if some external
+ * influence (such as the user or the OS) causes it to do so. Re-negotiation must
+ * start more than {@link #NEGOTIATION_IGNORE_DURATION} milliseconds after the FSA
+ * enters state NEGOTIATION_DONE or it will be ignored. This is how this client
+ * prevents negotiation loops.
+ * <p>
+ *
+ * Transition C happens when the local endpoint receives an option command from the
+ * remote endpoint before sending a command for the same option. In that case, the
+ * local endpoint replies immediately with an option command and the negotiation
+ * terminates.
+ * <p>
+ *
+ * Some TELNET servers (e.g., the Solaris server), after sending WILL and receiving
+ * DONT, will reply with a superfluous WONT. Any such superfluous option command
+ * received from the remote endpoint while the option's FSA is in state
+ * {@link #NEGOTIATION_DONE} will be ignored by the local endpoint.
+ */
+ protected static final int NEGOTIATION_NOT_STARTED = 0;
+
+ /** Negotiation state: Negotiation is in progress for this option. */
+ protected static final int NEGOTIATION_IN_PROGRESS = 1;
+
+ /** Negotiation state: Negotiation has terminated for this option. */
+ protected static final int NEGOTIATION_DONE = 2;
+
+ /**
+ * The number of milliseconds following the end of negotiation of this option
+ * before which the remote endpoint can re-negotiate the option. Any option
+ * command received from the remote endpoint before this time passes is ignored.
+ * This is used to prevent option negotiation loops.
+ *
+ * @see #ignoreNegotiation()
+ * @see #negotiationCompletionTime
+ */
+ protected static final int NEGOTIATION_IGNORE_DURATION = 30000;
+
+ /**
+ * This field holds the current negotiation state for this option.
+ */
+ protected int negotiationState = NEGOTIATION_NOT_STARTED;
+
+ /**
+ * This field holds the time when negotiation of this option most recently
+ * terminated (i.e., entered state {@link #NEGOTIATION_DONE}). This is used to
+ * determine whether an option command received from the remote endpoint after
+ * negotiation has terminated for this option is to be ignored or interpreted as
+ * the start of a new negotiation.
+ *
+ * @see #NEGOTIATION_IGNORE_DURATION
+ */
+ protected Date negotiationCompletionTime = new Date(0);
+
+ /**
+ * Holds the total number of negotiations that have completed for this option.
+ */
+ protected int negotiationCount = 0;
+
+ /**
+ * Holds the integer code representing the option.
+ */
+ protected byte option = 0;
+
+ /**
+ * Holds the OutputStream object that allows data to be sent to the remote endpoint
+ * of the TELNET connection.
+ */
+ protected OutputStream outputStream;
+
+ /**
+ * True if this option is for the local endpoint, false for the remote endpoint.
+ */
+ protected boolean local = true;
+
+ /**
+ * This field is true if the option is enabled, false if it is disabled. All
+ * options are initially disabled until they are negotiated to be enabled.
+ * <p>
+ */
+ protected boolean enabled = false;
+
+ /**
+ * This field is true if the client desires the option to be enabled, false if the
+ * client desires the option to be disabled. This field does not represent the
+ * remote's endpoints desire (as expressed via WILL and WONT commands) -- it
+ * represnet the local endpoint's desire.
+ * <p>
+ *
+ * @see #setDesired(boolean)
+ */
+ protected boolean desired = false;
+
+ /**
+ * Constructor.
+ * <p>
+ *
+ * @param option
+ * The integer code of this option.
+ * @param desired
+ * Whether we desire this option to be enabled.
+ * @param local
+ * Whether this option is for the local or remote endpoint.
+ * @param serverOutputStream
+ * A stream used to negotiate with the remote endpoint.
+ */
+ TelnetOption(byte option, boolean desired, boolean local, OutputStream outputStream) {
+ this.option = option;
+ this.desired = desired;
+ this.local = local;
+ this.outputStream = outputStream;
+ }
+
+ /**
+ * @return Returns a String containing the name of the TELNET option specified in
+ * parameter <i>option</i>.
+ */
+ public String optionName() {
+ return optionNames[option & 0xFF];
+ }
+
+ /**
+ * Returns true if this option is enabled, false if it is disabled.
+ * <p>
+ *
+ * @return Returns true if this option is enabled, false if it is disabled.
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
+ * Enables this option if <i>newValue</i> is true, otherwise disables this
+ * option.
+ * <p>
+ *
+ * @param newValue
+ * True if this option is to be enabled, false otherwise.
+ */
+ public void setEnabled(boolean newValue) {
+ Logger.log("Enabling " + (local ? "local" : "remote") + " option " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ optionName());
+ enabled = newValue;
+ }
+
+ /**
+ * Returns true if the local endpoint desires this option to be enabled, false if
+ * not. It is not an error for the value returned by this method to differ from
+ * the value returned by isEnabled(). The value returned by this method can change
+ * over time, reflecting the local endpoint's changing desire regarding the
+ * option.
+ * <p>
+ *
+ * NOTE: Even if this option represents a remote endpoint option, the return value
+ * of this method represents the local endpint's desire regarding the remote
+ * option.
+ * <p>
+ *
+ * @return Returns true if the local endpoint desires this option to be enabled,
+ * false if not.
+ */
+ public boolean isDesired() {
+ return desired;
+ }
+
+ /**
+ * Sets our desired value for this option. Note that the option can be desired
+ * when <i>enabled</i> is false, and the option can be undesired when
+ * <i>enabled</i> is true, though the latter state should not persist, since either
+ * endpoint can disable any option at any time.
+ * <p>
+ *
+ * @param newValue
+ * True if we desire this option to be enabled, false if
+ * we desire this option to be disabled.
+ */
+ public void setDesired(boolean newValue) {
+ if (newValue) {
+ Logger.log("Setting " + (local ? "local" : "remote") + " option " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ optionName() + " as desired."); //$NON-NLS-1$
+ }
+
+ desired = newValue;
+ }
+
+ /**
+ * Call this method to request that negotiation begin for this option. This method
+ * does nothing if negotiation for this option has already started or is already
+ * complete. If negotiation has not yet started for this option and the local
+ * endpoint desires this option to be enabled, then we send a WILL or DO command to
+ * the remote endpoint.
+ */
+ public void negotiate() {
+ if (negotiationState == NEGOTIATION_NOT_STARTED && desired) {
+ if (local) {
+ Logger.log("Starting negotiation for local option " + optionName()); //$NON-NLS-1$
+ sendWill();
+ } else {
+ Logger.log("Starting negotiation for remote option " + optionName()); //$NON-NLS-1$
+ sendDo();
+ }
+
+ negotiationState = NEGOTIATION_IN_PROGRESS;
+ }
+ }
+
+ /**
+ * This method is called whenever we receive a WILL command from the remote
+ * endpoint.
+ */
+ public void handleWill() {
+ if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation()) {
+ Logger.log("Ignoring superfluous WILL command from remote endpoint."); //$NON-NLS-1$
+ return;
+ }
+
+ if (negotiationState == NEGOTIATION_IN_PROGRESS) {
+ if (desired) {
+ // We sent DO and server replied with WILL. Enable the option, and end
+ // this negotiation.
+
+ enabled = true;
+ Logger.log("Enabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ } else {
+ // This should never happen! We sent DONT and the server replied with
+ // WILL. Bad server. No soup for you. Disable the option, and end
+ // this negotiation.
+
+ Logger.log("Server answered DONT with WILL!"); //$NON-NLS-1$
+ enabled = false;
+ Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ }
+ } else {
+ if (desired) {
+ // Server sent WILL, so we reply with DO. Enable the option, and end
+ // this negotiation.
+
+ sendDo();
+ enabled = true;
+ Logger.log("Enabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ } else {
+ // Server sent WILL, so we reply with DONT. Disable the option, and
+ // end this negotiation.
+
+ sendDont();
+ enabled = false;
+ Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ }
+ }
+ }
+
+ /**
+ * Handles a WONT command sent by the remote endpoint for this option. The value
+ * of <i>desired</i> doesn't matter in this method, because the remote endpoint is
+ * forcing the option to be disabled.
+ */
+ public void handleWont() {
+ if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation()) {
+ Logger.log("Ignoring superfluous WONT command from remote endpoint."); //$NON-NLS-1$
+ return;
+ }
+
+ if (negotiationState == NEGOTIATION_IN_PROGRESS) {
+ // We sent DO or DONT and server replied with WONT. Disable the
+ // option, and end this negotiation.
+
+ enabled = false;
+ Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ } else {
+ // Server sent WONT, so we reply with DONT. Disable the option, and
+ // end this negotiation.
+
+ sendDont();
+ enabled = false;
+ Logger.log("Disabling remote option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ }
+ }
+
+ /**
+ * Handles a DO command sent by the remote endpoint for this option.
+ */
+ public void handleDo() {
+ if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation()) {
+ Logger.log("Ignoring superfluous DO command from remote endpoint."); //$NON-NLS-1$
+ return;
+ }
+
+ if (negotiationState == NEGOTIATION_IN_PROGRESS) {
+ if (desired) {
+ // We sent WILL and server replied with DO. Enable the option, and end
+ // this negotiation.
+
+ enabled = true;
+ Logger.log("Enabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ } else {
+ // We sent WONT and server replied with DO. This should never happen!
+ // Bad server. No soup for you. Disable the option, and end this
+ // negotiation.
+
+ Logger.log("Server answered WONT with DO!"); //$NON-NLS-1$
+ enabled = false;
+ Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ }
+ } else {
+ if (desired) {
+ // Server sent DO, so we reply with WILL. Enable the option, and end
+ // this negotiation.
+
+ sendWill();
+ enabled = true;
+ Logger.log("Enabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ } else {
+ // Server sent DO, so we reply with WONT. Disable the option, and end
+ // this negotiation.
+
+ sendWont();
+ enabled = false;
+ Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ }
+ }
+ }
+
+ /**
+ * Handles a DONT command sent by the remote endpoint for this option. The value
+ * of <i>desired</i> doesn't matter in this method, because the remote endpoint is
+ * forcing the option to be disabled.
+ */
+ public void handleDont() {
+ if (negotiationState == NEGOTIATION_DONE && ignoreNegotiation()) {
+ Logger.log("Ignoring superfluous DONT command from remote endpoint."); //$NON-NLS-1$
+ return;
+ }
+
+ if (negotiationState == NEGOTIATION_IN_PROGRESS) {
+ // We sent WILL or WONT and server replied with DONT. Disable the
+ // option, and end this negotiation.
+
+ enabled = false;
+ Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ } else {
+ // Server sent DONT, so we reply with WONT. Disable the option, and end
+ // this negotiation.
+
+ sendWont();
+ enabled = false;
+ Logger.log("Disabling local option " + optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ endNegotiation();
+ }
+ }
+
+ /**
+ * This method handles a subnegotiation command received from the remote endpoint.
+ * Currently, the only subnegotiation we handle is when the remote endpoint
+ * commands us to send our terminal type (which is "xterm").
+ *
+ * @param subnegotiationData
+ * An array of bytes containing a TELNET
+ * subnegotiation command received from the
+ * remote endpoint.
+ * @param count
+ * The number of bytes in array
+ * subnegotiationData to examine.
+ */
+ public void handleSubnegotiation(byte[] subnegotiationData, int count) {
+ switch (option) {
+ case TELNET_OPTION_TERMINAL_TYPE:
+ if (subnegotiationData[1] != TELNET_SEND) {
+ // This should never happen!
+ Logger.log("Invalid TERMINAL-TYPE subnegotiation command from remote endpoint: " + //$NON-NLS-1$
+ (subnegotiationData[1] & 0xff));
+ break;
+ }
+
+ // Tell the remote endpoint our terminal type is "ansi" using this sequence
+ // of TELNET protocol bytes:
+ //
+ // IAC SB TERMINAL-TYPE IS x t e r m IAC SE
+
+ byte[] terminalTypeData = { TELNET_IAC, TELNET_SB, TELNET_OPTION_TERMINAL_TYPE, TELNET_IS, (byte) 'x',
+ (byte) 't', (byte) 'e', (byte) 'r', (byte) 'm', TELNET_IAC, TELNET_SE };
+
+ try {
+ outputStream.write(terminalTypeData);
+ } catch (IOException ex) {
+ Logger.log("IOException sending TERMINAL-TYPE subnegotiation!"); //$NON-NLS-1$
+ Logger.logException(ex);
+ }
+ break;
+
+ default:
+ // This should never happen!
+ Logger.log("SHOULD NOT BE REACHED: Called for option " + optionName()); //$NON-NLS-1$
+ break;
+ }
+ }
+
+ /**
+ * This method sends a subnegotiation command to the remote endpoint.
+ *
+ * @param subnegotiationData
+ * An array of Objects holding data to be used
+ * when generating the outbound subnegotiation
+ * command.
+ */
+ public void sendSubnegotiation(Object[] subnegotiationData) {
+ switch (option) {
+ case TELNET_OPTION_NAWS:
+ // Get the width and height of the view and send it to the remote
+ // endpoint using this sequence of TELNET protocol bytes:
+ //
+ // IAC SB NAWS <width-highbyte> <width-lowbyte> <height-highbyte>
+ // <height-lowbyte> IAC SE
+
+ byte[] NAWSData = { TELNET_IAC, TELNET_SB, TELNET_OPTION_NAWS, 0, 0, 0, 0, TELNET_IAC, TELNET_SE };
+ int width = ((Integer) subnegotiationData[0]).intValue();
+ int height = ((Integer) subnegotiationData[1]).intValue();
+
+ NAWSData[3] = (byte) ((width >>> 8) & 0xff); // High order byte of width.
+ NAWSData[4] = (byte) (width & 0xff); // Low order byte of width.
+ NAWSData[5] = (byte) ((height >>> 8) & 0xff); // High order byte of height.
+ NAWSData[6] = (byte) (height & 0xff); // Low order byte of height.
+
+ Logger.log("sending terminal size to remote endpoint: width = " + width + //$NON-NLS-1$
+ ", height = " + height + "."); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // This final local variable is a hack to get around the fact that inner
+ // classes cannot reference a non-final local variable in a lexically
+ // enclosing scope.
+
+ final byte[] NAWSDataFinal = NAWSData;
+
+ // Send the NAWS data in a new thread. The current thread is the display
+ // thread, and calls to write() can block, but blocking the display thread
+ // is _bad_ (it hangs the GUI).
+
+ Thread t = new Thread() {
+ @Override
+ public void run() {
+ try {
+ outputStream.write(NAWSDataFinal);
+ } catch (IOException ex) {
+ Logger.log("IOException sending NAWS subnegotiation!"); //$NON-NLS-1$
+ Logger.logException(ex);
+ }
+ }
+ };
+ t.setDaemon(true);
+ t.start();
+ break;
+
+ default:
+ // This should never happen!
+ Logger.log("SHOULD NOT BE REACHED: Called for option " + optionName()); //$NON-NLS-1$
+ break;
+ }
+ }
+
+ /**
+ * This method returns true if there has not yet been any negotiation of this
+ * option.
+ *
+ * @return Returns true if there has not yet been any negotiation of this option.
+ */
+ protected boolean notYetNegotiated() {
+ return negotiationState == NEGOTIATION_NOT_STARTED;
+ }
+
+ /**
+ * This method terminates the current negotiation and records the time at which the
+ * negotiation terminated.
+ */
+ protected void endNegotiation() {
+ Logger.log("Ending negotiation #" + negotiationCount + " for " + //$NON-NLS-1$ //$NON-NLS-2$
+ (local ? "local" : "remote") + " option " + optionName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ negotiationState = NEGOTIATION_DONE;
+ negotiationCompletionTime.setTime(System.currentTimeMillis());
+ ++negotiationCount;
+ }
+
+ /**
+ * This method determines whether or not to ignore what appears to be a new
+ * negotiation initiated by the remote endpoint. This is needed because some
+ * TELNET servers send superfluous option commands that a naive client might
+ * interpret as the start of a new negotiation. If the superfluous command is not
+ * ignored, an option negotiation loop can result (which is bad). For details
+ * about the superfluous commands sent by some servers, see the documentation for
+ * {@link #NEGOTIATION_NOT_STARTED}.
+ * <p>
+ *
+ * The current implementation of this method returns true if the new negotiation
+ * starts within NEGOTIATION_IGNORE_DURATION seconds of the end of the previous
+ * negotiation of this option.
+ * <p>
+ *
+ * @return Returns true if the new negotiation should be ignored, false if not.
+ */
+ protected boolean ignoreNegotiation() {
+ return (System.currentTimeMillis() - negotiationCompletionTime.getTime()) < NEGOTIATION_IGNORE_DURATION;
+ }
+
+ /**
+ * Sends a DO command to the remote endpoint for this option.
+ */
+ protected void sendDo() {
+ Logger.log("Sending DO " + optionName()); //$NON-NLS-1$
+ sendCommand(TELNET_DO);
+ }
+
+ /**
+ * Sends a DONT command to the remote endpoint for this option.
+ */
+ protected void sendDont() {
+ Logger.log("Sending DONT " + optionName()); //$NON-NLS-1$
+ sendCommand(TELNET_DONT);
+ }
+
+ /**
+ * Sends a WILL command to the remote endpoint for this option.
+ */
+ protected void sendWill() {
+ Logger.log("Sending WILL " + optionName()); //$NON-NLS-1$
+ sendCommand(TELNET_WILL);
+ }
+
+ /**
+ * Sends a WONT command to the remote endpoint for this option.
+ */
+ protected void sendWont() {
+ Logger.log("Sending WONT " + optionName()); //$NON-NLS-1$
+ sendCommand(TELNET_WONT);
+ }
+
+ /**
+ * This method sends a WILL/WONT/DO/DONT command to the remote endpoint for this
+ * option.
+ */
+ protected void sendCommand(byte command) {
+ byte[] data = { TELNET_IAC, 0, 0 };
+
+ data[1] = command;
+ data[2] = option;
+
+ try {
+ outputStream.write(data);
+ } catch (IOException ex) {
+ Logger.log("IOException sending command " + command); //$NON-NLS-1$
+ Logger.logException(ex);
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetProtocol.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetProtocol.java
new file mode 100644
index 00000000000..0f929599ab6
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/core/TelnetProtocol.java
@@ -0,0 +1,734 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2015 Wind River Systems, Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Fran Litterio (Wind River) - initial API and implementation
+ * Helmut Haigermoser (Wind River) - repackaged
+ * Ted Williams (Wind River) - repackaged into org.eclipse namespace
+ * Michael Scharf (Wind River) - split into core, view and connector plugins
+ * Martin Oberhuber (Wind River) - fixed copyright headers and beautified
+ * Michael Scharf (Wind River) - [209665] Add ability to log byte streams from terminal
+ * Alex Panchenko (Xored) - [277061] TelnetProtocol.isConnected() should check if socket was not closed
+ * Uwe Stieber (Wind River) - [281329] Telnet connection not handling "SocketException: Connection reset" correct
+ * Nils Hagge (Siemens AG) - [276023] close socket streams after connection is disconnected
+ * Greg Watson (IBM) - Adapted for org.eclipse.remote
+ *******************************************************************************/
+package org.eclipse.remote.telnet.core;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.ReadableByteChannel;
+
+import org.eclipse.remote.telnet.internal.core.Logger;
+import org.eclipse.remote.telnet.internal.core.messages.Messages;
+
+/**
+ * This class encapsulates a TELNET connection to a remote server. It processes
+ * incoming TELNET protocol data and generates outbound TELNET protocol data. It
+ * also manages two sets of TelnetOption objects: one for the local endpoint and
+ * one for the remote endpoint.
+ * <p>
+ *
+ * IMPORTANT: Understanding this code requires understanding the TELNET protocol
+ * and TELNET option processing, as defined in the RFCs listed below.
+ * <p>
+ *
+ * @author Fran Litterio (francis.litterio@windriver.com)
+ *
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc854.txt">RFC 854</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc855.txt">RFC 855</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc856.txt">RFC 856</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc857.txt">RFC 857</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc858.txt">RFC 858</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc859.txt">RFC 859</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc860.txt">RFC 860</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc861.txt">RFC 861</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1091.txt">RFC 1091</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1096.txt">RFC 1096</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1073.txt">RFC 1073</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1079.txt">RFC 1079</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1143.txt">RFC 1143</a>
+ * @see <a href="ftp://ftp.rfc-editor.org/in-notes/rfc1572.txt">RFC 1572</a>
+ */
+public class TelnetProtocol extends Thread implements TelnetCodes {
+ /**
+ * TELNET connection state: Initial state.
+ */
+ protected static final int STATE_INITIAL = 0;
+
+ /**
+ * TELNET connection state: Last byte processed was IAC code. code.
+ */
+ protected static final int STATE_IAC_RECEIVED = 1;
+
+ /**
+ * TELNET connection state: Last byte processed was WILL code. code.
+ */
+ protected static final int STATE_WILL_RECEIVED = 2;
+
+ /**
+ * TELNET connection state: Last byte processed was WONT code.
+ */
+ protected static final int STATE_WONT_RECEIVED = 3;
+
+ /**
+ * TELNET connection state: Last byte processed was DO code.
+ */
+ protected static final int STATE_DO_RECEIVED = 4;
+
+ /**
+ * TELNET connection state: Last byte processed was DONT code.
+ */
+ protected static final int STATE_DONT_RECEIVED = 5;
+
+ /**
+ * TELNET connection state: Last byte processed was SB.
+ */
+ protected static final int STATE_SUBNEGOTIATION_STARTED = 6;
+
+ /**
+ * TELNET connection state: Currently receiving sub-negotiation data.
+ */
+ protected static final int STATE_RECEIVING_SUBNEGOTIATION = 7;
+
+ /**
+ * Size of buffer for processing data received from remote endpoint.
+ */
+ protected static final int BUFFER_SIZE = 2048;
+
+ /**
+ * Holds raw bytes received from the remote endpoint, prior to any TELNET
+ * protocol processing.
+ */
+ protected ByteBuffer rawBytes = ByteBuffer.allocateDirect(BUFFER_SIZE);
+
+ /**
+ * Holds incoming network data after the TELNET protocol bytes have been
+ * processed and removed.
+ */
+ protected byte[] processedBytes = new byte[BUFFER_SIZE];
+
+ /**
+ * This field holds a StringBuffer containing text recently received from
+ * the remote endpoint (after all TELNET protocol bytes have been processed
+ * and removed).
+ */
+ protected StringBuffer processedStringBuffer = new StringBuffer(BUFFER_SIZE);
+
+ /**
+ * Holds the current state of the TELNET protocol processor.
+ */
+ protected int telnetState = STATE_INITIAL;
+
+ /**
+ * This field is true if the remote endpoint is a TELNET server, false if
+ * not. We set this to true if and only if the remote endpoint sends
+ * recognizable TELNET protocol data. We do not assume that the remote
+ * endpoint is a TELNET server just because it is listening on port 23. This
+ * allows us to successfully connect to a TELNET server listening on a port
+ * other than 23.
+ * <p>
+ *
+ * When this field first changes from false to true, we send all WILL or DO
+ * commands to the remote endpoint.
+ * <p>
+ *
+ * @see #telnetServerDetected()
+ */
+ protected boolean remoteIsTelnetServer = false;
+
+ /**
+ * An array of TelnetOption objects representing the local endpoint's TELNET
+ * options. The array is indexed by the numeric TELNET option code.
+ */
+ protected TelnetOption[] localOptions = new TelnetOption[256];
+
+ /**
+ * An array of TelnetOption objects representing the remote endpoint's
+ * TELNET options. The array is indexed by the numeric TELNET option code.
+ */
+ protected TelnetOption[] remoteOptions = new TelnetOption[256];
+
+ /**
+ * An array of bytes that holds the TELNET subnegotiation command most
+ * recently received from the remote endpoint. This array does _not_ include
+ * the leading IAC SB bytes, nor does it include the trailing IAC SE bytes.
+ * The first byte of this array is always a TELNET option code.
+ */
+ protected byte[] receivedSubnegotiation = new byte[128];
+
+ /**
+ * This field holds the index into array {@link #receivedSubnegotiation} of
+ * the next unused byte. This is used by method
+ * {@link #processTelnetProtocol(int)} when the state machine is in states
+ * {@link #STATE_SUBNEGOTIATION_STARTED} and {@link
+ * #STATE_RECEIVING_SUBNEGOTIATION}.
+ */
+ protected int nextSubnegotiationByteIndex = 0;
+
+ /**
+ * This field is true if an error occurs while processing a subnegotiation
+ * command.
+ *
+ * @see #processTelnetProtocol(int)
+ */
+ protected boolean ignoreSubnegotiation = false;
+
+ /**
+ * This field holds the width of the Terminal screen in columns.
+ */
+ protected int width = 0;
+
+ /**
+ * This field holds the height of the Terminal screen in rows.
+ */
+ protected int height = 0;
+
+ /**
+ * This field holds a reference to the {@link TelnetCommandShell}.
+ */
+ protected TelnetCommandShell shell;
+
+ /**
+ * This method holds the Socket object for the TELNET connection.
+ */
+ protected Socket socket;
+
+ /**
+ * This field holds a reference to an {@link ReadableByteChannel} object used to
+ * receive data from the remote endpoint.
+ */
+ protected ReadableByteChannel inputChannel;
+
+ /**
+ * This field holds a reference to an {@link OutputStream} object used to
+ * send data to the remote endpoint.
+ */
+ protected OutputStream serverOutputStream;
+
+ /**
+ * This field holds a reference to an {@link OutputStream} object used to
+ * send data to the client.
+ */
+ protected OutputStream clientOutputStream;
+
+ /**
+ * UNDER CONSTRUCTION
+ */
+ protected boolean localEcho = true;
+
+ /**
+ * This constructor just initializes some internal object state from its
+ * arguments.
+ */
+ public TelnetProtocol(Socket socket, TelnetCommandShell shell) throws IOException {
+ super();
+
+ Logger.log("entered"); //$NON-NLS-1$
+
+ this.shell = shell;
+ this.socket = socket;
+
+ // serverInputStream = socket.getInputStream();
+ serverOutputStream = socket.getOutputStream();
+ inputChannel = Channels.newChannel(socket.getInputStream());
+
+ initializeOptions();
+ }
+
+ public OutputStream getOutputStream() {
+ return serverOutputStream;
+ }
+
+ public void setClientOutputStream(OutputStream stream) {
+ clientOutputStream = stream;
+ }
+
+ /**
+ * Returns true if the TCP connection represented by this object is
+ * connected, false otherwise.
+ */
+ public boolean isConnected() {
+ return socket != null && socket.isConnected() && !socket.isClosed();
+ }
+
+ /**
+ * Returns true if the TCP connection represented by this object is
+ * connected and the remote endpoint is a TELNET server, false otherwise.
+ */
+ public boolean isRemoteTelnetServer() {
+ return remoteIsTelnetServer;
+ }
+
+ /**
+ * This method sets the terminal width and height to the supplied values. If
+ * either new value differs from the corresponding old value, we initiate a
+ * NAWS subnegotiation to inform the remote endpoint of the new terminal
+ * size.
+ */
+ public void setTerminalSize(int newWidth, int newHeight) {
+ Logger.log("Setting new size: width = " + newWidth + ", height = " + newHeight); //$NON-NLS-1$ //$NON-NLS-2$
+ if (!isConnected() || !isRemoteTelnetServer()) {
+ return;
+ }
+ boolean sizeChanged = false;
+
+ if (newWidth != width || newHeight != height) {
+ sizeChanged = true;
+ }
+
+ width = newWidth;
+ height = newHeight;
+
+ if (sizeChanged && remoteIsTelnetServer && localOptions[TELNET_OPTION_NAWS].isEnabled()) {
+ Integer[] sizeData = { Integer.valueOf(width), Integer.valueOf(height) };
+
+ localOptions[TELNET_OPTION_NAWS].sendSubnegotiation(sizeData);
+ }
+ }
+
+ /**
+ * Returns true if local echoing is enabled for this TCP connection, false
+ * otherwise.
+ */
+ public boolean localEcho() {
+ return localEcho;
+ }
+
+ /**
+ * This method runs in its own thread. It reads raw bytes from the TELNET
+ * connection socket, processes any TELNET protocol bytes (and removes
+ * them), and passes the remaining bytes to a TerminalDisplay object for
+ * display.
+ */
+ @Override
+ public void run() {
+ Logger.log("Entered"); //$NON-NLS-1$
+
+ try {
+ while (socket.isConnected()) {
+ rawBytes.clear();
+ int nRawBytes = inputChannel.read(rawBytes);
+ if (nRawBytes == -1) {
+ // End of input on serverInputStream.
+ Logger.log("End of input reading from socket!"); //$NON-NLS-1$
+
+ // Announce to the user that the remote endpoint has closed the
+ // connection.
+ if (clientOutputStream != null) {
+ clientOutputStream.write(Messages.TelnetProtocol_0.getBytes());
+ }
+ break;
+ }
+
+ // Process any TELNET protocol data that we receive. Don't
+ // send any TELNET protocol data until we are sure the remote
+ // endpoint is a TELNET server.
+
+ int nProcessedBytes = processTelnetProtocol(nRawBytes);
+
+ if (nProcessedBytes > 0 && clientOutputStream != null) {
+ clientOutputStream.write(processedBytes, 0, nProcessedBytes);
+ clientOutputStream.flush();
+ }
+ }
+ } catch (ClosedByInterruptException e) {
+ // Handled by finally clause
+ } catch (SocketException ex) {
+ String message = ex.getMessage();
+
+ // A "socket closed" exception is normal here. It's caused by the
+ // user clicking the disconnect button on the Terminal view toolbar.
+
+ if (message != null && !message.equalsIgnoreCase("Socket closed") //$NON-NLS-1$
+ && !message.equalsIgnoreCase("Connection reset")) { //$NON-NLS-1$
+ Logger.logException(ex);
+ }
+
+ } catch (Exception ex) {
+ Logger.logException(ex);
+ } finally {
+ // Tell the command shell that we have terminated
+ shell.terminated();
+ try {
+ if (inputChannel != null) {
+ inputChannel.close();
+ }
+ } catch (IOException ioe) {
+ /* ignore */
+ }
+ try {
+ if (serverOutputStream != null) {
+ serverOutputStream.close();
+ }
+ } catch (IOException ioe) {
+ /* ignore */
+ }
+ try {
+ if (clientOutputStream != null) {
+ clientOutputStream.close();
+ }
+ } catch (IOException ioe) {
+ /* ignore */
+ }
+ }
+ }
+
+ /**
+ * This method initializes the localOptions[] and remoteOptions[] arrays so
+ * that they contain references to TelnetOption objects representing our
+ * desired state for each option. The goal is to achieve server-side
+ * echoing, suppression of Go Aheads, and to send the local terminal type
+ * and size to the remote endpoint.
+ */
+ protected void initializeOptions() {
+ // First, create all the TelnetOption objects in the "undesired" state.
+
+ for (int i = 0; i < localOptions.length; ++i) {
+ localOptions[i] = new TelnetOption((byte) i, false, true, serverOutputStream);
+ }
+
+ for (int i = 0; i < localOptions.length; ++i) {
+ remoteOptions[i] = new TelnetOption((byte) i, false, false, serverOutputStream);
+ }
+
+ // Next, set some of the options to the "desired" state. The options we
+ // desire to be enabled are as follows:
+ //
+ // TELNET Option Desired for Desired for
+ // Name and Code Local Endpoint Remote Endpoint
+ // --------------------- -------------- ---------------
+ // Echo (1) No Yes
+ // Suppress Go Ahead (3) Yes Yes
+ // Terminal Type (24) Yes Yes
+ // NAWS (31) Yes Yes
+ //
+ // All other options remain in the "undesired" state, and thus will be
+ // disabled (since either endpoint can force any option to be disabled by simply
+ // answering WILL with DONT and DO with WONT).
+
+ localOptions[TELNET_OPTION_ECHO].setDesired(false);
+ remoteOptions[TELNET_OPTION_ECHO].setDesired(true);
+
+ localOptions[TELNET_OPTION_SUPPRESS_GA].setDesired(true);
+ remoteOptions[TELNET_OPTION_SUPPRESS_GA].setDesired(true);
+
+ localOptions[TELNET_OPTION_TERMINAL_TYPE].setDesired(true);
+ remoteOptions[TELNET_OPTION_TERMINAL_TYPE].setDesired(true);
+
+ localOptions[TELNET_OPTION_NAWS].setDesired(true);
+ remoteOptions[TELNET_OPTION_NAWS].setDesired(true);
+ }
+
+ /**
+ * Process TELNET protocol data contained in the first <i>count</i> bytes
+ * of <i>rawBytes</i>. This function preserves its state between calls,
+ * because a multi-byte TELNET command might be split between two (or more)
+ * calls to this function. The state is preserved in field <i>telnetState</i>.
+ * This function implements an FSA that recognizes TELNET option codes.
+ * TELNET option sub-negotiation is delegated to instances of TelnetOption.
+ *
+ * @return The number of bytes remaining in the buffer after removing all
+ * TELNET protocol bytes.
+ */
+ // TELNET option state is stored in instances of TelnetOption.
+ protected int processTelnetProtocol(int count) {
+ // This is too noisy to leave on all the time.
+ // Logger.log("Processing " + count + " bytes of data.");
+
+ int nextProcessedByte = 0;
+
+ for (int byteIndex = 0; byteIndex < count; ++byteIndex) {
+ // It is possible for control to flow through the below code such
+ // that nothing happens. This happens when array rawBytes[] contains no
+ // TELNET protocol data.
+
+ byte inputByte = rawBytes.get(byteIndex);
+ int ubyte = inputByte & 0xFF;
+
+ switch (telnetState) {
+ case STATE_INITIAL:
+ if (inputByte == TELNET_IAC) {
+ telnetState = STATE_IAC_RECEIVED;
+ } else {
+ // It's not an IAC code, so just append it to
+ // processedBytes.
+
+ processedBytes[nextProcessedByte++] = inputByte;
+ }
+ break;
+
+ case STATE_IAC_RECEIVED:
+ switch (inputByte) {
+ case TELNET_IAC:
+ // Two IAC bytes in a row are translated into one byte with
+ // the
+ // value 0xff.
+
+ processedBytes[nextProcessedByte++] = (byte) 0xff;
+ telnetState = STATE_INITIAL;
+ break;
+
+ case TELNET_WILL:
+ telnetState = STATE_WILL_RECEIVED;
+ break;
+
+ case TELNET_WONT:
+ telnetState = STATE_WONT_RECEIVED;
+ break;
+
+ case TELNET_DO:
+ telnetState = STATE_DO_RECEIVED;
+ break;
+
+ case TELNET_DONT:
+ telnetState = STATE_DONT_RECEIVED;
+ break;
+
+ case TELNET_SB:
+ telnetState = STATE_SUBNEGOTIATION_STARTED;
+ break;
+
+ // Commands to consume and ignore.
+
+ // Data Mark (DM). This is sent by a TELNET server following an
+ // IAC sent as TCP urgent data. It should cause the client to
+ // skip all not yet processed non-TELNET-protocol data preceding the
+ // DM byte. However, Java 1.4.x has no way to inform clients of
+ // class Socket that urgent data is available, so we simply ignore the
+ // "IAC DM" command. Since the IAC is sent as TCP urgent data,
+ // the Socket must be put into OOB-inline mode via a call to
+ // setOOBInline(true), otherwise the IAC is silently dropped by
+ // Java and only the DM arrives (leaving the user to see a
+ // spurious ISO Latin-1 character).
+ case TELNET_DM:
+
+ case TELNET_NOP: // No-op.
+ case TELNET_GA: // Go Ahead command. Meaningless on a full-duplex link.
+ case TELNET_IP: // Interupt Process command. Server should never send this.
+ case TELNET_AO: // Abort Output command. Server should never send this.
+ case TELNET_AYT: // Are You There command. Server should never send this.
+ case TELNET_EC: // Erase Character command. Server should never send this.
+ case TELNET_EL: // Erase Line command. Server should never send this.
+ telnetState = STATE_INITIAL;
+ break;
+
+ default:
+ // Unrecognized command! This should never happen.
+ Logger.log("processTelnetProtocol: UNRECOGNIZED TELNET PROTOCOL COMMAND: " + //$NON-NLS-1$
+ ubyte);
+ telnetState = STATE_INITIAL;
+ break;
+ }
+ break;
+
+ // For the next four cases, WILL and WONT commands affect the state
+ // of remote options, and DO and DONT commands affect the state of
+ // local options.
+
+ case STATE_WILL_RECEIVED:
+ Logger.log("Received WILL " + localOptions[ubyte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ remoteOptions[ubyte].handleWill();
+ telnetState = STATE_INITIAL;
+ telnetServerDetected();
+ break;
+
+ case STATE_WONT_RECEIVED:
+ Logger.log("Received WONT " + localOptions[ubyte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ remoteOptions[ubyte].handleWont();
+ telnetState = STATE_INITIAL;
+ telnetServerDetected();
+ break;
+
+ case STATE_DO_RECEIVED:
+ Logger.log("Received DO " + localOptions[ubyte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ localOptions[ubyte].handleDo();
+ telnetState = STATE_INITIAL;
+ telnetServerDetected();
+ break;
+
+ case STATE_DONT_RECEIVED:
+ Logger.log("Received DONT " + localOptions[ubyte].optionName() + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ localOptions[ubyte].handleDont();
+ telnetState = STATE_INITIAL;
+ telnetServerDetected();
+ break;
+
+ case STATE_SUBNEGOTIATION_STARTED:
+ Logger.log("Starting subnegotiation for option " + //$NON-NLS-1$
+ localOptions[ubyte].optionName() + "."); //$NON-NLS-1$
+
+ // First, zero out the array of received subnegotiation butes.
+
+ for (int i = 0; i < receivedSubnegotiation.length; ++i) {
+ receivedSubnegotiation[i] = 0;
+ }
+
+ // Forget about any previous subnegotiation errors.
+
+ ignoreSubnegotiation = false;
+
+ // Then insert this input byte into the array and enter state
+ // STATE_RECEIVING_SUBNEGOTIATION, where we will gather the
+ // remaining subnegotiation bytes.
+
+ nextSubnegotiationByteIndex = 0;
+ receivedSubnegotiation[nextSubnegotiationByteIndex++] = inputByte;
+ telnetState = STATE_RECEIVING_SUBNEGOTIATION;
+ break;
+
+ case STATE_RECEIVING_SUBNEGOTIATION:
+ if (inputByte == TELNET_IAC) {
+ // Handle double IAC bytes. From RFC 855: "if parameters
+ // in an option 'subnegotiation' include a byte with a value
+ // of 255, it is necessary to double this byte in accordance
+ // the general TELNET rules."
+
+ if (nextSubnegotiationByteIndex > 0
+ && receivedSubnegotiation[nextSubnegotiationByteIndex - 1] == TELNET_IAC) {
+ // The last input byte we received in this
+ // subnegotiation was IAC, so this is a double IAC. Leave the previous IAC
+ // in the receivedSubnegotiation[] array and drop the current
+ // one (thus translating a double IAC into a single IAC).
+
+ Logger.log("Double IAC in subnegotiation translated into single IAC."); //$NON-NLS-1$
+ break;
+ }
+
+ // Append the IAC byte to receivedSubnegotiation[]. If there
+ // is no room for the IAC byte, it overwrites the last byte,
+ // because we need to know when the subnegotiation ends, and that is
+ // marked by an "IAC SE" command.
+
+ if (nextSubnegotiationByteIndex < receivedSubnegotiation.length) {
+ receivedSubnegotiation[nextSubnegotiationByteIndex++] = inputByte;
+ } else {
+ receivedSubnegotiation[receivedSubnegotiation.length - 1] = inputByte;
+ }
+ break;
+ }
+
+ // Handle an "IAC SE" command, which marks the end of the
+ // subnegotiation. An SE byte by itself might be a legitimate
+ // part of the subnegotiation data, so don't do anything unless the SE
+ // is immediately preceded by an IAC.
+
+ if (inputByte == TELNET_SE && receivedSubnegotiation[nextSubnegotiationByteIndex - 1] == TELNET_IAC) {
+ Logger.log("Found SE code marking end of subnegotiation."); //$NON-NLS-1$
+
+ // We are done receiving the subnegotiation command. Now
+ // process it. We always use the option object stored in array
+ // localOptions[] to process the received subnegotiation.
+ // This is an arbitrary decision, but it is sufficient for handling
+ // options TERMINAL-TYPE and NAWS, which are the only options that
+ // we subnegotiate (presently). If, in the future,subnegotiations
+ // need to be handled by option objects stored in both
+ // localOptions[] and remoteOptions[], then some mechanism
+ // to choose the correct option object must be implemented.
+ //
+ // Also, if ignoreSubnegotiation is true, there was an error
+ // while receiving the subnegotiation, so we must not process the
+ // command, and instead just return to the initial state.
+
+ if (!ignoreSubnegotiation) {
+ // Remove the trailing IAC byte from
+ // receivedSubnegotiation[].
+
+ receivedSubnegotiation[nextSubnegotiationByteIndex - 1] = 0;
+
+ int subnegotiatedOption = receivedSubnegotiation[0] & 0xFF;
+
+ localOptions[subnegotiatedOption].handleSubnegotiation(receivedSubnegotiation,
+ nextSubnegotiationByteIndex);
+ } else {
+ Logger.log("NOT CALLING handleSubnegotiation() BECAUSE OF ERRORS!"); //$NON-NLS-1$
+ }
+
+ // Return to the initial state.
+
+ telnetState = STATE_INITIAL;
+ }
+
+ // Check whether the receivedSubnegotiation[] array is full.
+
+ if (nextSubnegotiationByteIndex >= receivedSubnegotiation.length) {
+ // This should not happen. Array receivedSubnegotiation can
+ // hold 128 bytes, and no TELNET option that we perform
+ // subnegotiation for requires that many bytes in a subnegotiation command.
+ // In the interest of robustness, we handle this case by ignoring all
+ // remaining subnegotiation bytes until we receive the IAC SE
+ // command that ends the subnegotiation. Also, we set
+ // ignoreSubnegotiation to true to prevent a call to
+ // handleSubnegotiation() when the IAC SE command arrives.
+
+ Logger.log("SUBNEGOTIATION BUFFER FULL!"); //$NON-NLS-1$
+ ignoreSubnegotiation = true;
+ } else {
+ Logger.log("Recording subnegotiation byte " + ubyte); //$NON-NLS-1$
+
+ receivedSubnegotiation[nextSubnegotiationByteIndex++] = inputByte;
+ }
+ break;
+
+ default:
+ // This should _never_ happen! If it does, it means there is a
+ // bug in this FSA. For robustness, we return to the initial state.
+
+ Logger.log("INVALID TELNET STATE: " + telnetState); //$NON-NLS-1$
+ telnetState = STATE_INITIAL;
+ break;
+ }
+ }
+
+ // Return the number of bytes of processed data (i.e., number of bytes
+ // of raw data minus TELNET control bytes). This value can be zero.
+
+ return nextProcessedByte;
+ }
+
+ /**
+ * This method is called whenever we receive a valid TELNET protocol command
+ * from the remote endpoint. When it is called for the first time for this
+ * connection, we negotiate all options that we desire to be enabled.
+ * <p>
+ *
+ * This method does not negotiate options that we do not desire to be
+ * enabled, because all options are initially disabled.
+ * <p>
+ */
+ protected void telnetServerDetected() {
+ if (!remoteIsTelnetServer) {
+ // This block only executes once per TelnetProtocol instance.
+
+ localEcho = false;
+
+ Logger.log("Detected TELNET server."); //$NON-NLS-1$
+
+ remoteIsTelnetServer = true;
+
+ for (TelnetOption localOption : localOptions) {
+ if (localOption.isDesired()) {
+ localOption.negotiate();
+ }
+ }
+
+ for (TelnetOption remoteOption : remoteOptions) {
+ if (remoteOption.isDesired()) {
+ remoteOption.negotiate();
+ }
+ }
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Activator.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Activator.java
new file mode 100644
index 00000000000..1d3945ef79b
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Activator.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends Plugin {
+ public static final String PLUGIN_ID = "org.eclipse.remote.telnet.core"; //$NON-NLS-1$
+
+ private static Plugin plugin;
+
+ @Override
+ public void start(BundleContext bundleContext) throws Exception {
+ plugin = this;
+ Logger.configure(bundleContext);
+ }
+
+ @Override
+ public void stop(BundleContext bundleContext) throws Exception {
+ plugin = null;
+ }
+
+ public static Plugin getDefault() {
+ return plugin;
+ }
+
+ public static void log(IStatus status) {
+ plugin.getLog().log(status);
+ }
+
+ public static void log(Throwable e) {
+ if (e instanceof CoreException) {
+ log(((CoreException) e).getStatus());
+ } else {
+ log(new Status(IStatus.ERROR, plugin.getBundle().getSymbolicName(), IStatus.ERROR, e.getLocalizedMessage(),
+ e));
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Logger.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Logger.java
new file mode 100644
index 00000000000..a05f45f6ef6
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/Logger.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2015 Wind River Systems, Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Fran Litterio (Wind River) - initial API and implementation
+ * Ted Williams (Wind River) - refactored into org.eclipse namespace
+ * Michael Scharf (Wind River) - split into core, view and connector plugins
+ * Martin Oberhuber (Wind River) - fixed copyright headers and beautified
+ * Greg Watson (IBM) - Adapted for org.eclipse.remote
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.core;
+
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.util.Hashtable;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osgi.service.debug.DebugOptions;
+import org.eclipse.osgi.service.debug.DebugOptionsListener;
+import org.osgi.framework.BundleContext;
+
+/**
+ * A simple logger class. Every method in this class is static, so they can be
+ * called from both class and instance methods. To use this class, write code
+ * like this:
+ * <p>
+ *
+ * <pre>
+ * Logger.log(&quot;something has happened&quot;);
+ * Logger.log(&quot;counter is &quot; + counter);
+ * </pre>
+ *
+ * @author Fran Litterio <francis.litterio@windriver.com>
+ *
+ */
+public final class Logger implements DebugOptionsListener {
+ public static final String TRACE_DEBUG_LOG = "org.eclipse.remote.telnet.core/debug/log"; //$NON-NLS-1$
+ public static final String TRACE_DEBUG_LOG_CHAR = "org.eclipse.remote.telnet.coredebug/log/char"; //$NON-NLS-1$
+ public static final String TRACE_DEBUG_LOG_VT100BACKEND = "org.eclipse.remote.telnet.core/debug/log/VT100Backend"; //$NON-NLS-1$
+
+ private static PrintStream logStream;
+ private static Logger logger;
+
+ private DebugOptions options;
+
+ public static void configure(BundleContext context) {
+ if (logger == null) {
+ logger = new Logger(context);
+ }
+ }
+
+ private Logger(BundleContext context) {
+ Hashtable<String, String> props = new Hashtable<>(2);
+ props.put(DebugOptions.LISTENER_SYMBOLICNAME, Activator.PLUGIN_ID);
+ context.registerService(DebugOptionsListener.class.getName(), this, props);
+ }
+
+ /**
+ * Encodes a String such that non-printable control characters are
+ * converted into user-readable escape sequences for logging.
+ *
+ * @param message
+ * String to encode
+ * @return encoded String
+ */
+ public static final String encode(String message) {
+ boolean encoded = false;
+ StringBuffer buf = new StringBuffer(message.length() + 32);
+ for (int i = 0; i < message.length(); i++) {
+ char c = message.charAt(i);
+ switch (c) {
+ case '\\':
+ case '\'':
+ buf.append('\\');
+ buf.append(c);
+ encoded = true;
+ break;
+ case '\r':
+ buf.append('\\');
+ buf.append('r');
+ encoded = true;
+ break;
+ case '\n':
+ buf.append('\\');
+ buf.append('n');
+ encoded = true;
+ break;
+ case '\t':
+ buf.append('\\');
+ buf.append('t');
+ encoded = true;
+ break;
+ case '\f':
+ buf.append('\\');
+ buf.append('f');
+ encoded = true;
+ break;
+ case '\b':
+ buf.append('\\');
+ buf.append('b');
+ encoded = true;
+ break;
+ default:
+ if (c <= '\u000f') {
+ buf.append('\\');
+ buf.append('x');
+ buf.append('0');
+ buf.append(Integer.toHexString(c));
+ encoded = true;
+ } else if (c >= ' ' && c < '\u007f') {
+ buf.append(c);
+ } else if (c <= '\u00ff') {
+ buf.append('\\');
+ buf.append('x');
+ buf.append(Integer.toHexString(c));
+ encoded = true;
+ } else {
+ buf.append('\\');
+ buf.append('u');
+ if (c <= '\u0fff') {
+ buf.append('0');
+ }
+ buf.append(Integer.toHexString(c));
+ encoded = true;
+ }
+ }
+ }
+ if (encoded) {
+ return buf.toString();
+ }
+ return message;
+ }
+
+ /**
+ * Checks if logging is enabled.
+ *
+ * @return true if logging is enabled.
+ */
+ public static final boolean isLogEnabled() {
+ return (logStream != null);
+ }
+
+ /**
+ * Logs the specified message. Do not append a newline to parameter
+ * <i>message</i>. This method does that for you.
+ *
+ * @param message
+ * A String containing the message to log.
+ */
+ public static final void log(String message) {
+ if (logStream != null) {
+ // Read my own stack to get the class name, method name, and line
+ // number of
+ // where this method was called.
+
+ StackTraceElement caller = new Throwable().getStackTrace()[1];
+ int lineNumber = caller.getLineNumber();
+ String className = caller.getClassName();
+ String methodName = caller.getMethodName();
+ className = className.substring(className.lastIndexOf('.') + 1);
+
+ logStream.println(className + "." + methodName + ":" + lineNumber + ": " + message); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ logStream.flush();
+ }
+ }
+
+ /**
+ * Writes a stack trace for an exception to both Standard Error and to the
+ * log file.
+ */
+ public static final void logException(Exception ex) {
+ // log in eclipse error log
+ if (Activator.getDefault() != null) {
+ Activator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.OK, ex.getMessage(), ex));
+ } else {
+ ex.printStackTrace();
+ }
+ // Additional Tracing for debug purposes:
+ // Read my own stack to get the class name, method name, and line number
+ // of where this method was called
+ if (logStream != null) {
+ StackTraceElement caller = new Throwable().getStackTrace()[1];
+ int lineNumber = caller.getLineNumber();
+ String className = caller.getClassName();
+ String methodName = caller.getMethodName();
+ className = className.substring(className.lastIndexOf('.') + 1);
+
+ PrintStream tmpStream = System.err;
+
+ if (logStream != null) {
+ tmpStream = logStream;
+ }
+
+ tmpStream.println(className + "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+ "Caught exception: " + ex); //$NON-NLS-1$
+ ex.printStackTrace(tmpStream);
+ }
+ }
+
+ @Override
+ public void optionsChanged(DebugOptions options) {
+ this.options = options;
+
+ // Any of the three known debugging options turns on the creation of the log file
+ boolean createLogFile = isOptionEnabled(TRACE_DEBUG_LOG) || isOptionEnabled(TRACE_DEBUG_LOG_CHAR)
+ || isOptionEnabled(TRACE_DEBUG_LOG_VT100BACKEND);
+
+ // Log only if tracing is enabled
+ if (createLogFile && Activator.getDefault() != null) {
+ IPath logFile = Platform.getStateLocation(Activator.getDefault().getBundle());
+ if (logFile != null && logFile.toFile().isDirectory()) {
+ logFile = logFile.append("tmterminal.log"); //$NON-NLS-1$
+ try {
+ logStream = new PrintStream(new FileOutputStream(logFile.toFile(), true));
+ } catch (Exception ex) {
+ logStream = System.err;
+ logStream.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$
+ ex.printStackTrace(logStream);
+ }
+ }
+ }
+ }
+
+ public boolean isOptionEnabled(String option) {
+ if (options == null) {
+ return false;
+ }
+ return options.getBooleanOption(Activator.PLUGIN_ID + option, false);
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/Messages.java b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/Messages.java
new file mode 100644
index 00000000000..9b82d7265d2
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.core.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.telnet.internal.core.messages.messages"; //$NON-NLS-1$
+
+ public static String TelnetCommandShell_0;
+ public static String TelnetProtocol_0;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/messages.properties b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/messages.properties
new file mode 100644
index 00000000000..aaa36f39359
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.core/src/org/eclipse/remote/telnet/internal/core/messages/messages.properties
@@ -0,0 +1,15 @@
+################################################################################
+# Copyright (c) 2015 IBM Corporation, and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial contribution
+################################################################################
+TelnetCommandShell_0=Unknown host:
+TelnetProtocol_0=Connection closed by foreign host.
diff --git a/remote/org.eclipse.remote.telnet.ui/.classpath b/remote/org.eclipse.remote.telnet.ui/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.telnet.ui/.project b/remote/org.eclipse.remote.telnet.ui/.project
new file mode 100644
index 00000000000..4614316f3b3
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.telnet.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.telnet.ui/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.telnet.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..5bf47b0cac2
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %bundleName
+Bundle-SymbolicName: org.eclipse.remote.telnet.ui;singleton:=true
+Bundle-Version: 1.0.200.qualifier
+Bundle-Activator: org.eclipse.remote.telnet.internal.ui.Activator
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Import-Package: org.eclipse.core.runtime,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.operation,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.jface.wizard,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.telnet.core,
+ org.eclipse.remote.ui,
+ org.eclipse.swt,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui.plugin,
+ org.osgi.framework
diff --git a/remote/org.eclipse.remote.telnet.ui/about.html b/remote/org.eclipse.remote.telnet.ui/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.telnet.ui/about.ini b/remote/org.eclipse.remote.telnet.ui/about.ini
new file mode 100644
index 00000000000..e07a7bb377e
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/about.ini
@@ -0,0 +1,24 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=cdt_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.telnet.ui/about.mappings b/remote/org.eclipse.remote.telnet.ui/about.mappings
new file mode 100644
index 00000000000..936a8039c3e
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/about.mappings
@@ -0,0 +1,9 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20200106-1728"
+# This value will be added automatically via the build scripts
+0=${buildId}
diff --git a/remote/org.eclipse.remote.telnet.ui/about.properties b/remote/org.eclipse.remote.telnet.ui/about.properties
new file mode 100644
index 00000000000..07d04d6070c
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/about.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+# NOTE TO TRANSLATOR: Please do not translate the featureVersion variable.
+
+
+blurb=Telnet Remote Services\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+\n\
+See the NOTICE file(s) distributed with this work for additional\n\
+information regarding copyright ownership.\n\
+\n\
+Visit http://www.eclipse.org/cdt
diff --git a/remote/org.eclipse.remote.telnet.ui/build.properties b/remote/org.eclipse.remote.telnet.ui/build.properties
new file mode 100644
index 00000000000..ed7e7fb3471
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/build.properties
@@ -0,0 +1,13 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ cdt_logo_icon32.png,\
+ icons/,\
+ plugin.properties
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.telnet.ui/cdt_logo_icon32.png b/remote/org.eclipse.remote.telnet.ui/cdt_logo_icon32.png
new file mode 100644
index 00000000000..470ca81b327
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/cdt_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.telnet.ui/icons/telnet.png b/remote/org.eclipse.remote.telnet.ui/icons/telnet.png
new file mode 100644
index 00000000000..58bc8dafa9b
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/icons/telnet.png
Binary files differ
diff --git a/remote/org.eclipse.remote.telnet.ui/plugin.properties b/remote/org.eclipse.remote.telnet.ui/plugin.properties
new file mode 100644
index 00000000000..214fce2774e
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/plugin.properties
@@ -0,0 +1,2 @@
+bundleName = Remote Serial Port Services UI
+providerName = Eclipse PTP
diff --git a/remote/org.eclipse.remote.telnet.ui/plugin.xml b/remote/org.eclipse.remote.telnet.ui/plugin.xml
new file mode 100644
index 00000000000..d123a9ce009
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/plugin.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.telnet.core.connectionType"
+ factory="org.eclipse.remote.telnet.internal.ui.TelnetConnectionsUI$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIConnectionService">
+ </connectionTypeService>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.telnet.ui/ptp_logo_icon32.png b/remote/org.eclipse.remote.telnet.ui/ptp_logo_icon32.png
new file mode 100644
index 00000000000..e8ec57270f3
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/ptp_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Activator.java b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Activator.java
new file mode 100644
index 00000000000..89f214c2794
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Activator.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.telnet.ui"; //$NON-NLS-1$
+
+ // Image keys
+ public static final String IMG_CONNECTION_TYPE = PLUGIN_ID + ".connectionType"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ getImageRegistry().put(IMG_CONNECTION_TYPE, imageDescriptorFromPlugin(PLUGIN_ID, "/icons/telnet.png")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ public static void log(IStatus status) {
+ plugin.getLog().log(status);
+ }
+
+ public static void log(Exception e) {
+ if (e instanceof CoreException) {
+ log(((CoreException) e).getStatus());
+ } else {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, e.getLocalizedMessage(), e));
+ }
+ }
+
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Messages.java b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Messages.java
new file mode 100644
index 00000000000..abdbf2a6d29
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/Messages.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.telnet.internal.ui.messages"; //$NON-NLS-1$
+ public static String NewSerialPortConnectionWizardPage_BaudRateLabel;
+ public static String NewSerialPortConnectionWizardPage_ByteSizeLabel;
+ public static String NewSerialPortConnectionWizardPage_Description;
+ public static String NewSerialPortConnectionWizardPage_NameLabel;
+ public static String NewSerialPortConnectionWizardPage_ParityLabel;
+ public static String NewSerialPortConnectionWizardPage_PortLabel;
+ public static String NewSerialPortConnectionWizardPage_StopBitsLabel;
+ public static String NewSerialPortConnectionWizardPage_Title;
+ public static String TelnetConnectionWizardPage_0;
+ public static String TelnetConnectionWizardPage_1;
+ public static String TelnetConnectionWizardPage_2;
+ public static String TelnetConnectionWizardPage_3;
+ public static String TelnetConnectionWizardPage_4;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizard.java b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizard.java
new file mode 100644
index 00000000000..a909567e41c
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizard.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.ui;
+
+import java.util.Set;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+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.exception.RemoteConnectionException;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.widgets.Shell;
+
+public class TelnetConnectionWizard extends Wizard implements IRemoteUIConnectionWizard {
+
+ private TelnetConnectionWizardPage page;
+ private IRemoteConnectionWorkingCopy workingCopy;
+ private final Shell shell;
+ private final IRemoteConnectionType connectionType;
+
+ public TelnetConnectionWizard(Shell shell, IRemoteConnectionType connectionType) {
+ this.shell = shell;
+ this.connectionType = connectionType;
+ }
+
+ @Override
+ public void addPages() {
+ page = new TelnetConnectionWizardPage();
+ if (workingCopy != null) {
+ IRemoteConnectionHostService hostSvc = workingCopy.getService(IRemoteConnectionHostService.class);
+ if (hostSvc != null) {
+ page.setHost(hostSvc.getHostname());
+ page.setPort(hostSvc.getPort());
+ page.setTimeout(hostSvc.getTimeout());
+ }
+ }
+ addPage(page);
+ }
+
+ @Override
+ public boolean performFinish() {
+ IRemoteConnection conn = getConnection();
+ if (conn != null) {
+ IRemoteConnectionHostService hostSvc = conn.getService(IRemoteConnectionHostService.class);
+ if (hostSvc != null) {
+ hostSvc.setHostname(page.getHost());
+ hostSvc.setPort(page.getPort());
+ hostSvc.setTimeout(page.getTimeout());
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy open() {
+ WizardDialog dialog = new WizardDialog(shell, this);
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == WizardDialog.OK) {
+ return getConnection();
+ }
+ return null;
+ }
+
+ @Override
+ public IRemoteConnectionWorkingCopy getConnection() {
+ if (workingCopy == null) {
+ try {
+ workingCopy = connectionType.newConnection(page.getHost());
+ } catch (RemoteConnectionException e) {
+ Activator.log(e.getStatus());
+ }
+ }
+ return workingCopy;
+ }
+
+ @Override
+ public void setConnection(IRemoteConnectionWorkingCopy connection) {
+ workingCopy = connection;
+ }
+
+ @Override
+ public void setConnectionName(String name) {
+ // Ignored
+ }
+
+ @Override
+ public void setInvalidConnectionNames(Set<String> names) {
+ // Ignored
+ }
+
+}
diff --git a/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizardPage.java b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizardPage.java
new file mode 100644
index 00000000000..bae212079ba
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionWizardPage.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2015 IBM Corporation, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial contribution
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.ui;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.remote.telnet.core.TelnetConnection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class TelnetConnectionWizardPage extends WizardPage {
+
+ private String host;
+ private int port = TelnetConnection.DEFAULT_PORT;
+ private int timeout = TelnetConnection.DEFAULT_TIMEOUT;
+
+ private Text hostText;
+ private Text portText;
+ private Text timeoutText;
+
+ protected TelnetConnectionWizardPage() {
+ super(TelnetConnectionWizardPage.class.getName());
+ setDescription(Messages.TelnetConnectionWizardPage_0);
+ setTitle(Messages.TelnetConnectionWizardPage_1);
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+
+ Label nameLabel = new Label(comp, SWT.NONE);
+ nameLabel.setText(Messages.TelnetConnectionWizardPage_2);
+
+ hostText = new Text(comp, SWT.BORDER | SWT.SINGLE);
+ hostText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ hostText.setText(host != null ? host : ""); //$NON-NLS-1$
+ hostText.addKeyListener(new KeyListener() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ updateStatus();
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ // Ignore
+ }
+ });
+
+ Label portLabel = new Label(comp, SWT.NONE);
+ portLabel.setText(Messages.TelnetConnectionWizardPage_3);
+
+ portText = new Text(comp, SWT.BORDER | SWT.SINGLE);
+ portText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ portText.setText(port < 0 ? "" : Integer.toString(port)); //$NON-NLS-1$
+ portText.addKeyListener(new KeyListener() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ updateStatus();
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ // Ignore
+ }
+ });
+
+ Label timeoutLabel = new Label(comp, SWT.NONE);
+ timeoutLabel.setText(Messages.TelnetConnectionWizardPage_4);
+
+ timeoutText = new Text(comp, SWT.BORDER | SWT.SINGLE);
+ timeoutText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ timeoutText.setText(timeout < 0 ? "" : Integer.toString(timeout)); //$NON-NLS-1$
+ timeoutText.addKeyListener(new KeyListener() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ updateStatus();
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ // Ignore
+ }
+ });
+
+ setControl(comp);
+ updateStatus();
+ }
+
+ private void updateStatus() {
+ host = hostText.getText();
+ try {
+ port = Integer.parseInt(portText.getText());
+ } catch (NumberFormatException e) {
+ port = -1;
+ }
+ try {
+ timeout = Integer.parseInt(timeoutText.getText());
+ } catch (NumberFormatException e) {
+ timeout = -1;
+ }
+
+ setPageComplete(!host.isEmpty());
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public int getTimeout() {
+ return timeout;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public void setTimeout(int timeout) {
+ this.timeout = timeout;
+ }
+}
diff --git a/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionsUI.java b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionsUI.java
new file mode 100644
index 00000000000..15d180dea28
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/TelnetConnectionsUI.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2015, 2020 QNX Software Systems, and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial contribution
+ * Greg Watson (IBM) - Adapted for telnet service
+ *******************************************************************************/
+package org.eclipse.remote.telnet.internal.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.ui.AbstractRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+
+public class TelnetConnectionsUI extends AbstractRemoteUIConnectionService {
+
+ private final IRemoteConnectionType connectionType;
+
+ private TelnetConnectionsUI(IRemoteConnectionType connectionType) {
+ this.connectionType = connectionType;
+ }
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (IRemoteUIConnectionService.class.equals(service)) {
+ return (T) new TelnetConnectionsUI(connectionType);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+ @Override
+ public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) {
+ return new TelnetConnectionWizard(shell, connectionType);
+ }
+
+ @Override
+ public void openConnectionWithProgress(Shell shell, IRunnableContext context, final IRemoteConnection connection) {
+ try {
+ IRunnableWithProgress op = monitor -> {
+ try {
+ connection.open(monitor);
+ } catch (RemoteConnectionException e) {
+ throw new InvocationTargetException(e);
+ }
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+ };
+ if (context != null) {
+ context.run(true, true, op);
+ } else {
+ new ProgressMonitorDialog(shell).run(true, true, op);
+ }
+ } catch (InvocationTargetException | InterruptedException e) {
+ Activator.log(e);
+ }
+ }
+
+ @Override
+ public ILabelProvider getLabelProvider() {
+ return new DefaultLabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ return Activator.getDefault().getImageRegistry().get(Activator.IMG_CONNECTION_TYPE);
+ }
+ };
+ }
+
+}
diff --git a/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/messages.properties b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/messages.properties
new file mode 100644
index 00000000000..f7aed57d6db
--- /dev/null
+++ b/remote/org.eclipse.remote.telnet.ui/src/org/eclipse/remote/telnet/internal/ui/messages.properties
@@ -0,0 +1,26 @@
+################################################################################
+# Copyright (c) 2015 IBM Corporation, and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# IBM Corporation - initial contribution
+################################################################################
+NewSerialPortConnectionWizardPage_BaudRateLabel=Baud rate:
+NewSerialPortConnectionWizardPage_ByteSizeLabel=Data size:
+NewSerialPortConnectionWizardPage_Description=New serial port connection settings
+NewSerialPortConnectionWizardPage_NameLabel=Connection name:
+NewSerialPortConnectionWizardPage_ParityLabel=Parity:
+NewSerialPortConnectionWizardPage_PortLabel=Serial port:
+NewSerialPortConnectionWizardPage_StopBitsLabel=Stop bits:
+NewSerialPortConnectionWizardPage_Title=New Serial Port Connection
+TelnetConnectionWizardPage_0=New telnet connection settings
+TelnetConnectionWizardPage_1=New Telnet Connection
+TelnetConnectionWizardPage_2=Host
+TelnetConnectionWizardPage_3=Port:
+TelnetConnectionWizardPage_4=Timeout:
diff --git a/remote/org.eclipse.remote.ui.tests/.classpath b/remote/org.eclipse.remote.ui.tests/.classpath
new file mode 100644
index 00000000000..a42a828e04a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src">
+ <attributes>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.ui.tests/.project b/remote/org.eclipse.remote.ui.tests/.project
new file mode 100644
index 00000000000..c0c71f6780c
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.ui.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..5b1c443114d
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..51a63ec9988
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=2
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.ui.tests/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.ui.tests/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..19bd6cd5f5a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Remote UI Tests
+Bundle-SymbolicName: org.eclipse.remote.ui.tests
+Bundle-Version: 1.0.100.qualifier
+Fragment-Host: org.eclipse.remote.ui;bundle-version="2.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Require-Bundle: org.junit;bundle-version="4.12.0",
+ org.eclipse.remote.core,
+ org.eclipse.ui.workbench,
+ org.eclipse.swt,
+ org.eclipse.core.filesystem
+Bundle-Vendor: Eclipse PTP
diff --git a/remote/org.eclipse.remote.ui.tests/about.html b/remote/org.eclipse.remote.ui.tests/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.ui.tests/build.properties b/remote/org.eclipse.remote.ui.tests/build.properties
new file mode 100644
index 00000000000..67af4196ea0
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ about.html,\
+ .
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.ui.tests/src/org/eclipse/remote/ui/tests/RemoteResourceBrowserTest.java b/remote/org.eclipse.remote.ui.tests/src/org/eclipse/remote/ui/tests/RemoteResourceBrowserTest.java
new file mode 100644
index 00000000000..856541a6b81
--- /dev/null
+++ b/remote/org.eclipse.remote.ui.tests/src/org/eclipse/remote/ui/tests/RemoteResourceBrowserTest.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2016 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ */
+package org.eclipse.remote.ui.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.NullProgressMonitor;
+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.IRemoteServicesManager;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.ui.dialogs.RemoteResourceBrowser;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/*
+ * Provides tests to several scenarios but they should be
+ * executed manually (i.e. browse and click OK)
+ */
+@RunWith(JUnit4.class)
+public class RemoteResourceBrowserTest {
+ private static final String USERNAME = "test"; //$NON-NLS-1$
+ private static final String PASSWORD = ""; //$NON-NLS-1$
+ private static final String HOST = "localhost"; //$NON-NLS-1$
+ private static IRemoteConnectionType fConnectionType;
+ private static IRemoteConnection fRemoteConnection;
+ private static Shell shell = null;
+ private RemoteResourceBrowser browser;
+ private IFileStore expectedResource;
+
+ @BeforeClass
+ public static void setUp() {
+ IRemoteServicesManager manager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ fConnectionType = manager.getConnectionType("org.eclipse.remote.JSch"); //$NON-NLS-1$
+ assertNotNull(fConnectionType);
+ IRemoteConnectionWorkingCopy wc = null;
+ try {
+ wc = fConnectionType.newConnection("test_connection");//$NON-NLS-1$
+ } catch (RemoteConnectionException e) {
+ fail(e.getLocalizedMessage());
+ }
+
+ IRemoteConnectionHostService hostService = wc.getService(IRemoteConnectionHostService.class);
+ assertNotNull(hostService);
+
+ String host = System.getenv("TEST_HOST");
+ if (host == null) {
+ host = HOST;
+ }
+ hostService.setHostname(host);
+
+ String username = System.getenv("TEST_USERNAME");
+ if (username == null) {
+ username = USERNAME;
+ }
+ hostService.setUsername(username);
+
+ String password = System.getenv("TEST_PASSWORD");
+ if (password == null) {
+ password = PASSWORD;
+ }
+ hostService.setPassword(password);
+
+ try {
+ fRemoteConnection = wc.save();
+ } catch (RemoteConnectionException e) {
+ fail(e.getLocalizedMessage());
+ }
+ assertNotNull(fRemoteConnection);
+
+ try {
+ fRemoteConnection.open(new NullProgressMonitor());
+ } catch (RemoteConnectionException e) {
+ fail(e.getLocalizedMessage());
+ }
+ assertTrue(fRemoteConnection.isOpen());
+
+ shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ assertNotNull(shell);
+ }
+
+ @AfterClass
+ public static void tearDown() throws RemoteConnectionException {
+ fConnectionType.removeConnection(fRemoteConnection);
+ }
+
+ /*
+ * Select any file.
+ */
+ @Test
+ public void browseFileTest() {
+ browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setConnection(fRemoteConnection);
+ browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+ browser.setTitle("Allows to select file only");
+ browser.open();
+ expectedResource = browser.getResource();
+ assertNotNull(expectedResource);
+ assertTrue(!expectedResource.fetchInfo().isDirectory());
+ }
+
+ /*
+ * Select any directory.
+ */
+ @Test
+ public void browseDirectoryTest() {
+ browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setConnection(fRemoteConnection);
+ browser.setType(RemoteResourceBrowser.DIRECTORY_BROWSER);
+ browser.setTitle("Allows to select directory only");
+ browser.open();
+ expectedResource = browser.getResource();
+ assertNotNull(expectedResource);
+ assertTrue(expectedResource.fetchInfo().isDirectory());
+ }
+
+ /*
+ * Select either file or directory.
+ */
+ @Test
+ public void browseResourceTest() {
+ browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setConnection(fRemoteConnection);
+ browser.setTitle("Allows to select either file or directory");
+ browser.open();
+ expectedResource = browser.getResource();
+ assertNotNull(expectedResource);
+ }
+
+ /*
+ * Select more than one resource.
+ */
+ @Test
+ public void browseResourcesTest() {
+ browser = new RemoteResourceBrowser(shell, SWT.MULTI);
+ browser.setConnection(fRemoteConnection);
+ browser.setTitle("Allows to select either multiple resources");
+ browser.open();
+ List<IFileStore> expectedResources = browser.getResources();
+ assertNotNull(expectedResources);
+ assertTrue(expectedResources.size() > 0);
+ }
+
+ /*
+ * Select to local connection and select a directory.
+ */
+ @Test
+ public void changeLocalConnectionTest() {
+ browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setConnection(fRemoteConnection);
+ browser.setTitle("Allows to switch to local browsing");
+ browser.setType(RemoteResourceBrowser.DIRECTORY_BROWSER);
+ browser.showConnections(true);
+ browser.showLocalSelection(true);
+ browser.open();
+ expectedResource = browser.getResource();
+ assertNotNull(expectedResource);
+ assertEquals(expectedResource.getFileSystem().getScheme(), "file");
+ }
+
+ /*
+ * Initial path set.
+ */
+ @Test
+ public void setInitialPathTest() {
+ String initialPath = "/tmp";
+ browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setConnection(fRemoteConnection);
+ browser.setTitle("Initial path set to " + initialPath);
+ browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+ browser.setInitialPath(initialPath);
+ browser.open();
+ }
+
+ /*
+ * Show connections.
+ * Don't show hidden check box and new folder button.
+ */
+ @Test
+ public void changeDefaultSettingsTest() {
+ browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setConnection(fRemoteConnection);
+ browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+ browser.showConnections(true);
+ browser.showHiddenCheckbox(false);
+ browser.showNewFolderButton(false);
+ browser.open();
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/.classpath b/remote/org.eclipse.remote.ui/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/remote/org.eclipse.remote.ui/.project b/remote/org.eclipse.remote.ui/.project
new file mode 100644
index 00000000000..c3d7657d04a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.remote.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/remote/org.eclipse.remote.ui/.settings/org.eclipse.core.resources.prefs b/remote/org.eclipse.remote.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..99f26c0203a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs b/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e3a8104f9ca
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,486 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch, *.xtend
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+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.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.launching.prefs b/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.launching.prefs
new file mode 100644
index 00000000000..f8a131b56e0
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.launching.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE=warning
+org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning
diff --git a/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.ui.prefs b/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..d35ba9b5231
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,213 @@
+cleanup.add_all=false
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.array_with_curly=false
+cleanup.arrays_fill=false
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=false
+cleanup.boolean_value_rather_than_comparison=false
+cleanup.break_loop=false
+cleanup.collection_cloning=false
+cleanup.comparing_on_criteria=false
+cleanup.comparison_statement=false
+cleanup.controlflow_merge=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=true
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.do_while_rather_than_while=true
+cleanup.double_negation=false
+cleanup.else_if=false
+cleanup.embedded_if=false
+cleanup.evaluate_nullable=false
+cleanup.extract_increment=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.hash=false
+cleanup.if_condition=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=false
+cleanup.instanceof_keyword=false
+cleanup.invert_equals=false
+cleanup.join=false
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.multi_catch=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=false
+cleanup.objects_equals=false
+cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
+cleanup.operand_factorization=false
+cleanup.organize_imports=true
+cleanup.overridden_assignment=false
+cleanup.plain_replacement=false
+cleanup.precompile_regex=false
+cleanup.primitive_comparison=false
+cleanup.primitive_parsing=false
+cleanup.primitive_rather_than_wrapper=false
+cleanup.primitive_serialization=false
+cleanup.pull_out_if_from_if_else=false
+cleanup.pull_up_assignment=false
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.reduce_indentation=false
+cleanup.redundant_comparator=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_method_parameters=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.return_expression=false
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.single_used_field=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.standard_comparison=false
+cleanup.static_inner_class=false
+cleanup.strictly_equal_or_different=false
+cleanup.stringbuffer_to_stringbuilder=false
+cleanup.stringbuilder=false
+cleanup.stringbuilder_for_local_vars=true
+cleanup.stringconcat_to_textblock=false
+cleanup.substring=false
+cleanup.switch=false
+cleanup.system_property=false
+cleanup.system_property_boolean=false
+cleanup.system_property_file_encoding=false
+cleanup.system_property_file_separator=false
+cleanup.system_property_line_separator=false
+cleanup.system_property_path_separator=false
+cleanup.ternary_operator=false
+cleanup.try_with_resource=false
+cleanup.unlooped_while=false
+cleanup.unreachable_block=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_string_is_blank=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup.valueof_rather_than_instantiation=false
+cleanup_profile=_CDT
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_CDT
+formatter_settings_version=14
+internal.default.compliance=user
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=1000
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=1000
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.api.tools.prefs b/remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..ec9fbf321d0
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,184 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Error
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Warning
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+MISSING_EE_DESCRIPTIONS=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+changed_execution_env=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Warning
+incompatible_api_component_version_report_minor_without_api_change=Warning
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.prefs b/remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 00000000000..d2dc703ba9e
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,35 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/remote/org.eclipse.remote.ui/META-INF/MANIFEST.MF b/remote/org.eclipse.remote.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..6fca78aa060
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,52 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.remote.ui;singleton:=true
+Bundle-Version: 2.2.100.qualifier
+Bundle-Activator: org.eclipse.remote.internal.ui.RemoteUIPlugin
+Bundle-Vendor: %pluginProvider
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.remote.internal.ui;x-internal:=true,
+ org.eclipse.remote.internal.ui.messages;x-internal:=true,
+ org.eclipse.remote.internal.ui.preferences;x-internal:=true,
+ org.eclipse.remote.internal.ui.services.local;x-internal:=true,
+ org.eclipse.remote.ui,
+ org.eclipse.remote.ui.dialogs,
+ org.eclipse.remote.ui.widgets
+Bundle-Localization: plugin
+Import-Package: org.eclipse.core.commands,
+ org.eclipse.core.expressions,
+ org.eclipse.core.filesystem,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.core.runtime.preferences;version="3.3.0",
+ org.eclipse.jface.action,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.operation,
+ org.eclipse.jface.preference,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.util,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.jface.wizard,
+ org.eclipse.osgi.util,
+ org.eclipse.remote.core,
+ org.eclipse.remote.core.exception,
+ org.eclipse.remote.internal.core.preferences,
+ org.eclipse.remote.ui.widgets,
+ org.eclipse.swt,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.eclipse.ui.dialogs,
+ org.eclipse.ui.handlers,
+ org.eclipse.ui.model,
+ org.eclipse.ui.navigator,
+ org.eclipse.ui.plugin,
+ org.eclipse.ui.progress,
+ org.osgi.framework,
+ org.osgi.service.prefs
diff --git a/remote/org.eclipse.remote.ui/about.html b/remote/org.eclipse.remote.ui/about.html
new file mode 100644
index 00000000000..b3134865230
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/about.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <title>About</title>
+</head>
+
+<body lang="EN-US">
+ <h2>About This Content</h2>
+
+ <p>November 30, 2017</p>
+ <h3>License</h3>
+
+ <p>
+ The Eclipse Foundation makes available all content in this plug-in
+ (&quot;Content&quot;). Unless otherwise indicated below, the Content
+ is provided to you under the terms and conditions of the Eclipse
+ Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+ available at <a href="https://www.eclipse.org/legal/epl-2.0">https://www.eclipse.org/legal/epl-2.0</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.
+ </p>
+
+ <p>
+ If you did not receive this Content directly from the Eclipse
+ Foundation, the Content is being redistributed by another party
+ (&quot;Redistributor&quot;) and different terms and conditions may
+ apply to your use of any object code in the Content. Check the
+ Redistributor's license that was provided with the Content. If no such
+ license exists, contact the Redistributor. Unless otherwise indicated
+ below, the terms and conditions of the EPL still apply to any source
+ code in the Content and such source code may be obtained at <a
+ href="https://www.eclipse.org/">https://www.eclipse.org</a>.
+ </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/remote/org.eclipse.remote.ui/about.ini b/remote/org.eclipse.remote.ui/about.ini
new file mode 100644
index 00000000000..e07a7bb377e
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/about.ini
@@ -0,0 +1,24 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%blurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=cdt_logo_icon32.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/remote/org.eclipse.remote.ui/about.mappings b/remote/org.eclipse.remote.ui/about.mappings
new file mode 100644
index 00000000000..936a8039c3e
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/about.mappings
@@ -0,0 +1,9 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20200106-1728"
+# This value will be added automatically via the build scripts
+0=${buildId}
diff --git a/remote/org.eclipse.remote.ui/about.properties b/remote/org.eclipse.remote.ui/about.properties
new file mode 100644
index 00000000000..9f09c78699e
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/about.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+# NOTE TO TRANSLATOR: Please do not translate the featureVersion variable.
+
+
+blurb=Remote Services\n\
+\n\
+Version: {featureVersion}\n\
+Build id: {0}\n\
+\n\
+Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation
+\n\
+See the NOTICE file(s) distributed with this work for additional\n\
+information regarding copyright ownership.\n\
+\n\
+Visit http://www.eclipse.org/cdt
diff --git a/remote/org.eclipse.remote.ui/build.properties b/remote/org.eclipse.remote.ui/build.properties
new file mode 100644
index 00000000000..32d940a1926
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/build.properties
@@ -0,0 +1,13 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.ini,\
+ about.mappings,\
+ about.properties,\
+ cdt_logo_icon32.png,\
+ about.html,\
+ plugin.properties,\
+ icons/
+src.includes = about.html
diff --git a/remote/org.eclipse.remote.ui/cdt_logo_icon32.png b/remote/org.eclipse.remote.ui/cdt_logo_icon32.png
new file mode 100644
index 00000000000..470ca81b327
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/cdt_logo_icon32.png
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/connection.gif b/remote/org.eclipse.remote.ui/icons/connection.gif
new file mode 100644
index 00000000000..870934b6934
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/connection.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/console.png b/remote/org.eclipse.remote.ui/icons/console.png
new file mode 100644
index 00000000000..ca77aee5bca
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/console.png
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/dlcl16/new_folder.gif b/remote/org.eclipse.remote.ui/icons/dlcl16/new_folder.gif
new file mode 100644
index 00000000000..310eb18e34b
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/dlcl16/new_folder.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/dlcl16/up_nav.gif b/remote/org.eclipse.remote.ui/icons/dlcl16/up_nav.gif
new file mode 100644
index 00000000000..884952fd288
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/dlcl16/up_nav.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/elcl16/new_folder.gif b/remote/org.eclipse.remote.ui/icons/elcl16/new_folder.gif
new file mode 100644
index 00000000000..310eb18e34b
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/elcl16/new_folder.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/elcl16/up_nav.gif b/remote/org.eclipse.remote.ui/icons/elcl16/up_nav.gif
new file mode 100644
index 00000000000..884952fd288
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/elcl16/up_nav.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/new_wiz.gif b/remote/org.eclipse.remote.ui/icons/new_wiz.gif
new file mode 100644
index 00000000000..7aea894d0b6
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/new_wiz.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/icons/ovr16/symlink_ovr.gif b/remote/org.eclipse.remote.ui/icons/ovr16/symlink_ovr.gif
new file mode 100644
index 00000000000..73bd973f540
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/icons/ovr16/symlink_ovr.gif
Binary files differ
diff --git a/remote/org.eclipse.remote.ui/plugin.properties b/remote/org.eclipse.remote.ui/plugin.properties
new file mode 100644
index 00000000000..e712d0e931b
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/plugin.properties
@@ -0,0 +1,24 @@
+###############################################################################
+# Copyright (c) 2013 IBM Corporation.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+###############################################################################
+
+pluginName=Remote Services UI
+pluginProvider=Eclipse PTP
+RemoteDevPrefPage.name=Remote Development
+ConnectionsPreferencePage.name=Remote Connections
+ConnectionsViewCategory.name=Connections
+ConnectionsView.name=Connections
+ConnectionsContent.name=Connections
+NewConnectionCommand.name=New Connection
+DeleteConnectionCommand.name=Delete Connection
+ConnectionProperties.name=Connection
+OpenConnectionCommand.name=Open Connection
+CloseConnectionCommand.name=Close Connection
diff --git a/remote/org.eclipse.remote.ui/plugin.xml b/remote/org.eclipse.remote.ui/plugin.xml
new file mode 100644
index 00000000000..69b96adf4d6
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/plugin.xml
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ class="org.eclipse.remote.internal.ui.preferences.RemoteDevelopmentPreferencePage"
+ id="org.eclipse.remote.ui.RemoteDevelopmentPreferencePage"
+ name="%RemoteDevPrefPage.name">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.remote.ui.RemoteDevelopmentPreferencePage"
+ class="org.eclipse.remote.internal.ui.preferences.ConnectionsPreferencePage"
+ id="org.eclipse.remote.connections"
+ name="%ConnectionsPreferencePage.name">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.trace.traceComponents">
+ <component
+ id="org.eclipse.remote.core.component"
+ label="Remote Core">
+ <bundle
+ consumed="true"
+ name="org.eclipse.remote.core">
+ </bundle>
+ </component>
+ </extension>
+ <extension
+ point="org.eclipse.remote.core.remoteServices">
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.ui.services.local.LocalUIFileService$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIFileService">
+ </connectionTypeService>
+ <connectionTypeService
+ connectionTypeId="org.eclipse.remote.LocalServices"
+ factory="org.eclipse.remote.internal.ui.services.local.LocalUIConnectionService$Factory"
+ service="org.eclipse.remote.ui.IRemoteUIConnectionService">
+ </connectionTypeService>
+ </extension>
+ <extension
+ point="org.eclipse.ui.views">
+ <category
+ id="org.eclipse.remote.ui.view.category.connections"
+ name="%ConnectionsViewCategory.name">
+ </category>
+ <view
+ category="org.eclipse.remote.ui.view.category.connections"
+ class="org.eclipse.remote.internal.ui.views.RemoteConnectionsView"
+ icon="icons/connection.gif"
+ id="org.eclipse.remote.ui.view.connections"
+ name="%ConnectionsView.name"
+ restorable="true">
+ </view>
+ </extension>
+ <extension
+ point="org.eclipse.ui.navigator.navigatorContent">
+ <navigatorContent
+ activeByDefault="true"
+ contentProvider="org.eclipse.remote.internal.ui.views.RemoteConnectionsContentProvider"
+ id="org.eclipse.remote.ui.navigatorContent.connections"
+ labelProvider="org.eclipse.remote.ui.RemoteConnectionsLabelProvider"
+ name="%ConnectionsContent.name">
+ <triggerPoints>
+ <instanceof
+ value="org.eclipse.remote.core.IRemoteServicesManager">
+ </instanceof>
+ </triggerPoints>
+ <possibleChildren>
+ <instanceof
+ value="org.eclipse.remote.core.IRemoteConnection">
+ </instanceof>
+ </possibleChildren>
+ </navigatorContent>
+ <actionProvider
+ class="org.eclipse.remote.internal.ui.views.RemoteConnectionsActionProvider"
+ id="org.eclipse.remote.ui.actionProvider.properties">
+ <enablement>
+ <instanceof
+ value="org.eclipse.remote.core.IRemoteConnection">
+ </instanceof>
+ </enablement>
+ </actionProvider>
+ </extension>
+ <extension
+ point="org.eclipse.ui.navigator.viewer">
+ <viewer
+ viewerId="org.eclipse.remote.ui.view.connections">
+ <options>
+ <property
+ name="org.eclipse.ui.navigator.hideLinkWithEditorAction"
+ value="true">
+ </property>
+ </options>
+ </viewer>
+ <viewerContentBinding
+ viewerId="org.eclipse.remote.ui.view.connections">
+ <includes>
+ <contentExtension
+ isRoot="true"
+ pattern="org.eclipse.remote.ui.navigatorContent.connections">
+ </contentExtension>
+ </includes>
+ </viewerContentBinding>
+ <viewerActionBinding
+ viewerId="org.eclipse.remote.ui.view.connections">
+ <includes>
+ <actionExtension
+ pattern="org.eclipse.remote.ui.actionProvider.*">
+ </actionExtension>
+ </includes>
+ </viewerActionBinding>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.remote.internal.ui.views.NewRemoteConnectionHandler"
+ id="org.eclipse.remote.ui.command.newConnection"
+ name="%NewConnectionCommand.name">
+ </command>
+ <command
+ defaultHandler="org.eclipse.remote.internal.ui.views.DeleteRemoteConnectionHandler"
+ id="org.eclipse.remote.ui.command.deleteConnection"
+ name="%DeleteConnectionCommand.name">
+ </command>
+ <command
+ defaultHandler="org.eclipse.remote.internal.ui.views.OpenConnectionHandler"
+ id="org.eclipse.remote.ui.command.openConnection"
+ name="%OpenConnectionCommand.name">
+ </command>
+ <command
+ defaultHandler="org.eclipse.remote.internal.ui.views.CloseConnectionHandler"
+ id="org.eclipse.remote.ui.command.closeConnection"
+ name="%CloseConnectionCommand.name">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.core.expressions.propertyTesters">
+ <propertyTester
+ class="org.eclipse.remote.internal.ui.ServicePropertyTester"
+ id="org.eclipse.remote.ui.propertyTester.hasService"
+ namespace="org.eclipse.remote.ui"
+ properties="hasConnectionTypeService,hasConnectionService,canDelete,canOpen,canClose"
+ type="org.eclipse.remote.core.IRemoteConnection">
+ </propertyTester>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.remote.ui.view.connections">
+ <command
+ commandId="org.eclipse.remote.ui.command.newConnection"
+ icon="icons/new_wiz.gif"
+ label="%NewConnectionCommand.name"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.remote.ui.view.connections">
+ <command
+ commandId="org.eclipse.remote.ui.command.openConnection"
+ label="%OpenConnectionCommand.name"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <iterate>
+ <test
+ property="org.eclipse.remote.ui.canOpen">
+ </test>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.remote.ui.command.closeConnection"
+ label="%CloseConnectionCommand.name"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <iterate>
+ <test
+ property="org.eclipse.remote.ui.canClose">
+ </test>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.remote.ui.command.deleteConnection"
+ label="%DeleteConnectionCommand.name"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <iterate>
+ <test
+ property="org.eclipse.remote.ui.canDelete">
+ </test>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.propertyPages">
+ <page
+ class="org.eclipse.remote.internal.ui.views.RemoteConnectionPropertyPage"
+ id="org.eclipse.remote.ui.page.connectionProperties"
+ name="%ConnectionProperties.name">
+ <enabledWhen>
+ <adapt
+ type="org.eclipse.remote.core.IRemoteConnection">
+ </adapt>
+ </enabledWhen>
+ </page>
+ </extension>
+
+</plugin>
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStore.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStore.java
new file mode 100644
index 00000000000..b69e1d88458
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStore.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.dialogs.FileSystemElement;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
+import org.eclipse.ui.progress.IElementCollector;
+
+public class DeferredFileStore implements IDeferredWorkbenchAdapter, IAdaptable {
+ private final IFileStore fFileStore;
+ private IFileInfo fFileInfo;
+ private IFileInfo fTargetInfo;
+ private ImageDescriptor fImage;
+ private final boolean fExcludeHidden;
+ private final DeferredFileStore fParent;
+
+ public DeferredFileStore(IFileStore store, boolean exclude) {
+ this(store, null, exclude, null);
+ }
+
+ /**
+ * @since 7.0
+ */
+ public DeferredFileStore(IFileStore store, boolean exclude, DeferredFileStore parent) {
+ this(store, null, exclude, parent);
+ }
+
+ /**
+ * @since 7.0
+ */
+ public DeferredFileStore(IFileStore store, IFileInfo info, boolean exclude, DeferredFileStore parent) {
+ fFileStore = store;
+ fFileInfo = info;
+ fExcludeHidden = exclude;
+ fParent = parent;
+ }
+
+ @Override
+ public void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) {
+ ArrayList<DeferredFileStore> children = new ArrayList<>();
+ try {
+ IFileInfo[] childInfos = fFileStore.childInfos(EFS.NONE, monitor);
+ for (IFileInfo info : childInfos) {
+ if (!(fExcludeHidden && info.getName().startsWith("."))) { //$NON-NLS-1$
+ children.add(
+ new DeferredFileStore(fFileStore.getChild(info.getName()), info, fExcludeHidden, this));
+ }
+ }
+ } catch (CoreException e) {
+ // Ignore
+ }
+ if (children != null) {
+ collector.add(children.toArray(), monitor);
+ }
+ collector.done();
+ }
+
+ /**
+ * Fetch the file info for the store. If the store is a symbolic link, fetch the file info for the target as well.
+ */
+ private void fetchInfo() {
+ if (fFileInfo == null) {
+ fFileInfo = fFileStore.fetchInfo();
+ }
+ if (fTargetInfo == null && fFileInfo.getAttribute(EFS.ATTRIBUTE_SYMLINK)) {
+ String target = fFileInfo.getStringAttribute(EFS.ATTRIBUTE_LINK_TARGET);
+ if (target != null) {
+ try {
+ URI targetUri = new URI(null, null, target, null); // Make sure target is escaped correctly
+ URI uri = fFileStore.toURI().resolve(targetUri.getRawPath());
+ IFileStore store = fFileStore.getFileSystem().getStore(uri);
+ fTargetInfo = store.fetchInfo();
+ } catch (URISyntaxException e) {
+ RemoteUIPlugin.log(e);
+ }
+ }
+ }
+ }
+
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ if (IWorkbenchAdapter.class.equals(adapter)) {
+ return adapter.cast(this);
+ }
+ return null;
+ }
+
+ /**
+ * Return the IWorkbenchAdapter for element or the element if it is
+ * an instance of IWorkbenchAdapter. If it does not exist return
+ * null.
+ *
+ * @param element
+ * @return IWorkbenchAdapter or <code>null</code>
+ */
+ protected IWorkbenchAdapter getAdapter(Object element) {
+ return getAdapter(element, IWorkbenchAdapter.class);
+ }
+
+ /**
+ * If it is possible to adapt the given object to the given type, this returns the adapter. Performs the following checks:
+ *
+ * <ol>
+ * <li>Returns <code>sourceObject</code> if it is an instance of the adapter type.</li>
+ * <li>If sourceObject implements IAdaptable, it is queried for adapters.</li>
+ * <li>If sourceObject is not an instance of PlatformObject (which would have already done so), the adapter manager is queried
+ * for adapters</li>
+ * </ol>
+ *
+ * Otherwise returns null.
+ *
+ * @param sourceObject
+ * object to adapt, or null
+ * @param adapterType
+ * type to adapt to
+ * @return a representation of sourceObject that is assignable to the adapter type, or null if no such representation exists
+ */
+ protected <T> T getAdapter(Object sourceObject, Class<T> adapterType) {
+ Assert.isNotNull(adapterType);
+ if (sourceObject == null) {
+ return null;
+ }
+ if (adapterType.isInstance(sourceObject)) {
+ return adapterType.cast(sourceObject);
+ }
+
+ if (sourceObject instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) sourceObject;
+
+ Object result = adaptable.getAdapter(adapterType);
+ if (result != null) {
+ // Sanity-check
+ Assert.isTrue(adapterType.isInstance(result));
+ return adapterType.cast(result);
+ }
+ }
+
+ if (!(sourceObject instanceof PlatformObject)) {
+ Object result = Platform.getAdapterManager().getAdapter(sourceObject, adapterType);
+ if (result != null) {
+ return adapterType.cast(result);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public Object[] getChildren(Object o) {
+ try {
+ IFileStore[] stores = fFileStore.childStores(EFS.NONE, null);
+ List<DeferredFileStore> def = new ArrayList<>();
+ for (int i = 0; i < stores.length; i++) {
+ if (!(fExcludeHidden && stores[i].getName().startsWith("."))) { //$NON-NLS-1$
+ def.add(new DeferredFileStore(stores[i], fExcludeHidden, this));
+ }
+ }
+ return def.toArray();
+ } catch (CoreException e) {
+ return new Object[0];
+ }
+ }
+
+ /**
+ * Get the filestore backing this object
+ *
+ * @return
+ */
+ public IFileStore getFileStore() {
+ return fFileStore;
+ }
+
+ @Override
+ public ImageDescriptor getImageDescriptor(Object object) {
+ fetchInfo();
+ if (fImage == null) {
+ boolean isDir = fFileInfo.isDirectory() || (fTargetInfo != null && fTargetInfo.isDirectory());
+ FileSystemElement element = new FileSystemElement(fFileStore.getName(), null, isDir);
+ IWorkbenchAdapter adapter = getAdapter(element);
+ if (adapter != null) {
+ ImageDescriptor imageDesc = adapter.getImageDescriptor(object);
+ if (fTargetInfo != null) {
+ imageDesc = new OverlayImageDescriptor(imageDesc, RemoteUIImages.DESC_OVR_SYMLINK,
+ OverlayImageDescriptor.BOTTOM_RIGHT);
+ }
+ fImage = imageDesc;
+ }
+ }
+ return fImage;
+ }
+
+ @Override
+ public String getLabel(Object o) {
+ return fFileStore.getName();
+ }
+
+ @Override
+ public Object getParent(Object o) {
+ return fParent;
+ }
+
+ @Override
+ public ISchedulingRule getRule(Object object) {
+ return null;
+ }
+
+ @Override
+ public boolean isContainer() {
+ fetchInfo();
+ return fFileInfo.isDirectory() || (fTargetInfo != null && fTargetInfo.isDirectory());
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStoreComparer.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStoreComparer.java
new file mode 100644
index 00000000000..082cf432431
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/DeferredFileStoreComparer.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.jface.viewers.IElementComparer;
+
+public class DeferredFileStoreComparer implements IElementComparer {
+
+ @Override
+ public boolean equals(Object o1, Object o2) {
+ if (o1 == o2) {
+ return true;
+ }
+ if (o1 == null) {
+ return false; // o2 != null if we reach this point
+ }
+ if (o1.equals(o2)) {
+ return true;
+ }
+
+ // Assume they are DeferredFileStore
+ DeferredFileStore c1 = (o1 instanceof DeferredFileStore) ? (DeferredFileStore) o1 : null;
+ DeferredFileStore c2 = (o2 instanceof DeferredFileStore) ? (DeferredFileStore) o2 : null;
+ if (c1 == null || c2 == null) {
+ return false;
+ }
+ return c1.getFileStore().equals(c2.getFileStore());
+ }
+
+ @Override
+ public int hashCode(Object element) {
+ if (element instanceof DeferredFileStore) {
+ return ((DeferredFileStore) element).getFileStore().hashCode();
+ }
+ return element.hashCode();
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/Messages.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/Messages.java
new file mode 100644
index 00000000000..a98aa0636cf
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/Messages.java
@@ -0,0 +1,20 @@
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.internal.ui.messages"; //$NON-NLS-1$
+ public static String NewRemoteConnectionTypePage_LaunchTargetType;
+ public static String NewRemoteConnectionTypePage_SelectTargetType;
+ public static String NewRemoteConnectionWizard_0;
+ public static String OpenTerminalHandler_OpenTerminalDesc;
+ public static String OpenTerminalHandler_OpenTerminalTitle;
+ public static String RemoteConnectionPropertyPage_ConnectionName;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/OverlayImageDescriptor.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/OverlayImageDescriptor.java
new file mode 100644
index 00000000000..94d1f315203
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/OverlayImageDescriptor.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @since 7.0
+ */
+public class OverlayImageDescriptor extends CompositeImageDescriptor {
+
+ static final int DEFAULT_WIDTH = 16;
+ static final int DEFAULT_HEIGHT = 16;
+
+ public static final int TOP_LEFT = 0;
+ public static final int TOP_RIGHT = 1;
+ public static final int BOTTOM_LEFT = 2;
+ public static final int BOTTOM_RIGHT = 3;
+
+ private final ImageDescriptor fBase;
+ private final ImageDescriptor fOverlay;
+ private final int fPosition;
+ private final int fOffset = 3;
+
+ public OverlayImageDescriptor(ImageDescriptor base, ImageDescriptor overlay, int pos) {
+ fBase = base;
+ fOverlay = overlay;
+ fPosition = pos;
+ }
+
+ /*
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int,
+ * int)
+ */
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ ImageData imageData = fBase.getImageData();
+ if (imageData != null) {
+ drawImage(imageData, 0, 0);
+ }
+ ImageData overlayData = fOverlay.getImageData();
+ if (overlayData != null) {
+ Point pos = null;
+ switch (fPosition) {
+ case TOP_LEFT:
+ pos = new Point(-overlayData.width / 2, -overlayData.height / 2);
+ break;
+ case TOP_RIGHT:
+ pos = new Point(imageData.width - overlayData.width / 2, 0);
+ break;
+ case BOTTOM_LEFT:
+ pos = new Point(0, imageData.height - overlayData.height / 2);
+
+ break;
+ case BOTTOM_RIGHT:
+ pos = new Point(imageData.width - overlayData.width / 2, imageData.height - overlayData.height / 2);
+ break;
+ }
+ drawImage(overlayData, pos.x - fOffset, pos.y - fOffset);
+ }
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT);
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/PendingUpdateAdapter.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/PendingUpdateAdapter.java
new file mode 100644
index 00000000000..9586793e98a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/PendingUpdateAdapter.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2009 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+
+/**
+ * The PendingUpdateAdapter is a convenience object that can be used
+ * by a BaseWorkbenchContentProvider that wants to show a pending update.
+ */
+public class PendingUpdateAdapter implements IWorkbenchAdapter, IAdaptable {
+
+ boolean removed = false;
+
+ /**
+ * Return whether or not this has been removed from the tree.
+ *
+ * @return boolean
+ */
+ public boolean isRemoved() {
+ return removed;
+ }
+
+ /**
+ * Set whether or not this has been removed from the tree.
+ *
+ * @param removedValue
+ * boolean
+ */
+ public void setRemoved(boolean removedValue) {
+ this.removed = removedValue;
+ }
+
+ /**
+ * Create a new instance of the receiver.
+ */
+ public PendingUpdateAdapter() {
+ // No initial behavior
+ }
+
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ if (adapter == IWorkbenchAdapter.class) {
+ return adapter.cast(this);
+ }
+ return null;
+ }
+
+ @Override
+ public Object[] getChildren(Object o) {
+ return new Object[0];
+ }
+
+ @Override
+ public ImageDescriptor getImageDescriptor(Object object) {
+ return null;
+ }
+
+ @Override
+ public String getLabel(Object o) {
+ return Messages.PendingUpdateAdapter_Pending;
+ }
+
+ @Override
+ public Object getParent(Object o) {
+ return null;
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteContentProvider.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteContentProvider.java
new file mode 100644
index 00000000000..7143be7133e
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteContentProvider.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+
+/**
+ * Extension to the generic workbench content provider mechanism
+ * to lazily determine whether an element has children. That is,
+ * children for an element aren't fetched until the user clicks
+ * on the tree expansion box.
+ */
+public class RemoteContentProvider extends WorkbenchContentProvider {
+ private IWorkingSet workingSet;
+ private RemoteTreeContentManager manager;
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (newInput != null) {
+ manager = new RemoteTreeContentManager(this, (RemoteTreeViewer) viewer, null);
+ } else {
+ manager = null;
+ }
+ super.inputChanged(viewer, oldInput, newInput);
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ if (manager != null /* && manager.isDeferredAdapter(element) */) {
+ return manager.mayHaveChildren(element);
+ }
+
+ return super.hasChildren(element);
+ }
+
+ /**
+ * Sets the workingSet.
+ *
+ * @param workingSet
+ * The workingSet to set
+ */
+ public void setWorkingSet(IWorkingSet workingSet) {
+ this.workingSet = workingSet;
+ }
+
+ /**
+ * Returns the workingSet.
+ *
+ * @return IWorkingSet
+ */
+ public IWorkingSet getWorkingSet() {
+ return workingSet;
+ }
+
+ @Override
+ public Object[] getChildren(Object element) {
+ if (manager != null) {
+ Object[] children = manager.getChildren(element);
+ if (children != null) {
+ return children;
+ }
+ }
+ return super.getChildren(element);
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteResourceComparator.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteResourceComparator.java
new file mode 100644
index 00000000000..f76304815e4
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteResourceComparator.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+
+public class RemoteResourceComparator extends ViewerComparator {
+
+ private boolean ascending = true;
+
+ public RemoteResourceComparator() {
+ super();
+ }
+
+ public void setAscending(boolean ascending) {
+ this.ascending = ascending;
+ }
+
+ public boolean isAscending() {
+ return ascending;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ if (o1 instanceof IFileInfo && o2 instanceof IFileInfo) {
+ int compareResult = ((IFileInfo) o1).getName().compareToIgnoreCase(((IFileInfo) o2).getName());
+ return ascending ? compareResult : -compareResult;
+ }
+
+ return super.compare(viewer, o1, o2);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeContentManager.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeContentManager.java
new file mode 100644
index 00000000000..7882d47a0d3
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeContentManager.java
@@ -0,0 +1,345 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
+import org.eclipse.ui.progress.IElementCollector;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.ui.progress.WorkbenchJob;
+
+/**
+ * A remote content manager that merges content into a tree rather then replacing its children with a
+ * "pending" node, and then the real children when they are available. This avoids collapsing the viewer when
+ * a refresh is performed. This implementation is currently tied to the <code>RemoteTreeViewer</code>.
+ *
+ * @since 3.1
+ */
+public class RemoteTreeContentManager {
+ private final RemoteTreeViewer fViewer;
+ private IWorkbenchSiteProgressService progressService;
+
+ /**
+ * Job to fetch children
+ */
+ private final Job fFetchJob = new FetchJob();
+
+ /**
+ * Queue of parents to fetch children for, and associated element collectors and deferred adapters.
+ */
+ private final List<Object> fElementQueue = new ArrayList<>();
+ private final List<IElementCollector> fCollectors = new ArrayList<>();
+ private final List<IDeferredWorkbenchAdapter> fAdapaters = new ArrayList<>();
+
+ /**
+ * Fetching children is done in a single background job. This makes fetching single threaded/serial per
+ * view.
+ */
+ private class FetchJob extends Job {
+
+ public FetchJob() {
+ super("FetchJob"); //$NON-NLS-1$
+ setSystem(true);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ while (!fElementQueue.isEmpty() && !monitor.isCanceled()) {
+ Object element = null;
+ IElementCollector collector = null;
+ IDeferredWorkbenchAdapter adapter = null;
+ synchronized (fElementQueue) {
+ // could have been cancelled after entering the while loop
+ if (fElementQueue.isEmpty()) {
+ return Status.CANCEL_STATUS;
+ }
+ element = fElementQueue.remove(0);
+ collector = fCollectors.remove(0);
+ adapter = fAdapaters.remove(0);
+ }
+ adapter.fetchDeferredChildren(element, collector, monitor);
+ }
+ if (monitor.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+ return Status.OK_STATUS;
+ }
+
+ }
+
+ /**
+ * Element collector
+ */
+ private class Collector implements IElementCollector {
+ // number of children added to the tree
+ int offset = 0;
+ Object fParent;
+
+ public Collector(Object parent) {
+ fParent = parent;
+ }
+
+ @Override
+ public void add(Object element, IProgressMonitor monitor) {
+ add(new Object[] { element }, monitor);
+ }
+
+ @Override
+ public void add(Object[] elements, IProgressMonitor monitor) {
+ Object[] filtered = fViewer.filter(elements);
+ if (fViewer.getComparator() != null) {
+ fViewer.getComparator().sort(fViewer, filtered);
+ }
+ if (filtered.length > 0) {
+ replaceChildren(fParent, filtered, offset, monitor);
+ offset = offset + filtered.length;
+ }
+ }
+
+ @Override
+ public void done() {
+ prune(fParent, offset);
+ }
+ }
+
+ /**
+ * Contructs a new content manager.
+ *
+ * @param provider
+ * content provider
+ * @param viewer
+ * viewer
+ * @param site
+ * part site
+ */
+ public RemoteTreeContentManager(ITreeContentProvider provider, RemoteTreeViewer viewer, IWorkbenchPartSite site) {
+ fViewer = viewer;
+ if (site != null) {
+ Object siteService = site.getAdapter(IWorkbenchSiteProgressService.class);
+ if (siteService != null) {
+ progressService = (IWorkbenchSiteProgressService) siteService;
+ }
+ }
+ }
+
+ /**
+ * Create the element collector for the receiver.
+ *
+ * @param parent
+ * The parent object being filled in,
+ * @param placeholder
+ * The adapter that will be used to indicate that results are pending, possibly <code>null</code>
+ * @return IElementCollector
+ */
+ protected IElementCollector createElementCollector(Object parent, PendingUpdateAdapter placeholder) {
+ return new Collector(parent);
+ }
+
+ /**
+ * Returns the child elements of the given element, or in the case of a deferred element, returns a
+ * placeholder. If a deferred element is used, a job is created to fetch the children in the background.
+ *
+ * @param parent
+ * The parent object.
+ * @return Object[] or <code>null</code> if parent is not an instance of IDeferredWorkbenchAdapter.
+ */
+ public Object[] getChildren(final Object parent) {
+ IDeferredWorkbenchAdapter element = getAdapter(parent);
+ if (element == null) {
+ return null;
+ }
+ Object[] currentChildren = fViewer.getCurrentChildren(parent);
+ PendingUpdateAdapter placeholder = null;
+ if (currentChildren == null || currentChildren.length == 0) {
+ placeholder = new PendingUpdateAdapter();
+ }
+ startFetchingDeferredChildren(parent, element, placeholder);
+ if (placeholder == null) {
+ return currentChildren;
+ }
+ return new Object[] { placeholder };
+ }
+
+ /**
+ * Create a UIJob to replace the children of the parent in the tree viewer.
+ *
+ * @param parent
+ * the parent for which children are to be replaced
+ * @param children
+ * the replacement children
+ * @param offset
+ * the offset at which to start replacing children
+ * @param monitor
+ * progress monitor
+ */
+ protected void replaceChildren(final Object parent, final Object[] children, final int offset,
+ IProgressMonitor monitor) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ WorkbenchJob updateJob = new WorkbenchJob("IncrementalDeferredTreeContentManager") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor updateMonitor) {
+ // Cancel the job if the tree viewer got closed
+ if (fViewer.getControl().isDisposed()) {
+ return Status.CANCEL_STATUS;
+ }
+ fViewer.replace(parent, children, offset);
+ return Status.OK_STATUS;
+ }
+ };
+ updateJob.setSystem(true);
+ updateJob.setPriority(Job.INTERACTIVE);
+ updateJob.schedule();
+ }
+
+ /**
+ * Create a UIJob to prune the children of the parent in the tree viewer, starting at the given offset.
+ *
+ * @param parent
+ * the parent for which children should be pruned
+ * @param offset
+ * the offset at which children should be pruned. All children at and after this index will be
+ * removed from the tree.
+ */
+ protected void prune(final Object parent, final int offset) {
+ WorkbenchJob updateJob = new WorkbenchJob("DeferredTree") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor updateMonitor) {
+ // Cancel the job if the tree viewer got closed
+ if (fViewer.getControl().isDisposed()) {
+ return Status.CANCEL_STATUS;
+ }
+ fViewer.prune(parent, offset);
+ return Status.OK_STATUS;
+ }
+ };
+ updateJob.setSystem(true);
+ updateJob.setPriority(Job.INTERACTIVE);
+ updateJob.schedule();
+ }
+
+ /**
+ * Run a job to clear the placeholder. This is used when the update for the tree is complete so that the
+ * user is aware that no more updates are pending.
+ *
+ * @param placeholder
+ */
+ protected void runClearPlaceholderJob(final PendingUpdateAdapter placeholder) {
+ if (placeholder == null || placeholder.isRemoved() || !PlatformUI.isWorkbenchRunning()) {
+ return;
+ }
+ // Clear the placeholder if it is still there
+ WorkbenchJob clearJob = new WorkbenchJob("DeferredTreeContentManager_ClearJob") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (!placeholder.isRemoved()) {
+ Control control = fViewer.getControl();
+ if (control.isDisposed()) {
+ return Status.CANCEL_STATUS;
+ }
+ fViewer.remove(placeholder);
+ placeholder.setRemoved(true);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ clearJob.setSystem(true);
+ clearJob.schedule();
+ }
+
+ protected String getFetchJobName(Object parent, IDeferredWorkbenchAdapter adapter) {
+ return "RemoteTreeContentManager"; //$NON-NLS-1$
+ }
+
+ /**
+ * Return the IDeferredWorkbenchAdapter for element or the element if it is an instance of
+ * IDeferredWorkbenchAdapter. If it does not exist return null.
+ *
+ * @param element
+ * @return IDeferredWorkbenchAdapter or <code>null</code>
+ */
+ protected IDeferredWorkbenchAdapter getAdapter(Object element) {
+ if (element instanceof IDeferredWorkbenchAdapter) {
+ return (IDeferredWorkbenchAdapter) element;
+ }
+ if (!(element instanceof IAdaptable)) {
+ return null;
+ }
+ Object adapter = ((IAdaptable) element).getAdapter(IDeferredWorkbenchAdapter.class);
+ if (adapter == null) {
+ return null;
+ }
+ return (IDeferredWorkbenchAdapter) adapter;
+ }
+
+ protected void startFetchingDeferredChildren(final Object parent, final IDeferredWorkbenchAdapter adapter,
+ PendingUpdateAdapter placeholder) {
+ final IElementCollector collector = createElementCollector(parent, placeholder);
+ synchronized (fElementQueue) {
+ if (!fElementQueue.contains(parent)) {
+ fElementQueue.add(parent);
+ fCollectors.add(collector);
+ fAdapaters.add(adapter);
+ }
+ }
+ if (progressService == null) {
+ fFetchJob.schedule();
+ } else {
+ progressService.schedule(fFetchJob);
+ }
+ }
+
+ /**
+ * Provides an optimized lookup for determining if an element has children. This is required because
+ * elements that are populated lazilly can't answer <code>getChildren</code> just to determine the
+ * potential for children. Throw an AssertionFailedException if element is null.
+ *
+ * @param element
+ * The Object being tested. This should not be <code>null</code>.
+ * @return boolean <code>true</code> if there are potentially children.
+ * @throws RuntimeException
+ * if the element is null.
+ */
+ public boolean mayHaveChildren(Object element) {
+ // Assert.isNotNull(element, ProgressMessages.DeferredTreeContentManager_NotDeferred);
+ IDeferredWorkbenchAdapter adapter = getAdapter(element);
+ return adapter != null && adapter.isContainer();
+ }
+
+ /**
+ * Cancels any content this provider is currently fetching.
+ */
+ public void cancel() {
+ synchronized (fElementQueue) {
+ fFetchJob.cancel();
+ fElementQueue.clear();
+ fAdapaters.clear();
+ fCollectors.clear();
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeViewer.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeViewer.java
new file mode 100644
index 00000000000..b6ba5f44e79
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteTreeViewer.java
@@ -0,0 +1,423 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.eclipse.ui.progress.UIJob;
+
+public class RemoteTreeViewer extends TreeViewer {
+ private ExpansionJob fExpansionJob = null;
+ private SelectionJob fSelectionJob = null;
+
+ private class ExpansionJob extends UIJob {
+
+ private Object element;
+ private final List<Object> parents = new ArrayList<>(); // top down
+
+ /**
+ * Constructs a job to expand the given element.
+ *
+ */
+ public ExpansionJob() {
+ super("Expansion"); //$NON-NLS-1$
+ setPriority(Job.INTERACTIVE);
+ setSystem(true);
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (getControl().isDisposed() || element == null) {
+ return Status.OK_STATUS;
+ }
+ synchronized (RemoteTreeViewer.this) {
+ boolean allParentsExpanded = true;
+ Iterator<Object> iterator = parents.iterator();
+ while (iterator.hasNext() && !monitor.isCanceled()) {
+ Object parent = iterator.next();
+ Widget item = findItem(parent);
+ if (item != null) {
+ expandToLevel(parent, 1);
+ } else {
+ allParentsExpanded = false;
+ break;
+ }
+ }
+ if (allParentsExpanded) {
+ Widget item = findItem(element);
+ if (item != null) {
+ if (isExpandable(element)) {
+ expandToLevel(element, 1);
+ }
+ element = null;
+ parents.clear();
+ return Status.OK_STATUS;
+ }
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ public void validate(Object object) {
+ if (element != null) {
+ if (element.equals(object) || parents.contains(object)) {
+ cancel();
+ element = null;
+ }
+ }
+ }
+
+ public void setDeferredExpansion(Object toExpand) {
+ element = toExpand;
+ parents.clear();
+ addAllParents(parents, element);
+ }
+
+ }
+
+ private class SelectionJob extends UIJob {
+
+ private IStructuredSelection selection;
+ private Object first;
+ private final List<Object> parents = new ArrayList<>(); // top down
+
+ /**
+ * Constucts a job to select the given element.
+ */
+ public SelectionJob() {
+ super("Selection"); //$NON-NLS-1$
+ setPriority(Job.INTERACTIVE);
+ setSystem(true);
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (getControl().isDisposed() || selection == null) {
+ return Status.OK_STATUS;
+ }
+ synchronized (RemoteTreeViewer.this) {
+ boolean allParentsExpanded = true;
+ Iterator<Object> iterator = parents.iterator();
+ while (iterator.hasNext() && !monitor.isCanceled()) {
+ Object parent = iterator.next();
+ Widget item = findItem(parent);
+ if (item != null) {
+ expandToLevel(parent, 1);
+ } else {
+ allParentsExpanded = false;
+ break;
+ }
+ }
+ if (allParentsExpanded) {
+ if (findItem(first) != null) {
+ setSelection(selection, true);
+ selection = null;
+ first = null;
+ parents.clear();
+ return Status.OK_STATUS;
+ }
+ }
+
+ return Status.OK_STATUS;
+ }
+ }
+
+ public void setDeferredSelection(IStructuredSelection sel) {
+ selection = sel;
+ first = selection.getFirstElement();
+ parents.clear();
+ addAllParents(parents, first);
+ }
+
+ public void validate(Object object) {
+ if (first != null) {
+ if (first.equals(object) || parents.contains(object)) {
+ cancel();
+ selection = null;
+ }
+ }
+ }
+ }
+
+ /**
+ * Constructs a remote tree viewer parented by the given composite.
+ *
+ * @param parent
+ * parent composite
+ */
+ public RemoteTreeViewer(Composite parent) {
+ super(parent);
+ addDisposeListener();
+ fExpansionJob = new ExpansionJob();
+ fSelectionJob = new SelectionJob();
+ }
+
+ /**
+ * Constructs a remote tree viewer parented by the given composite
+ * with the given style.
+ *
+ * @param parent
+ * parent composite
+ * @param style
+ * style bits
+ */
+ public RemoteTreeViewer(Composite parent, int style) {
+ super(parent, style);
+ addDisposeListener();
+ fExpansionJob = new ExpansionJob();
+ fSelectionJob = new SelectionJob();
+ }
+
+ /**
+ * Constructs a remote tree viewer with the given tree.
+ *
+ * @param tree
+ * tree widget
+ */
+ public RemoteTreeViewer(Tree tree) {
+ super(tree);
+ addDisposeListener();
+ fExpansionJob = new ExpansionJob();
+ fSelectionJob = new SelectionJob();
+ }
+
+ private void addDisposeListener() {
+ getControl().addDisposeListener(new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ cancelJobs();
+ }
+ });
+ }
+
+ protected void runDeferredUpdates() {
+ if (fExpansionJob != null) {
+ fExpansionJob.schedule();
+ }
+ if (fSelectionJob != null) {
+ fSelectionJob.schedule();
+ }
+ }
+
+ /**
+ * The given element is being removed from the tree. Cancel
+ * any deferred updates for the element.
+ *
+ * @param element
+ */
+ protected void validateDeferredUpdates(Object element) {
+ if (element != null) {
+ if (fExpansionJob != null) {
+ fExpansionJob.validate(element);
+ }
+ if (fSelectionJob != null) {
+ fSelectionJob.validate(element);
+ }
+ }
+ }
+
+ @Override
+ public synchronized void add(Object parentElement, Object childElement) {
+ super.add(parentElement, childElement);
+ runDeferredUpdates();
+ }
+
+ @Override
+ public synchronized void add(Object parentElement, Object... childElements) {
+ super.add(parentElement, childElements);
+ runDeferredUpdates();
+ }
+
+ @Override
+ public synchronized void remove(Object element) {
+ validateDeferredUpdates(element);
+ super.remove(element);
+ }
+
+ @Override
+ public synchronized void remove(Object... elements) {
+ for (Object element : elements) {
+ validateDeferredUpdates(element);
+ }
+ super.remove(elements);
+ }
+
+ /**
+ * Cancels any deferred updates currently scheduled/running.
+ */
+ public void cancelJobs() {
+ cancel(fSelectionJob);
+ cancel(fExpansionJob);
+ }
+
+ public synchronized void deferExpansion(Object element) {
+ TreeItem treeItem = (TreeItem) findItem(element);
+ if (treeItem == null) {
+ fExpansionJob.setDeferredExpansion(element);
+ fExpansionJob.schedule();
+ } else {
+ if (!getExpanded(treeItem)) {
+ fExpansionJob.setDeferredExpansion(element);
+ fExpansionJob.schedule();
+ }
+ }
+ }
+
+ public synchronized void deferSelection(IStructuredSelection selection) {
+ if (fSelectionJob == null) {
+ fSelectionJob = new SelectionJob();
+ }
+
+ fSelectionJob.setDeferredSelection(selection);
+ fSelectionJob.schedule();
+ }
+
+ public IStructuredSelection getDeferredSelection() {
+ if (fSelectionJob != null) {
+ return fSelectionJob.selection;
+ }
+ return null;
+ }
+
+ private void cancel(Job job) {
+ if (job != null) {
+ job.cancel();
+ }
+ }
+
+ private void addAllParents(List<Object> list, Object element) {
+ if (element instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) element;
+ IWorkbenchAdapter adapter = adaptable.getAdapter(IWorkbenchAdapter.class);
+ if (adapter != null) {
+ Object parent = adapter.getParent(element);
+ if (parent != null) {
+ list.add(0, parent);
+ addAllParents(list, parent);
+ }
+ }
+ }
+ }
+
+ @Override
+ public Object[] filter(Object[] elements) {
+ return super.filter(elements);
+ }
+
+ public Object[] getCurrentChildren(Object parent) {
+ Widget widget = findItem(parent);
+ if (widget != null) {
+ Item[] items = getChildren(widget);
+ Object[] children = new Object[items.length];
+ for (int i = 0; i < children.length; i++) {
+ Object data = items[i].getData();
+ if (data == null) {
+ return null;
+ }
+ children[i] = data;
+ }
+ return children;
+ }
+ return null;
+ }
+
+ public synchronized void prune(final Object parent, final int offset) {
+ Widget widget = findItem(parent);
+ if (widget != null) {
+ final Item[] currentChildren = getChildren(widget);
+ if (offset < currentChildren.length) {
+ preservingSelection(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = offset; i < currentChildren.length; i++) {
+ if (currentChildren[i].getData() != null) {
+ disassociate(currentChildren[i]);
+ }
+ currentChildren[i].dispose();
+ }
+ }
+ });
+ }
+ }
+ }
+
+ public synchronized void replace(final Object parent, final Object[] children, final int offset) {
+ preservingSelection(new Runnable() {
+ @Override
+ public void run() {
+ Widget widget = findItem(parent);
+ if (widget == null) {
+ add(parent, children);
+ } else {
+ Item[] currentChildren = getChildren(widget);
+ int pos = offset;
+ if (pos >= currentChildren.length) {
+ // append
+ add(parent, children);
+ } else {
+ // replace
+ for (int i = 0; i < children.length; i++) {
+ Object child = children[i];
+ if (pos < currentChildren.length) {
+ // replace
+ Item item = currentChildren[pos];
+ Object data = item.getData();
+ if (!child.equals(data)) {
+ // no need to cancel pending updates here, the child may have shifted up/down
+ internalRefresh(item, child, true, true);
+ } else {
+ // If it's the same child, the label/content may still have changed
+ doUpdateItem(item, child);
+ updatePlus(item, child);
+ }
+ } else {
+ // add
+ int numLeft = children.length - i;
+ if (numLeft > 1) {
+ Object[] others = new Object[numLeft];
+ System.arraycopy(children, i, others, 0, numLeft);
+ add(parent, others);
+ } else {
+ add(parent, child);
+ }
+ break;
+ }
+ pos++;
+ }
+ }
+ }
+ runDeferredUpdates();
+ }
+ });
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIImages.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIImages.java
new file mode 100644
index 00000000000..fba8c3ea091
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIImages.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2010,2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.Bundle;
+
+public class RemoteUIImages {
+
+ public static final IPath ICONS_PATH = new Path("icons"); //$NON-NLS-1$
+
+ private static final String NAME_PREFIX = RemoteUIPlugin.PLUGIN_ID + "."; //$NON-NLS-1$
+
+ private static ImageRegistry fgImageRegistry = new ImageRegistry();
+
+ private static final String T_ELCL = "elcl16"; //$NON-NLS-1$
+ private static final String T_DLCL = "dlcl16"; //$NON-NLS-1$
+ private static final String T_OVR = "ovr16"; //$NON-NLS-1$
+
+ /*
+ * Keys for images available from the plug-in image registry.
+ */
+ public static final String IMG_ELCL_UP_NAV = NAME_PREFIX + T_ELCL + ".up_nav.gif"; //$NON-NLS-1$
+ public static final String IMG_DLCL_UP_NAV = NAME_PREFIX + T_DLCL + ".up_nav.gif"; //$NON-NLS-1$
+ public static final String IMG_OVR_SYMLINK = NAME_PREFIX + T_OVR + ".symlink_ovr.gif"; //$NON-NLS-1$
+ public static final String IMG_ELCL_NEW_FOLDER = NAME_PREFIX + T_ELCL + ".new_folder.gif"; //$NON-NLS-1$
+ public static final String IMG_DLCL_NEW_FOLDER = NAME_PREFIX + T_DLCL + ".new_folder.gif"; //$NON-NLS-1$
+ public static final String IMG_DEFAULT_TYPE = NAME_PREFIX + "defaultType"; //$NON-NLS-1$
+
+ /*
+ * Set of predefined Image Descriptors.
+ */
+ public static final ImageDescriptor DESC_ELCL_UP_NAV = createManaged(T_ELCL, "up_nav.gif", IMG_ELCL_UP_NAV); //$NON-NLS-1$
+ public static final ImageDescriptor DESC_DLCL_UP_NAV = createManaged(T_DLCL, "up_nav.gif", IMG_ELCL_UP_NAV); //$NON-NLS-1$
+ public static final ImageDescriptor DESC_OVR_SYMLINK = createManaged(T_OVR, "symlink_ovr.gif", IMG_OVR_SYMLINK); //$NON-NLS-1$
+ public static final ImageDescriptor DESC_ELCL_NEW_FOLDER = createManaged(T_ELCL, "new_folder.gif", //$NON-NLS-1$
+ IMG_ELCL_NEW_FOLDER);
+ public static final ImageDescriptor DESC_DLCL_NEW_FOLDER = createManaged(T_DLCL, "new_folder.gif", //$NON-NLS-1$
+ IMG_DLCL_NEW_FOLDER);
+ public static final ImageDescriptor DESC_DEFAULT_TYPE = createManaged(ICONS_PATH.append("console.png"), //$NON-NLS-1$
+ IMG_DEFAULT_TYPE);
+
+ /**
+ * Returns the image managed under the given key in this registry.
+ *
+ * @param key
+ * the image's key
+ * @return the image managed under the given key
+ */
+ public static Image get(String key) {
+ return fgImageRegistry.get(key);
+ }
+
+ /**
+ * Returns the image descriptor for the given key in this registry. Might be called in a non-UI thread.
+ *
+ * @param key
+ * the image's key
+ * @return the image descriptor for the given key
+ */
+ public static ImageDescriptor getDescriptor(String key) {
+ return fgImageRegistry.getDescriptor(key);
+ }
+
+ /**
+ * Sets the three image descriptors for enabled, disabled, and hovered to an action. The actions
+ * are retrieved from the *lcl16 folders.
+ *
+ * @param action
+ * the action
+ * @param iconName
+ * the icon name
+ */
+ public static void setLocalImageDescriptors(IAction action, String iconName) {
+ setImageDescriptors(action, "lcl16", iconName); //$NON-NLS-1$
+ }
+
+ // ---- Helper methods to access icons on the file system --------------------------------------
+
+ private static void setImageDescriptors(IAction action, String type, String relPath) {
+ ImageDescriptor id = create("d" + type, relPath, false); //$NON-NLS-1$
+ if (id != null) {
+ action.setDisabledImageDescriptor(id);
+ }
+
+ /*
+ * id= create("c" + type, relPath, false); //$NON-NLS-1$
+ * if (id != null)
+ * action.setHoverImageDescriptor(id);
+ */
+
+ ImageDescriptor descriptor = create("e" + type, relPath, true); //$NON-NLS-1$
+ action.setHoverImageDescriptor(descriptor);
+ action.setImageDescriptor(descriptor);
+ }
+
+ private static ImageDescriptor createManaged(IPath path, String key) {
+ ImageDescriptor desc = createImageDescriptor(RemoteUIPlugin.getDefault().getBundle(), path, true);
+ fgImageRegistry.put(key, desc);
+ return desc;
+ }
+
+ private static ImageDescriptor createManaged(String prefix, String name, String key) {
+ ImageDescriptor image = create(prefix, name, true);
+ fgImageRegistry.put(key, image);
+ return image;
+ }
+
+ /*
+ * Creates an image descriptor for the given prefix and name in the JDT UI bundle. The path can
+ * contain variables like $NL$.
+ * If no image could be found, <code>useMissingImageDescriptor</code> decides if either
+ * the 'missing image descriptor' is returned or <code>null</code>.
+ * or <code>null</code>.
+ */
+ private static ImageDescriptor create(String prefix, String name, boolean useMissingImageDescriptor) {
+ IPath path = ICONS_PATH.append(prefix).append(name);
+ return createImageDescriptor(RemoteUIPlugin.getDefault().getBundle(), path, useMissingImageDescriptor);
+ }
+
+ /*
+ * Creates an image descriptor for the given path in a bundle. The path can contain variables
+ * like $NL$.
+ * If no image could be found, <code>useMissingImageDescriptor</code> decides if either
+ * the 'missing image descriptor' is returned or <code>null</code>.
+ * Added for 3.1.1.
+ */
+ public static ImageDescriptor createImageDescriptor(Bundle bundle, IPath path, boolean useMissingImageDescriptor) {
+ URL url = FileLocator.find(bundle, path, null);
+ if (url != null) {
+ return ImageDescriptor.createFromURL(url);
+ }
+ if (useMissingImageDescriptor) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ return null;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIPlugin.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIPlugin.java
new file mode 100644
index 00000000000..f41e885e268
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/RemoteUIPlugin.java
@@ -0,0 +1,104 @@
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class RemoteUIPlugin extends AbstractUIPlugin {
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.remote.ui"; //$NON-NLS-1$
+
+ // The shared instance
+ private static RemoteUIPlugin plugin;
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static RemoteUIPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get unique identifier for this plugin
+ *
+ * @since 7.0
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() == null) {
+ return PLUGIN_ID;
+ }
+ return getDefault().getBundle().getSymbolicName();
+ }
+
+ /**
+ * Generate a log message given an IStatus object
+ *
+ * @param status
+ * IStatus object
+ * @since 5.0
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Generate a log message
+ *
+ * @param msg
+ * message to log
+ * @since 5.0
+ */
+ public static void log(String msg) {
+ log(new Status(IStatus.ERROR, getDefault().getBundle().getSymbolicName(), IStatus.ERROR, msg, null));
+ }
+
+ /**
+ * Generate a log message for an exception
+ *
+ * @param e
+ * exception used to generate message
+ * @since 5.0
+ */
+ public static void log(Throwable e) {
+ log(new Status(IStatus.ERROR, getDefault().getBundle().getSymbolicName(), IStatus.ERROR,
+ Messages.PTPRemoteUIPlugin_3, e));
+ }
+
+ /**
+ * Return the OSGi service with the given service interface.
+ *
+ * @param service service interface
+ * @return the specified service or null if it's not registered
+ */
+ public static <T> T getService(Class<T> service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference<T> ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
+ /**
+ * The constructor
+ */
+ public RemoteUIPlugin() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/ServicePropertyTester.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/ServicePropertyTester.java
new file mode 100644
index 00000000000..5e230c62888
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/ServicePropertyTester.java
@@ -0,0 +1,59 @@
+package org.eclipse.remote.internal.ui;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+
+public class ServicePropertyTester extends PropertyTester {
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof IRemoteConnection) {
+ IRemoteConnection connection = (IRemoteConnection) receiver;
+ if (property.equals("hasConnectionTypeService")) { //$NON-NLS-1$
+ if (args.length > 0 && args[0] instanceof String) {
+ String serviceName = (String) args[0];
+ try {
+ Class<?> service = Class.forName(serviceName);
+ return connection.getConnectionType()
+ .hasService((Class<IRemoteConnectionType.Service>) service);
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+ } else if (property.equals("hasConnectionService")) { //$NON-NLS-1$
+ if (args.length > 0 && args[0] instanceof String) {
+ String serviceName = (String) args[0];
+ try {
+ Class<?> service = Class.forName(serviceName);
+ return connection.hasService((Class<IRemoteConnection.Service>) service);
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+ } else if (property.equals("canDelete")) { //$NON-NLS-1$
+ return connection.getConnectionType().canRemove();
+ } else if (property.equals("canOpen")) { //$NON-NLS-1$
+ IRemoteConnectionControlService controlService = connection
+ .getService(IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ return !connection.isOpen();
+ } else {
+ return false;
+ }
+ } else if (property.equals("canClose")) { //$NON-NLS-1$
+ IRemoteConnectionControlService controlService = connection
+ .getService(IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ return connection.isOpen();
+ } else {
+ return false;
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages.properties b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages.properties
new file mode 100644
index 00000000000..b9b7ca6feb5
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages.properties
@@ -0,0 +1,6 @@
+NewRemoteConnectionTypePage_LaunchTargetType=Connection Type
+NewRemoteConnectionTypePage_SelectTargetType=Select type of connection to create.
+NewRemoteConnectionWizard_0=Connection Type
+OpenTerminalHandler_OpenTerminalDesc=A real terminal would open now
+OpenTerminalHandler_OpenTerminalTitle=Open Terminal
+RemoteConnectionPropertyPage_ConnectionName=Connection Name:
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/Messages.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/Messages.java
new file mode 100644
index 00000000000..ff746b74b50
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/Messages.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.ui.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.remote.internal.ui.messages.messages"; //$NON-NLS-1$
+
+ public static String AbstractRemoteUIConnectionManager_Connection_Error;
+
+ public static String AbstractRemoteUIConnectionManager_Could_not_open_connection;
+
+ public static String ConnectionsPreferencePage_Add;
+
+ public static String ConnectionsPreferencePage_closed;
+
+ public static String ConnectionsPreferencePage_Close;
+
+ public static String ConnectionsPreferencePage_Confirm_Actions;
+
+ public static String ConnectionsPreferencePage_Connection_Name;
+
+ public static String ConnectionsPreferencePage_Edit;
+
+ public static String ConnectionsPreferencePage_Host;
+
+ public static String ConnectionsPreferencePage_open;
+
+ public static String ConnectionsPreferencePage_Open;
+
+ public static String ConnectionsPreferencePage_Remote_Services;
+
+ public static String ConnectionsPreferencePage_Remove;
+
+ public static String ConnectionsPreferencePage_Status;
+
+ public static String ConnectionsPreferencePage_There_are_unsaved_changes;
+
+ public static String ConnectionsPreferencePage_This_connection_contains_unsaved_changes;
+
+ public static String ConnectionsPreferencePage_User;
+
+ public static String LocalUIConnectionManager_0;
+ public static String LocalUIConnectionManager_1;
+ public static String LocalUIConnectionManager_2;
+ public static String LocalUIConnectionManager_3;
+
+ public static String PendingUpdateAdapter_Pending;
+
+ public static String PTPRemoteUIPlugin_3;
+ public static String PTPRemoteUIPlugin_4;
+
+ public static String RemoteConnectionWidget_Connection_Type;
+ public static String RemoteConnectionWidget_Connection_Name;
+ public static String RemoteConnectionWidget_Local;
+ public static String RemoteConnectionWidget_New;
+ public static String RemoteConnectionWidget_Remote;
+ public static String RemoteConnectionWidget_selectConnection;
+ public static String RemoteConnectionWidget_selectConnectionType;
+
+ public static String RemoteDevelopmentPreferencePage_Default_connection_type;
+
+ public static String RemoteDirectoryWidget_0;
+ public static String RemoteDirectoryWidget_1;
+ public static String RemoteDirectoryWidget_2;
+ public static String RemoteDirectoryWidget_3;
+
+ public static String RemoteFileWidget_Browse;
+
+ public static String RemoteFileWidget_File;
+
+ public static String RemoteFileWidget_Restore_Default;
+
+ public static String RemoteFileWidget_Select_File;
+
+ public static String RemoteResourceBrowser_resourceTitle;
+ public static String RemoteResourceBrowser_fileTitle;
+ public static String RemoteResourceBrowser_directoryTitle;
+ public static String RemoteResourceBrowser_resourceLabel;
+ public static String RemoteResourceBrowser_fileLabel;
+ public static String RemoteResourceBrowser_directoryLabel;
+ public static String RemoteResourceBrowser_connectonLabel;
+ public static String RemoteResourceBrowser_newConnection;
+ public static String RemoteResourceBrowser_NewFolder;
+ public static String RemoteResourceBrowser_Show_hidden_files;
+ public static String RemoteResourceBrowser_UpOneLevel;
+
+ public static String RemoteResourceBrowserWidget_0;
+
+ public static String RemoteResourceBrowserWidget_1;
+
+ public static String RemoteResourceBrowserWidget_2;
+
+ public static String RemoteResourceBrowserWidget_3;
+
+ public static String RemoteResourceBrowserWidget_4;
+
+ public static String RemoteResourceBrowserWidget_New_Folder;
+
+ public static String RemoteResourceBrowserWidget_Unable_to_create_new_folder;
+
+ public static String RemoteUIServices_Configuring_remote_services;
+
+ public static String RemoteUIServicesProxy_1;
+ public static String RemoteUIServicesProxy_2;
+
+ public static String CloseConnectionHandler_0;
+ public static String CloseConnectionHandler_1;
+ public static String DeleteRemoteConnectionHandler_ConfirmDeleteMessage;
+ public static String DeleteRemoteConnectionHandler_DeleteConnectionTitle;
+ public static String OpenConnectionHandler_0;
+ public static String OpenConnectionHandler_1;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties
new file mode 100644
index 00000000000..5bf83a33ab2
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/messages/messages.properties
@@ -0,0 +1,77 @@
+###############################################################################
+# Copyright (c) 2007 IBM Corporation and others.
+#
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+AbstractRemoteUIConnectionManager_Could_not_open_connection=Could not open connection
+AbstractRemoteUIConnectionManager_Connection_Error=Connection Error
+ConnectionsPreferencePage_Add=Add
+ConnectionsPreferencePage_Close=Close
+ConnectionsPreferencePage_closed=closed
+ConnectionsPreferencePage_Confirm_Actions=Confirm Actions
+ConnectionsPreferencePage_Connection_Name=Connection Name
+ConnectionsPreferencePage_Edit=Edit
+ConnectionsPreferencePage_Host=Host
+ConnectionsPreferencePage_open=open
+ConnectionsPreferencePage_Open=Open
+ConnectionsPreferencePage_Remote_Services=Remote Services:
+ConnectionsPreferencePage_Remove=Remove
+ConnectionsPreferencePage_Status=Status
+ConnectionsPreferencePage_There_are_unsaved_changes=There are unsaved changes that must be saved before proceeding. Do you wish to save the changes?
+ConnectionsPreferencePage_This_connection_contains_unsaved_changes=This connection contains unsaved changes which must be saved before the connection can be opened. Do you wish to save the changes?
+ConnectionsPreferencePage_User=User
+LocalUIConnectionManager_0=Connection Error
+LocalUIConnectionManager_1=Could not open connection
+LocalUIConnectionManager_2=Can not create local connection
+LocalUIConnectionManager_3=It is not possible to create a connection for the local connection provider. Select a different remote provider first.
+PendingUpdateAdapter_Pending=Pending...
+PTPRemoteUIPlugin_3=Internal Error
+PTPRemoteUIPlugin_4=Initializing remote services
+RemoteConnectionWidget_Connection_Type=Connection Type:
+RemoteConnectionWidget_Connection_Name=Connection name:
+RemoteConnectionWidget_Local=Local
+RemoteConnectionWidget_New=New...
+RemoteConnectionWidget_Remote=Remote
+RemoteConnectionWidget_selectConnection=Please select a connection
+RemoteConnectionWidget_selectConnectionType=Please select a connection type
+RemoteDevelopmentPreferencePage_Default_connection_type=Default connection type
+RemoteDirectoryWidget_0=Select Directory
+RemoteDirectoryWidget_1=Directory:
+RemoteDirectoryWidget_2=Browse...
+RemoteDirectoryWidget_3=Restore Default
+RemoteFileWidget_Browse=Browse...
+RemoteFileWidget_File=File:
+RemoteFileWidget_Restore_Default=Restore Default
+RemoteFileWidget_Select_File=Select File
+RemoteResourceBrowser_resourceTitle=Browse Resource
+RemoteResourceBrowser_fileTitle=Browse File
+RemoteResourceBrowser_directoryTitle=Browse Directory
+RemoteResourceBrowser_resourceLabel=Selected resource:
+RemoteResourceBrowser_fileLabel=Selected file:
+RemoteResourceBrowser_directoryLabel=Selected directory:
+RemoteResourceBrowser_connectonLabel=Connection:
+RemoteResourceBrowser_newConnection=New...
+RemoteResourceBrowser_NewFolder=New folder
+RemoteResourceBrowser_Show_hidden_files=Show hidden files
+RemoteResourceBrowser_UpOneLevel=Up one level
+RemoteResourceBrowserWidget_0=validate input
+RemoteResourceBrowserWidget_1=Enter Folder Name
+RemoteResourceBrowserWidget_2=Folder name:
+RemoteResourceBrowserWidget_3=Folder already exists
+RemoteResourceBrowserWidget_4=Please enter a folder name
+RemoteResourceBrowserWidget_New_Folder=New Folder
+RemoteResourceBrowserWidget_Unable_to_create_new_folder=Unable to create new folder
+RemoteUIServices_Configuring_remote_services=Configuring remote services...
+RemoteUIServicesProxy_1=Missing {0} attribute
+RemoteUIServicesProxy_2=Failed to instantiate factory: {0} in type: {1} in plugin: {2}
+CloseConnectionHandler_0=Closing connections
+CloseConnectionHandler_1=Error closing connections
+DeleteRemoteConnectionHandler_ConfirmDeleteMessage=Delete connection
+DeleteRemoteConnectionHandler_DeleteConnectionTitle=Delete Connection
+OpenConnectionHandler_0=Opening connections
+OpenConnectionHandler_1=Error opening connections
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/ConnectionsPreferencePage.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/ConnectionsPreferencePage.java
new file mode 100644
index 00000000000..4c92f021b68
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/ConnectionsPreferencePage.java
@@ -0,0 +1,631 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Patrick Tasse - [462499] set viewer comparator
+ * Bernd Hufmann - [462709] Display Host and User per connection
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.preferences;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemotePreferenceConstants;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.core.preferences.Preferences;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.remote.ui.widgets.RemoteConnectionWidget;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * This class implements a preference page which can be used to view a list of
+ * JSch connections, create new connections or to delete existing connections.
+ *
+ */
+public class ConnectionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ private class ConnectionContentProvider implements IStructuredContentProvider {
+
+ @Override
+ public void dispose() {
+ // Nothing to do
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return fWorkingCopies.values().toArray(new IRemoteConnection[fWorkingCopies.size()]);
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // Nothing to do
+ }
+
+ }
+
+ private class ConnectionLabelProvider implements ITableLabelProvider, ILabelProvider {
+
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ // Nothing to do
+ }
+
+ @Override
+ public void dispose() {
+ // Nothing to do
+ }
+
+ @Override
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, int columnIndex) {
+ IRemoteConnection connection = getOriginalIfClean((IRemoteConnection) element);
+ switch (columnIndex) {
+ case 0:
+ return connection.isOpen() ? Messages.ConnectionsPreferencePage_open
+ : Messages.ConnectionsPreferencePage_closed;
+ case 1:
+ return connection.getName();
+ case 2:
+ if (connection.hasService(IRemoteConnectionHostService.class)) {
+ return connection.getService(IRemoteConnectionHostService.class).getHostname();
+ }
+ break;
+ case 3:
+ if (connection.hasService(IRemoteConnectionHostService.class)) {
+ return connection.getService(IRemoteConnectionHostService.class).getUsername();
+ }
+ break;
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ @Override
+ public String getText(Object element) {
+ /*
+ * This interface is used by the default ViewerComparator.
+ */
+ IRemoteConnection connection = (IRemoteConnection) element;
+ return connection.getName();
+ }
+
+ @Override
+ public void removeListener(ILabelProviderListener listener) {
+ // Nothing to do
+ }
+
+ }
+
+ /**
+ * Handle widget selection events for this page
+ *
+ */
+ private class EventHandler extends SelectionAdapter {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object source;
+
+ source = e.getSource();
+ if (source == fAddButton) {
+ addConnection();
+ } else if (source == fEditButton) {
+ editConnection();
+ } else if (source == fRemoveButton) {
+ removeConnections();
+ } else if (source == fOpenButton) {
+ toggleConnection();
+ } else if (source == fCloseButton) {
+ toggleConnection();
+ } else if (source == fConnectionTable) {
+ selectConnection();
+ } else if (source == fServicesCombo) {
+ String id = fServiceIDs[fServicesCombo.getSelectionIndex()];
+ selectServices(id);
+ }
+ }
+
+ }
+
+ private final String[] fTableColumnHeaders = { Messages.ConnectionsPreferencePage_Status,
+ Messages.ConnectionsPreferencePage_Connection_Name, Messages.ConnectionsPreferencePage_Host,
+ Messages.ConnectionsPreferencePage_User };
+
+ private final ColumnLayoutData[] fTableColumnLayouts = { new ColumnWeightData(15), new ColumnWeightData(35),
+ new ColumnWeightData(30), new ColumnWeightData(20) };
+
+ private Combo fServicesCombo;
+ private Button fAddButton;
+ private Button fEditButton;
+ private Button fRemoveButton;
+ private Button fOpenButton;
+ private Button fCloseButton;
+ private Table fConnectionTable;
+ private TableViewer fConnectionViewer;
+ private EventHandler fEventHandler;
+
+ private String[] fServiceIDs;
+ private boolean fIsDirty;
+ private IRemoteConnection fSelectedConnection;
+ private IRemoteConnectionType fConnectionType;
+ private IRemoteUIConnectionService fUIConnectionManager;
+
+ private final Map<String, IRemoteConnection> fWorkingCopies = new HashMap<>();
+
+ private static final String DEFAULT_CONNECTION_NAME = "Remote Host"; //$NON-NLS-1$
+
+ public ConnectionsPreferencePage() {
+ super();
+ }
+
+ public ConnectionsPreferencePage(String title) {
+ super(title);
+ }
+
+ public ConnectionsPreferencePage(String title, ImageDescriptor image) {
+ super(title, image);
+ }
+
+ /**
+ * Add a new connection
+ */
+ private void addConnection() {
+ if (fIsDirty) {
+ MessageDialog dialog = new MessageDialog(getShell(), Messages.ConnectionsPreferencePage_Confirm_Actions,
+ null, Messages.ConnectionsPreferencePage_There_are_unsaved_changes, MessageDialog.QUESTION,
+ new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL }, 0);
+ if (dialog.open() == 1) {
+ return;
+ }
+ performOk();
+ }
+ if (fUIConnectionManager != null) {
+ IRemoteUIConnectionWizard wizard = fUIConnectionManager.getConnectionWizard(getShell());
+ if (wizard != null) {
+ wizard.setConnectionName(initialConnectionName());
+ wizard.setInvalidConnectionNames(invalidConnectionNames());
+ IRemoteConnectionWorkingCopy conn = wizard.open();
+ if (conn != null) {
+ fWorkingCopies.put(conn.getName(), conn);
+ if (!fConnectionViewer.getTable().isDisposed()) {
+ fConnectionViewer.refresh();
+ }
+ fIsDirty = true;
+ }
+ }
+ }
+ }
+
+ /**
+ * Create the contents for this page
+ *
+ * @param parent
+ * - The parent widget for the client area
+ */
+ @Override
+ protected Control createContents(Composite parent) {
+ return createWidgets(parent);
+ }
+
+ /**
+ * Create the widgets for this page
+ *
+ * @param parent
+ * The parent widget for the client area
+ * @return
+ */
+ private Control createWidgets(Composite parent) {
+ fEventHandler = new EventHandler();
+
+ Composite selectComp = new Composite(parent, SWT.NONE);
+ selectComp.setLayout(new GridLayout(2, false));
+ selectComp.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+
+ Label label = new Label(selectComp, SWT.NONE);
+ label.setText(Messages.ConnectionsPreferencePage_Remote_Services);
+ label.setLayoutData(new GridData());
+ fServicesCombo = new Combo(selectComp, SWT.READ_ONLY);
+ label.setLayoutData(new GridData());
+
+ IRemoteServicesManager manager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ List<IRemoteConnectionType> services = manager.getRemoteConnectionTypes();
+ String[] names = new String[services.size()];
+ fServiceIDs = new String[services.size()];
+ {
+ int i = 0;
+ for (IRemoteConnectionType s : services) {
+ names[i] = s.getName();
+ fServiceIDs[i] = s.getId();
+ i++;
+ }
+ }
+ fServicesCombo.addSelectionListener(fEventHandler);
+ fServicesCombo.setItems(names);
+
+ Composite preferencePane = new Composite(parent, SWT.NONE);
+ preferencePane.setLayout(new GridLayout(2, false));
+
+ fConnectionTable = new Table(preferencePane, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.widthHint = 425;
+ data.heightHint = fConnectionTable.getItemHeight();
+ data.horizontalSpan = 1;
+ fConnectionTable.setLayoutData(data);
+ fConnectionTable.setFont(parent.getFont());
+ fConnectionTable.addSelectionListener(fEventHandler);
+ fConnectionTable.addMouseListener(new MouseListener() {
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ if (fSelectedConnection != null) {
+ IRemoteConnection original = getOriginalIfClean(fSelectedConnection);
+ if (original.isOpen()) {
+ editConnection();
+ }
+ }
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ // Nothing
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ // Nothing
+ }
+ });
+
+ TableLayout tableLayout = new TableLayout();
+ fConnectionTable.setLayout(tableLayout);
+ fConnectionTable.setHeaderVisible(true);
+ fConnectionTable.setLinesVisible(true);
+
+ for (int i = 0; i < fTableColumnHeaders.length; i++) {
+ tableLayout.addColumnData(fTableColumnLayouts[i]);
+ TableColumn column = new TableColumn(fConnectionTable, SWT.NONE, i);
+ column.setResizable(fTableColumnLayouts[i].resizable);
+ column.setText(fTableColumnHeaders[i]);
+ }
+ fConnectionViewer = new TableViewer(fConnectionTable);
+ fConnectionViewer.setContentProvider(new ConnectionContentProvider());
+ fConnectionViewer.setLabelProvider(new ConnectionLabelProvider());
+ fConnectionViewer.setComparator(new ViewerComparator());
+ fConnectionViewer.setInput(this);
+
+ Composite buttonPane = new Composite(preferencePane, SWT.NONE);
+ buttonPane.setLayout(new GridLayout(1, false));
+ buttonPane.setLayoutData(new GridData(GridData.FILL_VERTICAL));
+ buttonPane.setFont(preferencePane.getFont());
+
+ fAddButton = new Button(buttonPane, SWT.PUSH);
+ setButtonLayoutData(fAddButton);
+ fAddButton.setText(Messages.ConnectionsPreferencePage_Add);
+ fAddButton.addSelectionListener(fEventHandler);
+ fEditButton = new Button(buttonPane, SWT.PUSH);
+ setButtonLayoutData(fEditButton);
+ fEditButton.setText(Messages.ConnectionsPreferencePage_Edit);
+ fEditButton.addSelectionListener(fEventHandler);
+ fEditButton.setEnabled(false);
+ fRemoveButton = new Button(buttonPane, SWT.PUSH);
+ setButtonLayoutData(fRemoveButton);
+ fRemoveButton.setText(Messages.ConnectionsPreferencePage_Remove);
+ fRemoveButton.addSelectionListener(fEventHandler);
+ fRemoveButton.setEnabled(false);
+ fOpenButton = new Button(buttonPane, SWT.PUSH);
+ setButtonLayoutData(fOpenButton);
+ fOpenButton.setText(Messages.ConnectionsPreferencePage_Open);
+ fOpenButton.addSelectionListener(fEventHandler);
+ fOpenButton.setEnabled(false);
+ fCloseButton = new Button(buttonPane, SWT.PUSH);
+ setButtonLayoutData(fCloseButton);
+ fCloseButton.setText(Messages.ConnectionsPreferencePage_Close);
+ fCloseButton.addSelectionListener(fEventHandler);
+ fCloseButton.setEnabled(false);
+
+ if (fServiceIDs.length > 0) {
+ String id = Preferences.getString(IRemotePreferenceConstants.PREF_CONNECTION_TYPE_ID);
+ if ("".equals(id)) { //$NON-NLS-1$
+ id = fServiceIDs[0];
+ }
+ for (int i = 0; i < fServiceIDs.length; i++) {
+ if (id.equals(fServiceIDs[i])) {
+ fServicesCombo.select(i);
+ }
+ }
+ selectServices(id);
+ }
+
+ return preferencePane;
+ }
+
+ /**
+ * Edit an existing service configuration
+ */
+ private void editConnection() {
+ if (fSelectedConnection != null) {
+ IRemoteConnectionWorkingCopy copy;
+ if (fSelectedConnection instanceof IRemoteConnectionWorkingCopy) {
+ copy = (IRemoteConnectionWorkingCopy) fSelectedConnection;
+ } else {
+ copy = fSelectedConnection.getWorkingCopy();
+ }
+ IRemoteUIConnectionWizard wizard = fUIConnectionManager.getConnectionWizard(getShell());
+ if (wizard != null) {
+ wizard.setConnection(copy);
+ wizard.setInvalidConnectionNames(invalidConnectionNames());
+ IRemoteConnectionWorkingCopy conn = wizard.open();
+ if (conn != null && conn.isDirty()) {
+ fWorkingCopies.put(copy.getName(), copy);
+ fConnectionViewer.refresh();
+ fIsDirty = true;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void init(IWorkbench workbench) {
+ // Do nothing
+ }
+
+ private String initialConnectionName() {
+ String name = RemoteConnectionWidget.DEFAULT_CONNECTION_NAME;
+ int count = 2;
+ while (fWorkingCopies.containsKey(name)) {
+ name = DEFAULT_CONNECTION_NAME + " " + count++; //$NON-NLS-1$
+ }
+ return name;
+ }
+
+ private void initWorkingConnections() {
+ fWorkingCopies.clear();
+ for (IRemoteConnection conn : fConnectionType.getConnections()) {
+ fWorkingCopies.put(conn.getName(), conn);
+ }
+ }
+
+ private Set<String> invalidConnectionNames() {
+ return fWorkingCopies.keySet();
+ }
+
+ @Override
+ protected void performDefaults() {
+ initWorkingConnections();
+ fIsDirty = false;
+ fConnectionViewer.refresh();
+ super.performDefaults();
+ }
+
+ /**
+ * Delete service configurations when Ok button is pressed
+ *
+ * @return Status from superclass indicating if Ok processing is to continue
+ */
+ @Override
+ public boolean performOk() {
+ if (fIsDirty) {
+ updateConnections();
+ fIsDirty = false;
+ }
+ return super.performOk();
+ }
+
+ /**
+ * Remove the selected service configuration from the set of service
+ * configurations
+ */
+ private void removeConnections() {
+ TableItem[] items = fConnectionTable.getSelection();
+ if (items.length > 0) {
+ for (TableItem item : items) {
+ fWorkingCopies.remove(((IRemoteConnection) item.getData()).getName());
+ }
+ fConnectionViewer.refresh();
+ fIsDirty = true;
+ fConnectionTable.deselectAll();
+ fSelectedConnection = null;
+ }
+ updateEnablement();
+ }
+
+ /**
+ * Record the selected connection and enable the buttons.
+ */
+ private void selectConnection() {
+ TableItem[] selection = fConnectionTable.getSelection();
+ if (selection.length > 0) {
+ fSelectedConnection = (IRemoteConnection) selection[0].getData();
+ } else {
+ fSelectedConnection = null;
+ }
+ updateEnablement();
+ }
+
+ private void selectServices(String id) {
+ IRemoteServicesManager manager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ fConnectionType = manager.getConnectionType(id);
+ if (fConnectionType != null) {
+ fUIConnectionManager = fConnectionType.getService(IRemoteUIConnectionService.class);
+ initWorkingConnections();
+ fConnectionViewer.refresh();
+ fAddButton.setEnabled(fConnectionType.canAdd());
+ }
+ fIsDirty = false;
+ }
+
+ /**
+ * Toggle the connection
+ */
+ private void toggleConnection() {
+ TableItem[] items = fConnectionTable.getSelection();
+ if (items.length > 0) {
+ IRemoteConnection conn = getOriginalIfClean((IRemoteConnection) items[0].getData());
+ if (conn.hasService(IRemoteConnectionControlService.class) && conn.isOpen()) {
+ conn.close();
+ } else {
+ if (conn instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) conn;
+ if (wc.isDirty()) {
+ MessageDialog dialog = new MessageDialog(getShell(),
+ Messages.ConnectionsPreferencePage_Confirm_Actions, null,
+ Messages.ConnectionsPreferencePage_This_connection_contains_unsaved_changes,
+ MessageDialog.QUESTION,
+ new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL }, 0);
+ if (dialog.open() == 1) {
+ return;
+ }
+ try {
+ conn = wc.save();
+ } catch (RemoteConnectionException e) {
+ RemoteUIPlugin.log(e);
+ }
+ /*
+ * Replace working copy with original so that the correct version will be used in the future
+ */
+ fWorkingCopies.put(conn.getName(), conn);
+ }
+ }
+ IRemoteUIConnectionService mgr = conn.getConnectionType().getService(IRemoteUIConnectionService.class);
+ if (mgr != null) {
+ mgr.openConnectionWithProgress(getShell(), null, conn);
+ }
+ }
+ fConnectionViewer.refresh();
+ updateEnablement();
+ }
+ }
+
+ /**
+ * Update the connection manager with changes to the connections.
+ */
+ private void updateConnections() {
+ /*
+ * Remove any deleted connections
+ */
+ for (IRemoteConnection conn : fConnectionType.getConnections()) {
+ if (!fWorkingCopies.containsKey(conn.getName())
+ && (!conn.hasService(IRemoteConnectionControlService.class) || !conn.isOpen())) {
+ try {
+ fConnectionType.removeConnection(conn);
+ } catch (RemoteConnectionException e) {
+ // Ignore
+ }
+ }
+ }
+ /*
+ * Save any added/edited connections
+ */
+ for (IRemoteConnection conn : fWorkingCopies.values()) {
+ if (conn instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) conn;
+ if (wc.isDirty()) {
+ try {
+ wc.save();
+ } catch (RemoteConnectionException e) {
+ RemoteUIPlugin.log(e);
+ }
+ }
+ }
+ }
+ initWorkingConnections();
+ }
+
+ private void updateEnablement() {
+ fEditButton.setEnabled(false);
+ fRemoveButton.setEnabled(false);
+ fOpenButton.setEnabled(false);
+ fCloseButton.setEnabled(false);
+ if (fSelectedConnection != null) {
+ IRemoteConnection conn = getOriginalIfClean(fSelectedConnection);
+ if (conn.hasService(IRemoteConnectionControlService.class)) {
+ if (!conn.isOpen()) {
+ fEditButton.setEnabled(conn.getConnectionType().canEdit());
+ fRemoveButton.setEnabled(conn.getConnectionType().canRemove());
+ fOpenButton.setEnabled(true);
+ } else {
+ fCloseButton.setEnabled(true);
+ }
+ } else {
+ fEditButton.setEnabled(conn.getConnectionType().canEdit());
+ }
+ }
+ }
+
+ /**
+ * Get the original connection if the working copy is not dirty
+ *
+ * @param conn
+ * @return
+ */
+ private IRemoteConnection getOriginalIfClean(IRemoteConnection conn) {
+ if (conn instanceof IRemoteConnectionWorkingCopy) {
+ IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) conn;
+ if (!wc.isDirty()) {
+ return wc.getOriginal();
+ }
+ }
+ return conn;
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/PreferencesAdapter.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/PreferencesAdapter.java
new file mode 100644
index 00000000000..7649ef6dd05
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/PreferencesAdapter.java
@@ -0,0 +1,339 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.ui.preferences;
+
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.remote.internal.core.preferences.Preferences;
+
+/**
+ * Adapts {@link org.eclipse.core.runtime.IEclipsePreferences} to {@link org.eclipse.jface.preference.IPreferenceStore}
+ *
+ * @since 3.0
+ */
+public class PreferencesAdapter implements IPreferenceStore {
+
+ /**
+ * Property change listener. Listens for events of type
+ * {@link org.eclipse.core.runtime.IEclipsePreferences.PreferenceChangeEvent} and fires a
+ * {@link org.eclipse.jface.util.PropertyChangeEvent} on the adapter with arguments from the received event.
+ */
+ private class PreferenceChangeListener implements IPreferenceChangeListener {
+
+ /*
+ * @see org.eclipse.core.runtime.Preferences.IPropertyChangeListener# propertyChange
+ * (org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
+ */
+ @Override
+ public void preferenceChange(IEclipsePreferences.PreferenceChangeEvent event) {
+ firePropertyChangeEvent(event.getKey(), event.getOldValue(), event.getNewValue());
+ }
+ }
+
+ /** Listeners on the adapter */
+ private final ListenerList fListeners = new ListenerList(ListenerList.IDENTITY);
+
+ /** Listener on the adapted Preferences */
+ private final PreferenceChangeListener fListener = new PreferenceChangeListener();
+
+ /** True iff no events should be forwarded */
+ private boolean fSilent;
+
+ /** True if any preferences have changed */
+ private boolean fNeedsSaving = false;
+
+ /**
+ * Initialize with the given Preferences.
+ *
+ * @param preferences
+ * The preferences to wrap.
+ * @since 4.0
+ */
+ public PreferencesAdapter() {
+ Preferences.addPreferenceChangeListener(fListener);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void addPropertyChangeListener(IPropertyChangeListener listener) {
+ fListeners.add(listener);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void removePropertyChangeListener(IPropertyChangeListener listener) {
+ fListeners.remove(listener);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean contains(String name) {
+ return Preferences.contains(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
+ fNeedsSaving = true;
+ if (!fSilent) {
+ PropertyChangeEvent event = new PropertyChangeEvent(this, name, oldValue, newValue);
+ Object[] listeners = fListeners.getListeners();
+ for (Object listener : listeners) {
+ ((IPropertyChangeListener) listener).propertyChange(event);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean getBoolean(String name) {
+ return Preferences.getBoolean(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean getDefaultBoolean(String name) {
+ return Preferences.getDefaultBoolean(name, false);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public double getDefaultDouble(String name) {
+ return Preferences.getDefaultDouble(name, 0.0);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public float getDefaultFloat(String name) {
+ return Preferences.getDefaultFloat(name, 0.0f);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultInt(String name) {
+ return Preferences.getDefaultInt(name, 0);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public long getDefaultLong(String name) {
+ return Preferences.getDefaultLong(name, 0L);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getDefaultString(String name) {
+ return Preferences.getDefaultString(name, ""); //$NON-NLS-1$
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public double getDouble(String name) {
+ return Preferences.getDouble(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public float getFloat(String name) {
+ return Preferences.getFloat(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getInt(String name) {
+ return Preferences.getInt(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public long getLong(String name) {
+ return Preferences.getLong(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getString(String name) {
+ return Preferences.getString(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isDefault(String name) {
+ return Preferences.isDefault(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean needsSaving() {
+ return fNeedsSaving;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void putValue(String name, String value) {
+ try {
+ fSilent = true;
+ Preferences.setString(name, value);
+ } finally {
+ fSilent = false;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setDefault(String name, double value) {
+ Preferences.setDefaultDouble(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setDefault(String name, float value) {
+ Preferences.setDefaultFloat(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setDefault(String name, int value) {
+ Preferences.setDefaultInt(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setDefault(String name, long value) {
+ Preferences.setDefaultLong(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setDefault(String name, String defaultObject) {
+ Preferences.setDefaultString(name, defaultObject);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setDefault(String name, boolean value) {
+ Preferences.setDefaultBoolean(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setToDefault(String name) {
+ Preferences.setToDefault(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setValue(String name, double value) {
+ Preferences.setDouble(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setValue(String name, float value) {
+ Preferences.setFloat(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setValue(String name, int value) {
+ Preferences.setInt(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setValue(String name, long value) {
+ Preferences.setLong(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setValue(String name, String value) {
+ Preferences.setString(name, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setValue(String name, boolean value) {
+ Preferences.setBoolean(name, value);
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/RemoteDevelopmentPreferencePage.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/RemoteDevelopmentPreferencePage.java
new file mode 100644
index 00000000000..2026745f586
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/preferences/RemoteDevelopmentPreferencePage.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2012 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.remote.internal.ui.preferences;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.preference.ComboFieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemotePreferenceConstants;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @since 4.1
+ *
+ */
+public class RemoteDevelopmentPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
+
+ public RemoteDevelopmentPreferencePage() {
+ super(GRID);
+ setPreferenceStore(new PreferencesAdapter());
+ }
+
+ @Override
+ public void init(IWorkbench workbench) {
+ // Do nothing
+ }
+
+ @Override
+ protected void createFieldEditors() {
+ List<String[]> namesAndValues = new ArrayList<>();
+ String[] nameAndValue = new String[2];
+ nameAndValue[0] = "None"; //$NON-NLS-1$
+ nameAndValue[1] = ""; //$NON-NLS-1$
+ namesAndValues.add(nameAndValue);
+
+ IRemoteServicesManager manager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ for (IRemoteConnectionType service : manager.getRemoteConnectionTypes()) {
+ nameAndValue = new String[2];
+ nameAndValue[0] = service.getName();
+ nameAndValue[1] = service.getId();
+ namesAndValues.add(nameAndValue);
+ }
+ addField(new ComboFieldEditor(IRemotePreferenceConstants.PREF_CONNECTION_TYPE_ID,
+ Messages.RemoteDevelopmentPreferencePage_Default_connection_type,
+ namesAndValues.toArray(new String[namesAndValues.size()][2]), getFieldEditorParent()));
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIConnectionService.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIConnectionService.java
new file mode 100644
index 00000000000..80266678f35
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIConnectionService.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.services.local;
+
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.ui.AbstractRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.widgets.Shell;
+
+public class LocalUIConnectionService extends AbstractRemoteUIConnectionService {
+
+ private IRemoteConnectionType connectionType;
+
+ public LocalUIConnectionService(IRemoteConnectionType connectionType) {
+ this.connectionType = connectionType;
+ }
+
+ @Override
+ public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) {
+ // we don't do this
+ return null;
+ }
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (IRemoteUIConnectionService.class.equals(service)) {
+ return (T) new LocalUIConnectionService(connectionType);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileService.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileService.java
new file mode 100644
index 00000000000..683c3f7acf3
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/services/local/LocalUIFileService.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.services.local;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.ui.IRemoteUIFileService;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class LocalUIFileService implements IRemoteUIFileService {
+ private final IRemoteConnectionType connectionType;
+ private IRemoteConnection connection = null;
+
+ public LocalUIFileService(IRemoteConnectionType connectionType) {
+ this.connectionType = connectionType;
+ }
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (IRemoteUIFileService.class.equals(service)) {
+ return (T) new LocalUIFileService(connectionType);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+ @Override
+ public String browseDirectory(Shell shell, String message, String filterPath, int flags) {
+ DirectoryDialog dialog = new DirectoryDialog(shell);
+ dialog.setText(message);
+ if (filterPath != null) {
+ File path = new File(filterPath);
+ if (path.exists()) {
+ dialog.setFilterPath(path.isFile() ? path.getParent() : filterPath);
+ }
+ }
+
+ String path = dialog.open();
+ if (path == null) {
+ return null;
+ }
+
+ return path;
+ }
+
+ @Override
+ public String browseFile(Shell shell, String message, String filterPath, int flags) {
+ FileDialog dialog = new FileDialog(shell, SWT.SINGLE);
+ dialog.setText(message);
+ if (filterPath != null) {
+ File path = new File(filterPath);
+ if (path.exists()) {
+ dialog.setFilterPath(path.isFile() ? path.getParent() : filterPath);
+ }
+ }
+
+ String path = dialog.open();
+ if (path == null) {
+ return null;
+ }
+
+ return path;
+ }
+
+ @Override
+ public List<String> browseFiles(Shell shell, String message, String filterPath, int flags) {
+ FileDialog dialog = new FileDialog(shell, SWT.MULTI);
+ dialog.setText(message);
+ if (filterPath != null) {
+ File path = new File(filterPath);
+ if (path.exists()) {
+ dialog.setFilterPath(path.isFile() ? path.getParent() : filterPath);
+ }
+ }
+
+ String path = dialog.open();
+ if (path == null) {
+ return null;
+ }
+
+ return Arrays.asList(dialog.getFileNames());
+ }
+
+ @Override
+ public IRemoteConnection getConnection() {
+ return connection;
+ }
+
+ @Override
+ public void setConnection(IRemoteConnection connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ public void showConnections(boolean enable) {
+ // Not implemented
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/CloseConnectionHandler.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/CloseConnectionHandler.java
new file mode 100644
index 00000000000..2374eb95458
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/CloseConnectionHandler.java
@@ -0,0 +1,65 @@
+package org.eclipse.remote.internal.ui.views;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class CloseConnectionHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();
+ if (selection != null && selection instanceof IStructuredSelection) {
+ // Get the manageable connections from the selection
+ final List<IRemoteConnection> connections = new ArrayList<>();
+ @SuppressWarnings("unchecked")
+ Iterator<Object> i = ((IStructuredSelection) selection).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IRemoteConnection) {
+ IRemoteConnection connection = (IRemoteConnection) obj;
+ connections.add(connection);
+ }
+ }
+
+ new Job(Messages.CloseConnectionHandler_0) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ List<IStatus> status = new ArrayList<>();
+ for (IRemoteConnection connection : connections) {
+ IRemoteConnectionControlService controlService = connection
+ .getService(IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ controlService.close();
+ }
+ }
+
+ if (status.isEmpty()) {
+ return Status.OK_STATUS;
+ } else {
+ return new MultiStatus(RemoteUIPlugin.PLUGIN_ID, 1, status.toArray(new IStatus[status.size()]),
+ Messages.CloseConnectionHandler_1, null);
+ }
+ }
+ }.schedule();
+ }
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/DeleteRemoteConnectionHandler.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/DeleteRemoteConnectionHandler.java
new file mode 100644
index 00000000000..5b49b27e59a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/DeleteRemoteConnectionHandler.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.views;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class DeleteRemoteConnectionHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();
+ if (selection != null && selection instanceof IStructuredSelection) {
+ // Get the manageable connections from the selection
+ List<IRemoteConnection> connections = new ArrayList<>();
+ @SuppressWarnings("unchecked")
+ Iterator<Object> i = ((IStructuredSelection) selection).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IRemoteConnection) {
+ IRemoteConnection connection = (IRemoteConnection) obj;
+ IRemoteConnectionType connectionType = connection.getConnectionType();
+ if (connectionType.canRemove()) {
+ connections.add(connection);
+ }
+ }
+ }
+
+ // Confirm the delete
+ String message = Messages.DeleteRemoteConnectionHandler_ConfirmDeleteMessage;
+ for (IRemoteConnection connection : connections) {
+ message += " " + connection.getName(); //$NON-NLS-1$
+ }
+ message += "?"; //$NON-NLS-1$
+ if (MessageDialog.openConfirm(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.DeleteRemoteConnectionHandler_DeleteConnectionTitle, message)) {
+ for (IRemoteConnection connection : connections) {
+ IRemoteConnectionType connectionType = connection.getConnectionType();
+ try {
+ connectionType.removeConnection(connection);
+ } catch (RemoteConnectionException e) {
+ RemoteUIPlugin.log(e.getStatus());
+ }
+ }
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionHandler.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionHandler.java
new file mode 100644
index 00000000000..4d0b62b0ccf
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionHandler.java
@@ -0,0 +1,22 @@
+package org.eclipse.remote.internal.ui.views;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+public class NewRemoteConnectionHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ NewRemoteConnectionWizard wizard = new NewRemoteConnectionWizard();
+ Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ WizardDialog dialog = new WizardDialog(parent, wizard);
+ dialog.open();
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionTypePage.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionTypePage.java
new file mode 100644
index 00000000000..3e266a8e507
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionTypePage.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.views;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.ui.Messages;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @since 2.0 API tooling made me put this in even though it's an internal package...
+ */
+public class NewRemoteConnectionTypePage extends WizardPage {
+
+ private Table table;
+ private IRemoteUIConnectionWizard nextWizard;
+
+ public NewRemoteConnectionTypePage() {
+ super("NewLaunchTargetTypePage"); //$NON-NLS-1$
+ setTitle(Messages.NewRemoteConnectionTypePage_LaunchTargetType);
+ setDescription(Messages.NewRemoteConnectionTypePage_SelectTargetType);
+ }
+
+ public IRemoteUIConnectionWizard getNextWizard() {
+ return nextWizard;
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout());
+
+ table = new Table(comp, SWT.SINGLE | SWT.BORDER);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ table.setLayoutData(data);
+
+ setPageComplete(false);
+
+ IRemoteServicesManager remoteManager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ for (IRemoteConnectionType connectionType : remoteManager.getAllConnectionTypes()) {
+ if (!connectionType.canAdd())
+ continue;
+
+ IRemoteUIConnectionService connService = connectionType.getService(IRemoteUIConnectionService.class);
+ if (connService == null)
+ continue;
+
+ IRemoteUIConnectionWizard wizard = connService.getConnectionWizard(parent.getShell());
+ if (wizard == null)
+ continue;
+
+ TableItem item = new TableItem(table, SWT.NONE);
+ item.setText(connectionType.getName());
+ item.setData(wizard);
+
+ Image icon = connService.getLabelProvider().getImage(connectionType);
+ if (icon != null) {
+ item.setImage(icon);
+ }
+
+ // TODO select the last selected entry
+ table.select(0);
+ setPageComplete(true);
+ }
+
+ table.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ getContainer().showPage(getNextPage());
+ }
+ });
+
+ setControl(comp);
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return isPageComplete();
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ nextWizard = (IRemoteUIConnectionWizard) table.getSelection()[0].getData();
+ if (nextWizard != null) {
+ nextWizard.addPages();
+ IWizardPage[] pages = nextWizard.getPages();
+ if (pages.length > 0) {
+ return pages[0];
+ }
+ }
+
+ return super.getNextPage();
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionWizard.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionWizard.java
new file mode 100644
index 00000000000..320e1cc8926
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/NewRemoteConnectionWizard.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Doug Schaefer
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.views;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.ui.Messages;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+
+/**
+ * @since 2.0
+ */
+public class NewRemoteConnectionWizard extends Wizard {
+
+ private final NewRemoteConnectionTypePage typePage;
+
+ public NewRemoteConnectionWizard() {
+ setWindowTitle(Messages.NewRemoteConnectionWizard_0);
+ typePage = new NewRemoteConnectionTypePage();
+ setForcePreviousAndNextButtons(true);
+ }
+
+ @Override
+ public void addPages() {
+ addPage(typePage);
+ }
+
+ @Override
+ public boolean performFinish() {
+ IRemoteUIConnectionWizard nextWizard = typePage.getNextWizard();
+ if (nextWizard != null) {
+ IRemoteConnectionWorkingCopy wc = nextWizard.getConnection();
+ try {
+ wc.save();
+ } catch (RemoteConnectionException e) {
+ RemoteUIPlugin.log(e);
+ return false;
+ }
+ return true;
+ } else {
+ // what happened?
+ return false;
+ }
+ }
+
+ @Override
+ public boolean canFinish() {
+ // don't allow to finish since we need to activate actual connection wizard page
+ return false;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/OpenConnectionHandler.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/OpenConnectionHandler.java
new file mode 100644
index 00000000000..d9f368d2ea2
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/OpenConnectionHandler.java
@@ -0,0 +1,70 @@
+package org.eclipse.remote.internal.ui.views;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionControlService;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class OpenConnectionHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();
+ if (selection != null && selection instanceof IStructuredSelection) {
+ // Get the manageable connections from the selection
+ final List<IRemoteConnection> connections = new ArrayList<>();
+ @SuppressWarnings("unchecked")
+ Iterator<Object> i = ((IStructuredSelection) selection).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IRemoteConnection) {
+ IRemoteConnection connection = (IRemoteConnection) obj;
+ connections.add(connection);
+ }
+ }
+
+ new Job(Messages.OpenConnectionHandler_0) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ List<IStatus> status = new ArrayList<>();
+ for (IRemoteConnection connection : connections) {
+ IRemoteConnectionControlService controlService = connection
+ .getService(IRemoteConnectionControlService.class);
+ if (controlService != null) {
+ try {
+ controlService.open(monitor);
+ } catch (RemoteConnectionException e) {
+ status.add(e.getStatus());
+ }
+ }
+ }
+
+ if (status.isEmpty()) {
+ return Status.OK_STATUS;
+ } else {
+ return new MultiStatus(RemoteUIPlugin.PLUGIN_ID, 1, status.toArray(new IStatus[status.size()]),
+ Messages.OpenConnectionHandler_1, null);
+ }
+ }
+ }.schedule();
+ }
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionPropertyPage.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionPropertyPage.java
new file mode 100644
index 00000000000..3d886c1fd70
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionPropertyPage.java
@@ -0,0 +1,48 @@
+package org.eclipse.remote.internal.ui.views;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.internal.ui.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+public class RemoteConnectionPropertyPage extends PropertyPage {
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+
+ IRemoteConnection connection = null;
+ Object element = getElement();
+ if (element instanceof IRemoteConnection) {
+ connection = (IRemoteConnection) element;
+ } else if (element instanceof IAdaptable) {
+ connection = ((IAdaptable) element).getAdapter(IRemoteConnection.class);
+ }
+
+ if (connection != null) {
+ Label nameLabel = new Label(comp, SWT.NONE);
+ nameLabel.setText(Messages.RemoteConnectionPropertyPage_ConnectionName);
+
+ Text nameText = new Text(comp, SWT.BORDER);
+ nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ nameText.setText(connection.getName());
+ }
+
+ return comp;
+ }
+
+ @Override
+ public boolean performOk() {
+ // TODO, change the name if it needs changing
+ return true;
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsActionProvider.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsActionProvider.java
new file mode 100644
index 00000000000..1e09bb16f8c
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsActionProvider.java
@@ -0,0 +1,17 @@
+package org.eclipse.remote.internal.ui.views;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.window.SameShellProvider;
+import org.eclipse.ui.dialogs.PropertyDialogAction;
+import org.eclipse.ui.navigator.CommonActionProvider;
+
+public class RemoteConnectionsActionProvider extends CommonActionProvider {
+
+ @Override
+ public void fillContextMenu(IMenuManager menu) {
+ // Property menu
+ menu.add(new PropertyDialogAction(new SameShellProvider(getActionSite().getViewSite().getShell()),
+ getActionSite().getStructuredViewer()));
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsContentProvider.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsContentProvider.java
new file mode 100644
index 00000000000..eef7007c91a
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsContentProvider.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.views;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionChangeListener;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.RemoteConnectionChangeEvent;
+
+public class RemoteConnectionsContentProvider implements ITreeContentProvider, IRemoteConnectionChangeListener {
+
+ private IRemoteServicesManager remoteServicesManager;
+ private Viewer viewer;
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = viewer;
+
+ if (newInput instanceof IRemoteServicesManager) {
+ if (remoteServicesManager != null) {
+ // remove us as a listener on the old manager
+ remoteServicesManager.removeRemoteConnectionChangeListener(this);
+ }
+
+ remoteServicesManager = (IRemoteServicesManager) newInput;
+ remoteServicesManager.addRemoteConnectionChangeListener(this);
+ }
+ }
+
+ @Override
+ public void connectionChanged(RemoteConnectionChangeEvent event) {
+ // Refresh the viewer on the UI thread
+ viewer.getControl().getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ viewer.refresh();
+ }
+ });
+ }
+
+ @Override
+ public void dispose() {
+ if (remoteServicesManager != null) {
+ remoteServicesManager.removeRemoteConnectionChangeListener(this);
+ }
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return remoteServicesManager.getAllRemoteConnections().toArray();
+ }
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ // Connections have no children by default
+ return new Object[0];
+ }
+
+ @Override
+ public Object getParent(Object element) {
+ if (element instanceof IRemoteConnection) {
+ return remoteServicesManager;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ if (element instanceof IRemoteServicesManager) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsView.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsView.java
new file mode 100644
index 00000000000..4cc37197833
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/internal/ui/views/RemoteConnectionsView.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.internal.ui.views;
+
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.ui.navigator.CommonNavigator;
+
+public class RemoteConnectionsView extends CommonNavigator {
+
+ @Override
+ protected Object getInitialInput() {
+ // the remote services manager is the root object
+ return RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/AbstractRemoteUIConnectionService.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/AbstractRemoteUIConnectionService.java
new file mode 100644
index 00000000000..060716ad1ac
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/AbstractRemoteUIConnectionService.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.ui.RemoteUIImages;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Abstract base class for providing UI connection manager services.
+ * @since 2.0
+ */
+public abstract class AbstractRemoteUIConnectionService implements IRemoteUIConnectionService {
+
+ @Override
+ public void openConnectionWithProgress(final Shell shell, IRunnableContext context,
+ final IRemoteConnection connection) {
+ if (!connection.isOpen()) {
+ IRunnableWithProgress op = new IRunnableWithProgress() {
+ @Override
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ connection.open(monitor);
+ } catch (RemoteConnectionException e) {
+ throw new InvocationTargetException(e);
+ }
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+ }
+ };
+ try {
+ if (context != null) {
+ context.run(true, true, op);
+ } else {
+ new ProgressMonitorDialog(shell).run(true, true, op);
+ }
+ } catch (InvocationTargetException e) {
+ ErrorDialog.openError(shell, Messages.AbstractRemoteUIConnectionManager_Connection_Error,
+ Messages.AbstractRemoteUIConnectionManager_Could_not_open_connection,
+ new Status(IStatus.ERROR, RemoteUIPlugin.PLUGIN_ID, e.getCause().getMessage()));
+ } catch (InterruptedException e) {
+ ErrorDialog.openError(shell, Messages.AbstractRemoteUIConnectionManager_Connection_Error,
+ Messages.AbstractRemoteUIConnectionManager_Could_not_open_connection,
+ new Status(IStatus.ERROR, RemoteUIPlugin.PLUGIN_ID, e.getMessage()));
+ }
+ }
+ }
+
+ protected static class DefaultLabelProvider extends LabelProvider {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof IRemoteConnection) {
+ return ((IRemoteConnection) element).getName();
+ } else if (element instanceof IRemoteConnectionType) {
+ return ((IRemoteConnectionType) element).getName();
+ } else {
+ return super.getText(element);
+ }
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof IRemoteConnection || element instanceof IRemoteConnectionType) {
+ return RemoteUIImages.get(RemoteUIImages.IMG_DEFAULT_TYPE);
+ }
+ return super.getImage(element);
+ }
+ }
+
+ @Override
+ public ILabelProvider getLabelProvider() {
+ return new DefaultLabelProvider();
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionService.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionService.java
new file mode 100644
index 00000000000..ed71e543751
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionService.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui;
+
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Interface for providing connection management operations in the UI. Clients can call these methods to open generic dialogs for
+ * operations on connections.
+ * @since 2.0
+ */
+public interface IRemoteUIConnectionService extends IRemoteConnectionType.Service {
+
+ /**
+ * ID for the command to start the new connection wizard.
+ */
+ public static final String NEW_CONNECTION_COMMAND = "org.eclipse.remote.ui.command.newConnection"; //$NON-NLS-1$
+
+ /**
+ * Create a wizard for adding or editing connections. The implementation can choose to do this in any way, but typically will
+ * use a dialog or wizard.
+ *
+ * @param shell
+ * shell used to display dialogs
+ * @return connection wizard
+ */
+ public IRemoteUIConnectionWizard getConnectionWizard(Shell shell);
+
+ /**
+ * Attempt to open a connection using a progress monitor. Can be called on either open or closed connections, and will
+ * initialize the remote services if necessary. Users should check connection.isOpen() on return to determine if the connection
+ * was actually opened.
+ *
+ * @param shell
+ * shell used to display dialogs
+ * @param context
+ * runnable context for displaying progress indicator. Can be null.
+ * @param connection
+ * connection to open
+ */
+ public void openConnectionWithProgress(Shell shell, IRunnableContext context, IRemoteConnection connection);
+
+ /**
+ * Return the label provider that provides the text and base image for the connection type
+ * and connections of that type.
+ *
+ * @return label provider
+ */
+ public ILabelProvider getLabelProvider();
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionWizard.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionWizard.java
new file mode 100644
index 00000000000..895802a7456
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConnectionWizard.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui;
+
+import java.util.Set;
+
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+
+/**
+ * Interface for creating and editing connections in the UI.
+ */
+public interface IRemoteUIConnectionWizard extends IWizard {
+ /**
+ * Open configuration wizard allowing the user to enter information about a connection. If the user confirms the information is
+ * correct (e.g. selects OK in a dialog) then a working copy of the connection is returned. If the user discards the
+ * information, then null is returned.
+ *
+ * @return connection working copy or null if the wizard is canceled
+ */
+ IRemoteConnectionWorkingCopy open();
+
+ /**
+ * Get the connection being edited.
+ *
+ * @return connection being edited
+ * @since 2.0
+ */
+ IRemoteConnectionWorkingCopy getConnection();
+
+ /**
+ * Set a connection containing the information to be edited by the wizard. Setting this value overrides the
+ * {@link #setConnectionName(String)} method.
+ *
+ * @param connection
+ * connection used to initialize the wizard
+ */
+ void setConnection(IRemoteConnectionWorkingCopy connection);
+
+ /**
+ * Set the initial name of the connection.
+ *
+ * @param name
+ * initial connection name
+ */
+ void setConnectionName(String name);
+
+ /**
+ * Supply a set of connection names that are invalid. The dialog should display an error if the user trys to select a name from
+ * the set.
+ *
+ * @param names
+ * set of invalid connections names
+ */
+ void setInvalidConnectionNames(Set<String> names);
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConstants.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConstants.java
new file mode 100644
index 00000000000..d98140898ab
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIConstants.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui;
+
+/**
+ * Constants use by UI operations.
+ */
+public interface IRemoteUIConstants {
+ /**
+ * A constant indicating that no bits are set.
+ */
+ public static int NONE = 0;
+
+ /**
+ * A constant used to indicate a dialog used for opening files.
+ */
+ public static int OPEN = 1 << 1;
+
+ /**
+ * A constant used to indicate a dialog should be used for saving files.
+ */
+ public static int SAVE = 1 << 2;
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java
new file mode 100644
index 00000000000..cf4c5b6cb73
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/IRemoteUIFileService.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui;
+
+import java.util.List;
+
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+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 {
+ /**
+ * Browse for a remote directory. The return value is the path of the
+ * directory <i>on the remote system</i>.
+ *
+ * Equivalent to {@link org.eclipse.swt.widgets.DirectoryDialog}.
+ *
+ * @param shell
+ * workbench shell
+ * @param message
+ * message to display in dialog
+ * @param initialPath
+ * initial path to use when displaying files
+ * @param flags
+ * option settings for dialog (not currently used)
+ * valid values are NONE (@see IRemoteUIConstants)
+ * @return the path to the directory relative to the remote system or null
+ * if the browser was cancelled
+ */
+ public String browseDirectory(Shell shell, String message, String initialPath, int flags);
+
+ /**
+ * Browse for a remote file. The return value is the path of the file <i>on
+ * the remote system</i>.
+ *
+ * Equivalent to {@link org.eclipse.swt.widgets.FileDialog}.
+ *
+ * @param shell
+ * workbench shell
+ * @param message
+ * message to display in dialog
+ * @param initialPath
+ * initial path to use when displaying files
+ * @param flags
+ * options settings for dialog
+ * valid values are NONE, SAVE, or OPEN (@see IRemoteUIConstants)
+ * @return the path to the file relative to the remote system or null if the
+ * browser was cancelled
+ */
+
+ public String browseFile(Shell shell, String message, String initialPath, int flags);
+
+ /**
+ * Browse for a set of remote files. The return value is a list of paths
+ * of the files <i>on the remote system</i>.
+ *
+ * Equivalent to {@link org.eclipse.swt.widgets.FileDialog}.
+ *
+ * @param shell
+ * workbench shell
+ * @param message
+ * message to display in dialog
+ * @param initialPath
+ * initial path to use when displaying files
+ * @param flags
+ * options settings for dialog (@see IRemoteUIConstants)
+ * valid values are NONE, SAVE, or OPEN (@see IRemoteUIConstants)
+ * @return list of paths to the files relative to the remote system or null if the
+ * browser was cancelled
+ */
+ public List<String> browseFiles(Shell shell, String message, String initialPath, int flags);
+
+ /**
+ * Get the last connection that was selected in the browser.
+ *
+ * @return selected connection
+ */
+ public IRemoteConnection getConnection();
+
+ /**
+ * 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
+ */
+ public void setConnection(IRemoteConnection connection);
+
+ /**
+ * Show a list of available connections if possible.
+ *
+ * @param enable
+ * enable connection list
+ */
+ public void showConnections(boolean enable);
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteConnectionsLabelProvider.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteConnectionsLabelProvider.java
new file mode 100644
index 00000000000..2da75719b8f
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteConnectionsLabelProvider.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2015 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * QNX Software Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A label provider to show the test and base image for remote connections.
+ * It calls out to the connection type services to get the text and images for
+ * the types of the connections.
+ *
+ * @since 2.0
+ */
+public class RemoteConnectionsLabelProvider extends LabelProvider {
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof IRemoteConnection) {
+ IRemoteConnectionType type = ((IRemoteConnection) element).getConnectionType();
+ IRemoteUIConnectionService uiService = type.getService(IRemoteUIConnectionService.class);
+ if (uiService != null) {
+ return uiService.getLabelProvider().getText(element);
+ } else {
+ return ((IRemoteConnection) element).getName();
+ }
+ } else {
+ return super.getText(element);
+ }
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof IRemoteConnection) {
+ IRemoteConnection connection = (IRemoteConnection) element;
+ IRemoteConnectionType type = connection.getConnectionType();
+ IRemoteUIConnectionService uiService = type.getService(IRemoteUIConnectionService.class);
+ if (uiService != null) {
+ final Image baseImage = uiService.getLabelProvider().getImage(element);
+ if (connection.isOpen()) {
+ return baseImage;
+ } else {
+ String closedId = "closed." + type.getId(); //$NON-NLS-1$
+ Image closedImage = RemoteUIPlugin.getDefault().getImageRegistry().get(closedId);
+ if (closedImage == null) {
+ final Image errorImage = PlatformUI.getWorkbench().getSharedImages()
+ .getImage(ISharedImages.IMG_DEC_FIELD_ERROR);
+ ImageDescriptor desc = new CompositeImageDescriptor() {
+ @Override
+ protected Point getSize() {
+ Rectangle bounds = baseImage.getBounds();
+ return new Point(bounds.width, bounds.height);
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawImage(baseImage.getImageData(), 0, 0);
+ int y = baseImage.getBounds().height - errorImage.getBounds().height;
+ drawImage(errorImage.getImageData(), 0, y);
+ }
+ };
+ closedImage = desc.createImage();
+ RemoteUIPlugin.getDefault().getImageRegistry().put(closedId, closedImage);
+ }
+ return closedImage;
+ }
+ }
+ }
+ return super.getImage(element);
+ }
+
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteUIFileService.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteUIFileService.java
new file mode 100644
index 00000000000..85ef9158bcc
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/RemoteUIFileService.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.jface.window.Window;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionType.Service;
+import org.eclipse.remote.ui.dialogs.RemoteResourceBrowser;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @since 2.1
+ */
+public class RemoteUIFileService implements IRemoteUIFileService {
+ private final IRemoteConnectionType connectionType;
+ private IRemoteConnection connection = null;
+ private boolean showConnections = false;
+
+ public RemoteUIFileService(IRemoteConnectionType connectionType) {
+ this.connectionType = connectionType;
+ }
+
+ public static class Factory implements IRemoteConnectionType.Service.Factory {
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Service> T getService(IRemoteConnectionType connectionType, Class<T> service) {
+ if (IRemoteUIFileService.class.equals(service)) {
+ return (T) new RemoteUIFileService(connectionType);
+ }
+ return null;
+ }
+ }
+
+ @Override
+ public IRemoteConnectionType getConnectionType() {
+ return connectionType;
+ }
+
+ @Override
+ public String browseDirectory(Shell shell, String message, String filterPath, int flags) {
+ RemoteResourceBrowser browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setType(RemoteResourceBrowser.DIRECTORY_BROWSER);
+ browser.setInitialPath(filterPath);
+ browser.setTitle(message);
+ browser.showConnections(showConnections);
+ browser.setConnection(connection);
+ if (browser.open() == Window.CANCEL) {
+ return null;
+ }
+ connection = browser.getConnection();
+ IFileStore resource = browser.getResource();
+ if (resource == null) {
+ return null;
+ }
+ return resource.toURI().getPath();
+ }
+
+ @Override
+ public String browseFile(Shell shell, String message, String filterPath, int flags) {
+ RemoteResourceBrowser browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+ browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+ browser.setInitialPath(filterPath);
+ browser.setTitle(message);
+ browser.showConnections(showConnections);
+ browser.setConnection(connection);
+ if (browser.open() == Window.CANCEL) {
+ return null;
+ }
+ connection = browser.getConnection();
+ IFileStore resource = browser.getResource();
+ if (resource == null) {
+ return null;
+ }
+ return resource.toURI().getPath();
+ }
+
+ @Override
+ public List<String> browseFiles(Shell shell, String message, String filterPath, int flags) {
+ RemoteResourceBrowser browser = new RemoteResourceBrowser(shell, SWT.MULTI);
+ browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+ browser.setInitialPath(filterPath);
+ browser.setTitle(message);
+ browser.showConnections(showConnections);
+ browser.setConnection(connection);
+ if (browser.open() == Window.CANCEL) {
+ return null;
+ }
+ connection = browser.getConnection();
+ List<String> paths = new ArrayList<>();
+ for (IFileStore store : browser.getResources()) {
+ paths.add(store.toURI().getPath());
+ }
+ return paths;
+ }
+
+ @Override
+ public IRemoteConnection getConnection() {
+ return connection;
+ }
+
+ @Override
+ public void setConnection(IRemoteConnection connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ public void showConnections(boolean enable) {
+ showConnections = enable;
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java
new file mode 100644
index 00000000000..cb4c1ddaf51
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/dialogs/RemoteResourceBrowser.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * Copyright (c) 2008,2013 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui.dialogs;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.operation.ModalContext;
+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;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+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.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Generic file/directory browser for remote resources.
+ *
+ * A directory browser (DIRECTORY_BROWSER) only allows selection of directories.
+ * A file browser (FILE_BROWSER) allows selection of files and directories, but the ok button is only enabled when a file is
+ * selected.
+ * A resource browser (FILE_BROWSER|DIRECTORY_BROWSER) allows selection of files and directories. This is the default.
+ *
+ * To select multiple resources, set the style to SWT.MULTI.
+ *
+ * @author greg
+ *
+ */
+public class RemoteResourceBrowser extends Dialog implements IRunnableContext {
+ public static final String EMPTY_STRING = ""; //$NON-NLS-1$
+ public static final int FILE_BROWSER = 0x01;
+ public static final int DIRECTORY_BROWSER = 0x02;
+
+ private final static int widthHint = 400;
+
+ private Button fOkButton;
+ private RemoteResourceBrowserWidget fResourceBrowserWidget;
+ private ProgressMonitorPart fProgressMonitor;
+
+ private int fBrowserType;
+ private String fDialogTitle;
+
+ private boolean fShowHiddenCheckbox = true;
+ private boolean fShowNewFolderButton = true;
+ private boolean fShowConnections = false;
+ private boolean fShowLocalSelection = false;
+ private String fInitialPath;
+ private IRemoteConnection fConnection;
+ private int fBrowserStyle = SWT.SINGLE;
+
+ public RemoteResourceBrowser(Shell parent, int style) {
+ super(parent);
+ setShellStyle(SWT.RESIZE | getShellStyle());
+ if (style != SWT.NONE) {
+ fBrowserStyle = style;
+ }
+ setTitle(Messages.RemoteResourceBrowser_resourceTitle);
+ setType(FILE_BROWSER | DIRECTORY_BROWSER);
+ }
+
+ @Override
+ protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
+ Button button = super.createButton(parent, id, label, defaultButton);
+ if (id == IDialogConstants.OK_ID) {
+ fOkButton = button;
+ }
+ return button;
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Control contents = super.createContents(parent);
+ if (fDialogTitle == null) {
+ if (fBrowserType == DIRECTORY_BROWSER) {
+ setTitle(Messages.RemoteResourceBrowser_directoryTitle);
+ } else if (fBrowserType == FILE_BROWSER) {
+ setTitle(Messages.RemoteResourceBrowser_fileTitle);
+ }
+ } else {
+ setTitle(fDialogTitle);
+ }
+ if (fInitialPath != null) {
+ fResourceBrowserWidget.setInitialPath(fInitialPath);
+ }
+ if (fConnection != null) {
+ fResourceBrowserWidget.setConnection(fConnection);
+ }
+ updateDialog();
+ return contents;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite main = (Composite) super.createDialogArea(parent);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.widthHint = widthHint;
+ main.setLayoutData(gd);
+ main.setLayout(new GridLayout(1, true));
+
+ int options = 0;
+ if (fConnection == null || fShowConnections) {
+ options |= RemoteResourceBrowserWidget.SHOW_CONNECTIONS;
+ }
+ if (fBrowserType == DIRECTORY_BROWSER) {
+ options |= RemoteResourceBrowserWidget.DIRECTORY_BROWSER;
+ } else if (fBrowserType == FILE_BROWSER) {
+ options |= RemoteResourceBrowserWidget.FILE_BROWSER;
+ } else {
+ options |= RemoteResourceBrowserWidget.FILE_BROWSER | RemoteResourceBrowserWidget.DIRECTORY_BROWSER;
+ }
+ if (fShowHiddenCheckbox) {
+ options |= RemoteResourceBrowserWidget.SHOW_HIDDEN_CHECKBOX;
+ }
+ if (fShowNewFolderButton) {
+ options |= RemoteResourceBrowserWidget.SHOW_NEW_FOLDER_BUTTON;
+ }
+ if (fShowLocalSelection) {
+ options |= RemoteResourceBrowserWidget.SHOW_LOCAL_SELECTION;
+ }
+ fResourceBrowserWidget = new RemoteResourceBrowserWidget(main, fBrowserStyle, options);
+ fResourceBrowserWidget.addSelectionChangedListener(new ISelectionChangedListener() {
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateDialog();
+ }
+ });
+ fResourceBrowserWidget.addFocusListener(new FocusListener() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ getShell().setDefaultButton(null); // allow text widget to receive SWT.DefaultSelection event
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ getShell().setDefaultButton(fOkButton);
+ }
+ });
+ fResourceBrowserWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ if (fConnection != null) {
+ fResourceBrowserWidget.setConnection(fConnection);
+ }
+
+ Composite monitorComposite = new Composite(main, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.numColumns = 2;
+ monitorComposite.setLayout(layout);
+ monitorComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ fProgressMonitor = new ProgressMonitorPart(monitorComposite, new GridLayout(), true);
+ GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, true);
+ fProgressMonitor.setLayoutData(gridData);
+ monitorComposite.setVisible(false);
+
+ fResourceBrowserWidget.setRunnableContext(this);
+
+ return main;
+ }
+
+ /**
+ * Get the connection that was selected
+ *
+ * @return selected connection
+ */
+ public IRemoteConnection getConnection() {
+ if (fResourceBrowserWidget != null) {
+ return fResourceBrowserWidget.getConnection();
+ }
+ return null;
+ }
+
+ /**
+ * Get the resources that was selected.
+ *
+ * @return selected resource or null if no resource is selected
+ */
+ public IFileStore getResource() {
+ if (fResourceBrowserWidget != null) {
+ return fResourceBrowserWidget.getResource();
+ }
+ return null;
+ }
+
+ /**
+ * Get the resources that were selected.
+ *
+ * @return selected resources
+ */
+ public List<IFileStore> getResources() {
+ if (fResourceBrowserWidget != null) {
+ return fResourceBrowserWidget.getResources();
+ }
+ return new ArrayList<>();
+ }
+
+ @Override
+ public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
+ throws InvocationTargetException, InterruptedException {
+ fProgressMonitor.attachToCancelComponent(null);
+ fProgressMonitor.getParent().setVisible(true);
+ try {
+ ModalContext.run(runnable, fork, fProgressMonitor, getShell().getDisplay());
+ } finally {
+ fProgressMonitor.getParent().setVisible(false);
+ fProgressMonitor.removeFromCancelComponent(null);
+ }
+ }
+
+ /**
+ * 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) {
+ if (connection != null && connection.hasService(IRemoteFileService.class)) {
+ fConnection = connection;
+ }
+ }
+
+ /**
+ * Set the initial path to start browsing. This will be set in the browser
+ * text field, and in a future version should expand the browser to this
+ * location if it exists.
+ *
+ * @param path initial path
+ */
+ public void setInitialPath(String path) {
+ fInitialPath = path;
+ }
+
+ /**
+ * Set the fDialogTitle of the dialog.
+ *
+ * @param title title to display
+ */
+ public void setTitle(String title) {
+ fDialogTitle = title;
+ if (fDialogTitle == null) {
+ fDialogTitle = ""; //$NON-NLS-1$
+ }
+ Shell shell = getShell();
+ if ((shell != null) && !shell.isDisposed()) {
+ shell.setText(fDialogTitle);
+ }
+ }
+
+ /**
+ * Set the type of browser. Can be either a file browser (allows selection
+ * of files), a directory browser (allows selection of directories), or
+ * a resource browser (allows selection of files and directories).
+ */
+ public void setType(int type) {
+ fBrowserType = type;
+ }
+
+ /**
+ * Show available connections on browser if possible (default disabled).
+ *
+ * @param enable enable connection display if true
+ */
+ public void showConnections(boolean enable) {
+ fShowConnections = enable;
+ }
+
+ /**
+ * Enable a checkbox to show hidden files (default enabled)
+ *
+ * @param showHidden show hidden files if true
+ */
+ public void showHiddenCheckbox(boolean showHidden) {
+ fShowHiddenCheckbox = showHidden;
+ }
+
+ /**
+ * Enable selection of local files
+ *
+ * @param showLocalSelection show local files if true
+ */
+ public void showLocalSelection(boolean showLocalSelection) {
+ fShowLocalSelection = showLocalSelection;
+ }
+
+ /**
+ * Enable a button to create new folders (default enabled)
+ *
+ * @param showNewFolderButton show new folder button if true
+ */
+ public void showNewFolderButton(boolean showNewFolderButton) {
+ fShowNewFolderButton = showNewFolderButton;
+ }
+
+ private void updateDialog() {
+ if (fOkButton != null) {
+ IFileStore resource = getResource();
+ boolean enabled = getConnection() != null && resource != null;
+ if (enabled && fBrowserType == FILE_BROWSER) {
+ enabled &= !resource.fetchInfo().isDirectory();
+ }
+ fOkButton.setEnabled(enabled);
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java
new file mode 100644
index 00000000000..e7bb243a56c
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java
@@ -0,0 +1,652 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Greg Watson - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui.widgets;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemotePreferenceConstants;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.internal.core.preferences.Preferences;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.remote.ui.IRemoteUIConnectionWizard;
+import org.eclipse.swt.SWT;
+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.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * Widget to allow the user to select a service provider and connection. Provides a "New" button to create a new connection.
+ *
+ * If title is supplied then the widget will be placed in a group.
+ *
+ * @since 5.0
+ *
+ */
+public class RemoteConnectionWidget extends Composite {
+ /**
+ * Listener for widget selected events. Allows the events to be enabled/disabled.
+ *
+ */
+ protected class WidgetListener implements SelectionListener {
+ /** State of the listener (enabled/disabled). */
+ private boolean listenerEnabled = true;
+
+ /**
+ * Disable listener, received events shall be ignored.
+ */
+ public void disable() {
+ setEnabled(false);
+ }
+
+ protected void doWidgetDefaultSelected(SelectionEvent e) {
+ // Default empty implementation.
+ }
+
+ /**
+ * Enable the listener to handle events.
+ */
+ public void enable() {
+ setEnabled(true);
+ }
+
+ /**
+ * Test if the listener is enabled.
+ */
+ public synchronized boolean isEnabled() {
+ return listenerEnabled;
+ }
+
+ /**
+ * Set listener enabled state
+ *
+ * @param enabled
+ */
+ public synchronized void setEnabled(boolean enabled) {
+ listenerEnabled = enabled;
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ if (isEnabled()) {
+ widgetSelected(e);
+ }
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (isEnabled()) {
+ Object source = e.getSource();
+ if (source == fConnectionTypeCombo) {
+ handleConnectionTypeSelected(null);
+ } else if (source == fConnectionCombo) {
+ handleConnectionSelected();
+ } else if (source == fNewConnectionButton) {
+ handleNewRemoteConnectionSelected();
+ } else if (source == fLocalButton) {
+ handleButtonSelected();
+ } else if (source == fRemoteButton) {
+ handleButtonSelected();
+ }
+ }
+ }
+
+ }
+
+ public static final String DEFAULT_CONNECTION_NAME = "Remote Host"; //$NON-NLS-1$
+
+ /**
+ * Force the use of the connection type combo, regardless of the PREF_CONNECTION_TYPE preference setting.
+ *
+ * @since 2.0
+ */
+ public static int FLAG_FORCE_CONNECTION_TYPE_SELECTION = 1 << 0;
+
+ /**
+ * Do not provide a selection for local services.
+ */
+ public static int FLAG_NO_LOCAL_SELECTION = 1 << 1;
+
+ private Combo fConnectionTypeCombo;
+ private Button fLocalButton;
+ private Button fRemoteButton;
+ private final Combo fConnectionCombo;
+ private final Button fNewConnectionButton;
+
+ private List<IRemoteConnectionType> fConnectionTypes;
+ private IRemoteConnection fSelectedConnection;
+ private IRemoteServicesManager fRemoteServicesManager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ private IRemoteConnectionType fDefaultConnectionType;
+ private boolean fSelectionListernersEnabled = true;
+ private boolean fEnabled = true;
+
+ private final ListenerList fSelectionListeners = new ListenerList();
+ private final WidgetListener fWidgetListener = new WidgetListener();
+
+ /**
+ * Constructor
+ *
+ * @param parent
+ * parent composite
+ * @param style
+ * style or SWT.NONE
+ * @param title
+ * if a title is supplied then the widget will be placed in a group. Can be null.
+ * @param flags
+ * a combination of flags that modify the behavior of the widget.
+ */
+ public RemoteConnectionWidget(Composite parent, int style, String title, int flags) {
+ this(parent, style, title, flags, null, null);
+ }
+
+ /**
+ * Constructor
+ *
+ * @param parent
+ * parent composite
+ * @param style
+ * style or SWT.NONE
+ * @param title
+ * if a title is supplied then the widget will be placed in a group. Can be null.
+ * @param flags
+ * a combination of flags that modify the behavior of the widget.
+ * @param context
+ * runnable context, or null
+ * @since 2.0
+ */
+ public RemoteConnectionWidget(Composite parent, int style, String title, int flags, IRunnableContext context) {
+ this(parent, style, title, flags, context, null);
+ }
+
+ /**
+ * Constructor
+ *
+ * @param parent
+ * parent composite
+ * @param style
+ * style or SWT.NONE
+ * @param title
+ * if a title is supplied then the widget will be placed in a group. Can be null.
+ * @param flags
+ * a combination of flags that modify the behavior of the widget.
+ * @param connnectionTypes
+ * list of connection types to select from
+ * @since 2.0
+ */
+ public RemoteConnectionWidget(Composite parent, int style, String title, int flags,
+ List<IRemoteConnectionType> connectionTypes) {
+ this(parent, style, title, flags, null, connectionTypes);
+ }
+
+ /**
+ * Constructor
+ *
+ * @param parent
+ * parent composite
+ * @param style
+ * style or SWT.NONE
+ * @param title
+ * if a title is supplied then the widget will be placed in a group. Can be null.
+ * @param flags
+ * a combination of flags that modify the behavior of the widget.
+ * @param context
+ * runnable context, or null
+ * @param connectionTypes
+ * list of connection types to select from
+ * @since 2.0
+ */
+ public RemoteConnectionWidget(Composite parent, int style, String title, int flags, IRunnableContext context,
+ List<IRemoteConnectionType> connectionTypes) {
+ super(parent, style);
+
+ if (connectionTypes != null) {
+ // Just present the connections that are provided
+ flags |= FLAG_FORCE_CONNECTION_TYPE_SELECTION | FLAG_NO_LOCAL_SELECTION;
+ }
+
+ Composite body = this;
+
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.numColumns = 4;
+ setLayout(layout);
+ setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ if (title != null) {
+ Group group = new Group(this, SWT.NONE);
+ group.setText(title);
+ GridLayout groupLayout = new GridLayout(1, false);
+ groupLayout.marginHeight = 0;
+ groupLayout.marginWidth = 0;
+ groupLayout.numColumns = 4;
+ group.setLayout(groupLayout);
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ layout.numColumns = 1;
+ body = group;
+ }
+
+ fRemoteServicesManager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+ if (connectionTypes != null) {
+ // No default if the list of connection types was supplied
+ fConnectionTypes = connectionTypes;
+ } else {
+ fConnectionTypes = fRemoteServicesManager.getRemoteConnectionTypes();
+ String id = Preferences.getString(IRemotePreferenceConstants.PREF_CONNECTION_TYPE_ID);
+ if (id != null) {
+ fDefaultConnectionType = fRemoteServicesManager.getConnectionType(id);
+ }
+ }
+
+ /*
+ * Check if we need a connection type combo, or we should just use the default provider
+ */
+ if ((flags & FLAG_FORCE_CONNECTION_TYPE_SELECTION) != 0) {
+ Label label = new Label(body, SWT.NONE);
+ label.setText(Messages.RemoteConnectionWidget_Connection_Type);
+ label.setLayoutData(new GridData());
+
+ fConnectionTypeCombo = new Combo(body, SWT.DROP_DOWN | SWT.READ_ONLY);
+ GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ gd.horizontalSpan = 3;
+ fConnectionTypeCombo.setLayoutData(gd);
+ fConnectionTypeCombo.addSelectionListener(fWidgetListener);
+ fConnectionTypeCombo.setFocus();
+ }
+
+ if ((flags & FLAG_NO_LOCAL_SELECTION) == 0 && (flags & FLAG_FORCE_CONNECTION_TYPE_SELECTION) == 0) {
+ fLocalButton = new Button(body, SWT.RADIO);
+ fLocalButton.setText(Messages.RemoteConnectionWidget_Local);
+ fLocalButton.setLayoutData(new GridData());
+ fLocalButton.addSelectionListener(fWidgetListener);
+ fLocalButton.setSelection(false);
+
+ fRemoteButton = new Button(body, SWT.RADIO);
+ fRemoteButton.setText(Messages.RemoteConnectionWidget_Remote);
+ fRemoteButton.setLayoutData(new GridData());
+ fRemoteButton.addSelectionListener(fWidgetListener);
+ } else {
+ Label remoteLabel = new Label(body, SWT.NONE);
+ remoteLabel.setText(Messages.RemoteConnectionWidget_Connection_Name);
+ remoteLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+ }
+
+ fConnectionCombo = new Combo(body, SWT.DROP_DOWN | SWT.READ_ONLY);
+ fConnectionCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ fConnectionCombo.addSelectionListener(fWidgetListener);
+ if (fDefaultConnectionType != null) {
+ fConnectionCombo.setFocus();
+ }
+ fConnectionCombo.setEnabled(false);
+
+ fNewConnectionButton = new Button(body, SWT.PUSH);
+ fNewConnectionButton.setText(Messages.RemoteConnectionWidget_New);
+ fNewConnectionButton.setLayoutData(new GridData());
+ fNewConnectionButton.addSelectionListener(fWidgetListener);
+
+ if (fConnectionTypeCombo != null) {
+ initializeConnectionTypeCombo();
+ }
+
+ handleConnectionTypeSelected(null);
+
+ if (fLocalButton != null) {
+ handleButtonSelected();
+ }
+ }
+
+ /**
+ * Adds the listener to the collection of listeners who will be notified when the user changes the receiver's selection, by
+ * sending it one of the messages defined in the <code>SelectionListener</code> interface.
+ * <p>
+ * <code>widgetSelected</code> is called when the user changes the service provider or connection.
+ * </p>
+ *
+ * @param listener
+ * the listener which should be notified
+ */
+ public void addSelectionListener(SelectionListener listener) {
+ 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<? extends IRemoteConnection.Service>... services) {
+ fConnectionTypes = fRemoteServicesManager.getConnectionTypesSupporting(services);
+ if (fConnectionTypeCombo != null) {
+ initializeConnectionTypeCombo();
+ }
+ handleConnectionTypeSelected(null);
+ }
+
+ /**
+ * Get the new button from the widget
+ *
+ * @return button
+ * @since 7.0
+ */
+ public Button getButton() {
+ return fNewConnectionButton;
+ }
+
+ /**
+ * Get the connection that is currently selected in the widget, or null if there is no selected connection.
+ *
+ * @return selected connection
+ */
+ public IRemoteConnection getConnection() {
+ return fSelectedConnection;
+ }
+
+ private IRemoteConnectionType getSelectedConnectionType() {
+ if (fConnectionTypeCombo != null) {
+ int selectionIndex = fConnectionTypeCombo.getSelectionIndex();
+ if (fConnectionTypes.size() > 0 && selectionIndex > 0) {
+ return fConnectionTypes.get(selectionIndex - 1);
+ }
+ }
+ if (fDefaultConnectionType != null) {
+ return fDefaultConnectionType;
+ }
+ return null;
+ }
+
+ private IRemoteUIConnectionService getUIConnectionManager() {
+ IRemoteConnectionType services = getSelectedConnectionType();
+ if (services != null) {
+ return services.getService(IRemoteUIConnectionService.class);
+ }
+ return null;
+ }
+
+ private void handleButtonSelected() {
+ fRemoteButton.setSelection(!fLocalButton.getSelection());
+ updateEnablement();
+ handleConnectionSelected();
+ }
+
+ /**
+ * Handle the section of a new connection. Update connection option buttons appropriately.
+ */
+ protected void handleConnectionSelected() {
+ final boolean enabled = fWidgetListener.isEnabled();
+ fWidgetListener.disable();
+ IRemoteConnection selectedConnection = null;
+ if (fLocalButton != null && fLocalButton.getSelection()) {
+ selectedConnection = fRemoteServicesManager.getLocalConnectionType().getConnections().get(0);
+ } else {
+ int currentSelection = fConnectionCombo.getSelectionIndex();
+ if (currentSelection > 0) {
+ String connectionName = fConnectionCombo.getItem(currentSelection);
+ selectedConnection = getSelectedConnectionType().getConnection(connectionName);
+ }
+ }
+ if (selectedConnection == null || fSelectedConnection == null
+ || !selectedConnection.getName().equals(fSelectedConnection.getName())) {
+ fSelectedConnection = selectedConnection;
+ Event evt = new Event();
+ evt.widget = this;
+ notifyListeners(new SelectionEvent(evt));
+ }
+ fWidgetListener.setEnabled(enabled);
+ }
+
+ /**
+ * Handle creation of a new connection by pressing the 'New...' button. Calls handleRemoteServicesSelected() to update the
+ * connection combo with the new connection.
+ *
+ * TODO should probably select the new connection
+ */
+ protected void handleNewRemoteConnectionSelected() {
+ if (getUIConnectionManager() != null) {
+ IRemoteUIConnectionWizard wizard = getUIConnectionManager().getConnectionWizard(getShell());
+ if (wizard != null) {
+ wizard.setConnectionName(initialConnectionName());
+ IRemoteConnectionWorkingCopy conn = wizard.open();
+ if (conn != null) {
+ try {
+ handleConnectionTypeSelected(conn.save());
+ handleConnectionSelected();
+ } catch (CoreException e) {
+ RemoteUIPlugin.log(e);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Handle selection of a new connection type from the connection type combo. Handles the special case where the
+ * connection type combo is null and a local connection is supplied. In this case, the selected connection type is not changed.
+ *
+ * The assumption is that this will trigger a call to the selection handler for the connection combo.
+ *
+ * @param conn
+ * connection to select as current. If conn is null, select the first item in the list.
+ * @since 2.0
+ */
+ protected void handleConnectionTypeSelected(IRemoteConnection conn) {
+ final boolean enabled = fWidgetListener.isEnabled();
+ fWidgetListener.disable();
+ try {
+ IRemoteConnectionType selectedConnectionType = getSelectedConnectionType();
+ if (conn != null) {
+ selectedConnectionType = conn.getConnectionType();
+ }
+
+ /*
+ * If a connection was supplied, set its connection type in the combo. Otherwise use the currently selected
+ * service.
+ */
+ if (fDefaultConnectionType == null && conn != null) {
+ for (int index = 0; index < fConnectionTypes.size(); index++) {
+ if (fConnectionTypes.get(index).getId().equals(selectedConnectionType.getId())) {
+ fConnectionTypeCombo.select(index + 1);
+ break;
+ }
+ }
+ }
+
+ fConnectionCombo.removeAll();
+ fConnectionCombo.add(Messages.RemoteConnectionWidget_selectConnection);
+
+ if (selectedConnectionType == null) {
+ fConnectionCombo.select(0);
+ fConnectionCombo.setEnabled(false);
+ fNewConnectionButton.setEnabled(false);
+ handleConnectionSelected();
+ } else {
+ fConnectionCombo.setEnabled(true);
+
+ /*
+ * Populate the connection combo and select the connection
+ */
+ int selected = 0;
+ int offset = 1;
+
+ List<IRemoteConnection> sorted = selectedConnectionType.getConnections();
+ Collections.sort(sorted, new Comparator<IRemoteConnection>() {
+ @Override
+ public int compare(IRemoteConnection o1, IRemoteConnection o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+ });
+
+ for (IRemoteConnection s : sorted) {
+ fConnectionCombo.add(s.getName());
+ if (conn != null && s.getName().equals(conn.getName())) {
+ selected = offset;
+ }
+ offset++;
+ }
+
+ fConnectionCombo.select(selected);
+ handleConnectionSelected();
+
+ /*
+ * Enable 'new' button if new connections are supported
+ */
+ fNewConnectionButton.setEnabled(selectedConnectionType.canAdd());
+ }
+ } finally {
+ fWidgetListener.setEnabled(enabled);
+ }
+ }
+
+ private String initialConnectionName() {
+ String name = DEFAULT_CONNECTION_NAME;
+ int count = 1;
+ while (getSelectedConnectionType().getConnection(name) != null) {
+ name = DEFAULT_CONNECTION_NAME + " " + count++; //$NON-NLS-1$
+ }
+ return name;
+ }
+
+ /**
+ * Initialize the contents of the connection type combo. Keeps an array of connection types that matches the combo elements.
+ *
+ * @since 2.0
+ */
+ protected void initializeConnectionTypeCombo() {
+ final boolean enabled = fWidgetListener.isEnabled();
+ fWidgetListener.disable();
+ fConnectionTypeCombo.removeAll();
+ int offset = 1;
+ int defIndex = 0;
+ fConnectionTypeCombo.add(Messages.RemoteConnectionWidget_selectConnectionType);
+ for (int i = 0; i < fConnectionTypes.size(); i++) {
+ fConnectionTypeCombo.add(fConnectionTypes.get(i).getName());
+ if (fDefaultConnectionType != null && fConnectionTypes.get(i).equals(fDefaultConnectionType)) {
+ defIndex = i + offset;
+ }
+ }
+ if (fConnectionTypes.size() > 0) {
+ fConnectionTypeCombo.select(defIndex);
+ }
+ fWidgetListener.setEnabled(enabled);
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return fEnabled;
+ }
+
+ private void notifyListeners(SelectionEvent e) {
+ if (fSelectionListernersEnabled) {
+ for (Object listener : fSelectionListeners.getListeners()) {
+ ((SelectionListener) listener).widgetSelected(e);
+ }
+ }
+ }
+
+ /**
+ * Remove a listener that will be notified when one of the widget's controls are selected
+ *
+ * @param listener
+ * listener to remove
+ */
+ public void removeSelectionListener(SelectionListener listener) {
+ fSelectionListeners.remove(listener);
+ }
+
+ /**
+ * Set the connection that should be selected in the widget.
+ *
+ * @param connection
+ * connection to select
+ * @throws CoreException
+ */
+ public void setConnection(IRemoteConnection connection) {
+ fSelectionListernersEnabled = false;
+ if (fLocalButton != null && connection != null
+ && connection.getConnectionType() == fRemoteServicesManager.getLocalConnectionType()) {
+ fLocalButton.setSelection(true);
+ handleButtonSelected();
+ } else {
+ handleConnectionTypeSelected(connection);
+ }
+ handleConnectionSelected();
+ updateEnablement();
+ fSelectionListernersEnabled = true;
+ }
+
+ /**
+ * Set the connection that should be selected in the widget.
+ *
+ * @param id
+ * connection type id
+ * @param name
+ * connection name
+ * @since 6.0
+ */
+ public void setConnection(String id, String name) {
+ IRemoteConnectionType connectionType = fRemoteServicesManager.getConnectionType(id);
+ if (connectionType != null) {
+ IRemoteConnection connection = connectionType.getConnection(name);
+ if (connection != null) {
+ setConnection(connection);
+ }
+ }
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ fEnabled = enabled;
+ updateEnablement();
+ }
+
+ private void updateEnablement() {
+ if (fDefaultConnectionType != null) {
+ boolean isRemote = true;
+ if (fLocalButton != null) {
+ fLocalButton.setEnabled(fEnabled);
+ fRemoteButton.setEnabled(fEnabled);
+ isRemote = !fLocalButton.getSelection();
+ }
+ fConnectionCombo.setEnabled(fEnabled && isRemote);
+ fNewConnectionButton.setEnabled(fEnabled && isRemote && fDefaultConnectionType.canAdd());
+ } else {
+ IRemoteConnectionType services = getSelectedConnectionType();
+ fConnectionCombo.setEnabled(fEnabled && services != null);
+ fNewConnectionButton.setEnabled(fEnabled && services != null && services.canAdd());
+ if (fConnectionTypeCombo != null) {
+ fConnectionTypeCombo.setEnabled(fEnabled);
+ }
+ }
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java
new file mode 100644
index 00000000000..4add1483dcd
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteDirectoryWidget.java
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Mike Kucera (IBM) - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui.widgets;
+
+import java.util.HashMap;
+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;
+import org.eclipse.remote.ui.IRemoteUIFileService;
+import org.eclipse.swt.SWT;
+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.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Widget to allow the user to select a remote directory. Provides a "Browse"
+ * button that uses the currently specified connection and a "Restore Default"
+ * button to revert to the initial setting.
+ *
+ * If title is supplied then the widget will be placed in a group.
+ *
+ * The browse message can be modified using {@link #setBrowseMessage(String)}
+ *
+ */
+public class RemoteDirectoryWidget extends Composite {
+ private final Text text;
+ private final Button browseButton;
+ private final Button defaultButton;
+
+ private final String fDefaultPath = null;
+ private String fBrowseMessage = Messages.RemoteDirectoryWidget_0;
+ private IRemoteConnection fRemoteConnection;
+ private final ListenerList modifyListeners = new ListenerList();
+
+ private final Map<String, String> previousSelections = new HashMap<>();
+
+ public RemoteDirectoryWidget(Composite parent, int style, String title, String defaultPath) {
+ super(parent, style);
+
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ setLayout(layout);
+ setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Composite body = this;
+
+ if (title != null) {
+ Group group = new Group(this, SWT.NONE);
+ group.setText(title);
+ group.setLayout(new GridLayout(1, false));
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ body = group;
+ }
+
+ Composite textComp = new Composite(body, SWT.NONE);
+ textComp.setLayout(new GridLayout(2, false));
+ textComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Label label = new Label(textComp, SWT.NONE);
+ label.setText(Messages.RemoteDirectoryWidget_1);
+
+ text = new Text(textComp, SWT.BORDER);
+ 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);
+ notifyListeners(e);
+ }
+ });
+
+ Composite buttonComp = new Composite(body, SWT.NONE);
+ buttonComp.setLayout(new GridLayout(2, true));
+ GridData buttonCompData = new GridData(SWT.FILL, SWT.FILL, false, false);
+ buttonCompData.horizontalAlignment = SWT.END;
+ buttonComp.setLayoutData(buttonCompData);
+
+ browseButton = new Button(buttonComp, SWT.NONE);
+ browseButton.setText(Messages.RemoteDirectoryWidget_2);
+ GridData browseButtonData = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
+ browseButtonData.widthHint = 110;
+ browseButton.setLayoutData(browseButtonData);
+ browseButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ browse();
+ }
+ });
+
+ defaultButton = new Button(buttonComp, SWT.NONE);
+ defaultButton.setText(Messages.RemoteDirectoryWidget_3);
+ GridData defaultButtonData = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
+ defaultButtonData.widthHint = 110;
+ defaultButton.setLayoutData(defaultButtonData);
+ defaultButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ restoreDefault(fDefaultPath);
+ }
+ });
+
+ if (defaultPath != null) {
+ text.setText(defaultPath);
+ }
+ updateBrowseButton();
+ }
+
+ /**
+ * Add a listener that will be notified when the directory path is modified.
+ *
+ * @param listener
+ * listener to add
+ */
+ public void addModifyListener(ModifyListener listener) {
+ modifyListeners.add(listener);
+ }
+
+ /**
+ * Get the directory location path. This path will be relative to the remote
+ * machine.
+ *
+ * @return directory location path
+ */
+ public String getLocationPath() {
+ return text.getText();
+ }
+
+ /**
+ * Remove a listener that will be notified when the directory path is
+ * modified.
+ *
+ * @param listener
+ * listener to remove
+ */
+ public void removeModifyListener(ModifyListener listener) {
+ modifyListeners.remove(listener);
+ }
+
+ /**
+ * Set the message that will be displayed in the remote directory browser
+ * dialog.
+ *
+ * @param message
+ * message to be displayed
+ */
+ public void setBrowseMessage(String message) {
+ fBrowseMessage = message;
+ }
+
+ /**
+ * 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
+ */
+ public void setConnection(IRemoteConnection conn) {
+ if (conn == null) {
+ throw new NullPointerException();
+ }
+
+ 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);
+ updateBrowseButton();
+ }
+ }
+
+ /**
+ * Set the initial remote location that will be displayed in the widget.
+ *
+ * @param path
+ */
+ public void setLocationPath(String path) {
+ if (path != null && !path.equals(getLocationPath())) {
+ text.setText(path);
+ }
+ }
+
+ private void browse() {
+ IRemoteUIConnectionService connMgr = getUIConnectionManager();
+ if (connMgr != null) {
+ connMgr.openConnectionWithProgress(getShell(), null, fRemoteConnection);
+ }
+ if (fRemoteConnection.isOpen()) {
+ IRemoteUIFileService fileMgr = getUIFileManager();
+ if (fileMgr != null) {
+ fileMgr.setConnection(fRemoteConnection);
+ String path = fileMgr.browseDirectory(getShell(), fBrowseMessage, "", 0); //$NON-NLS-1$
+ if (path != null) {
+ setLocationPath(path);
+ }
+ }
+ }
+ }
+
+ private String getSavedPath() {
+ if (fRemoteConnection != null) {
+ return previousSelections
+ .get(fRemoteConnection.getConnectionType().getId() + "." + fRemoteConnection.getName()); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ private IRemoteUIFileService getUIFileManager() {
+ if (fRemoteConnection != null) {
+ return fRemoteConnection.getConnectionType().getService(IRemoteUIFileService.class);
+ }
+ return null;
+ }
+
+ private IRemoteUIConnectionService getUIConnectionManager() {
+ if (fRemoteConnection != null) {
+ return fRemoteConnection.getConnectionType().getService(IRemoteUIConnectionService.class);
+ }
+ return null;
+ }
+
+ private void notifyListeners(ModifyEvent e) {
+ for (Object listener : modifyListeners.getListeners()) {
+ ((ModifyListener) listener).modifyText(e);
+ }
+ }
+
+ private void restoreDefault(String path) {
+ if (path == null && fRemoteConnection != null) {
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ if (processService != null) {
+ path = processService.getWorkingDirectory().toString();
+ }
+ }
+ if (path == null) {
+ path = ""; //$NON-NLS-1$
+ }
+ setLocationPath(path); // modify event listener updates map
+ }
+
+ private void setSavedPath(String path) {
+ if (fRemoteConnection != null) {
+ previousSelections.put(fRemoteConnection.getConnectionType().getId() + "." + fRemoteConnection.getName(), //$NON-NLS-1$
+ path);
+ }
+ }
+
+ private void updateBrowseButton() {
+ browseButton.setEnabled(getUIFileManager() != null);
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java
new file mode 100644
index 00000000000..e27065a4067
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteFileWidget.java
@@ -0,0 +1,300 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Mike Kucera (IBM) - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.remote.ui.widgets;
+
+import java.util.HashMap;
+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;
+import org.eclipse.remote.ui.IRemoteUIFileService;
+import org.eclipse.swt.SWT;
+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.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Widget to allow the user to select a remote file. Provides a "Browse"
+ * button that uses the currently specified connection and a "Restore Default"
+ * button to revert to the initial setting.
+ *
+ * If GROUP_FLAG is set, then the widget will be placed in a group.
+ * If RESTORE_BUTTON_FLAG is set, then a "Restore Default" button will be added
+ *
+ * If defaultPath is not null, then the initial path will be set to its value.
+ *
+ * The browse message can be modified using {@link #setBrowseMessage(String)}
+ *
+ */
+public class RemoteFileWidget extends Composite {
+ public static int GROUP_FLAG = 0x01;
+ public static int RESTORE_BUTTON_FLAG = 0x02;
+
+ private final Label fLabel;
+ private final Text fText;
+ private final Button fBrowseButton;
+
+ private Button fDefaultButton;
+ private String fDefaultPath;
+ private String fBrowseMessage = Messages.RemoteFileWidget_Select_File;
+ private IRemoteConnection fRemoteConnection;
+
+ private final ListenerList fModifyListeners = new ListenerList();
+ private final Map<String, String> fPreviousSelections = new HashMap<>();
+
+ public RemoteFileWidget(Composite parent, int style, int flags, String title, String defaultPath) {
+ super(parent, style);
+
+ GridLayout layout = new GridLayout(4, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ setLayout(layout);
+
+ Composite body = this;
+
+ if ((flags & GROUP_FLAG) != 0) {
+ Group group = new Group(this, SWT.NONE);
+ group.setText(title);
+ group.setLayout(new GridLayout(1, false));
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ body = group;
+ }
+
+ fLabel = new Label(body, SWT.NONE);
+ fLabel.setText(Messages.RemoteFileWidget_File);
+ fLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+
+ fText = new Text(body, SWT.BORDER);
+ fText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ fText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ String path = fText.getText();
+ setSavedPath(path);
+ notifyListeners(e);
+ }
+ });
+
+ fBrowseButton = new Button(body, SWT.NONE);
+ fBrowseButton.setText(Messages.RemoteFileWidget_Browse);
+ GridData browseButtonData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+ browseButtonData.widthHint = 110;
+ fBrowseButton.setLayoutData(browseButtonData);
+ fBrowseButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ browse();
+ }
+ });
+
+ if ((flags & RESTORE_BUTTON_FLAG) != 0) {
+ fDefaultButton = new Button(body, SWT.NONE);
+ fDefaultButton.setText(Messages.RemoteFileWidget_Restore_Default);
+ GridData defaultButtonData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+ defaultButtonData.widthHint = 110;
+ fDefaultButton.setLayoutData(defaultButtonData);
+ fDefaultButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ restoreDefault(fDefaultPath);
+ }
+ });
+ }
+ if (defaultPath != null) {
+ fDefaultPath = defaultPath;
+ fText.setText(defaultPath);
+ }
+ updateBrowseButton();
+ }
+
+ /**
+ * Add a listener that will be notified when the file path is modified.
+ *
+ * @param listener
+ * listener to add
+ */
+ public void addModifyListener(ModifyListener listener) {
+ fModifyListeners.add(listener);
+ }
+
+ private void browse() {
+ IRemoteUIConnectionService connMgr = getUIConnectionManager();
+ if (connMgr != null) {
+ connMgr.openConnectionWithProgress(getShell(), null, fRemoteConnection);
+ }
+ if (fRemoteConnection.isOpen()) {
+ IRemoteUIFileService fileMgr = getUIFileManager();
+ if (fileMgr != null) {
+ fileMgr.setConnection(fRemoteConnection);
+ String path = fileMgr.browseFile(getShell(), fBrowseMessage, "", 0); //$NON-NLS-1$
+ if (path != null) {
+ setLocationPath(path);
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the file location path. This path will be relative to the remote
+ * machine.
+ *
+ * @return file location path
+ */
+ public String getLocationPath() {
+ return fText.getText();
+ }
+
+ private String getSavedPath() {
+ if (fRemoteConnection != null) {
+ return fPreviousSelections
+ .get(fRemoteConnection.getConnectionType().getId() + "." + fRemoteConnection.getName()); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ private IRemoteUIConnectionService getUIConnectionManager() {
+ if (fRemoteConnection != null) {
+ return fRemoteConnection.getConnectionType().getService(IRemoteUIConnectionService.class);
+ }
+ return null;
+ }
+
+ private IRemoteUIFileService getUIFileManager() {
+ if (fRemoteConnection != null) {
+ return fRemoteConnection.getConnectionType().getService(IRemoteUIFileService.class);
+ }
+ return null;
+ }
+
+ private void notifyListeners(ModifyEvent e) {
+ for (Object listener : fModifyListeners.getListeners()) {
+ ((ModifyListener) listener).modifyText(e);
+ }
+ }
+
+ /**
+ * Remove a listener that will be notified when the file path is
+ * modified.
+ *
+ * @param listener
+ * listener to remove
+ */
+ public void removeModifyListener(ModifyListener listener) {
+ fModifyListeners.remove(listener);
+ }
+
+ private void restoreDefault(String path) {
+ if (path == null && fRemoteConnection != null) {
+ IRemoteProcessService processService = fRemoteConnection.getService(IRemoteProcessService.class);
+ if (processService != null) {
+ path = processService.getWorkingDirectory().toString();
+ }
+ }
+ if (path == null) {
+ path = ""; //$NON-NLS-1$
+ }
+ setLocationPath(path); // modify event listener updates map
+ }
+
+ /**
+ * Set the message that will be displayed in the remote file browser
+ * dialog.
+ *
+ * @param message
+ * message to be displayed
+ */
+ public void setBrowseMessage(String message) {
+ fBrowseMessage = message;
+ }
+
+ /**
+ * 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
+ */
+ public void setConnection(IRemoteConnection conn) {
+ if (conn == null) {
+ throw new NullPointerException();
+ }
+
+ 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);
+ updateBrowseButton();
+ }
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ if (!fText.isDisposed()) {
+ fText.setEnabled(enabled);
+ }
+ if (!fBrowseButton.isDisposed()) {
+ fBrowseButton.setEnabled(enabled);
+ }
+ }
+
+ /**
+ * Set the label to be displayed
+ *
+ * @param label
+ */
+ public void setLabel(String label) {
+ if (fLabel != null && !fLabel.isDisposed()) {
+ fLabel.setText(label);
+ }
+ }
+
+ /**
+ * Set the initial remote location that will be displayed in the widget.
+ *
+ * @param path
+ */
+ public void setLocationPath(String path) {
+ if (path != null && !path.equals(getLocationPath())) {
+ fText.setText(path);
+ }
+ }
+
+ private void setSavedPath(String path) {
+ if (fRemoteConnection != null) {
+ fPreviousSelections.put(fRemoteConnection.getConnectionType().getId() + "." + fRemoteConnection.getName(), //$NON-NLS-1$
+ path);
+ }
+ }
+
+ private void updateBrowseButton() {
+ fBrowseButton.setEnabled(getUIFileManager() != null);
+ }
+}
diff --git a/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java
new file mode 100644
index 00000000000..7ff3356ec0f
--- /dev/null
+++ b/remote/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java
@@ -0,0 +1,808 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2015 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ * Martin Oberhuber - [468889] Support Eclipse older than Mars
+ *******************************************************************************/
+package org.eclipse.remote.ui.widgets;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteFileService;
+import org.eclipse.remote.core.IRemoteProcessService;
+import org.eclipse.remote.core.RemoteServicesUtils;
+import org.eclipse.remote.internal.ui.DeferredFileStore;
+import org.eclipse.remote.internal.ui.DeferredFileStoreComparer;
+import org.eclipse.remote.internal.ui.PendingUpdateAdapter;
+import org.eclipse.remote.internal.ui.RemoteContentProvider;
+import org.eclipse.remote.internal.ui.RemoteResourceComparator;
+import org.eclipse.remote.internal.ui.RemoteTreeViewer;
+import org.eclipse.remote.internal.ui.RemoteUIImages;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.internal.ui.messages.Messages;
+import org.eclipse.remote.ui.IRemoteUIConnectionService;
+import org.eclipse.swt.SWT;
+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.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * Generic file/directory browser for remote resources.
+ *
+ * @author greg
+ *
+ */
+public class RemoteResourceBrowserWidget extends Composite {
+ /**
+ * Delayed input dialog uses {@link ValidateJob} to create an InputDialog that only validates it's text field after an
+ * appropriate timeout has occurred. This is to prevent excessive network traffic when checking the existence of a remote
+ * directory on a target system.
+ *
+ * Due to the timing of the validation, it is possible to close the dialog prior to the validation completing. However since the
+ * validation is only used to check for the existence of a remote file/directory, the worst that can happen is that the user
+ * will not be notified that the directory already exists.
+ *
+ */
+ private class DelayedInputDialog extends InputDialog {
+ public DelayedInputDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue,
+ IInputValidator validator) {
+ super(parentShell, dialogTitle, dialogMessage, initialValue, validator);
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ /*
+ * Cancel the job as soon as the dialog is closed to avoid SWTException
+ */
+ fValidateJob.cancel();
+ super.buttonPressed(buttonId);
+ }
+
+ protected void doValidate() {
+ super.validateInput();
+ }
+
+ @Override
+ protected void validateInput() {
+ fValidateJob.cancel();
+ if (!getText().getText().equals("")) { //$NON-NLS-1$
+ fValidateJob.schedule(VALIDATE_DELAY);
+ } else {
+ super.validateInput();
+ }
+ }
+ }
+
+ /**
+ * Validation job that will call the {@link DelayedInputDialog#doValidate()} method when run. The job should be scheduled with a
+ * delay to limit the frequency of validation.
+ */
+ private class ValidateJob extends UIJob {
+ private DelayedInputDialog fDialog;
+
+ public ValidateJob() {
+ super(Messages.RemoteResourceBrowserWidget_0);
+ setSystem(true);
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ fDialog.doValidate();
+ return Status.OK_STATUS;
+ }
+
+ public void setDialog(DelayedInputDialog dialog) {
+ fDialog = dialog;
+ }
+ }
+
+ private static final int VALIDATE_DELAY = 100;
+ private final ValidateJob fValidateJob = new ValidateJob();
+
+ /**
+ * Browse for files
+ */
+ public static final int FILE_BROWSER = 0x01;
+ /**
+ * Browse for directories (files are not shown)
+ */
+ public static final int DIRECTORY_BROWSER = 0x02;
+ /**
+ * Show local selection button
+ */
+ public static final int SHOW_LOCAL_SELECTION = 0x04;
+ /**
+ * Display checkbox to show/hide hidden files
+ */
+ public static final int SHOW_HIDDEN_CHECKBOX = 0x10;
+ /**
+ * Display button to create new folders
+ */
+ public static final int SHOW_NEW_FOLDER_BUTTON = 0x20;
+ /**
+ * Display widget to select a connection
+ */
+ public static final int SHOW_CONNECTIONS = 0x40;
+
+ @SuppressWarnings("unused")
+ private static final int minimumWidth = 200;
+ private static final int heightHint = 300;
+
+ private RemoteTreeViewer fTreeViewer;
+ private Text fRemotePathText;
+ private Button fUpButton;
+ private Button fNewFolderButton;
+ private Button fShowHiddenButton;
+ private RemoteConnectionWidget fRemoteConnectionWidget;
+
+ private String fDialogTitle;
+ private String fDialogLabel;
+
+ private boolean fShowHidden;
+ private final List<IFileStore> fResources = new ArrayList<>();
+ private String fResource;
+ private String fInitialPath;
+ private IPath fRootPath;
+ private IRemoteFileService fFileMgr;
+ private IRemoteConnection fConnection;
+
+ private final ListenerList fSelectionListeners = new ListenerList();
+
+ private int fOptionFlags = FILE_BROWSER | SHOW_HIDDEN_CHECKBOX | SHOW_NEW_FOLDER_BUTTON;
+
+ private IRunnableContext fRunnableContext;
+
+ public RemoteResourceBrowserWidget(Composite parent, int style, int flags) {
+ super(parent, style);
+ setTitle(Messages.RemoteResourceBrowser_resourceTitle);
+
+ if (flags != 0) {
+ fOptionFlags = flags;
+ }
+
+ setType();
+
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ setLayout(layout);
+
+ final Composite mainComp = new Composite(this, SWT.NONE);
+ mainComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ mainComp.setLayout(new GridLayout(1, false));
+
+ if ((fOptionFlags & SHOW_CONNECTIONS) != 0) {
+ fRemoteConnectionWidget = new RemoteConnectionWidget(mainComp, SWT.NONE, "", //$NON-NLS-1$
+ (fOptionFlags & SHOW_LOCAL_SELECTION) == 0 ? RemoteConnectionWidget.FLAG_NO_LOCAL_SELECTION : 0);
+ fRemoteConnectionWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ // Must happen before adding selection listener as this will trigger selection event
+ fRemoteConnectionWidget.filterConnections(IRemoteFileService.class);
+ fRemoteConnectionWidget.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ try {
+ connectionSelected();
+ } catch (CoreException e) {
+ RemoteUIPlugin.log(e.getStatus());
+ }
+ updateEnablement();
+ notifySelectionChangedListeners(new SelectionChangedEvent(fTreeViewer, new ISelection() {
+ @Override
+ public boolean isEmpty() {
+ return true;
+ }
+ }));
+ }
+ });
+ }
+
+ Composite textComp = new Composite(mainComp, SWT.NONE);
+ layout = new GridLayout(4, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ textComp.setLayout(layout);
+ textComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ Label label = new Label(textComp, SWT.NONE);
+ label.setText(fDialogLabel);
+ label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+
+ fRemotePathText = new Text(textComp, SWT.BORDER | SWT.SINGLE);
+ fRemotePathText.addTraverseListener(new TraverseListener() {
+ @Override
+ public void keyTraversed(TraverseEvent e) {
+ if (e.detail == SWT.TRAVERSE_RETURN) {
+ e.doit = false;
+ }
+ }
+ });
+ fRemotePathText.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ fRemotePathText.setSelection(fRemotePathText.getText().length());
+ setRoot(fRemotePathText.getText());
+ }
+ });
+ fRemotePathText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ fResource = fRemotePathText.getText().trim();
+ }
+ });
+ GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ // gd.minimumWidth = minimumWidth;
+ fRemotePathText.setLayoutData(gd);
+
+ fUpButton = new Button(textComp, SWT.PUSH | SWT.FLAT);
+ fUpButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+ fUpButton.setImage(RemoteUIImages.get(RemoteUIImages.IMG_ELCL_UP_NAV));
+ fUpButton.setToolTipText(Messages.RemoteResourceBrowser_UpOneLevel);
+ fUpButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!fRootPath.isRoot()) {
+ setRoot(fRootPath.removeLastSegments(1).toString());
+ }
+ }
+ });
+
+ if ((fOptionFlags & SHOW_NEW_FOLDER_BUTTON) != 0) {
+ // new folder: See Bug 396334
+ fNewFolderButton = new Button(textComp, SWT.PUSH | SWT.FLAT);
+ fNewFolderButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+ fNewFolderButton.setImage(RemoteUIImages.get(RemoteUIImages.IMG_ELCL_NEW_FOLDER));
+ fNewFolderButton.setToolTipText(Messages.RemoteResourceBrowser_NewFolder);
+ fNewFolderButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ ISelection selection = fTreeViewer.getSelection();
+ if (!selection.isEmpty()) {
+ if (selection instanceof TreeSelection) {
+ TreePath[] treePaths = ((TreeSelection) selection).getPaths();
+ /*
+ * There should only be one path
+ */
+ if (treePaths.length > 0) {
+ TreePath treePath = treePaths[0];
+ if (treePath.getLastSegment() instanceof DeferredFileStore) {
+ DeferredFileStore element = ((DeferredFileStore) treePath.getLastSegment());
+ String path = toPath(element.getFileStore().toURI());
+ String newPath = createNewFolder(path);
+ if (newPath != null) {
+ fTreeViewer.expandToLevel(element, 1);
+ fTreeViewer.refresh(element);
+ Object[] children = element.getChildren(null);
+ for (Object child : children) {
+ if (child instanceof DeferredFileStore && newPath
+ .equals(((DeferredFileStore) child).getFileStore().getName())) {
+ fTreeViewer.deferSelection(new StructuredSelection(child));
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ DeferredFileStore root = (DeferredFileStore) fTreeViewer.getInput();
+ String path = toPath(root.getFileStore().toURI());
+ String newPath = createNewFolder(path);
+ if (newPath != null) {
+ fTreeViewer.refresh();
+ fTreeViewer.getTree().setFocus();
+ Object[] children = root.getChildren(null);
+ for (Object child : children) {
+ if (child instanceof DeferredFileStore
+ && newPath.equals(((DeferredFileStore) child).getFileStore().getName())) {
+ fTreeViewer.deferSelection(new StructuredSelection(child));
+ }
+ }
+ }
+ }
+ }
+ });
+ } else {
+ gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+ gd.horizontalSpan = 2;
+ fUpButton.setLayoutData(gd);
+ }
+
+ if ((style & SWT.MULTI) == SWT.MULTI) {
+ fTreeViewer = new RemoteTreeViewer(mainComp, SWT.MULTI | SWT.BORDER);
+ } else {
+ fTreeViewer = new RemoteTreeViewer(mainComp, SWT.SINGLE | SWT.BORDER);
+ }
+ gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ // see bug 158380
+ gd.heightHint = Math.max(parent.getSize().y, heightHint);
+ fTreeViewer.getTree().setLayoutData(gd);
+ fTreeViewer.setUseHashlookup(true);
+ fTreeViewer.setComparer(new DeferredFileStoreComparer());
+ fTreeViewer.setComparator(new RemoteResourceComparator());
+ fTreeViewer.setContentProvider(new RemoteContentProvider());
+ fTreeViewer.setLabelProvider(new WorkbenchLabelProvider());
+ fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
+ IStructuredSelection ss = (IStructuredSelection) selection;
+ fResources.clear();
+ for (Object currentSelection : ss.toArray()) {
+ if (currentSelection instanceof DeferredFileStore) {
+ IFileStore store = ((DeferredFileStore) currentSelection).getFileStore();
+ fResources.add(store);
+ }
+ }
+ if (fResources.size() > 0) {
+ fRemotePathText.setText(toPath(fResources.get(0).toURI()));
+ }
+ updateEnablement();
+ notifySelectionChangedListeners(event);
+ }
+ }
+ });
+ fTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
+ @Override
+ public void doubleClick(DoubleClickEvent event) {
+ IStructuredSelection s = (IStructuredSelection) event.getSelection();
+ Object o = s.getFirstElement();
+ if (fTreeViewer.isExpandable(o)) {
+ fTreeViewer.setExpandedState(o, !fTreeViewer.getExpandedState(o));
+ }
+ }
+
+ });
+ /*
+ * Only add filter if we are a directory browser. File and resource browsers show everything.
+ */
+ int mask = FILE_BROWSER | DIRECTORY_BROWSER;
+ if ((fOptionFlags & mask) != mask // Avoid filter on resource browsers.
+ && (fOptionFlags & DIRECTORY_BROWSER) != 0) {
+ fTreeViewer.addFilter(new ViewerFilter() {
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if ((element instanceof DeferredFileStore)) {
+ return ((DeferredFileStore) element).isContainer();
+ }
+ return element instanceof PendingUpdateAdapter;
+ }
+ });
+ }
+
+ if ((fOptionFlags & SHOW_HIDDEN_CHECKBOX) != 0) {
+ fShowHiddenButton = new Button(mainComp, SWT.CHECK);
+ fShowHiddenButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+ fShowHiddenButton.setText(Messages.RemoteResourceBrowser_Show_hidden_files);
+ fShowHiddenButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ fShowHidden = fShowHiddenButton.getSelection();
+ setRoot(fRootPath.toString());
+ }
+ });
+ }
+
+ updateEnablement();
+ }
+
+ private String toPath(URI uri) {
+ return getConnection().getService(IRemoteFileService.class).toPath(uri);
+ }
+
+ /**
+ * Add a listener that will be notified when the selection is changed.
+ *
+ * @param listener
+ * listener to add
+ */
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ fSelectionListeners.add(listener);
+ }
+
+ /**
+ * Change the viewers input. Called when a new connection is selected.
+ *
+ * @param conn
+ * new connection
+ * @return true if input successfully changed
+ */
+ private boolean changeInput(final IRemoteConnection conn) {
+ if (conn == null) {
+ setRoot(null);
+ return true;
+ }
+ IRemoteUIConnectionService uiMgr = conn.getConnectionType().getService(IRemoteUIConnectionService.class);
+ if (uiMgr != null) {
+ uiMgr.openConnectionWithProgress(getShell(), getRunnableContext(), conn);
+ }
+ if (!conn.isOpen()) {
+ return false;
+ }
+
+ fFileMgr = conn.getService(IRemoteFileService.class);
+ if (fFileMgr != null) {
+ /*
+ * Note: the call to findInitialPath must happen before the
+ * fTreeViewer input is set or the fTreeViewer fails. No idea why this
+ * is.
+ */
+ IRemoteProcessService processService = conn.getService(IRemoteProcessService.class);
+ if (processService != null) {
+ String cwd = processService.getWorkingDirectory();
+ IPath initial = findInitialPath(cwd, fInitialPath);
+
+ // TODO: not platform independent - needs IRemotePath
+ setRoot(initial.toString());
+ }
+
+ fConnection = conn;
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * When a new connection is selected, make sure it is open before using it.
+ *
+ * @throws CoreException
+ */
+ private void connectionSelected() throws CoreException {
+ /*
+ * Make sure the connection is open before we try and read from the
+ * connection.
+ */
+ final IRemoteConnection conn = fRemoteConnectionWidget.getConnection();
+ if (!changeInput(conn)) {
+ /*
+ * Reset combo back to the previous selection
+ */
+ fRemoteConnectionWidget.setConnection(fConnection);
+ }
+ }
+
+ /**
+ * @return
+ */
+ private String createNewFolder(final String parent) {
+ final String[] name = new String[1];
+ name[0] = null;
+ try {
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ @Override
+ public void run(IProgressMonitor monitor) {
+ SubMonitor progress = SubMonitor.convert(monitor, 10);
+ String baseName = "newfolder"; //$NON-NLS-1$
+ final IFileStore path = fConnection.getService(IRemoteFileService.class).getResource(parent);
+ IFileStore child = path.getChild(baseName);
+ int count = 1;
+ try {
+ while (!progress.isCanceled() && child.fetchInfo(EFS.NONE, progress.newChild(1)).exists()) {
+ progress.setWorkRemaining(10);
+ child = path.getChild(baseName + " (" + count++ + ")"); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ } catch (final CoreException e) {
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ ErrorDialog.openError(getShell(), Messages.RemoteResourceBrowserWidget_New_Folder,
+ Messages.RemoteResourceBrowserWidget_Unable_to_create_new_folder,
+ e.getStatus());
+ }
+ });
+ }
+ final IFileStore basePath = child;
+ final String[] userPath = new String[1];
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ DelayedInputDialog dialog = new DelayedInputDialog(getShell(),
+ Messages.RemoteResourceBrowserWidget_1, Messages.RemoteResourceBrowserWidget_2,
+ basePath.getName(), new IInputValidator() {
+ @Override
+ public String isValid(String newText) {
+ if (!newText.equals("")) { //$NON-NLS-1$
+ IFileStore newPath = path.getChild(newText);
+ if (newPath.fetchInfo().exists()) {
+ return Messages.RemoteResourceBrowserWidget_3;
+ }
+ } else {
+ return Messages.RemoteResourceBrowserWidget_4;
+ }
+ return null;
+ }
+ });
+ fValidateJob.setDialog(dialog);
+ if (dialog.open() == Dialog.OK) {
+ userPath[0] = dialog.getValue();
+ }
+ }
+ });
+ if (userPath[0] != null) {
+ try {
+ IFileStore newPath = path.getChild(userPath[0]);
+ if (!progress.isCanceled()) {
+ newPath.mkdir(EFS.SHALLOW, progress.newChild(10));
+ name[0] = newPath.getName();
+ }
+ } catch (final CoreException e) {
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ ErrorDialog.openError(getShell(), Messages.RemoteResourceBrowserWidget_New_Folder,
+ Messages.RemoteResourceBrowserWidget_Unable_to_create_new_folder,
+ e.getStatus());
+ }
+ });
+ }
+ }
+ }
+ };
+ getRunnableContext().run(true, true, runnable);
+ } catch (InvocationTargetException e) {
+ // Ignore, return null
+ } catch (InterruptedException e) {
+ // Ignore, return null
+ }
+ return name[0];
+ }
+
+ /**
+ * Determine the initial path for the browser. If the initial path is not
+ * supplied or does not exist on the remote machine, then the initial path
+ * will be the cwd.
+ *
+ * @param cwd
+ * @param initialPath
+ * @return initial path
+ */
+ private IPath findInitialPath(String cwd, String initialPath) {
+ if (initialPath != null) {
+ IPath path = RemoteServicesUtils.posixPath(initialPath);
+ if (!path.isAbsolute()) {
+ path = RemoteServicesUtils.posixPath(cwd).append(path);
+ }
+ if (fFileMgr.getResource(path.toString()).fetchInfo().exists()) {
+ return path;
+ }
+ }
+ return RemoteServicesUtils.posixPath(cwd);
+ }
+
+ /**
+ * Get the connection that was selected
+ *
+ * @return selected connection
+ */
+ public IRemoteConnection getConnection() {
+ return fConnection;
+ }
+
+ /**
+ * Get a resource that corresponds to the text field
+ *
+ * @return resource corresponding to the text field
+ * @since 1.1
+ */
+ public IFileStore getResource() {
+ if (fResource != null) {
+ if (!fResource.equals("") && getConnection() != null) { //$NON-NLS-1$
+ return getConnection().getService(IRemoteFileService.class).getResource(fResource);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get the resources that were selected.
+ *
+ * @return selected resources
+ */
+ public List<IFileStore> getResources() {
+ return fResources;
+ }
+
+ public IRunnableContext getRunnableContext() {
+ if (fRunnableContext == null) {
+ return new ProgressMonitorDialog(getShell());
+ }
+ return fRunnableContext;
+ }
+
+ private void notifySelectionChangedListeners(SelectionChangedEvent e) {
+ for (Object listener : fSelectionListeners.getListeners()) {
+ ((ISelectionChangedListener) listener).selectionChanged(e);
+ }
+ }
+
+ /**
+ * Remove a listener that will be notified when the selection is changed
+ *
+ * @param listener
+ * listener to remove
+ */
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ fSelectionListeners.remove(listener);
+ }
+
+ /**
+ * 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) {
+ if (connection.hasService(IRemoteFileService.class)) {
+ changeInput(connection);
+ if (fRemoteConnectionWidget != null) {
+ fRemoteConnectionWidget.setConnection(connection);
+ }
+ updateEnablement();
+ }
+ }
+
+ /**
+ * Set the initial path to start browsing. This will be set in the browser
+ * text field, and in a future version should expand the browser to this
+ * location if it exists.
+ *
+ * NOTE: This must be called *before* {@link #setConnection(IRemoteConnection)} to have any effect.
+ *
+ * @param path
+ */
+ public void setInitialPath(String path) {
+ fInitialPath = path;
+ updateEnablement();
+ }
+
+ /**
+ * Set the root directory for the browser. This will also update the text
+ * field with the path. If the path is null, the browser will be set to the initial state.
+ *
+ * @param path
+ * path of root directory or null
+ */
+ private void setRoot(String path) {
+ fResources.clear();
+ fRootPath = null;
+ if (path == null) {
+ fTreeViewer.setInput(null);
+ } else if (fFileMgr != null) {
+ IFileStore root = fFileMgr.getResource(path);
+ fTreeViewer.setInput(new DeferredFileStore(root, !fShowHidden));
+ fRemotePathText.setText(path);
+ fRemotePathText.setSelection(fRemotePathText.getText().length());
+ fResources.add(root);
+ fRootPath = RemoteServicesUtils.posixPath(path);
+ }
+ }
+
+ public void setRunnableContext(IRunnableContext context) {
+ fRunnableContext = context;
+ }
+
+ /**
+ * Set the fDialogTitle of the dialog.
+ *
+ * @param title
+ */
+ public void setTitle(String title) {
+ fDialogTitle = title;
+ if (fDialogTitle == null) {
+ fDialogTitle = ""; //$NON-NLS-1$
+ }
+ Shell shell = getShell();
+ if ((shell != null) && !shell.isDisposed()) {
+ shell.setText(fDialogTitle);
+ }
+ }
+
+ /**
+ * Set the type of browser. Can be either a file browser (allows selection
+ * of files only) or a directory browser (allows selection of directories only), or
+ * both files and directories.
+ */
+ public void setType() {
+ if ((fOptionFlags & DIRECTORY_BROWSER) == 0) {
+ fDialogLabel = Messages.RemoteResourceBrowser_fileLabel;
+ setTitle(Messages.RemoteResourceBrowser_fileTitle);
+ } else if ((fOptionFlags & FILE_BROWSER) == 0) {
+ fDialogLabel = Messages.RemoteResourceBrowser_directoryLabel;
+ setTitle(Messages.RemoteResourceBrowser_directoryTitle);
+ } else {
+ fDialogLabel = Messages.RemoteResourceBrowser_resourceLabel;
+ setTitle(Messages.RemoteResourceBrowser_resourceTitle);
+ }
+ }
+
+ private void updateEnablement() {
+ boolean upEnabled = false;
+ boolean newFolderEnabled = false;
+ boolean connectionOpen = fConnection != null && fConnection.isOpen();
+
+ if (connectionOpen) {
+ if (fResources.size() == 1) {
+ IFileStore store = fResources.get(0);
+ /*
+ * Assume that we have already called fetchInfo() on the file store, so this should
+ * effectively be a noop.
+ */
+ if (store.fetchInfo().isDirectory()) {
+ newFolderEnabled = true;
+ }
+ if (store.getParent() != null) {
+ upEnabled = true;
+ }
+ }
+ }
+
+ if (fUpButton != null) {
+ fUpButton.setEnabled(upEnabled);
+ }
+ if (fNewFolderButton != null) {
+ fNewFolderButton.setEnabled(newFolderEnabled);
+ }
+ if (fRemotePathText != null) {
+ fRemotePathText.setEnabled(connectionOpen);
+ }
+ if (fTreeViewer != null) {
+ fTreeViewer.getTree().setEnabled(connectionOpen);
+ }
+ if (fShowHiddenButton != null) {
+ fShowHiddenButton.setEnabled(connectionOpen);
+ }
+ }
+}
diff --git a/remote/pom.xml b/remote/pom.xml
index 2c1c2eae236..e6e17f123c3 100644
--- a/remote/pom.xml
+++ b/remote/pom.xml
@@ -17,7 +17,7 @@
<parent>
<groupId>org.eclipse.cdt</groupId>
<artifactId>cdt-parent</artifactId>
- <version>10.3.0-SNAPSHOT</version>
+ <version>10.7.0-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.cdt.remote-parent</artifactId>

Back to the top