From af5c33ecaa05a95ea90e117f2d684690111fc43f Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 9 Jul 2015 12:54:27 +0200 Subject: Bug 472335: Upgrade tcf-remote to work with org.eclipse.remote 2.0 Change-Id: I29bef7ff99dc5b0665a20f09eb4704b07cbc3c49 Signed-off-by: Markus Schorn --- admin/pom-config.xml | 794 ++++++------ .../feature.xml | 114 +- .../feature.xml | 92 +- .../tcf/filesystem/core/internal/FSTreeNode.java | 1341 ++++++++++---------- .../core/internal/url/TcfURLConnection.java | 616 +++++---- .../.settings/org.eclipse.jdt.core.prefs | 769 +++++------ .../META-INF/MANIFEST.MF | 48 +- .../org.eclipse.tcf.te.tcf.remote.core/plugin.xml | 79 +- .../tcf/te/tcf/remote/core/TCFConnection.java | 604 +++++---- .../tcf/te/tcf/remote/core/TCFConnectionBase.java | 102 -- .../te/tcf/remote/core/TCFConnectionManager.java | 473 +++---- .../tcf/remote/core/TCFConnectionWorkingCopy.java | 155 --- .../te/tcf/remote/core/TCFEclipseFileSystem.java | 127 +- .../tcf/te/tcf/remote/core/TCFFileManager.java | 58 - .../tcf/te/tcf/remote/core/TCFFileStore.java | 454 ++++--- .../eclipse/tcf/te/tcf/remote/core/TCFProcess.java | 400 +++--- .../tcf/te/tcf/remote/core/TCFProcessBuilder.java | 248 ++-- .../tcf/remote/core/TCFRemoteConnectionType.java | 33 + .../tcf/te/tcf/remote/core/TCFRemoteServices.java | 41 - .../tcf/te/tcf/remote/core/TCFServicesFactory.java | 62 +- .../remote/core/activator/CoreBundleActivator.java | 159 +-- .../core/operation/TCFFileStoreOperation.java | 170 +-- .../core/operation/TCFOperationChildStores.java | 1 + .../remote/core/operation/TCFOperationMkDir.java | 176 +-- .../META-INF/MANIFEST.MF | 42 +- .../org.eclipse.tcf.te.tcf.remote.ui/plugin.xml | 47 +- .../te/tcf/remote/ui/TCFFileSystemContributor.java | 168 ++- .../te/tcf/remote/ui/TCFUIConnectionService.java | 35 + .../tcf/te/tcf/remote/ui/TCFUIFileManager.java | 100 -- .../tcf/te/tcf/remote/ui/TCFUIFileService.java | 112 ++ .../tcf/te/tcf/remote/ui/TCFUIServices.java | 47 - .../tcf/te/tcf/remote/ui/TCFUIServicesFactory.java | 48 +- .../tcf/te/tcf/remote/ui/activator/UIPlugin.java | 133 +- 33 files changed, 3881 insertions(+), 3967 deletions(-) delete mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionBase.java delete mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionWorkingCopy.java delete mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileManager.java create mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteConnectionType.java delete mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteServices.java create mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIConnectionService.java delete mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileManager.java create mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileService.java delete mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServices.java diff --git a/admin/pom-config.xml b/admin/pom-config.xml index 85b718d2f..71258f078 100644 --- a/admin/pom-config.xml +++ b/admin/pom-config.xml @@ -1,397 +1,397 @@ - - - 4.0.0 - - - 3.0 - - - org.eclipse.tcf - org.eclipse.tcf.maven-config - 1.4.0-SNAPSHOT - pom - TCF and Target Explorer, Maven Configuration Master - - - - Eclipse Public License - http://www.eclipse.org/legal/epl-v10.html - repo - - - - - Eclipse Foundation - http://www.eclipse.org/ - - - - - 0.22.0 - 0.22.0 - 2.7 - 1.8 - 1.5 - - 2.5.2 - - 0.7.4.201502262128 - 1.1.2 - - - ${env.WORKSPACE}/admin - development - UTF-8 - - - false - file - true - - scm:git:git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.git - - - - http://download.eclipse.org/eclipse/updates/3.8 - http://download.eclipse.org/cbi/updates/license - http://download.eclipse.org/tools/cdt/releases/kepler - http://download.eclipse.org/tm/updates/4.0milestones - http://download.eclipse.org/tm/terminal/updates/4.0milestones - http://download.eclipse.org/tools/ptp/builds/remote/1.1.1 - http://archive.eclipse.org/tm/updates/rxtx - http://download.eclipse.org/tools/orbit/downloads/drops/R20150519210750/repository/ - http://download.eclipse.org/technology/swtbot/releases/latest/ - - - - - license-feature - ${license-site} - p2 - - - platform - ${platform-site} - p2 - - - orbit - ${orbit-site} - p2 - - - cdt - ${cdt-site} - p2 - - - terminal - ${terminal-site} - p2 - - - tm - ${tm-site} - p2 - - - swtbot - ${swtbot-site} - p2 - - - ptp-remote - ${ptp-remote-site} - p2 - - - rxtx - ${rxtx-site} - p2 - - - - - - sonatype - https://oss.sonatype.org/content/repositories/public - - true - - - true - - - - cbi - https://repo.eclipse.org/content/repositories/cbi-releases/ - - - cbi-snapshots - https://repo.eclipse.org/content/repositories/cbi-snapshots/ - - - - - - - kepler - - - http://download.eclipse.org/eclipse/updates/4.3 - - - - - - luna - - - http://download.eclipse.org/eclipse/updates/4.4 - http://download.eclipse.org/tools/cdt/releases/8.4 - - - - - - - mars - - - http://download.eclipse.org/eclipse/updates/4.5milestones - http://download.eclipse.org/tools/cdt/builds/mars/milestones - - - - - - - - - org.eclipse.tycho - tycho-maven-plugin - ${tycho-version} - true - - - - - - org.eclipse.tycho - tycho-maven-plugin - ${tycho-version} - true - - - org.eclipse.tycho - target-platform-configuration - ${tycho-version} - - - - linux - gtk - x86 - - - linux - gtk - x86_64 - - - win32 - win32 - x86 - - - win32 - win32 - x86_64 - - - p2 - true - true - - - - org.eclipse.tycho - tycho-compiler-plugin - ${tycho-version} - - UTF-8 - - - - org.eclipse.tycho - tycho-source-plugin - ${tycho-version} - - UTF-8 - - - - plugin-source - - plugin-source - - - - - - org.eclipse.tycho - tycho-packaging-plugin - ${tycho-version} - - - org.eclipse.tycho.extras - tycho-buildtimestamp-jgit - ${tycho-version} - - - org.eclipse.tycho.extras - tycho-sourceref-jgit - ${tycho-extras-version} - - - - false - jgit - pom.xml - ignore - - true - - - - - org.eclipse.tycho - tycho-p2-repository-plugin - ${tycho-version} - - ${project.artifactId} - - - - org.apache.maven.plugins - maven-resources-plugin - ${maven-resources-version} - - UTF-8 - - - - org.apache.maven.plugins - maven-antrun-plugin - ${maven-antrun-version} - - - org.codehaus.gmaven - gmaven-plugin - ${gmaven-version} - - - org.codehaus.mojo - findbugs-maven-plugin - ${findbugs-version} - - UTF-8 - Max - Low - true - false - ${adminDir}/findbugs-exclude.xml - - - - - check - - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-version} - - - - - org.eclipse.tycho.extras - tycho-pack200a-plugin - ${tycho-version} - - - pack200-normalize - verify - - normalize - - - - - - org.eclipse.cbi.maven.plugins - eclipse-jarsigner-plugin - ${eclipse-jarsigner-version} - - - sign - verify - - sign - - - - - - org.eclipse.tycho.extras - tycho-pack200b-plugin - ${tycho-version} - - - pack200-pack - verify - - pack - - - - - - - - org.eclipse.tycho - tycho-p2-plugin - ${tycho-version} - - - - - p2-metadata - package - - p2-metadata - - - - - false - - - - - - + + + 4.0.0 + + + 3.0 + + + org.eclipse.tcf + org.eclipse.tcf.maven-config + 1.4.0-SNAPSHOT + pom + TCF and Target Explorer, Maven Configuration Master + + + + Eclipse Public License + http://www.eclipse.org/legal/epl-v10.html + repo + + + + + Eclipse Foundation + http://www.eclipse.org/ + + + + + 0.22.0 + 0.22.0 + 2.7 + 1.8 + 1.5 + + 2.5.2 + + 0.7.4.201502262128 + 1.1.2 + + + ${env.WORKSPACE}/admin + development + UTF-8 + + + false + file + true + + scm:git:git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.git + + + + http://download.eclipse.org/eclipse/updates/3.8 + http://download.eclipse.org/cbi/updates/license + http://download.eclipse.org/tools/cdt/releases/kepler + http://download.eclipse.org/tm/updates/4.0milestones + http://download.eclipse.org/tm/terminal/updates/4.0milestones + http://download.eclipse.org/tools/ptp/builds/remote/2.0.0 + http://archive.eclipse.org/tm/updates/rxtx + http://download.eclipse.org/tools/orbit/downloads/drops/R20150519210750/repository/ + http://download.eclipse.org/technology/swtbot/releases/latest/ + + + + + license-feature + ${license-site} + p2 + + + platform + ${platform-site} + p2 + + + orbit + ${orbit-site} + p2 + + + cdt + ${cdt-site} + p2 + + + terminal + ${terminal-site} + p2 + + + tm + ${tm-site} + p2 + + + swtbot + ${swtbot-site} + p2 + + + ptp-remote + ${ptp-remote-site} + p2 + + + rxtx + ${rxtx-site} + p2 + + + + + + sonatype + https://oss.sonatype.org/content/repositories/public + + true + + + true + + + + cbi + https://repo.eclipse.org/content/repositories/cbi-releases/ + + + cbi-snapshots + https://repo.eclipse.org/content/repositories/cbi-snapshots/ + + + + + + + kepler + + + http://download.eclipse.org/eclipse/updates/4.3 + + + + + + luna + + + http://download.eclipse.org/eclipse/updates/4.4 + http://download.eclipse.org/tools/cdt/releases/8.4 + + + + + + + mars + + + http://download.eclipse.org/eclipse/updates/4.5milestones + http://download.eclipse.org/tools/cdt/builds/mars/milestones + + + + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + + + linux + gtk + x86 + + + linux + gtk + x86_64 + + + win32 + win32 + x86 + + + win32 + win32 + x86_64 + + + p2 + true + true + + + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho-version} + + UTF-8 + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + UTF-8 + + + + plugin-source + + plugin-source + + + + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho-version} + + + org.eclipse.tycho.extras + tycho-buildtimestamp-jgit + ${tycho-version} + + + org.eclipse.tycho.extras + tycho-sourceref-jgit + ${tycho-extras-version} + + + + false + jgit + pom.xml + ignore + + true + + + + + org.eclipse.tycho + tycho-p2-repository-plugin + ${tycho-version} + + ${project.artifactId} + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-version} + + UTF-8 + + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun-version} + + + org.codehaus.gmaven + gmaven-plugin + ${gmaven-version} + + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-version} + + UTF-8 + Max + Low + true + false + ${adminDir}/findbugs-exclude.xml + + + + + check + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-version} + + + + + org.eclipse.tycho.extras + tycho-pack200a-plugin + ${tycho-version} + + + pack200-normalize + verify + + normalize + + + + + + org.eclipse.cbi.maven.plugins + eclipse-jarsigner-plugin + ${eclipse-jarsigner-version} + + + sign + verify + + sign + + + + + + org.eclipse.tycho.extras + tycho-pack200b-plugin + ${tycho-version} + + + pack200-pack + verify + + pack + + + + + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho-version} + + + + + p2-metadata + package + + p2-metadata + + + + + false + + + + + + diff --git a/target_explorer/features/org.eclipse.tcf.te.tcf.remote.feature/feature.xml b/target_explorer/features/org.eclipse.tcf.te.tcf.remote.feature/feature.xml index da50dbf3f..2758e79b1 100644 --- a/target_explorer/features/org.eclipse.tcf.te.tcf.remote.feature/feature.xml +++ b/target_explorer/features/org.eclipse.tcf.te.tcf.remote.feature/feature.xml @@ -1,57 +1,57 @@ - - - - - %description - - - - %copyright - - - - %license - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + %description + + + + %copyright + + + + %license + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/target_explorer/features/org.eclipse.tcf.te.tcf.remote.sdk.feature/feature.xml b/target_explorer/features/org.eclipse.tcf.te.tcf.remote.sdk.feature/feature.xml index ba65ab775..2bdb487a3 100644 --- a/target_explorer/features/org.eclipse.tcf.te.tcf.remote.sdk.feature/feature.xml +++ b/target_explorer/features/org.eclipse.tcf.te.tcf.remote.sdk.feature/feature.xml @@ -1,46 +1,46 @@ - - - - - %description - - - - %copyright - - - - %license - - - - - - - - - - - - - - - - - + + + + + %description + + + + %copyright + + + + %license + + + + + + + + + + + + + + + + + diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/FSTreeNode.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/FSTreeNode.java index 6d3036703..3aff1f101 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/FSTreeNode.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/FSTreeNode.java @@ -1,663 +1,678 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * William Chen (Wind River) - [345384] Provide property pages for remote file system nodes - * William Chen (Wind River) - [352302]Opening a file in an editor depending on - * the client's permissions. - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.filesystem.core.internal; - -import static java.util.Collections.singletonList; - -import java.beans.PropertyChangeEvent; -import java.io.File; -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLEncoder; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.QualifiedName; -import org.eclipse.core.runtime.content.IContentType; -import org.eclipse.tcf.protocol.Protocol; -import org.eclipse.tcf.services.IFileSystem; -import org.eclipse.tcf.services.IFileSystem.FileAttrs; -import org.eclipse.tcf.te.core.interfaces.IFilterable; -import org.eclipse.tcf.te.core.interfaces.IPropertyChangeProvider; -import org.eclipse.tcf.te.core.interfaces.IViewerInput; -import org.eclipse.tcf.te.tcf.filesystem.core.activator.CorePlugin; -import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IConfirmCallback; -import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IOperation; -import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IResultOperation; -import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNode; -import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNodeWorkingCopy; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCopy; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCopyLocal; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCreateFile; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCreateFolder; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpDelete; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpDownload; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpMove; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpRefresh; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpRename; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpUpload; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.testers.TargetPropertyTester; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.url.TcfURLConnection; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.url.TcfURLStreamHandlerService; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.CacheManager; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.ContentTypeHelper; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.FileState; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.PersistenceManager; -import org.eclipse.tcf.te.tcf.filesystem.core.model.CacheState; -import org.eclipse.tcf.te.tcf.filesystem.core.model.RuntimeModel; -import org.eclipse.tcf.te.tcf.filesystem.core.nls.Messages; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; - -/** - * Representation of a file system tree node. - *

- * Note: Node construction and child list access is limited to the TCF - * event dispatch thread. - */ -@SuppressWarnings("deprecation") -public final class FSTreeNode extends FSTreeNodeBase implements IFilterable, org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode { - private static final QualifiedName EDITOR_KEY = new QualifiedName("org.eclipse.ui.internal.registry.ResourceEditorRegistry", "EditorProperty");//$NON-NLS-2$//$NON-NLS-1$ - static final String KEY_WIN32_ATTRS = "Win32Attrs"; //$NON-NLS-1$ - private static final Comparator CMP_WIN = new Comparator() { - @Override - public int compare(FSTreeNode o1, FSTreeNode o2) { - return o1.getName().compareToIgnoreCase(o2.getName()); - } - }; - private static final Comparator CMP_UNIX = new Comparator() { - @Override - public int compare(FSTreeNode o1, FSTreeNode o2) { - return o1.getName().compareTo(o2.getName()); - } - }; - - - private FSTreeNode fParent; - private String fName; - - private Type fType; - private IFileSystem.FileAttrs fAttributes; - - private FSTreeNode[] fChildren = null; - - private final RuntimeModel fRuntimeModel; - private final boolean fWindowsNode; - private long fRefreshTime; - - - public FSTreeNode(RuntimeModel runtimeModel, String name) { - fRuntimeModel = runtimeModel; - fParent = null; - fName = name; - fAttributes = null; - fType = Type.FILE_SYSTEM; - fWindowsNode = isWindowsNode(getPeerNode()); - Assert.isTrue(Protocol.isDispatchThread()); - } - - private boolean isWindowsNode(IPeerNode peerNode) { - String osname = TargetPropertyTester.getOSName(peerNode); - if (osname != null){ - return osname.startsWith("Windows"); //$NON-NLS-1$ - } - return false; - } - - public FSTreeNode(FSTreeNode parent, String name, boolean isRootDir, IFileSystem.FileAttrs attribs) { - fRuntimeModel = parent.getRuntimeModel(); - fWindowsNode = parent.isWindowsNode() || (isRootDir && name.endsWith("\\")); //$NON-NLS-1$ - fParent = parent; - fName = name; - fAttributes = attribs; - if (isRootDir) { - fType = Type.ROOT; - } else { - fType = Type.DIRECTORY_OR_FILE; - } - Assert.isTrue(Protocol.isDispatchThread()); - } - - @Override - public String toString() { - return getClass().getSimpleName() + ": name=" + fName; //$NON-NLS-1$ - } - - @Override - public Object getAdapter(Class adapter) { - if(IViewerInput.class.equals(adapter)) { - return getPeerNode().getAdapter(IViewerInput.class); - } - if(IPropertyChangeProvider.class.equals(adapter)) { - return getPeerNode().getAdapter(adapter); - } - return super.getAdapter(adapter); - } - - @Override - public RuntimeModel getRuntimeModel() { - return fRuntimeModel; - } - - @Override - public IPeerNode getPeerNode() { - return fRuntimeModel.getPeerNode(); - } - - @Override - public UserAccount getUserAccount() { - return fRuntimeModel.getUserAccount(); - } - - @Override - public Type getType() { - return fType; - } - - @Override - public boolean isWindowsNode() { - return fWindowsNode; - } - - @Override - public boolean isFile() { - return fAttributes != null && fAttributes.isFile(); - } - - @Override - public boolean isDirectory() { - switch(fType) { - case FILE_SYSTEM: - return false; - case ROOT: - return true; - case DIRECTORY_OR_FILE: - return fAttributes == null || fAttributes.isDirectory(); - } - return false; - } - - @Override - public boolean isRootDirectory() { - return fType == Type.ROOT; - } - - public FileAttrs getAttributes() { - return fAttributes; - } - - @Override - protected int getWin32Attrs() { - final FileAttrs attribs = fAttributes; - if (attribs != null && attribs.attributes != null) { - Object val = attribs.attributes.get(KEY_WIN32_ATTRS); - if (val instanceof Integer) { - return ((Integer) val).intValue(); - } - } - return 0; - } - - @Override - protected int getPermissions() { - final FileAttrs attribs = fAttributes; - if (attribs != null) { - return attribs.permissions; - } - return 0; - } - - @Override - public String getLocation() { - return getLocation(false); - } - - public String getLocation(boolean forceSlashes) { - return getLocation(isWindowsNode() && !forceSlashes ? '\\' : '/', false); - } - - private String getLocation(char separator, boolean encodeName) { - String name = getName(); - if (fType == Type.ROOT) { - if (isWindowsNode() && name.charAt(name.length()-1) != separator) { - return name.substring(0, name.length()-1) + separator; - } - return name; - } - if (fParent == null) - return name; - - - String pLoc = fParent.getLocation(separator, encodeName); - if (pLoc.length() == 0) - return name; - - if (encodeName) { - try { - name = URLEncoder.encode(getName(), "UTF-8"); //$NON-NLS-1$ - } catch (Exception e) { - // Ignore - } - } - char lastChar = pLoc.charAt(pLoc.length()-1); - if (lastChar != separator) - return pLoc + separator + name; - - return pLoc + name; - } - - /** - * Get the URL of the file or folder. The URL's format is created in the - * following way: tcf://remote/path/to/the/resource... See - * {@link TcfURLConnection#TcfURLConnection(URL)} - * - * @see TcfURLStreamHandlerService#parseURL(URL, String, int, int) - * @see #getLocationURI() - * @return The URL of the file/folder. - */ - @Override - public URL getLocationURL() { - try { - URI uri = getLocationURI(); - return uri == null ? null : uri.toURL(); - } catch (MalformedURLException e) { - CorePlugin.logError("Cannot create tcf url", e); //$NON-NLS-1$ - } - return null; - } - - /** - * Get the URI of the file or folder. The URI's format is created in the - * following way: tcf://remote/path/to/the/resource... - * - * @return The URI of the file/folder. - */ - @Override - public URI getLocationURI() { - try { - String id = getPeerNode().getPeerId(); - String path = getLocation('/', true); - return new URI(TcfURLConnection.PROTOCOL_SCHEMA, id, "/" + path, null); //$NON-NLS-1$ - } catch (URISyntaxException e) { - CorePlugin.logError("Cannot create tcf uri", e); //$NON-NLS-1$ - return null; - } - } - - /** - * Get the type label of the file for displaying purpose. - * - * @return The type label text. - */ - @Override - public String getFileTypeLabel() { - switch (fType) { - case FILE_SYSTEM: - return Messages.FSTreeNodeContentProvider_rootNodeLabel; - case ROOT: - return Messages.FSTreeNode_TypeLocalDisk; - case DIRECTORY_OR_FILE: - break; - } - - if (isDirectory()) - return Messages.FSTreeNode_TypeFileFolder; - - if (isSystemFile()) { - return Messages.FSTreeNode_TypeSystemFile; - } - IContentType contentType = Platform.getContentTypeManager().findContentTypeFor(getName()); - if (contentType != null) { - return contentType.getName(); - } - int lastDot = getName().lastIndexOf("."); //$NON-NLS-1$ - if (lastDot == -1) { - return Messages.FSTreeNode_TypeUnknownFile; - } - return getName().substring(lastDot + 1).toUpperCase() + " " + Messages.FSTreeNode_TypeFile; //$NON-NLS-1$ - } - - - /** - * Get the local file's state of the specified tree node. The local file must exist - * before calling this method to get its state. - * - * @return The tree node's latest cache state. - */ - @Override - public CacheState getCacheState() { - File file = CacheManager.getCacheFile(this); - if (!file.exists()) { - return CacheState.consistent; - } - FileState digest = PersistenceManager.getInstance().getFileDigest(this); - return digest.getCacheState(); - } - - @Override - public FSTreeNode getParent() { - return fParent; - } - - @Override - public String getName() { - return fName; - } - - @Override - public IFSTreeNodeWorkingCopy createWorkingCopy() { - return new FSTreeNodeWorkingCopy(this); - } - - @Override - public boolean isFileSystem() { - return fType == Type.FILE_SYSTEM; - } - - @Override - public long getAccessTime() { - if (fAttributes != null) - return fAttributes.atime; - return 0; - } - - @Override - public long getModificationTime() { - if (fAttributes != null) - return fAttributes.mtime; - return 0; - } - - @Override - public long getSize() { - if (fAttributes != null) - return fAttributes.size; - return 0; - } - - @Override - public int getUID() { - if (fAttributes != null) - return fAttributes.uid; - return 0; - } - - @Override - public int getGID() { - if (fAttributes != null) - return fAttributes.gid; - return 0; - } - - @Override - public boolean isAncestorOf(IFSTreeNode node) { - while (node != null) { - if ((node = node.getParent()) == this) - return true; - } - return false; - } - - @Override - public File getCacheFile() { - return CacheManager.getCacheFile(this); - } - - @Override - public String getPreferredEditorID() { - return PersistenceManager.getInstance().getPersistentProperties(this).get(EDITOR_KEY); - } - - @Override - public void setPreferredEditorID(String editorID) { - PersistenceManager.getInstance().getPersistentProperties(this).put(EDITOR_KEY, editorID); - } - - @Override - public IContentType getContentType() { - return ContentTypeHelper.getContentType(this); - } - - @Override - public boolean isBinaryFile() { - return ContentTypeHelper.isBinaryFile(this); - } - - @Override - public FSTreeNode[] getChildren() { - return fChildren; - } - - @Override - public IOperation operationRefresh(boolean recursive) { - return new OpRefresh(this, recursive); - } - - - @Override - public IOperation operationRename(String newName) { - return new OpRename(this, newName); - } - - @Override - public IOperation operationUploadContent(File srcFile) { - if (srcFile == null) - srcFile = getCacheFile(); - - OpUpload upload = new OpUpload(null); - upload.addUpload(srcFile, this); - return upload; - } - - @Override - public IOperation operationDelete(IConfirmCallback readonlyCallback) { - return new OpDelete(singletonList(this), readonlyCallback); - } - - @Override - public IOperation operationDownload(OutputStream output) { - return new OpDownload(this, output); - } - - @Override - public IOperation operationDownload(File destinationFolder, IConfirmCallback confirmCallback) { - return new OpCopyLocal(singletonList(this), destinationFolder, confirmCallback); - } - - @Override - public IOperation operationDropFiles(List files, IConfirmCallback confirmCallback) { - OpUpload upload = new OpUpload(confirmCallback); - for (String file : files) { - upload.addDrop(new File(file), this); - } - return upload; - } - - @Override - public IOperation operationDropMove(List nodes, IConfirmCallback confirmCallback) { - return new OpMove(nodes, this, confirmCallback); - } - - @Override - public IOperation operationDropCopy(List nodes, boolean cpPerm, boolean cpOwn, - IConfirmCallback moveCopyCallback) { - return new OpCopy(nodes, this, cpPerm, cpOwn, moveCopyCallback); - } - - @Override - public IResultOperation operationNewFile(String name) { - return new OpCreateFile(this, name); - } - - @Override - public IResultOperation operationNewFolder(String name) { - return new OpCreateFolder(this, name); - } - - public void changeParent(FSTreeNode newParent) { - fParent = newParent; - } - - public void changeName(String newName) { - fName = newName; - } - - @Override - public FSTreeNode findChild(String name) { - return binarySearch(fChildren, name); - } - - public void addNode(FSTreeNode newNode, boolean notify) { - final FSTreeNode[] children = fChildren; - if (children == null) { - setChildren(new FSTreeNode[] {newNode}, notify); - } else { - int ip = Arrays.binarySearch(children, newNode, getComparator()); - if (ip >= 0) { - children[ip] = newNode; - } else { - ip = -ip - 1; - FSTreeNode[] newChildren = new FSTreeNode[children.length+1]; - System.arraycopy(children, 0, newChildren, 0, ip); - newChildren[ip] = newNode; - System.arraycopy(children, ip, newChildren, ip+1, children.length-ip); - setChildren(newChildren, notify); - } - } - } - - public void removeNode(FSTreeNode node, boolean notify) { - final FSTreeNode[] children = fChildren; - if (children == null) - return; - - int ip = Arrays.binarySearch(children, node, getComparator()); - if (ip < 0 || children[ip] != node) - return; - - FSTreeNode[] newChildren = new FSTreeNode[children.length-1]; - System.arraycopy(children, 0, newChildren, 0, ip); - System.arraycopy(children, ip+1, newChildren, ip, children.length-ip-1); - setChildren(newChildren, notify); - } - - public void setContent(FSTreeNode[] children, boolean notify) { - setContent(children, notify, true); - } - - public void setContent(FSTreeNode[] children, boolean notify, boolean updateRefreshTime) { - final Comparator comparator = getComparator(); - Arrays.sort(children, comparator); - if (fChildren != null) { - int j = 0; - for (int i=0; i 0) { - break; - } - } - } - } - if (updateRefreshTime) fRefreshTime = System.currentTimeMillis(); - setChildren(children, notify); - } - - private Comparator getComparator() { - return isWindowsNode() ? CMP_WIN : CMP_UNIX; - } - - private void setChildren(FSTreeNode[] children, boolean notify) { - Assert.isTrue(Protocol.isDispatchThread()); - FSTreeNode[] oldChildren = fChildren; - fChildren = children; - if (notify) { - notifyChange("children", oldChildren, children); //$NON-NLS-1$ - } - } - - public void setAttributes(FileAttrs attrs, boolean notify) { - FileAttrs oldAttrs = fAttributes; - fAttributes = attrs; - if (attrs != null && attrs.isFile()) - fRefreshTime = System.currentTimeMillis(); - if (notify) { - notifyChange("attributes", oldAttrs, attrs); //$NON-NLS-1$ - } - } - - public void notifyChange() { - notifyChange("children", null, null); //$NON-NLS-1$ - } - - private void notifyChange(String prop, Object oldValue, Object newValue) { - fRuntimeModel.firePropertyChanged(new PropertyChangeEvent(this, prop, oldValue, newValue)); - } - - @Override - public long getLastRefresh() { - return fRefreshTime; - } - - private FSTreeNode binarySearch(final FSTreeNode[] children, String name) { - if (children == null) - return null; - - boolean caseSensitive = !isWindowsNode(); - int low = 0; - int high = children.length - 1; - - while (low <= high) { - int mid = (low + high) >>> 1; - FSTreeNode midVal = children[mid]; - int cmp = caseSensitive ? midVal.getName().compareTo(name) : midVal.getName().compareToIgnoreCase(name); - if (cmp < 0) - low = mid + 1; - else if (cmp > 0) - high = mid - 1; - else - return midVal; - } - return null; - } - - @Override - public void setRevealOnConnect(boolean value) { - if (value) { - if (CorePlugin.getDefault().addToRevealOnConnect(getLocation(true))) { - notifyChange("favorites", Boolean.FALSE, Boolean.TRUE); //$NON-NLS-1$ - } - } else { - if (CorePlugin.getDefault().removeFromRevealOnConnect(getLocation(true))) { - notifyChange("favorites", Boolean.TRUE, Boolean.FALSE); //$NON-NLS-1$ - } - } - } - - @Override - public boolean isRevealOnConnect() { - return CorePlugin.getDefault().isRevealOnConnect(getLocation(true)); - } -} +/******************************************************************************* + * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + * William Chen (Wind River) - [345384] Provide property pages for remote file system nodes + * William Chen (Wind River) - [352302]Opening a file in an editor depending on + * the client's permissions. + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.filesystem.core.internal; + +import static java.util.Collections.singletonList; + +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.core.runtime.content.IContentType; +import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.services.IFileSystem; +import org.eclipse.tcf.services.IFileSystem.FileAttrs; +import org.eclipse.tcf.te.core.interfaces.IFilterable; +import org.eclipse.tcf.te.core.interfaces.IPropertyChangeProvider; +import org.eclipse.tcf.te.core.interfaces.IViewerInput; +import org.eclipse.tcf.te.tcf.filesystem.core.activator.CorePlugin; +import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IConfirmCallback; +import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IOperation; +import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IResultOperation; +import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNode; +import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNodeWorkingCopy; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCopy; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCopyLocal; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCreateFile; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpCreateFolder; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpDelete; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpDownload; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpMove; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpRefresh; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpRename; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpUpload; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.testers.TargetPropertyTester; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.url.TcfURLConnection; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.url.TcfURLStreamHandlerService; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.CacheManager; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.ContentTypeHelper; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.FileState; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.utils.PersistenceManager; +import org.eclipse.tcf.te.tcf.filesystem.core.model.CacheState; +import org.eclipse.tcf.te.tcf.filesystem.core.model.RuntimeModel; +import org.eclipse.tcf.te.tcf.filesystem.core.nls.Messages; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; + +/** + * Representation of a file system tree node. + *

+ * Note: Node construction and child list access is limited to the TCF + * event dispatch thread. + */ +@SuppressWarnings("deprecation") +public final class FSTreeNode extends FSTreeNodeBase implements IFilterable, org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode { + private static final QualifiedName EDITOR_KEY = new QualifiedName("org.eclipse.ui.internal.registry.ResourceEditorRegistry", "EditorProperty");//$NON-NLS-2$//$NON-NLS-1$ + static final String KEY_WIN32_ATTRS = "Win32Attrs"; //$NON-NLS-1$ + private static final Comparator CMP_WIN = new Comparator() { + @Override + public int compare(FSTreeNode o1, FSTreeNode o2) { + return o1.getName().compareToIgnoreCase(o2.getName()); + } + }; + private static final Comparator CMP_UNIX = new Comparator() { + @Override + public int compare(FSTreeNode o1, FSTreeNode o2) { + return o1.getName().compareTo(o2.getName()); + } + }; + + public static final String NOSLASH_MARKER = "/./"; //$NON-NLS-1$ + + public static String addNoSlashMarker(String path) { + if (path.length() > 0 && path.charAt(0) != '/') + return NOSLASH_MARKER + path; + return path; + } + + public static String stripNoSlashMarker(String path) { + if (path.startsWith(NOSLASH_MARKER)) + return path.substring(NOSLASH_MARKER.length()); + return path; + } + + + + private FSTreeNode fParent; + private String fName; + + private Type fType; + private IFileSystem.FileAttrs fAttributes; + + private FSTreeNode[] fChildren = null; + + private final RuntimeModel fRuntimeModel; + private final boolean fWindowsNode; + private long fRefreshTime; + + + public FSTreeNode(RuntimeModel runtimeModel, String name) { + fRuntimeModel = runtimeModel; + fParent = null; + fName = name; + fAttributes = null; + fType = Type.FILE_SYSTEM; + fWindowsNode = isWindowsNode(getPeerNode()); + Assert.isTrue(Protocol.isDispatchThread()); + } + + private boolean isWindowsNode(IPeerNode peerNode) { + String osname = TargetPropertyTester.getOSName(peerNode); + if (osname != null){ + return osname.startsWith("Windows"); //$NON-NLS-1$ + } + return false; + } + + public FSTreeNode(FSTreeNode parent, String name, boolean isRootDir, IFileSystem.FileAttrs attribs) { + fRuntimeModel = parent.getRuntimeModel(); + fWindowsNode = parent.isWindowsNode() || (isRootDir && name.endsWith("\\")); //$NON-NLS-1$ + fParent = parent; + fName = name; + fAttributes = attribs; + if (isRootDir) { + fType = Type.ROOT; + } else { + fType = Type.DIRECTORY_OR_FILE; + } + Assert.isTrue(Protocol.isDispatchThread()); + } + + @Override + public String toString() { + return getClass().getSimpleName() + ": name=" + fName; //$NON-NLS-1$ + } + + @Override + public Object getAdapter(Class adapter) { + if (IViewerInput.class.equals(adapter)) { + return getPeerNode().getAdapter(adapter); + } + if (IPropertyChangeProvider.class.equals(adapter)) { + return getPeerNode().getAdapter(adapter); + } + return super.getAdapter(adapter); + } + + @Override + public RuntimeModel getRuntimeModel() { + return fRuntimeModel; + } + + @Override + public IPeerNode getPeerNode() { + return fRuntimeModel.getPeerNode(); + } + + @Override + public UserAccount getUserAccount() { + return fRuntimeModel.getUserAccount(); + } + + @Override + public Type getType() { + return fType; + } + + @Override + public boolean isWindowsNode() { + return fWindowsNode; + } + + @Override + public boolean isFile() { + return fAttributes != null && fAttributes.isFile(); + } + + @Override + public boolean isDirectory() { + switch(fType) { + case FILE_SYSTEM: + return false; + case ROOT: + return true; + case DIRECTORY_OR_FILE: + return fAttributes == null || fAttributes.isDirectory(); + } + return false; + } + + @Override + public boolean isRootDirectory() { + return fType == Type.ROOT; + } + + public FileAttrs getAttributes() { + return fAttributes; + } + + @Override + protected int getWin32Attrs() { + final FileAttrs attribs = fAttributes; + if (attribs != null && attribs.attributes != null) { + Object val = attribs.attributes.get(KEY_WIN32_ATTRS); + if (val instanceof Integer) { + return ((Integer) val).intValue(); + } + } + return 0; + } + + @Override + protected int getPermissions() { + final FileAttrs attribs = fAttributes; + if (attribs != null) { + return attribs.permissions; + } + return 0; + } + + @Override + public String getLocation() { + return getLocation(false); + } + + public String getLocation(boolean forceSlashes) { + return getLocation(isWindowsNode() && !forceSlashes ? '\\' : '/', false); + } + + private String getLocation(char separator, boolean encodeName) { + String name = getName(); + if (fType == Type.ROOT) { + if (isWindowsNode() && name.charAt(name.length()-1) != separator) { + return name.substring(0, name.length()-1) + separator; + } + return name; + } + if (fParent == null) + return name; + + + String pLoc = fParent.getLocation(separator, encodeName); + if (pLoc.length() == 0) + return name; + + if (encodeName) { + try { + name = URLEncoder.encode(getName(), "UTF-8"); //$NON-NLS-1$ + } catch (Exception e) { + // Ignore + } + } + char lastChar = pLoc.charAt(pLoc.length()-1); + if (lastChar != separator) + return pLoc + separator + name; + + return pLoc + name; + } + + /** + * Get the URL of the file or folder. The URL's format is created in the + * following way: tcf://remote/path/to/the/resource... See + * {@link TcfURLConnection#TcfURLConnection(URL)} + * + * @see TcfURLStreamHandlerService#parseURL(URL, String, int, int) + * @see #getLocationURI() + * @return The URL of the file/folder. + */ + @Override + public URL getLocationURL() { + try { + URI uri = getLocationURI(); + return uri == null ? null : uri.toURL(); + } catch (MalformedURLException e) { + CorePlugin.logError("Cannot create tcf url", e); //$NON-NLS-1$ + } + return null; + } + + /** + * Get the URI of the file or folder. The URI's format is created in the + * following way: tcf://remote/path/to/the/resource... + * + * @return The URI of the file/folder. + */ + @Override + public URI getLocationURI() { + try { + String name = getPeerNode().getName(); + String path = getLocation('/', true); + return new URI(TcfURLConnection.PROTOCOL_SCHEMA, name, addNoSlashMarker(path), null); + } catch (URISyntaxException e) { + CorePlugin.logError("Cannot create tcf uri", e); //$NON-NLS-1$ + return null; + } + } + + /** + * Get the type label of the file for displaying purpose. + * + * @return The type label text. + */ + @Override + public String getFileTypeLabel() { + switch (fType) { + case FILE_SYSTEM: + return Messages.FSTreeNodeContentProvider_rootNodeLabel; + case ROOT: + return Messages.FSTreeNode_TypeLocalDisk; + case DIRECTORY_OR_FILE: + break; + } + + if (isDirectory()) + return Messages.FSTreeNode_TypeFileFolder; + + if (isSystemFile()) { + return Messages.FSTreeNode_TypeSystemFile; + } + IContentType contentType = Platform.getContentTypeManager().findContentTypeFor(getName()); + if (contentType != null) { + return contentType.getName(); + } + int lastDot = getName().lastIndexOf("."); //$NON-NLS-1$ + if (lastDot == -1) { + return Messages.FSTreeNode_TypeUnknownFile; + } + return getName().substring(lastDot + 1).toUpperCase() + " " + Messages.FSTreeNode_TypeFile; //$NON-NLS-1$ + } + + + /** + * Get the local file's state of the specified tree node. The local file must exist + * before calling this method to get its state. + * + * @return The tree node's latest cache state. + */ + @Override + public CacheState getCacheState() { + File file = CacheManager.getCacheFile(this); + if (!file.exists()) { + return CacheState.consistent; + } + FileState digest = PersistenceManager.getInstance().getFileDigest(this); + return digest.getCacheState(); + } + + @Override + public FSTreeNode getParent() { + return fParent; + } + + @Override + public String getName() { + return fName; + } + + @Override + public IFSTreeNodeWorkingCopy createWorkingCopy() { + return new FSTreeNodeWorkingCopy(this); + } + + @Override + public boolean isFileSystem() { + return fType == Type.FILE_SYSTEM; + } + + @Override + public long getAccessTime() { + if (fAttributes != null) + return fAttributes.atime; + return 0; + } + + @Override + public long getModificationTime() { + if (fAttributes != null) + return fAttributes.mtime; + return 0; + } + + @Override + public long getSize() { + if (fAttributes != null) + return fAttributes.size; + return 0; + } + + @Override + public int getUID() { + if (fAttributes != null) + return fAttributes.uid; + return 0; + } + + @Override + public int getGID() { + if (fAttributes != null) + return fAttributes.gid; + return 0; + } + + @Override + public boolean isAncestorOf(IFSTreeNode node) { + while (node != null) { + if ((node = node.getParent()) == this) + return true; + } + return false; + } + + @Override + public File getCacheFile() { + return CacheManager.getCacheFile(this); + } + + @Override + public String getPreferredEditorID() { + return PersistenceManager.getInstance().getPersistentProperties(this).get(EDITOR_KEY); + } + + @Override + public void setPreferredEditorID(String editorID) { + PersistenceManager.getInstance().getPersistentProperties(this).put(EDITOR_KEY, editorID); + } + + @Override + public IContentType getContentType() { + return ContentTypeHelper.getContentType(this); + } + + @Override + public boolean isBinaryFile() { + return ContentTypeHelper.isBinaryFile(this); + } + + @Override + public FSTreeNode[] getChildren() { + return fChildren; + } + + @Override + public IOperation operationRefresh(boolean recursive) { + return new OpRefresh(this, recursive); + } + + + @Override + public IOperation operationRename(String newName) { + return new OpRename(this, newName); + } + + @Override + public IOperation operationUploadContent(File srcFile) { + if (srcFile == null) + srcFile = getCacheFile(); + + OpUpload upload = new OpUpload(null); + upload.addUpload(srcFile, this); + return upload; + } + + @Override + public IOperation operationDelete(IConfirmCallback readonlyCallback) { + return new OpDelete(singletonList(this), readonlyCallback); + } + + @Override + public IOperation operationDownload(OutputStream output) { + return new OpDownload(this, output); + } + + @Override + public IOperation operationDownload(File destinationFolder, IConfirmCallback confirmCallback) { + return new OpCopyLocal(singletonList(this), destinationFolder, confirmCallback); + } + + @Override + public IOperation operationDropFiles(List files, IConfirmCallback confirmCallback) { + OpUpload upload = new OpUpload(confirmCallback); + for (String file : files) { + upload.addDrop(new File(file), this); + } + return upload; + } + + @Override + public IOperation operationDropMove(List nodes, IConfirmCallback confirmCallback) { + return new OpMove(nodes, this, confirmCallback); + } + + @Override + public IOperation operationDropCopy(List nodes, boolean cpPerm, boolean cpOwn, + IConfirmCallback moveCopyCallback) { + return new OpCopy(nodes, this, cpPerm, cpOwn, moveCopyCallback); + } + + @Override + public IResultOperation operationNewFile(String name) { + return new OpCreateFile(this, name); + } + + @Override + public IResultOperation operationNewFolder(String name) { + return new OpCreateFolder(this, name); + } + + public void changeParent(FSTreeNode newParent) { + fParent = newParent; + } + + public void changeName(String newName) { + fName = newName; + } + + @Override + public FSTreeNode findChild(String name) { + return binarySearch(fChildren, name); + } + + public void addNode(FSTreeNode newNode, boolean notify) { + final FSTreeNode[] children = fChildren; + if (children == null) { + setChildren(new FSTreeNode[] {newNode}, notify); + } else { + int ip = Arrays.binarySearch(children, newNode, getComparator()); + if (ip >= 0) { + children[ip] = newNode; + } else { + ip = -ip - 1; + FSTreeNode[] newChildren = new FSTreeNode[children.length+1]; + System.arraycopy(children, 0, newChildren, 0, ip); + newChildren[ip] = newNode; + System.arraycopy(children, ip, newChildren, ip+1, children.length-ip); + setChildren(newChildren, notify); + } + } + } + + public void removeNode(FSTreeNode node, boolean notify) { + final FSTreeNode[] children = fChildren; + if (children == null) + return; + + int ip = Arrays.binarySearch(children, node, getComparator()); + if (ip < 0 || children[ip] != node) + return; + + FSTreeNode[] newChildren = new FSTreeNode[children.length-1]; + System.arraycopy(children, 0, newChildren, 0, ip); + System.arraycopy(children, ip+1, newChildren, ip, children.length-ip-1); + setChildren(newChildren, notify); + } + + public void setContent(FSTreeNode[] children, boolean notify) { + setContent(children, notify, true); + } + + public void setContent(FSTreeNode[] children, boolean notify, boolean updateRefreshTime) { + final Comparator comparator = getComparator(); + Arrays.sort(children, comparator); + if (fChildren != null) { + int j = 0; + for (int i=0; i 0) { + break; + } + } + } + } + if (updateRefreshTime) fRefreshTime = System.currentTimeMillis(); + setChildren(children, notify); + } + + private Comparator getComparator() { + return isWindowsNode() ? CMP_WIN : CMP_UNIX; + } + + private void setChildren(FSTreeNode[] children, boolean notify) { + Assert.isTrue(Protocol.isDispatchThread()); + FSTreeNode[] oldChildren = fChildren; + fChildren = children; + if (notify) { + notifyChange("children", oldChildren, children); //$NON-NLS-1$ + } + } + + public void setAttributes(FileAttrs attrs, boolean notify) { + FileAttrs oldAttrs = fAttributes; + fAttributes = attrs; + if (attrs != null && attrs.isFile()) + fRefreshTime = System.currentTimeMillis(); + if (notify) { + notifyChange("attributes", oldAttrs, attrs); //$NON-NLS-1$ + } + } + + public void notifyChange() { + notifyChange("children", null, null); //$NON-NLS-1$ + } + + private void notifyChange(String prop, Object oldValue, Object newValue) { + fRuntimeModel.firePropertyChanged(new PropertyChangeEvent(this, prop, oldValue, newValue)); + } + + @Override + public long getLastRefresh() { + return fRefreshTime; + } + + private FSTreeNode binarySearch(final FSTreeNode[] children, String name) { + if (children == null) + return null; + + boolean caseSensitive = !isWindowsNode(); + int low = 0; + int high = children.length - 1; + + while (low <= high) { + int mid = (low + high) >>> 1; + FSTreeNode midVal = children[mid]; + int cmp = caseSensitive ? midVal.getName().compareTo(name) : midVal.getName().compareToIgnoreCase(name); + if (cmp < 0) + low = mid + 1; + else if (cmp > 0) + high = mid - 1; + else + return midVal; + } + return null; + } + + @Override + public void setRevealOnConnect(boolean value) { + if (value) { + if (CorePlugin.getDefault().addToRevealOnConnect(getLocation(true))) { + notifyChange("favorites", Boolean.FALSE, Boolean.TRUE); //$NON-NLS-1$ + } + } else { + if (CorePlugin.getDefault().removeFromRevealOnConnect(getLocation(true))) { + notifyChange("favorites", Boolean.TRUE, Boolean.FALSE); //$NON-NLS-1$ + } + } + } + + @Override + public boolean isRevealOnConnect() { + return CorePlugin.getDefault().isRevealOnConnect(getLocation(true)); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/url/TcfURLConnection.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/url/TcfURLConnection.java index b9cfe3e85..16cf45158 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/url/TcfURLConnection.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/internal/url/TcfURLConnection.java @@ -1,309 +1,307 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * William Chen (Wind River)- [345387]Open the remote files with a proper editor - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.filesystem.core.internal.url; - -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.concurrent.atomic.AtomicReference; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.osgi.util.NLS; -import org.eclipse.tcf.protocol.IChannel; -import org.eclipse.tcf.protocol.IPeer; -import org.eclipse.tcf.protocol.IToken; -import org.eclipse.tcf.protocol.Protocol; -import org.eclipse.tcf.services.IFileSystem; -import org.eclipse.tcf.services.IFileSystem.DoneClose; -import org.eclipse.tcf.services.IFileSystem.DoneOpen; -import org.eclipse.tcf.services.IFileSystem.FileSystemException; -import org.eclipse.tcf.services.IFileSystem.IFileHandle; -import org.eclipse.tcf.te.tcf.core.Tcf; -import org.eclipse.tcf.te.tcf.filesystem.core.internal.exceptions.TCFChannelException; -import org.eclipse.tcf.te.tcf.filesystem.core.nls.Messages; -import org.eclipse.tcf.te.tcf.filesystem.core.services.Operation; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; -import org.eclipse.tcf.te.tcf.locator.interfaces.services.IPeerModelLookupService; -import org.eclipse.tcf.te.tcf.locator.model.ModelManager; - -/** - * The URL connection returned by TCF stream service used to handle "tcf" - * stream protocol. - */ -public class TcfURLConnection extends URLConnection { - // Default connecting timeout. - private static final int DEFAULT_CONNECT_TIMEOUT = 5000; - // Default file opening timeout. - private static final int DEFAULT_OPEN_TIMEOUT = 5000; - // Default file reading timeout. - private static final int DEFAULT_READ_TIMEOUT = 5000; - // Default file closing timeout. - private static final int DEFAULT_CLOSE_TIMEOUT = 5000; - // The schema name of the stream protocol. - public static final String PROTOCOL_SCHEMA = "tcf"; //$NON-NLS-1$ - - // The input stream of this connection. - private TcfInputStream inputStream; - // The output stream of this connection. - private TcfOutputStream outputStream; - - // The TCF agent peer of the connection. - private IPeer peer; - // The path to the resource on the remote file system. - String path; - // The timeout for opening a file. - private int openTimeout; - // The timeout for closing a file. - private int closeTimeout; - - // The TCF channel used to open and read the resource. - IChannel channel; - // The file's handle - IFileHandle handle; - // The file service - IFileSystem service; - - /** - * Create a TCF URL Connection using the specified url. The format of this - * URL should be: tcf://remote/path/to/the/resource... The - * stream protocol schema is designed in this way in order to retrieve the - * agent peer ID without knowing the structure of a TCF peer id. - * - * @see TcfURLStreamHandlerService#parseURL(URL, String, int, int) - * @param url - * The URL of the resource. - */ - public TcfURLConnection(final URL url) throws IOException { - super(url); - String peerId = url.getHost(); - Assert.isNotNull(peerId); - peer = findPeer(peerId); - if (peer == null) { - throw new IOException(NLS.bind(Messages.TcfURLConnection_NoPeerFound, peerId)); - } - String p = url.getPath(); - if (!p.startsWith("/")) { //$NON-NLS-1$ - throw new IOException(Messages.TcfURLConnection_relativePath); - } - path = p.substring(1); - // Set default timeout. - setConnectTimeout(DEFAULT_CONNECT_TIMEOUT); - setOpenTimeout(DEFAULT_OPEN_TIMEOUT); - setReadTimeout(DEFAULT_READ_TIMEOUT); - setCloseTimeout(DEFAULT_CLOSE_TIMEOUT); - } - - /** - * Find the TCF peer with the specified ID. - * - * @param peerId The target peer's ID. - * @return The peer with this ID or null if not found. - */ - private IPeer findPeer(final String peerId) { - Assert.isNotNull(peerId); - - final AtomicReference peer = new AtomicReference(); - - Runnable runnable = new Runnable() { - - @Override - public void run() { - IPeer p = Protocol.getLocator().getPeers().get(peerId); - if (p == null) { - IPeerNode peerNode = ModelManager.getPeerModel().getService(IPeerModelLookupService.class).lkupPeerModelById(peerId); - if (peerNode != null) p = peerNode.getPeer(); - } - peer.set(p); - } - }; - - if (Protocol.isDispatchThread()) runnable.run(); - else Protocol.invokeAndWait(runnable); - - return peer.get(); - } - - /** - * Get the timeout for closing a file. - * - * @return the timeout in milliseconds. - */ - public long getCloseTimeout() { - return closeTimeout; - } - - /** - * Set the timeout for closing a file. - * - * @param closeTimeout - * the timeout in milliseconds. - */ - public void setCloseTimeout(int closeTimeout) { - this.closeTimeout = closeTimeout; - } - - /** - * Get the timeout for opening a file. - * - * @return the timeout in milliseconds. - */ - public long getOpenTimeout() { - return openTimeout; - } - - /** - * Set the timeout for opening a file. - * - * @param openTimeout - * the timeout in milliseconds. - */ - public void setOpenTimeout(int openTimeout) { - this.openTimeout = openTimeout; - } - - /** - * Open a file on the remote file system for read/write and store the file handle. - * - * @throws IOException Opening file fails. - */ - private void openFile() throws IOException { - if(peer == null) - throw new IOException(Messages.TcfURLConnection_NoSuchTcfAgent); - try { - // Open the channel - channel = Operation.openChannel(peer); - } catch (TCFChannelException e) { - throw new IOException(e.getMessage()); - } - if (channel != null) { - service = Operation.getBlockingFileSystem(channel); - if (service != null) { - final FileSystemException[] errors = new FileSystemException[1]; - // Open the file. - int open_flag = 0; - if (doInput) - open_flag |= IFileSystem.TCF_O_READ; - if (doOutput) - open_flag |= IFileSystem.TCF_O_WRITE | IFileSystem.TCF_O_CREAT | IFileSystem.TCF_O_TRUNC; - service.open(path, open_flag, null, new DoneOpen() { - @Override - public void doneOpen(IToken token, FileSystemException error, IFileHandle hdl) { - errors[0] = error; - handle = hdl; - } - }); - if (errors[0] != null) { - IOException exception = new IOException(errors[0].toString()); - exception.initCause(errors[0]); - throw exception; - } - if (handle == null) { - throw new IOException(Messages.TcfURLConnection_NoFileHandleReturned); - } - } else { - throw new IOException(Messages.Operation_NoFileSystemError); - } - } - } - - /* - * (non-Javadoc) - * - * @see java.net.URLConnection#connect() - */ - @Override - public void connect() throws IOException { - if (!connected) { - openFile(); - if (doInput) { - inputStream = new TcfInputStream(this); - } - if (doOutput) { - outputStream = new TcfOutputStream(this); - } - connected = true; - } - } - - /* - * (non-Javadoc) - * - * @see java.net.URLConnection#getInputStream() - */ - @Override - public InputStream getInputStream() throws IOException { - if (!connected) - connect(); - return inputStream; - } - - /* - * (non-Javadoc) - * @see java.net.URLConnection#getOutputStream() - */ - @Override - public OutputStream getOutputStream() throws IOException { - if (!connected) - connect(); - return outputStream; - } - - /** - * Close the stream, release its file handler and close - * the TCF channel used if possible. - * - * @param stream The stream either the input stream or the output stream. - * @throws IOException If closing file handle times out. - */ - public synchronized void closeStream(Closeable stream) throws IOException { - boolean shouldClose = shouldCloseFileHandle(stream); - if (shouldClose) { - service.close(handle, new DoneClose() { - @Override - public void doneClose(IToken token, FileSystemException error) { - Tcf.getChannelManager().closeChannel(channel); - } - }); - } - } - - /** - * Decide if the file handle and the TCF channel should be closed if - * the specified stream is closed. If the stream is the last stream - * that depends on the file handle and the TCF channel, then it should - * be closed. - * - * @param stream The stream to be closed. - * @return true if the file handle and the TCF channel should be closed. - */ - private boolean shouldCloseFileHandle(Closeable stream) { - boolean shouldClose = false; - if (stream == inputStream) { - if (doOutput) { - if (outputStream.closed) { - shouldClose = true; - } - } else { - shouldClose = true; - } - } else if (stream == outputStream) { - if (doInput) { - if (inputStream.closed) - shouldClose = true; - } else { - shouldClose = true; - } - } - return shouldClose; - } -} +/******************************************************************************* + * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * William Chen (Wind River)- [345387]Open the remote files with a proper editor + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.filesystem.core.internal.url; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.concurrent.atomic.AtomicReference; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.osgi.util.NLS; +import org.eclipse.tcf.protocol.IChannel; +import org.eclipse.tcf.protocol.IPeer; +import org.eclipse.tcf.protocol.IToken; +import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.services.IFileSystem; +import org.eclipse.tcf.services.IFileSystem.DoneClose; +import org.eclipse.tcf.services.IFileSystem.DoneOpen; +import org.eclipse.tcf.services.IFileSystem.FileSystemException; +import org.eclipse.tcf.services.IFileSystem.IFileHandle; +import org.eclipse.tcf.te.tcf.core.Tcf; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.FSTreeNode; +import org.eclipse.tcf.te.tcf.filesystem.core.internal.exceptions.TCFChannelException; +import org.eclipse.tcf.te.tcf.filesystem.core.nls.Messages; +import org.eclipse.tcf.te.tcf.filesystem.core.services.Operation; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; +import org.eclipse.tcf.te.tcf.locator.interfaces.services.IPeerModelLookupService; +import org.eclipse.tcf.te.tcf.locator.model.ModelManager; + +/** + * The URL connection returned by TCF stream service used to handle "tcf" + * stream protocol. + */ +public class TcfURLConnection extends URLConnection { + // Default connecting timeout. + private static final int DEFAULT_CONNECT_TIMEOUT = 5000; + // Default file opening timeout. + private static final int DEFAULT_OPEN_TIMEOUT = 5000; + // Default file reading timeout. + private static final int DEFAULT_READ_TIMEOUT = 5000; + // Default file closing timeout. + private static final int DEFAULT_CLOSE_TIMEOUT = 5000; + // The schema name of the stream protocol. + public static final String PROTOCOL_SCHEMA = "tcf"; //$NON-NLS-1$ + + // The input stream of this connection. + private TcfInputStream inputStream; + // The output stream of this connection. + private TcfOutputStream outputStream; + + // The TCF agent peer of the connection. + private IPeer peer; + // The path to the resource on the remote file system. + String path; + // The timeout for opening a file. + private int openTimeout; + // The timeout for closing a file. + private int closeTimeout; + + // The TCF channel used to open and read the resource. + IChannel channel; + // The file's handle + IFileHandle handle; + // The file service + IFileSystem service; + + /** + * Create a TCF URL Connection using the specified url. The format of this + * URL should be: tcf://remote/path/to/the/resource... The + * stream protocol schema is designed in this way in order to retrieve the + * agent peer ID without knowing the structure of a TCF peer id. + * + * @see TcfURLStreamHandlerService#parseURL(URL, String, int, int) + * @param url + * The URL of the resource. + */ + public TcfURLConnection(final URL url) throws IOException { + super(url); + String peerName = url.getHost(); + Assert.isNotNull(peerName); + peer = findPeer(peerName); + if (peer == null) { + throw new IOException(NLS.bind(Messages.TcfURLConnection_NoPeerFound, peerName)); + } + path = FSTreeNode.stripNoSlashMarker(url.getPath()); + // Set default timeout. + setConnectTimeout(DEFAULT_CONNECT_TIMEOUT); + setOpenTimeout(DEFAULT_OPEN_TIMEOUT); + setReadTimeout(DEFAULT_READ_TIMEOUT); + setCloseTimeout(DEFAULT_CLOSE_TIMEOUT); + } + + /** + * Find the TCF peer with the specified ID. + * + * @param peerId The target peer's ID. + * @return The peer with this ID or null if not found. + */ + private IPeer findPeer(final String peerName) { + Assert.isNotNull(peerName); + + final AtomicReference peer = new AtomicReference(); + + Runnable runnable = new Runnable() { + + @Override + public void run() { + IPeer p = Protocol.getLocator().getPeers().get(peerName); + if (p == null) { + IPeerNode[] peerNode = ModelManager.getPeerModel().getService(IPeerModelLookupService.class).lkupPeerModelByName(peerName); + if (peerNode != null && peerNode.length > 0) + p = peerNode[0].getPeer(); + } + peer.set(p); + } + }; + + if (Protocol.isDispatchThread()) runnable.run(); + else Protocol.invokeAndWait(runnable); + + return peer.get(); + } + + /** + * Get the timeout for closing a file. + * + * @return the timeout in milliseconds. + */ + public long getCloseTimeout() { + return closeTimeout; + } + + /** + * Set the timeout for closing a file. + * + * @param closeTimeout + * the timeout in milliseconds. + */ + public void setCloseTimeout(int closeTimeout) { + this.closeTimeout = closeTimeout; + } + + /** + * Get the timeout for opening a file. + * + * @return the timeout in milliseconds. + */ + public long getOpenTimeout() { + return openTimeout; + } + + /** + * Set the timeout for opening a file. + * + * @param openTimeout + * the timeout in milliseconds. + */ + public void setOpenTimeout(int openTimeout) { + this.openTimeout = openTimeout; + } + + /** + * Open a file on the remote file system for read/write and store the file handle. + * + * @throws IOException Opening file fails. + */ + private void openFile() throws IOException { + if(peer == null) + throw new IOException(Messages.TcfURLConnection_NoSuchTcfAgent); + try { + // Open the channel + channel = Operation.openChannel(peer); + } catch (TCFChannelException e) { + throw new IOException(e.getMessage()); + } + if (channel != null) { + service = Operation.getBlockingFileSystem(channel); + if (service != null) { + final FileSystemException[] errors = new FileSystemException[1]; + // Open the file. + int open_flag = 0; + if (doInput) + open_flag |= IFileSystem.TCF_O_READ; + if (doOutput) + open_flag |= IFileSystem.TCF_O_WRITE | IFileSystem.TCF_O_CREAT | IFileSystem.TCF_O_TRUNC; + service.open(path, open_flag, null, new DoneOpen() { + @Override + public void doneOpen(IToken token, FileSystemException error, IFileHandle hdl) { + errors[0] = error; + handle = hdl; + } + }); + if (errors[0] != null) { + IOException exception = new IOException(errors[0].toString()); + exception.initCause(errors[0]); + throw exception; + } + if (handle == null) { + throw new IOException(Messages.TcfURLConnection_NoFileHandleReturned); + } + } else { + throw new IOException(Messages.Operation_NoFileSystemError); + } + } + } + + /* + * (non-Javadoc) + * + * @see java.net.URLConnection#connect() + */ + @Override + public void connect() throws IOException { + if (!connected) { + openFile(); + if (doInput) { + inputStream = new TcfInputStream(this); + } + if (doOutput) { + outputStream = new TcfOutputStream(this); + } + connected = true; + } + } + + /* + * (non-Javadoc) + * + * @see java.net.URLConnection#getInputStream() + */ + @Override + public InputStream getInputStream() throws IOException { + if (!connected) + connect(); + return inputStream; + } + + /* + * (non-Javadoc) + * @see java.net.URLConnection#getOutputStream() + */ + @Override + public OutputStream getOutputStream() throws IOException { + if (!connected) + connect(); + return outputStream; + } + + /** + * Close the stream, release its file handler and close + * the TCF channel used if possible. + * + * @param stream The stream either the input stream or the output stream. + * @throws IOException If closing file handle times out. + */ + public synchronized void closeStream(Closeable stream) throws IOException { + boolean shouldClose = shouldCloseFileHandle(stream); + if (shouldClose) { + service.close(handle, new DoneClose() { + @Override + public void doneClose(IToken token, FileSystemException error) { + Tcf.getChannelManager().closeChannel(channel); + } + }); + } + } + + /** + * Decide if the file handle and the TCF channel should be closed if + * the specified stream is closed. If the stream is the last stream + * that depends on the file handle and the TCF channel, then it should + * be closed. + * + * @param stream The stream to be closed. + * @return true if the file handle and the TCF channel should be closed. + */ + private boolean shouldCloseFileHandle(Closeable stream) { + boolean shouldClose = false; + if (stream == inputStream) { + if (doOutput) { + if (outputStream.closed) { + shouldClose = true; + } + } else { + shouldClose = true; + } + } else if (stream == outputStream) { + if (doInput) { + if (inputStream.closed) + shouldClose = true; + } else { + shouldClose = true; + } + } + return shouldClose; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/.settings/org.eclipse.jdt.core.prefs b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/.settings/org.eclipse.jdt.core.prefs index 1bf40d52c..724b6a738 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/.settings/org.eclipse.jdt.core.prefs +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/.settings/org.eclipse.jdt.core.prefs @@ -1,384 +1,385 @@ -eclipse.preferences.version=1 -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.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=warning -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=enabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -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=enabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -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=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -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.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -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=warning -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.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=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -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.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -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=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled -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.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=0 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0 -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_superclass_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=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.clear_blank_lines_in_block_comment=true -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -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=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -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=100 -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=4 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=4 -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=true -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_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=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=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=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_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_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=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_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_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_unary_operator=do not 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_binary_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_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_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_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=true -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true -org.eclipse.jdt.core.formatter.lineSplit=100 -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.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=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +eclipse.preferences.version=1 +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.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=warning +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=enabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +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=enabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +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=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +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.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +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=warning +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.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=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +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.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled +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=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled +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.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=0 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0 +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_superclass_in_type_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=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.clear_blank_lines_in_block_comment=true +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +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=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +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=100 +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=4 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=4 +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=true +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_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=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=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=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_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_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=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_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_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_unary_operator=do not 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_binary_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_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_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_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=true +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true +org.eclipse.jdt.core.formatter.lineSplit=100 +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.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=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/META-INF/MANIFEST.MF index 58addd0f9..82308655b 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/META-INF/MANIFEST.MF +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/META-INF/MANIFEST.MF @@ -1,24 +1,24 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.tcf.te.tcf.remote.core;singleton:=true -Bundle-Version: 1.4.0.qualifier -Bundle-Activator: org.eclipse.tcf.te.tcf.remote.core.activator.CoreBundleActivator -Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.0", - org.eclipse.remote.core;bundle-version="1.0.0", - org.eclipse.tcf.te.tcf.locator;bundle-version="1.4.0", - org.eclipse.tcf.core;bundle-version="1.4.0", - org.eclipse.tcf.te.runtime;bundle-version="1.4.0", - org.eclipse.tcf.te.core;bundle-version="1.4.0", - org.eclipse.tcf.te.runtime.model;bundle-version="1.4.0", - org.eclipse.core.filesystem;bundle-version="1.3.200", - org.eclipse.tcf.te.tcf.core;bundle-version="1.4.0", - org.eclipse.tcf.te.tcf.processes.core;bundle-version="1.4.0" -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-ActivationPolicy: lazy -Bundle-Localization: plugin -Export-Package: org.eclipse.tcf.te.tcf.remote.core, - org.eclipse.tcf.te.tcf.remote.core.activator;x-internal:=true, - org.eclipse.tcf.te.tcf.remote.core.nls;x-internal:=true, - org.eclipse.tcf.te.tcf.remote.core.operation +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %pluginName +Bundle-SymbolicName: org.eclipse.tcf.te.tcf.remote.core;singleton:=true +Bundle-Version: 1.4.0.qualifier +Bundle-Activator: org.eclipse.tcf.te.tcf.remote.core.activator.CoreBundleActivator +Bundle-Vendor: %providerName +Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.0", + org.eclipse.remote.core;bundle-version="2.0.0", + org.eclipse.tcf.te.tcf.locator;bundle-version="1.4.0", + org.eclipse.tcf.core;bundle-version="1.4.0", + org.eclipse.tcf.te.runtime;bundle-version="1.4.0", + org.eclipse.tcf.te.core;bundle-version="1.4.0", + org.eclipse.tcf.te.runtime.model;bundle-version="1.4.0", + org.eclipse.core.filesystem;bundle-version="1.3.200", + org.eclipse.tcf.te.tcf.core;bundle-version="1.4.0", + org.eclipse.tcf.te.tcf.processes.core;bundle-version="1.4.0" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-ActivationPolicy: lazy +Bundle-Localization: plugin +Export-Package: org.eclipse.tcf.te.tcf.remote.core, + org.eclipse.tcf.te.tcf.remote.core.activator;x-internal:=true, + org.eclipse.tcf.te.tcf.remote.core.nls;x-internal:=true, + org.eclipse.tcf.te.tcf.remote.core.operation diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/plugin.xml index ece1187df..aa491b220 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/plugin.xml +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/plugin.xml @@ -1,20 +1,59 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnection.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnection.java index 37bb00a76..abd5194cb 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnection.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnection.java @@ -1,272 +1,334 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import static java.util.Collections.emptyMap; -import static java.util.Collections.unmodifiableMap; - -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.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.IRemoteConnectionChangeEvent; -import org.eclipse.remote.core.IRemoteConnectionChangeListener; -import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; -import org.eclipse.remote.core.IRemoteFileManager; -import org.eclipse.remote.core.IRemoteProcess; -import org.eclipse.remote.core.IRemoteProcessBuilder; -import org.eclipse.remote.core.exception.RemoteConnectionException; -import org.eclipse.tcf.protocol.IPeer; -import org.eclipse.tcf.te.core.interfaces.IConnectable; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; -import org.eclipse.tcf.te.tcf.remote.core.activator.CoreBundleActivator; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationGetEnvironment; - -public class TCFConnection extends TCFConnectionBase { - - private static enum EState {OPEN, CLOSED_TCF, CLOSED_REMOTE_SERVICES} - - private final String fName; - private volatile IPeerNode fPeerNode; - private final List fListeners = new ArrayList(); - - private volatile EState fState; - private Map fAttributes; - private Map fEnvironment; - - public TCFConnection(TCFRemoteServices tcfServices, IPeerNode peerNode) { - super(tcfServices); - fName = peerNode.getName(); +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import java.net.URI; +import java.util.List; +import java.util.Map; + +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.OperationCanceledException; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteConnectionControlService; +import org.eclipse.remote.core.IRemoteConnectionHostService; +import org.eclipse.remote.core.IRemoteConnectionPropertyService; +import org.eclipse.remote.core.IRemoteFileService; +import org.eclipse.remote.core.IRemoteProcessBuilder; +import org.eclipse.remote.core.IRemoteProcessService; +import org.eclipse.remote.core.RemoteConnectionChangeEvent; +import org.eclipse.remote.core.exception.RemoteConnectionException; +import org.eclipse.remote.internal.core.RemotePath; +import org.eclipse.tcf.protocol.IPeer; +import org.eclipse.tcf.te.core.interfaces.IConnectable; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; +import org.eclipse.tcf.te.tcf.remote.core.activator.CoreBundleActivator; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationGetEnvironment; + +public class TCFConnection implements + IRemoteConnectionHostService, + IRemoteConnectionPropertyService, + IRemoteProcessService, + IRemoteConnectionControlService, + IRemoteFileService { + + public static final String CONNECTION_TYPE_ID = "org.eclipse.tcf.te.tcf.remote"; //$NON-NLS-1$ + + private IRemoteConnection fRemoteConnection; + private volatile IPeerNode fPeerNode; + + private volatile boolean fOpen; + private Map fEnvironment; + private String fWorkingDirectory = "/"; //$NON-NLS-1$ + private String fBaseDirectory = ""; //$NON-NLS-1$ + + public TCFConnection(IPeerNode peerNode) { fPeerNode = peerNode; - fState = peerNode.getConnectState() == IConnectable.STATE_CONNECTED ? EState.OPEN : EState.CLOSED_TCF; - } - - public TCFConnection(TCFRemoteServices tcfServices, String name) { - super(tcfServices); - fName = name; - fState = EState.CLOSED_TCF; - } - - public void setPeerNode(IPeerNode peerNode) { - fPeerNode = peerNode; - setConnectedTCF(peerNode.getConnectState() == IConnectable.STATE_CONNECTED); - } - - public IPeerNode getPeerNode() { - return fPeerNode; - } - - @Override - public String getAddress() { - if (fPeerNode == null) - return "0.0.0.0"; //$NON-NLS-1$ - - return fPeerNode.getPeer().getAttributes().get(IPeer.ATTR_IP_HOST); - } - - @Override - public Map getAttributes() { - if (fPeerNode == null) - return emptyMap(); - - if (fAttributes == null) { - Map attributes = new HashMap(); - attributes.put(OS_NAME_PROPERTY, fPeerNode.getPeer().getOSName()); - fAttributes = unmodifiableMap(attributes); - } - return fAttributes; - } - - @Override - public IRemoteProcess getCommandShell(int flags) throws IOException { - throw new IOException(Messages.TCFConnection_errorNoCommandShell); - } - - @Override - public Map getEnv() { - if (fEnvironment == null && fPeerNode != null) { - try { - fEnvironment = new TCFOperationGetEnvironment(fPeerNode.getPeer()).execute(SubMonitor.convert(null)); - } catch (OperationCanceledException e) { - } catch (CoreException e) { - Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), Messages.TCFConnection_errorNoEnvironment, e)); - } - } - return fEnvironment; - } - - @Override - public IRemoteFileManager getFileManager() { - return new TCFFileManager(this); - } - - @Override - public String getName() { - return fName; - } - - @Override - public int getPort() { - if (fPeerNode == null) - return 0; - - try { - return Integer.parseInt(fPeerNode.getPeer().getAttributes().get(IPeer.ATTR_IP_PORT)); - } catch (Exception e) { - return 0; - } - } - - @Override - public IRemoteProcessBuilder getProcessBuilder(List command) { - return new TCFProcessBuilder(this, command); - } - - @Override - public IRemoteProcessBuilder getProcessBuilder(String... command) { - return new TCFProcessBuilder(this, command); - } - - @Override - public String getUsername() { - if (fPeerNode == null) - return null; - return fPeerNode.getPeer().getAttributes().get(IPeer.ATTR_USER_NAME); - } - - @Override - public IRemoteConnectionWorkingCopy getWorkingCopy() { - return new TCFConnectionWorkingCopy(this); - } - - @Override - public boolean isOpen() { - return fState == EState.OPEN; - } - - @Override - public void open(IProgressMonitor monitor) throws RemoteConnectionException { - if (fPeerNode == null) { - getRemoteServices().getConnectionManager().waitForInitialization(monitor); - } - boolean notify = false; - boolean performOpen = false; - synchronized (this) { - if (fState != EState.OPEN) { - if (fPeerNode.getConnectState() == IConnectable.STATE_CONNECTED) { - fState = EState.OPEN; - notify = true; - } else { - fState = EState.CLOSED_TCF; - performOpen = true; - } - } - } - if (notify) { - fireConnectionChangeEvent(IRemoteConnectionChangeEvent.CONNECTION_OPENED); - } else if (performOpen) { - getRemoteServices().getConnectionManager().open(fPeerNode, monitor); - } - } - - @Override - public void close() { - boolean notify = false; - synchronized (this) { - if (fState == EState.OPEN) { - fState = EState.CLOSED_REMOTE_SERVICES; - notify = true; - } - } - if (notify) { - fireConnectionChangeEvent(IRemoteConnectionChangeEvent.CONNECTION_CLOSED); - } - } - - void setConnectedTCF(boolean connected) { - int notify = -1; - synchronized (this) { - if (connected) { - if (fState == EState.CLOSED_TCF) { - fState = EState.OPEN; - notify = IRemoteConnectionChangeEvent.CONNECTION_OPENED; - } - } else { - if (fState == EState.OPEN) { - fState = EState.CLOSED_TCF; - notify = IRemoteConnectionChangeEvent.CONNECTION_CLOSED; - } - } - } - if (notify != -1) { - fireConnectionChangeEvent(notify); - } - } - - - @Override - public void addConnectionChangeListener(IRemoteConnectionChangeListener listener) { - synchronized (fListeners) { - if (!fListeners.contains(listener)) - fListeners.add(listener); - } - } - - @Override - public void removeConnectionChangeListener(IRemoteConnectionChangeListener listener) { - synchronized (fListeners) { - fListeners.remove(listener); - } - } - - private IRemoteConnectionChangeListener[] getListeners() { - synchronized (fListeners) { - return fListeners.toArray(new IRemoteConnectionChangeListener[fListeners.size()]); - } - } - - @Override - public void fireConnectionChangeEvent(final int type) { - final IRemoteConnection connection = this; - new Job(Messages.TCFConnection_notifyListeners) { - @SuppressWarnings("synthetic-access") - @Override - protected IStatus run(IProgressMonitor monitor) { - IRemoteConnectionChangeEvent event = new IRemoteConnectionChangeEvent() { - @Override - public IRemoteConnection getConnection() { - return connection; - } - - @Override - public int getType() { - return type; - } - }; - for (Object listener : getListeners()) { - ((IRemoteConnectionChangeListener) listener).connectionChanged(event); - } - return Status.OK_STATUS; - } - }.schedule(); - } -} + fOpen = peerNode.getConnectState() == IConnectable.STATE_CONNECTED; + } + + public TCFConnection(IRemoteConnection rc) { + fRemoteConnection = rc; + fOpen = false; + } + + public String getName() { + if (fPeerNode != null) + return fPeerNode.getName(); + return fRemoteConnection.getName(); + } + + @Override + public IRemoteConnection getRemoteConnection() { + return fRemoteConnection; + } + + void setRemoteConnection(IRemoteConnection remoteConnection) { + fRemoteConnection = remoteConnection; + } + + void setPeerNode(IPeerNode peerNode) { + if (fPeerNode == peerNode) + return; + + fPeerNode = peerNode; + setConnectedTCF(peerNode.getConnectState() == IConnectable.STATE_CONNECTED); + } + + public IPeerNode getPeerNode() { + return fPeerNode; + } + + // IRemoteConnectionHostService + @Override + public String getHostname() { + if (fPeerNode == null) + return "0.0.0.0"; //$NON-NLS-1$ + + return getPeerProperty(IPeer.ATTR_IP_HOST); + } + + private String getPeerProperty(String key) { + return fPeerNode.getPeer().getAttributes().get(key); + } + + @Override + public int getPort() { + if (fPeerNode != null) { + try { + return Integer.parseInt(getPeerProperty(IPeer.ATTR_IP_PORT)); + } catch (Exception e) { + } + } + return 0; + } + + @Override + public int getTimeout() { + return 60; + } + + @Override + public boolean useLoginShell() { + return false; + } + + @Override + public String getUsername() { + if (fPeerNode == null) + return ""; //$NON-NLS-1$ + return getPeerProperty(IPeer.ATTR_USER_NAME); + } + + @Override + public void setHostname(String hostname) {} + + @Override + public void setPassphrase(String passphrase) {} + + @Override + public void setPassword(String password) {} + + @Override + public void setPort(int port) {} + + @Override + public void setTimeout(int timeout) {} + + @Override + public void setUseLoginShell(boolean useLogingShell) {} + + @Override + public void setUsePassword(boolean usePassword) {} + + @Override + public void setUsername(String username) {} + + // IRemoteConnectionPropertyService + @Override + public String getProperty(String key) { + if (fPeerNode == null) + return null; + + if (IRemoteConnection.OS_NAME_PROPERTY.equals(key)) { + return getPeerProperty(IPeer.ATTR_OS_NAME); + } + + return null; + } + + // IRemoteProcessService + @Override + public Map getEnv() { + if (fEnvironment == null && fPeerNode != null) { + try { + fEnvironment = new TCFOperationGetEnvironment(fPeerNode.getPeer()).execute(SubMonitor.convert(null)); + } catch (OperationCanceledException e) { + } catch (CoreException e) { + Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), Messages.TCFConnection_errorNoEnvironment, e)); + } + } + return fEnvironment; + } + + @Override + public String getEnv(String name) { + Map map = getEnv(); + if (map != null) + return map.get(name); + return null; + } + + @Override + public IRemoteProcessBuilder getProcessBuilder(List command) { + if (!isOpen()) + return null; + + return new TCFProcessBuilder(this, command); + } + + @Override + public IRemoteProcessBuilder getProcessBuilder(String... command) { + if (!isOpen()) + return null; + + return new TCFProcessBuilder(this, command); + } + + + @Override + public String getWorkingDirectory() { + return fWorkingDirectory; + } + + @Override + public void setWorkingDirectory(String path) { + fWorkingDirectory = path; + } + + // IRemoteConnectionControlService + @Override + public boolean isOpen() { + return fOpen; + } + + @Override + public void open(IProgressMonitor monitor) throws RemoteConnectionException { + if (fPeerNode == null) { + TCFConnectionManager.INSTANCE.waitForInitialization(monitor); + } + boolean open = false; + synchronized (this) { + if (fOpen) + return; + + if (fPeerNode.getConnectState() == IConnectable.STATE_CONNECTED) { + fOpen = open = true; + } + } + if (open) { + fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_OPENED); + } else { + TCFConnectionManager.INSTANCE.open(fPeerNode, monitor); + } + } + + @Override + public void close() { + synchronized (this) { + if (!fOpen) + return; + fOpen = false; + } + fireConnectionChangeEvent(RemoteConnectionChangeEvent.CONNECTION_CLOSED); + TCFConnectionManager.INSTANCE.close(fPeerNode); + } + + void setConnectedTCF(boolean connected) { + int notify = -1; + synchronized (this) { + if (connected) { + if (!fOpen) { + fOpen = true; + notify = RemoteConnectionChangeEvent.CONNECTION_OPENED; + } + } else { + if (fOpen) { + fOpen = false; + notify = RemoteConnectionChangeEvent.CONNECTION_CLOSED; + } + } + } + if (notify != -1) { + fireConnectionChangeEvent(notify); + } + } + + private void fireConnectionChangeEvent(final int type) { + final IRemoteConnection rc = fRemoteConnection; + if (rc == null) + return; + + new Job(Messages.TCFConnection_notifyListeners) { + @Override + protected IStatus run(IProgressMonitor monitor) { + rc.fireConnectionChangeEvent(type); + return Status.OK_STATUS; + } + }.schedule(); + } + + // IRemoteFileService + @Override + public String getBaseDirectory() { + return fBaseDirectory; + } + + @Override + public String getDirectorySeparator() { + return "/"; //$NON-NLS-1$ + } + + @Override + public IFileStore getResource(String path) { + return new TCFFileStore(this, RemotePath.forPosix(path).toString(), null); + } + + @Override + public void setBaseDirectory(String path) { + fBaseDirectory = path; + } + + @Override + public String toPath(URI uri) { + return TCFFileStore.toPath(uri); + } + + @Override + public URI toURI(String path) { + return toURI(RemotePath.forPosix(path)); + } + + @Override + public URI toURI(IPath path) { + if (!path.isAbsolute() && fBaseDirectory != null && fBaseDirectory.length() > 0) { + path = RemotePath.forPosix(fBaseDirectory).append(path); + } + return TCFFileStore.toURI(this, path.toString()); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionBase.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionBase.java deleted file mode 100644 index 771e976d1..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionBase.java +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.exception.RemoteConnectionException; -import org.eclipse.remote.core.exception.UnableToForwardPortException; - -public abstract class TCFConnectionBase implements IRemoteConnection { - - private final TCFRemoteServices fRemoteServices; - - private String fWorkingDirectory = "/"; //$NON-NLS-1$ - - public TCFConnectionBase(TCFRemoteServices tcfServices) { - fRemoteServices = tcfServices; - } - - @Override - public final int compareTo(IRemoteConnection o) { - return getName().compareTo(o.getName()); - } - - @Override - public final String getProperty(String key) { - return getAttributes().get(key); - } - - @Override - public final String getEnv(String name) { - return getEnv().get(name); - } - - @Override - public final TCFRemoteServices getRemoteServices() { - return fRemoteServices; - } - - @Override - public final String getWorkingDirectory() { - return fWorkingDirectory; - } - - @Override - public final void forwardLocalPort(int localPort, String fwdAddress, int fwdPort) throws RemoteConnectionException { - throw new UnableToForwardPortException(Messages.TCFConnectionBase_errorNoPortForwarding); - } - - @Override - public final int forwardLocalPort(String fwdAddress, int fwdPort, IProgressMonitor monitor) throws RemoteConnectionException { - throw new UnableToForwardPortException(Messages.TCFConnectionBase_errorNoPortForwarding); - } - - @Override - public final void forwardRemotePort(int remotePort, String fwdAddress, int fwdPort) throws RemoteConnectionException { - throw new UnableToForwardPortException(Messages.TCFConnectionBase_errorNoPortForwarding); - } - - @Override - public final int forwardRemotePort(String fwdAddress, int fwdPort, IProgressMonitor monitor) throws RemoteConnectionException { - throw new UnableToForwardPortException(Messages.TCFConnectionBase_errorNoPortForwarding); - } - - @Override - public final void removeLocalPortForwarding(int port) { - } - - @Override - public final void removeRemotePortForwarding(int port) { - } - - @Override - public final void setWorkingDirectory(String path) { - if (new Path(path).isAbsolute()) { - fWorkingDirectory = path; - } - } - @Override - public final boolean supportsTCPPortForwarding() { - return false; - } - - @Override - public final String toString() { - String str = getName() + " [" + getAddress(); //$NON-NLS-1$ - int port = getPort(); - if (port >= 0 && port != 1756) { - str += ":" + port; //$NON-NLS-1$ - } - return str + "]"; //$NON-NLS-1$ - } -} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionManager.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionManager.java index f856e0b07..82db7ebc7 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionManager.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionManager.java @@ -1,216 +1,257 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.EventObject; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.remote.core.AbstractRemoteConnectionManager; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; -import org.eclipse.remote.core.exception.RemoteConnectionException; -import org.eclipse.tcf.protocol.Protocol; -import org.eclipse.tcf.te.core.interfaces.IConnectable; -import org.eclipse.tcf.te.runtime.callback.Callback; -import org.eclipse.tcf.te.runtime.events.ChangeEvent; -import org.eclipse.tcf.te.runtime.events.EventManager; -import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener; -import org.eclipse.tcf.te.tcf.locator.interfaces.IPeerModelListener; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNodeProperties; -import org.eclipse.tcf.te.tcf.locator.model.ModelManager; - -public class TCFConnectionManager extends AbstractRemoteConnectionManager implements IPeerModelListener, IEventListener { - private final Map fConnections = Collections.synchronizedMap(new HashMap()); - private int fInitialized = 0; - - public TCFConnectionManager(TCFRemoteServices services) { - super(services); - } - - @Override - protected TCFRemoteServices getRemoteServices() { - return (TCFRemoteServices) super.getRemoteServices(); - } - - public void initialize() { - synchronized (fConnections) { - if (fInitialized > 0) - return; - - fInitialized = 1; - - Protocol.invokeLater(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - EventManager.getInstance().addEventListener(TCFConnectionManager.this, ChangeEvent.class); - IPeerModel peerModel = ModelManager.getPeerModel(); - peerModel.addListener(TCFConnectionManager.this); - - synchronized (fConnections) { - for (IPeerNode peerNode : peerModel.getPeerNodes()) { - String name = peerNode.getPeer().getName(); - TCFConnection connection = fConnections.get(name); - if (connection != null) { - connection.setPeerNode(peerNode); - } else { - fConnections.put(name, new TCFConnection(getRemoteServices(), peerNode)); - } - } - for (Iterator it = fConnections.values().iterator(); it.hasNext(); ) { - TCFConnection conn = it.next(); - if (conn.getPeerNode() == null) - it.remove(); - } - fInitialized = 2; - fConnections.notifyAll(); - } - } - }); - } - } - - public void waitForInitialization(IProgressMonitor monitor) { - synchronized (fConnections) { - if (fInitialized == 2) - return; - if (fInitialized == 0) - initialize(); - - while (fInitialized != 2) { - if (monitor.isCanceled()) - return; - try { - fConnections.wait(500); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - } - } - } - - @Override - public void modelChanged(IPeerModel model, IPeerNode peerNode, boolean added) { - String name = peerNode.getPeer().getName(); - if (added) { - synchronized (fConnections) { - if (!fConnections.containsKey(name)) { - fConnections.put(name, new TCFConnection(getRemoteServices(), peerNode)); - } - } - } else { - TCFConnection connection = fConnections.remove(name); - if (connection != null) { - connection.setConnectedTCF(false); - } - } - } - - @Override - public void modelDisposed(IPeerModel model) { - fConnections.clear(); - } - - @Override - public void eventFired(EventObject event) { - final ChangeEvent changeEvent = (ChangeEvent) event; - final Object source = changeEvent.getSource(); - if (source instanceof IPeerNode && IPeerNodeProperties.PROPERTY_CONNECT_STATE.equals(changeEvent.getEventId())) { - IPeerNode peerNode = (IPeerNode) source; - TCFConnection connection = fConnections.get(peerNode.getPeer().getName()); - if (connection != null) { - Object val= changeEvent.getNewValue(); - boolean connected = val instanceof Number && ((Number) val).intValue() == IConnectable.STATE_CONNECTED; - connection.setConnectedTCF(connected); - } - } - } - - @Override - public IRemoteConnection getConnection(String name) { - synchronized (fConnections) { - TCFConnection connection = fConnections.get(name); - if (connection == null && fInitialized < 2) { - connection = new TCFConnection(getRemoteServices(), name); - fConnections.put(name, connection); - } - } - return fConnections.get(name); - } - - @Override - public IRemoteConnection getConnection(URI uri) { - String connName = TCFEclipseFileSystem.getConnectionNameFor(uri); - if (connName != null) { - return getConnection(connName); - } - return null; - } - - @Override - public List getConnections() { - synchronized (fConnections) { - return new ArrayList(fConnections.values()); - } - } - - @Override - public IRemoteConnectionWorkingCopy newConnection(String name) throws RemoteConnectionException { - throw new RemoteConnectionException(Messages.TCFConnectionManager_errorNoCreateConnection); - } - - @Override - public void removeConnection(IRemoteConnection conn) { - } - - void open(IPeerNode peerNode, IProgressMonitor monitor) throws RemoteConnectionException { - final boolean[] done = {false}; - Callback callback = new Callback() { - @Override - protected void internalDone(Object caller, IStatus status) { - synchronized (done) { - done[0] = true; - done.notify(); - } - } - }; - synchronized (done) { - peerNode.changeConnectState(IConnectable.ACTION_CONNECT, callback, monitor); - try { - if (!done[0]) - done.wait(); - } catch (InterruptedException e) { - throw new RemoteConnectionException(e); - } - } - if (peerNode.getConnectState() != IConnectable.STATE_CONNECTED) { - IStatus status = callback.getStatus(); - if (status != null && !status.isOK()) { - String msg = status.getMessage(); - if (msg != null && msg.length() > 0) { - throw new RemoteConnectionException(msg, status.getException()); - } - } - throw new RemoteConnectionException(Messages.TCFConnectionManager_errorCannotConnect, status != null ? status.getException() : null); - } - } -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EventObject; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; +import org.eclipse.remote.core.exception.RemoteConnectionException; +import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.te.core.interfaces.IConnectable; +import org.eclipse.tcf.te.runtime.callback.Callback; +import org.eclipse.tcf.te.runtime.events.ChangeEvent; +import org.eclipse.tcf.te.runtime.events.EventManager; +import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener; +import org.eclipse.tcf.te.tcf.locator.interfaces.IPeerModelListener; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNodeProperties; +import org.eclipse.tcf.te.tcf.locator.model.ModelManager; +import org.eclipse.tcf.te.tcf.remote.core.activator.CoreBundleActivator; + +public class TCFConnectionManager implements IPeerModelListener, IEventListener { + + public static final TCFConnectionManager INSTANCE = new TCFConnectionManager(); + + private final Map fConnections = Collections.synchronizedMap(new HashMap()); + private IRemoteConnectionType fConnectionType; + private int fInitialized = 0; + + public TCFConnection mapConnection(IRemoteConnection rc) { + if (rc == null) + return null; + if (!rc.getConnectionType().getId().equals(TCFConnection.CONNECTION_TYPE_ID)) + return null; + + synchronized(fConnections) { + String name = rc.getName(); + TCFConnection result = fConnections.get(name); + if (result == null) { + result = new TCFConnection(rc); + fConnections.put(name, result); + } + return result; + } + } + + public void setConnectionType(IRemoteConnectionType connectionType) { + synchronized(fConnections) { + fConnectionType = connectionType; + initialize(); + syncConnections(); + } + } + + public void initialize() { + synchronized (fConnections) { + if (fInitialized > 0) + return; + + fInitialized = 1; + + Protocol.invokeLater(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + EventManager.getInstance().addEventListener(TCFConnectionManager.this, ChangeEvent.class); + IPeerModel peerModel = ModelManager.getPeerModel(); + peerModel.addListener(TCFConnectionManager.this); + + synchronized (fConnections) { + for (IPeerNode peerNode : peerModel.getPeerNodes()) { + String name = peerNode.getPeer().getName(); + TCFConnection connection = fConnections.get(name); + if (connection == null) { + fConnections.put(name, new TCFConnection(peerNode)); + } else { + connection.setPeerNode(peerNode); + } + } + fInitialized = 2; + syncConnections(); + fConnections.notifyAll(); + } + } + + }); + } + } + + void syncConnections() { + if (fConnectionType != null && fInitialized == 2) { + // Remove all connections without a peer + for (IRemoteConnection rc : new ArrayList(fConnectionType.getConnections())) { + String name = rc.getName(); + TCFConnection connection = fConnections.get(name); + if (connection == null || connection.getPeerNode() == null) { + try { + fConnectionType.removeConnection(rc); + } catch (RemoteConnectionException e) { + CoreBundleActivator.logError("Cannot remove remote connection.", e); //$NON-NLS-1$ + } + fConnections.remove(name); + } + } + // Add connections with peers + for (Iterator it = fConnections.values().iterator(); it.hasNext(); ) { + TCFConnection connection = it.next(); + IPeerNode peerNode = connection.getPeerNode(); + if (peerNode == null) { + it.remove(); + } else { + addRemoteConnection(connection); + } + } + } + } + + private void addRemoteConnection(TCFConnection connection) { + if (fConnectionType == null) + return; + + String name = connection.getName(); + if (fConnectionType.getConnection(name) == null) { + try { + IRemoteConnectionWorkingCopy wc = fConnectionType.newConnection(name); + IRemoteConnection rc = wc.save(); + connection.setRemoteConnection(rc); + } catch (RemoteConnectionException e) { + CoreBundleActivator.logError("Cannot add remote connection.", e); //$NON-NLS-1$ + } + } + } + + public void waitForInitialization(IProgressMonitor monitor) { + synchronized (fConnections) { + if (fInitialized == 2) + return; + if (fInitialized == 0) + initialize(); + + while (fInitialized != 2) { + if (monitor.isCanceled()) + return; + try { + fConnections.wait(500); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + } + } + } + + @Override + public void modelChanged(IPeerModel model, IPeerNode peerNode, boolean added) { + String name = peerNode.getPeer().getName(); + if (added) { + synchronized (fConnections) { + TCFConnection connection = fConnections.get(name); + if (connection != null) { + connection.setPeerNode(peerNode); + } else { + connection = new TCFConnection(peerNode); + fConnections.put(name, connection); + } + addRemoteConnection(connection); + } + } else { + TCFConnection connection = fConnections.remove(name); + if (connection != null) { + connection.setConnectedTCF(false); + IRemoteConnection rc = connection.getRemoteConnection(); + if (rc != null) { + try { + rc.getConnectionType().removeConnection(rc); + } catch (RemoteConnectionException e) { + CoreBundleActivator.logError("Cannot remove remote connection.", e); //$NON-NLS-1$ + } + } + } + } + } + + @Override + public void modelDisposed(IPeerModel model) { + fConnections.clear(); + } + + @Override + public void eventFired(EventObject event) { + final ChangeEvent changeEvent = (ChangeEvent) event; + final Object source = changeEvent.getSource(); + if (source instanceof IPeerNode && IPeerNodeProperties.PROPERTY_CONNECT_STATE.equals(changeEvent.getEventId())) { + IPeerNode peerNode = (IPeerNode) source; + TCFConnection connection = fConnections.get(peerNode.getPeer().getName()); + if (connection != null) { + Object val= changeEvent.getNewValue(); + boolean connected = val instanceof Number && ((Number) val).intValue() == IConnectable.STATE_CONNECTED; + connection.setConnectedTCF(connected); + } + } + } + + void open(IPeerNode peerNode, IProgressMonitor monitor) throws RemoteConnectionException { + final boolean[] done = {false}; + Callback callback = new Callback() { + @Override + protected void internalDone(Object caller, IStatus status) { + synchronized (done) { + done[0] = true; + done.notify(); + } + } + }; + synchronized (done) { + peerNode.changeConnectState(IConnectable.ACTION_CONNECT, callback, monitor); + try { + if (!done[0]) + done.wait(); + } catch (InterruptedException e) { + throw new RemoteConnectionException(e); + } + } + if (peerNode.getConnectState() != IConnectable.STATE_CONNECTED) { + IStatus status = callback.getStatus(); + if (status != null && !status.isOK()) { + String msg = status.getMessage(); + if (msg != null && msg.length() > 0) { + throw new RemoteConnectionException(msg, status.getException()); + } + } + throw new RemoteConnectionException(Messages.TCFConnectionManager_errorCannotConnect, status != null ? status.getException() : null); + } + } + + void close(IPeerNode peerNode) { + peerNode.changeConnectState(IConnectable.ACTION_DISCONNECT, new Callback(), null); + } + +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionWorkingCopy.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionWorkingCopy.java deleted file mode 100644 index 71b438b56..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFConnectionWorkingCopy.java +++ /dev/null @@ -1,155 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.IRemoteConnectionChangeListener; -import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; -import org.eclipse.remote.core.IRemoteFileManager; -import org.eclipse.remote.core.IRemoteProcess; -import org.eclipse.remote.core.IRemoteProcessBuilder; -import org.eclipse.remote.core.exception.RemoteConnectionException; - -public class TCFConnectionWorkingCopy extends TCFConnectionBase implements IRemoteConnectionWorkingCopy { - - private final TCFConnection fConnection; - - public TCFConnectionWorkingCopy(TCFConnection connection) { - super(connection.getRemoteServices()); - fConnection = connection; - } - - @Override - public IRemoteConnection getOriginal() { - return fConnection; - } - @Override - public boolean isDirty() { - return false; - } - @Override - public IRemoteConnection save() { - return fConnection; - } - @Override - public void setAddress(String address) { - } - - @Override - public void setAttribute(String key, String value) { - } - - @Override - public void setName(String name) { - } - - @Override - public void setPassword(String password) { - } - - @Override - public void setPort(int port) { - } - - @Override - public void setUsername(String username) { - } - - @Override - public void addConnectionChangeListener(IRemoteConnectionChangeListener listener) { - fConnection.addConnectionChangeListener(listener); - } - - @Override - public void close() { - fConnection.close(); - } - - @Override - public void fireConnectionChangeEvent(int type) { - fConnection.fireConnectionChangeEvent(type); - } - - @Override - public String getAddress() { - return fConnection.getAddress(); - } - - @Override - public Map getAttributes() { - return fConnection.getAttributes(); - } - - @Override - public IRemoteProcess getCommandShell(int flags) throws IOException { - return fConnection.getCommandShell(flags); - } - - @Override - public Map getEnv() { - return fConnection.getEnv(); - } - - @Override - public IRemoteFileManager getFileManager() { - return fConnection.getFileManager(); - } - - @Override - public String getName() { - return fConnection.getName(); - } - - @Override - public int getPort() { - return fConnection.getPort(); - } - - @Override - public IRemoteProcessBuilder getProcessBuilder(List command) { - return fConnection.getProcessBuilder(command); - } - - @Override - public IRemoteProcessBuilder getProcessBuilder(String... command) { - return fConnection.getProcessBuilder(command); - } - - @Override - public String getUsername() { - return fConnection.getUsername(); - } - - @Override - public IRemoteConnectionWorkingCopy getWorkingCopy() { - return this; - } - - @Override - public boolean isOpen() { - return fConnection.isOpen(); - } - - @Override - public void open(IProgressMonitor monitor) throws RemoteConnectionException { - fConnection.open(monitor); - } - - @Override - public void removeConnectionChangeListener(IRemoteConnectionChangeListener listener) { - fConnection.removeConnectionChangeListener(listener); - } -} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFEclipseFileSystem.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFEclipseFileSystem.java index 513c6436b..861f619b7 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFEclipseFileSystem.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFEclipseFileSystem.java @@ -1,78 +1,51 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.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; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.IRemoteServices; -import org.eclipse.remote.core.RemoteServices; - -public class TCFEclipseFileSystem extends FileSystem { - - public static final String SCHEME = "tcf"; //$NON-NLS-1$ - - public static String getConnectionNameFor(URI uri) { - return uri.getAuthority(); - } - - public static URI getURIFor(TCFConnection connection, String path) throws URISyntaxException { - return new URI(SCHEME, connection.getName(), path, null, null); - } - - public static IRemoteConnection getConnection(URI uri) { - if (!SCHEME.equals(uri.getScheme())) - return null; - String peerName = uri.getAuthority(); - if (peerName == null) - return null; - - IRemoteServices trs = RemoteServices.getRemoteServices(TCFRemoteServices.TCF_ID); - if (trs == null) - return null; - - return trs.getConnectionManager().getConnection(peerName); - } - - public TCFEclipseFileSystem() { - super(); - } - - @Override - public int attributes() { - return EFS.ATTRIBUTE_READ_ONLY | EFS.ATTRIBUTE_EXECUTABLE; - } - - @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) { - return TCFFileStore.getInstance(uri); - } +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import java.net.URI; + +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 TCFEclipseFileSystem extends FileSystem { + + + public TCFEclipseFileSystem() { + super(); + } + + @Override + public int attributes() { + return EFS.ATTRIBUTE_READ_ONLY | EFS.ATTRIBUTE_EXECUTABLE; + } + + @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) { + return TCFFileStore.getInstance(uri); + } } \ No newline at end of file diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileManager.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileManager.java deleted file mode 100644 index 306fd747e..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileManager.java +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import java.net.URI; - -import org.eclipse.core.filesystem.IFileStore; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.remote.core.IRemoteFileManager; - -public class TCFFileManager implements IRemoteFileManager { - private final TCFConnection fConnection; - - public TCFFileManager(TCFConnection connection) { - fConnection = connection; - } - - @Override - public String getDirectorySeparator() { - return "/"; //$NON-NLS-1$ - } - - @Override - public IFileStore getResource(String pathStr) { - if (!pathStr.startsWith("/")) { //$NON-NLS-1$ - pathStr = fConnection.getWorkingDirectory() + "/" + pathStr; //$NON-NLS-1$ - } - return TCFFileStore.getInstance(fConnection, pathStr, null); - } - - @Override - public String toPath(URI uri) { - return uri.getPath(); - } - - @Override - public URI toURI(IPath path) { - try { - return TCFEclipseFileSystem.getURIFor(fConnection, path.toString()); - } catch (Exception e) { - return null; - } - } - - @Override - public URI toURI(String path) { - return toURI(new Path(path)); - } -} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileStore.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileStore.java index 63d36c3a8..6bad00765 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileStore.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFFileStore.java @@ -1,203 +1,251 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.net.URISyntaxException; - -import org.eclipse.core.filesystem.EFS; -import org.eclipse.core.filesystem.IFileInfo; -import org.eclipse.core.filesystem.IFileStore; -import org.eclipse.core.filesystem.provider.FileInfo; -import org.eclipse.core.filesystem.provider.FileStore; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.tcf.services.IFileSystem.FileAttrs; -import org.eclipse.tcf.te.tcf.remote.core.activator.CoreBundleActivator; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationChildStores; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationDelete; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationFetchInfo; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationMkDir; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationOpenInputStream; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationOpenOutputStream; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationPutInfo; - -public final class TCFFileStore extends FileStore { - - public static IFileStore getInstance(URI uri) { - IRemoteConnection connection = TCFEclipseFileSystem.getConnection(uri); - if (connection instanceof TCFConnection) - return new TCFFileStore((TCFConnection) connection, uri, null); - - return EFS.getNullFileSystem().getStore(new Path(uri.getPath())); - } - - public static IFileStore getInstance(TCFConnection connection, String path, TCFFileStore parent) { - try { - URI uri = TCFEclipseFileSystem.getURIFor(connection, path); - return new TCFFileStore(connection, uri, parent); - } catch (URISyntaxException e) { - Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), Messages.TCFFileManager_errorFileStoreForPath, e)); - } - return EFS.getNullFileSystem().getStore(new Path(path)); - } - - private final URI fURI; - private final TCFConnection fConnection; - private FileAttrs fAttributes; - private IFileStore fParent; - - private TCFFileStore(TCFConnection connection, URI uri, TCFFileStore parent) { - fURI = uri; - fConnection = connection; - fParent = parent; - } - - @Override - public URI toURI() { - return fURI; - } - - public TCFConnection getConnection() { - return fConnection; - } - - public String getPath() { - return fURI.getPath(); - } - - public void setAttributes(FileAttrs attrs) { - fAttributes = attrs; - } - - public FileAttrs getAttributes() { - return fAttributes; - } - - @Override - public IFileStore getChild(String name) { - String path = getPath() + '/' + name; - path = path.replaceAll("/+", "/"); //$NON-NLS-1$ //$NON-NLS-2$ - if (path.length() > 1 && path.endsWith("/")) //$NON-NLS-1$ - path = path.substring(0, path.length()-1); - return getInstance(fConnection, path, this); - } - - @Override - public String getName() { - String path = getPath(); - int idx = path.lastIndexOf('/'); - if (idx > 0) - return path.substring(idx + 1); - return path; - } - - @Override - public IFileStore getParent() { - if (fParent != null) - return fParent; - - String path = getPath(); - int idx = path.lastIndexOf('/'); - if (idx < 1) - return null; - - fParent = getInstance(fConnection, path.substring(0, idx-1), null); - return fParent; - } - - @Override - public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException { - try { - return new TCFOperationFetchInfo(this).execute(SubMonitor.convert(monitor)); - } catch (OperationCanceledException e) { - } - return new FileInfo(getName()); - } - - @Override - public IFileStore[] childStores(int options, IProgressMonitor monitor) throws CoreException { - try { - return new TCFOperationChildStores(this).execute(SubMonitor.convert(monitor)); - } catch (OperationCanceledException e) { - } - return new IFileStore[0]; - } - - @Override - public String[] childNames(int options, IProgressMonitor monitor) throws CoreException { - IFileStore[] children = childStores(options, monitor); - String[] result = new String[children.length]; - int i = 0; - for (IFileStore s : children) { - result[i++] = s.getName(); - } - return result; - } - - @Override - public void delete(int options, IProgressMonitor monitor) throws CoreException { - try { - new TCFOperationDelete(this).execute(SubMonitor.convert(monitor)); - } catch (OperationCanceledException e) { - } - } - - @Override - public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException { - boolean shallow = (options & EFS.SHALLOW) == EFS.SHALLOW; - try { - new TCFOperationMkDir(this, shallow).execute(SubMonitor.convert(monitor)); - } catch (OperationCanceledException e) { - } - return this; - } - - @Override - public void putInfo(IFileInfo info, int options, IProgressMonitor monitor) throws CoreException { - boolean setAttribs = (options & EFS.SET_ATTRIBUTES) != 0; - boolean setLastModified = (options & EFS.SET_LAST_MODIFIED) != 0; - try { - if (setAttribs || setLastModified) { - new TCFOperationPutInfo(this, info, setAttribs, setLastModified).execute(SubMonitor.convert(monitor)); - } - } catch (OperationCanceledException e) { - } - } - - @Override - public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException { - try { - return new TCFOperationOpenInputStream(this).execute(SubMonitor.convert(monitor)); - } catch (OperationCanceledException e) { - return null; - } - } - - @Override - public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException { - boolean append = (options & EFS.APPEND) != 0; - try { - return new TCFOperationOpenOutputStream(this, append).execute(SubMonitor.convert(monitor)); - } catch (OperationCanceledException e) { - return null; - } - } -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.net.URISyntaxException; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.filesystem.provider.FileInfo; +import org.eclipse.core.filesystem.provider.FileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.core.IRemoteServicesManager; +import org.eclipse.remote.internal.core.RemotePath; +import org.eclipse.tcf.services.IFileSystem.FileAttrs; +import org.eclipse.tcf.te.tcf.remote.core.activator.CoreBundleActivator; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationChildStores; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationDelete; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationFetchInfo; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationMkDir; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationOpenInputStream; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationOpenOutputStream; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationPutInfo; + +public final class TCFFileStore extends FileStore { + public static final String SCHEME = "tcf"; //$NON-NLS-1$ + public static final String NOSLASH_MARKER = "/./"; //$NON-NLS-1$ + + public static String addNoSlashMarker(String path) { + if (path.length() > 0 && path.charAt(0) != '/') + return NOSLASH_MARKER + path; + return path; + } + + public static String stripNoSlashMarker(String path) { + if (path.startsWith(NOSLASH_MARKER)) + return path.substring(NOSLASH_MARKER.length()); + return path; + } + + public static URI toURI(TCFConnection connection, String path) { + try { + return new URI(SCHEME, connection.getName(), addNoSlashMarker(path), null, null); + } catch (URISyntaxException e) { + return null; + } + } + + public static String toPath(URI uri) { + return stripNoSlashMarker(uri.getPath()); + } + + + public static TCFConnection toConnection(URI uri) { + IRemoteServicesManager rsm = CoreBundleActivator.getService(IRemoteServicesManager.class); + if (rsm == null) + return null; + + IRemoteConnectionType ct = rsm.getConnectionType(uri); + if (ct == null) + return null; + + String peerName = uri.getAuthority(); + if (peerName == null) + return null; + + return TCFConnectionManager.INSTANCE.mapConnection(ct.getConnection(peerName)); + } + + + public static IFileStore getInstance(URI uri) { + TCFConnection connection = toConnection(uri); + String path = toPath(uri); + if (connection != null) { + return new TCFFileStore(connection, path, null); + } + return EFS.getNullFileSystem().getStore(RemotePath.forPosix(path)); + } + + private final TCFConnection fConnection; + private final String fPath; + private FileAttrs fAttributes; + private TCFFileStore fParent; + private boolean fArtificialRoot; + + TCFFileStore(TCFConnection connection, String path, TCFFileStore parent) { + fPath = path; + fConnection = connection; + fParent = parent; + } + + @Override + public URI toURI() { + return toURI(fConnection, fPath); + } + + public TCFConnection getConnection() { + return fConnection; + } + + public String getPath() { + return fPath; + } + + public void setAttributes(FileAttrs attrs) { + fAttributes = attrs; + } + + public FileAttrs getAttributes() { + return fAttributes; + } + + @Override + public IFileStore getChild(String name) { + // Remove trailing slash + if (name.length() > 1 && name.endsWith("/")) //$NON-NLS-1$ + name = name.substring(0, name.length()-1); + + String path; + if (fArtificialRoot) { + path = name; + } else if (fPath.endsWith("/")) { //$NON-NLS-1$ + path = fPath + name; + } else { + path = fPath + "/" + name; //$NON-NLS-1$ + } + return new TCFFileStore(fConnection, path, this); + } + + @Override + public String getName() { + String path = getPath(); + if (fParent == null || fParent.fArtificialRoot) + return path; + + int idx = path.lastIndexOf('/', path.length()-2); + if (idx > 0) + return path.substring(idx + 1); + return path; + } + + @Override + public IFileStore getParent() { + if (fParent != null) + return fParent; + + int idx = fPath.lastIndexOf('/'); + if (idx < 1) + return null; + + fParent = new TCFFileStore(fConnection, fPath.substring(0, idx-1), null); + return fParent; + } + + @Override + public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException { + try { + return new TCFOperationFetchInfo(this).execute(SubMonitor.convert(monitor)); + } catch (OperationCanceledException e) { + } + return new FileInfo(getName()); + } + + @Override + public IFileStore[] childStores(int options, IProgressMonitor monitor) throws CoreException { + try { + return new TCFOperationChildStores(this).execute(SubMonitor.convert(monitor)); + } catch (OperationCanceledException e) { + } + return new IFileStore[0]; + } + + @Override + public String[] childNames(int options, IProgressMonitor monitor) throws CoreException { + IFileStore[] children = childStores(options, monitor); + String[] result = new String[children.length]; + int i = 0; + for (IFileStore s : children) { + result[i++] = s.getName(); + } + return result; + } + + @Override + public void delete(int options, IProgressMonitor monitor) throws CoreException { + try { + new TCFOperationDelete(this).execute(SubMonitor.convert(monitor)); + } catch (OperationCanceledException e) { + } + } + + @Override + public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException { + boolean shallow = (options & EFS.SHALLOW) == EFS.SHALLOW; + try { + new TCFOperationMkDir(this, shallow).execute(SubMonitor.convert(monitor)); + } catch (OperationCanceledException e) { + } + return this; + } + + @Override + public void putInfo(IFileInfo info, int options, IProgressMonitor monitor) throws CoreException { + boolean setAttribs = (options & EFS.SET_ATTRIBUTES) != 0; + boolean setLastModified = (options & EFS.SET_LAST_MODIFIED) != 0; + try { + if (setAttribs || setLastModified) { + new TCFOperationPutInfo(this, info, setAttribs, setLastModified).execute(SubMonitor.convert(monitor)); + } + } catch (OperationCanceledException e) { + } + } + + @Override + public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException { + try { + return new TCFOperationOpenInputStream(this).execute(SubMonitor.convert(monitor)); + } catch (OperationCanceledException e) { + return null; + } + } + + @Override + public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException { + boolean append = (options & EFS.APPEND) != 0; + try { + return new TCFOperationOpenOutputStream(this, append).execute(SubMonitor.convert(monitor)); + } catch (OperationCanceledException e) { + return null; + } + } + + public void setIsArtificialRoot() { + fArtificialRoot = true; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcess.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcess.java index 541c6fce1..2c2b63a37 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcess.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcess.java @@ -1,183 +1,217 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import java.util.EventObject; - -import org.eclipse.remote.core.AbstractRemoteProcess; -import org.eclipse.tcf.services.IProcesses.ProcessContext; -import org.eclipse.tcf.te.runtime.events.EventManager; -import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener; -import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessLauncher; -import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessStateChangeEvent; - -public class TCFProcess extends AbstractRemoteProcess implements IEventListener { - private InputStream fStdout; - private InputStream fStderr; - private OutputStream fStdin; - - private PipedOutputStream fCombinedOutput; - private int fReadersDone; - - private final ProcessLauncher fLauncher; - private int fExitValue; - private boolean fCompleted; - - private class StreamForwarder implements Runnable { - private final static int BUF_SIZE = 8192; - - private final InputStream fInput; - private final OutputStream fOutput; - - public StreamForwarder(InputStream input, OutputStream output) { - fInput = input; - fOutput = output; - } - - @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) { - } - onProcReaderDone(); - } - } - - private static class NullInputStream extends InputStream { - public NullInputStream() { - } - - @Override - public int read() throws IOException { - return -1; - } - - @Override - public int available() { - return 0; - } - } - - public TCFProcess(ProcessLauncher launcher) { - fLauncher = launcher; - EventManager.getInstance().addEventListener(this, ProcessStateChangeEvent.class); - } - - public void connectStreams(TCFProcessStreams streams, boolean redirectStderr) throws IOException { - if (redirectStderr) { - fCombinedOutput = new PipedOutputStream(); - fStdout = new PipedInputStream(fCombinedOutput); - fStderr = null; - - new Thread(new StreamForwarder(streams.getStdout(), fCombinedOutput)).start(); - new Thread(new StreamForwarder(streams.getStderr(), fCombinedOutput)).start(); - } else { - fStdout = streams.getStdout(); - fStderr = streams.getStderr(); - } - fStdin = streams.getStdin(); - } - - protected void onProcReaderDone() { - synchronized (this) { - if (++fReadersDone == 2) { - try { - fCombinedOutput.close(); - } catch (IOException e) { - } - } - } - } - - @Override - public void destroy() { - synchronized(this) { - if (fCompleted) - return; - } - - fLauncher.cancel(); - fLauncher.terminate(); - synchronized (this) { - if (!fCompleted) { - fExitValue = -1; - fCompleted = true; - notifyAll(); - } - } - EventManager.getInstance().removeEventListener(this); - } - - @Override - public int exitValue() { - return fExitValue; - } - - @Override - public InputStream getErrorStream() { - return fStderr != null ? fStderr : new NullInputStream(); - } - - @Override - public InputStream getInputStream() { - return fStdout != null ? fStdout : new NullInputStream(); - } - - @Override - public OutputStream getOutputStream() { - return fStdin; - } - - @Override - public int waitFor() throws InterruptedException { - synchronized (this) { - while (!isCompleted()) { - wait(); - } - } - return exitValue(); - } - - @Override - public boolean isCompleted() { - return fCompleted; - } - - @Override - public void eventFired(EventObject event) { - if (event instanceof ProcessStateChangeEvent) { - ProcessStateChangeEvent pscEvent = (ProcessStateChangeEvent) event; - if (pscEvent.getEventId().equals(ProcessStateChangeEvent.EVENT_PROCESS_TERMINATED)) { - Object source = pscEvent.getSource(); - if ((source instanceof ProcessContext)) { - ProcessContext context = (ProcessContext) fLauncher.getAdapter(ProcessContext.class); - if (context != null && ((ProcessContext) source).getID().equals(context.getID())) { - synchronized (this) { - fExitValue = pscEvent.getExitCode(); - fCompleted = true; - notifyAll(); - } - } - } - } - } - } -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.EventObject; + +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteProcess; +import org.eclipse.remote.core.IRemoteProcessBuilder; +import org.eclipse.remote.core.IRemoteProcessControlService; +import org.eclipse.tcf.services.IProcesses.ProcessContext; +import org.eclipse.tcf.te.runtime.events.EventManager; +import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener; +import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessLauncher; +import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessStateChangeEvent; + +public class TCFProcess implements IRemoteProcess, IRemoteProcessControlService, IEventListener { + private InputStream fStdout; + private InputStream fStderr; + private OutputStream fStdin; + + private PipedOutputStream fCombinedOutput; + private int fReadersDone; + + private final ProcessLauncher fLauncher; + private int fExitValue; + private boolean fCompleted; + private IRemoteProcessBuilder fBuilder; + + private class StreamForwarder implements Runnable { + private final static int BUF_SIZE = 8192; + + private final InputStream fInput; + private final OutputStream fOutput; + + public StreamForwarder(InputStream input, OutputStream output) { + fInput = input; + fOutput = output; + } + + @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) { + } + onProcReaderDone(); + } + } + + private static class NullInputStream extends InputStream { + public NullInputStream() { + } + + @Override + public int read() throws IOException { + return -1; + } + + @Override + public int available() { + return 0; + } + } + + public TCFProcess(TCFProcessBuilder builder, ProcessLauncher launcher) { + fBuilder = builder; + fLauncher = launcher; + EventManager.getInstance().addEventListener(this, ProcessStateChangeEvent.class); + } + + @Override + public IRemoteProcessBuilder getProcessBuilder() { + return fBuilder; + } + + @Override + public IRemoteConnection getRemoteConnection() { + return fBuilder.getRemoteConnection(); + } + + @Override + public IRemoteProcess getRemoteProcess() { + return this; + } + + @Override + public T getService(Class service) { + if (service.isAssignableFrom(TCFProcess.class)) + return service.cast(this); + return null; + } + + @Override + public boolean hasService(Class service) { + return service.isAssignableFrom(TCFProcess.class); + } + + public void connectStreams(TCFProcessStreams streams, boolean redirectStderr) throws IOException { + if (redirectStderr) { + fCombinedOutput = new PipedOutputStream(); + fStdout = new PipedInputStream(fCombinedOutput); + fStderr = null; + + new Thread(new StreamForwarder(streams.getStdout(), fCombinedOutput)).start(); + new Thread(new StreamForwarder(streams.getStderr(), fCombinedOutput)).start(); + } else { + fStdout = streams.getStdout(); + fStderr = streams.getStderr(); + } + fStdin = streams.getStdin(); + } + + protected void onProcReaderDone() { + synchronized (this) { + if (++fReadersDone == 2) { + try { + fCombinedOutput.close(); + } catch (IOException e) { + } + } + } + } + + @Override + public void destroy() { + synchronized(this) { + if (fCompleted) + return; + } + + fLauncher.cancel(); + fLauncher.terminate(); + synchronized (this) { + if (!fCompleted) { + fExitValue = -1; + fCompleted = true; + notifyAll(); + } + } + EventManager.getInstance().removeEventListener(this); + } + + @Override + public int exitValue() { + return fExitValue; + } + + @Override + public InputStream getErrorStream() { + return fStderr != null ? fStderr : new NullInputStream(); + } + + @Override + public InputStream getInputStream() { + return fStdout != null ? fStdout : new NullInputStream(); + } + + @Override + public OutputStream getOutputStream() { + return fStdin; + } + + @Override + public int waitFor() throws InterruptedException { + synchronized (this) { + while (!isCompleted()) { + wait(); + } + } + return exitValue(); + } + + @Override + public boolean isCompleted() { + return fCompleted; + } + + @Override + public void eventFired(EventObject event) { + if (event instanceof ProcessStateChangeEvent) { + ProcessStateChangeEvent pscEvent = (ProcessStateChangeEvent) event; + if (pscEvent.getEventId().equals(ProcessStateChangeEvent.EVENT_PROCESS_TERMINATED)) { + Object source = pscEvent.getSource(); + if ((source instanceof ProcessContext)) { + ProcessContext context = (ProcessContext) fLauncher.getAdapter(ProcessContext.class); + if (context != null && ((ProcessContext) source).getID().equals(context.getID())) { + synchronized (this) { + fExitValue = pscEvent.getExitCode(); + fCompleted = true; + notifyAll(); + } + } + } + } + } + } + + +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcessBuilder.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcessBuilder.java index b8cf8399a..b5cc9afe2 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcessBuilder.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFProcessBuilder.java @@ -1,130 +1,126 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import static java.text.MessageFormat.format; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.filesystem.IFileStore; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.remote.core.AbstractRemoteProcessBuilder; -import org.eclipse.remote.core.IRemoteFileManager; -import org.eclipse.remote.core.IRemoteProcess; -import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; -import org.eclipse.tcf.te.runtime.properties.PropertiesContainer; -import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager; -import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessLauncher; -import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessLauncher; -import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationStartProcess; - -public class TCFProcessBuilder extends AbstractRemoteProcessBuilder { +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import static java.text.MessageFormat.format; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.remote.core.AbstractRemoteProcessBuilder; +import org.eclipse.remote.core.IRemoteProcess; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.properties.PropertiesContainer; +import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager; +import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessLauncher; +import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessLauncher; +import org.eclipse.tcf.te.tcf.remote.core.operation.TCFOperationStartProcess; + +public class TCFProcessBuilder extends AbstractRemoteProcessBuilder { private final TCFConnection fConnection; - private Map fEnv; - - public TCFProcessBuilder(TCFConnection connection, List command) { - super(command); - fConnection = connection; - } - - public TCFProcessBuilder(TCFConnection connection, String... command) { - this(connection, Arrays.asList(command)); - } - - @Override - public IFileStore directory() { - IFileStore dir = super.directory(); - if (dir == null) { - IRemoteFileManager fileMgr = fConnection.getFileManager(); - if (fileMgr != null) { - dir = fileMgr.getResource(fConnection.getWorkingDirectory()); - directory(dir); - } - } - return dir; - } - - @Override - public Map environment() { - if (fEnv == null) { - fEnv = new HashMap(fConnection.getEnv()); - } - return fEnv; - } - - @Override - public int getSupportedFlags() { - return 0; - } - - @Override - public IRemoteProcess start(int flags) throws IOException { - if (!fConnection.isOpen()) { - throw new IOException(format(Messages.TCFProcessBuilder_errorConnectionClosed, fConnection.getName())); - } - IFileStore dirStore = super.directory(); - String dir; - if (dirStore instanceof TCFFileStore) { - dir = ((TCFFileStore) dirStore).getPath().toString(); - } else { - dir = ""; //$NON-NLS-1$ - } - - List cmd = command(); - if (cmd.size() < 1) - throw new IOException(Messages.TCFProcessBuilder_errorNoCommand); - - String process= cmd.get(0); - String[] args= cmd.subList(1, cmd.size()).toArray(new String[cmd.size()-1]); - - IPropertiesContainer launcherProps = new PropertiesContainer(); - launcherProps.setProperty(IProcessLauncher.PROP_PROCESS_CWD, dir); - launcherProps.setProperty(IProcessLauncher.PROP_PROCESS_PATH, process); - launcherProps.setProperty(IProcessLauncher.PROP_PROCESS_ARGS, args); - launcherProps.setProperty(IChannelManager.FLAG_FORCE_NEW, Boolean.FALSE); - launcherProps.setProperty(ProcessLauncher.PROCESS_LAUNCH_FAILED_MESSAGE, format("Failed to launch process {0}" , process)); //$NON-NLS-1$ - - TCFProcessStreams streamsProxy = new TCFProcessStreams(); - ProcessLauncher launcher = new ProcessLauncher(streamsProxy) { - @SuppressWarnings("synthetic-access") - @Override - protected void mergeEnvironment(Map processEnv, Map processEnvDiff) { - if (fEnv != null) { - processEnv.clear(); - processEnv.putAll(fEnv); - } - } - }; - - TCFProcess remoteProcess = new TCFProcess(launcher); - boolean ok = false; - try { - new TCFOperationStartProcess(fConnection.getPeerNode().getPeer(), - launcher, launcherProps).execute(SubMonitor.convert(null)); + private Map fEnv; + + public TCFProcessBuilder(TCFConnection connection, List command) { + super(connection.getRemoteConnection(), command); + fConnection = connection; + } + + public TCFProcessBuilder(TCFConnection connection, String... command) { + this(connection, Arrays.asList(command)); + } + + @Override + public IFileStore directory() { + IFileStore dir = super.directory(); + if (dir == null) { + dir = fConnection.getResource(fConnection.getWorkingDirectory()); + directory(dir); + } + return dir; + } + + @Override + public Map environment() { + if (fEnv == null) { + fEnv = new HashMap(fConnection.getEnv()); + } + return fEnv; + } + + @Override + public int getSupportedFlags() { + return 0; + } + + @Override + public IRemoteProcess start(int flags) throws IOException { + if (!fConnection.isOpen()) { + throw new IOException(format(Messages.TCFProcessBuilder_errorConnectionClosed, fConnection.getName())); + } + IFileStore dirStore = super.directory(); + String dir; + if (dirStore instanceof TCFFileStore) { + dir = ((TCFFileStore) dirStore).getPath(); + } else { + dir = ""; //$NON-NLS-1$ + } + + List cmd = command(); + if (cmd.size() < 1) + throw new IOException(Messages.TCFProcessBuilder_errorNoCommand); + + String process= cmd.get(0); + String[] args= cmd.subList(1, cmd.size()).toArray(new String[cmd.size()-1]); + + IPropertiesContainer launcherProps = new PropertiesContainer(); + launcherProps.setProperty(IProcessLauncher.PROP_PROCESS_CWD, dir); + launcherProps.setProperty(IProcessLauncher.PROP_PROCESS_PATH, process); + launcherProps.setProperty(IProcessLauncher.PROP_PROCESS_ARGS, args); + launcherProps.setProperty(IChannelManager.FLAG_FORCE_NEW, Boolean.FALSE); + launcherProps.setProperty(ProcessLauncher.PROCESS_LAUNCH_FAILED_MESSAGE, format("Failed to launch process {0}" , process)); //$NON-NLS-1$ + + TCFProcessStreams streamsProxy = new TCFProcessStreams(); + ProcessLauncher launcher = new ProcessLauncher(streamsProxy) { + @SuppressWarnings("synthetic-access") + @Override + protected void mergeEnvironment(Map processEnv, Map processEnvDiff) { + if (fEnv != null) { + processEnv.clear(); + processEnv.putAll(fEnv); + } + } + }; + + TCFProcess remoteProcess = new TCFProcess(this, launcher); + boolean ok = false; + try { + new TCFOperationStartProcess(fConnection.getPeerNode().getPeer(), + launcher, launcherProps).execute(SubMonitor.convert(null)); remoteProcess.connectStreams(streamsProxy, redirectErrorStream()); - ok = true; + ok = true; return remoteProcess; - } catch (OperationCanceledException e) { - return null; - } catch (CoreException e) { - throw new IOException(Messages.TCFProcessBuilder_errorLaunchingProcess, e); - } finally { - if (!ok) - remoteProcess.destroy(); - } - } + } catch (OperationCanceledException e) { + return null; + } catch (CoreException e) { + throw new IOException(Messages.TCFProcessBuilder_errorLaunchingProcess, e); + } finally { + if (!ok) + remoteProcess.destroy(); + } + } } \ No newline at end of file diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteConnectionType.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteConnectionType.java new file mode 100644 index 000000000..871a38a0a --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteConnectionType.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import org.eclipse.remote.core.IRemoteConnectionProviderService; +import org.eclipse.remote.core.IRemoteConnectionType; + +public class TCFRemoteConnectionType implements IRemoteConnectionProviderService { + private final IRemoteConnectionType fConnectionType; + + public TCFRemoteConnectionType(IRemoteConnectionType type) { + fConnectionType = type; + } + + @Override + public IRemoteConnectionType getConnectionType() { + return fConnectionType; + } + + @Override + public void init() { + TCFConnectionManager.INSTANCE.setConnectionType(fConnectionType); + } + +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteServices.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteServices.java deleted file mode 100644 index c391b142e..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFRemoteServices.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.remote.core.AbstractRemoteServices; -import org.eclipse.remote.core.IRemoteServicesDescriptor; - -public class TCFRemoteServices extends AbstractRemoteServices { - public static final String TCF_ID = "org.eclipse.tcf.te.tcf.remote.core.TCFService"; //$NON-NLS-1$ - - private final TCFConnectionManager fConnectionManager = new TCFConnectionManager(this); - - public TCFRemoteServices(IRemoteServicesDescriptor descriptor) { - super(descriptor); - } - - @Override - public TCFConnectionManager getConnectionManager() { - return fConnectionManager; - } - - @Override - public boolean initialize(IProgressMonitor monitor) { - fConnectionManager.initialize(); - return true; - } - - @Override - public int getCapabilities() { - return 0; - } -} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFServicesFactory.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFServicesFactory.java index 11910f5e3..ff1380b73 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFServicesFactory.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/TCFServicesFactory.java @@ -1,22 +1,40 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core; - -import org.eclipse.remote.core.IRemoteServices; -import org.eclipse.remote.core.IRemoteServicesDescriptor; -import org.eclipse.remote.core.IRemoteServicesFactory; - -public class TCFServicesFactory implements IRemoteServicesFactory { - @Override - public IRemoteServices getServices(IRemoteServicesDescriptor descriptor) { - return new TCFRemoteServices(descriptor); - } -} +/******************************************************************************* + * Copyright (c) 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core; + +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.core.IRemoteProcess; + +public class TCFServicesFactory implements IRemoteConnectionType.Service.Factory, + IRemoteConnection.Service.Factory, IRemoteProcess.Service.Factory { + + @Override + public T getService(IRemoteConnectionType connectionType, Class service) { + if (service.isAssignableFrom(TCFRemoteConnectionType.class)) { + return service.cast(new TCFRemoteConnectionType(connectionType)); + } + return null; + } + + @Override + public T getService(IRemoteConnection remoteConnection, Class service) { + if (service.isAssignableFrom(TCFConnection.class)) { + return service.cast(TCFConnectionManager.INSTANCE.mapConnection(remoteConnection)); + } + return null; + } + + @Override + public T getService(IRemoteProcess remoteProcess, Class service) { + return remoteProcess.getService(service); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/activator/CoreBundleActivator.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/activator/CoreBundleActivator.java index a0eaf3066..7629f65a8 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/activator/CoreBundleActivator.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/activator/CoreBundleActivator.java @@ -1,76 +1,83 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core.activator; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class CoreBundleActivator implements BundleActivator { - - // The bundle context - private static BundleContext context; - // The shared instance - private static CoreBundleActivator plugin; - - /** - * Returns the bundle context - * - * @return the bundle context - */ - public static BundleContext getContext() { - return context; - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static CoreBundleActivator getDefault() { - return plugin; - } - - /** - * Convenience method which returns the unique identifier of this plugin. - */ - public static String getUniqueIdentifier() { - if (getContext() != null && getContext().getBundle() != null) { - return getContext().getBundle().getSymbolicName(); - } - return "org.eclipes.tcf.te.tcf.remote.core"; //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext bundleContext) throws Exception { - context = bundleContext; - plugin = this; - } - - /* (non-Javadoc) - * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext bundleContext) throws Exception { - context = null; - plugin = null; - } - -// public static void logError(String msg, Throwable th) { -// Platform.getLog(Platform.getBundle(ID)).log(new Status(IStatus.ERROR, ID, msg, th)); -// } - -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core.activator; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; + +/** + * The activator class controls the plug-in life cycle + */ +public class CoreBundleActivator implements BundleActivator { + + private static final String PLUGIN_ID = "org.eclipes.tcf.te.tcf.remote.core"; //$NON-NLS-1$ + // The bundle context + private static BundleContext context; + // The shared instance + private static CoreBundleActivator plugin; + + /** + * Returns the bundle context + * + * @return the bundle context + */ + public static BundleContext getContext() { + return context; + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static CoreBundleActivator getDefault() { + return plugin; + } + + /** + * Convenience method which returns the unique identifier of this plugin. + */ + public static String getUniqueIdentifier() { + return PLUGIN_ID; + } + + /* (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + @Override + public void start(BundleContext bundleContext) throws Exception { + context = bundleContext; + plugin = this; + } + + /* (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + @Override + public void stop(BundleContext bundleContext) throws Exception { + context = null; + plugin = null; + } + + public static T getService(Class service) { + ServiceReference ref = context.getServiceReference(service); + return ref != null ? context.getService(ref) : null; + } + + public static void logError(String msg, Throwable th) { + Platform.getLog(Platform.getBundle(PLUGIN_ID)).log(new Status(IStatus.ERROR, PLUGIN_ID, msg, th)); + } + +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFFileStoreOperation.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFFileStoreOperation.java index f61f3b3a3..b8c5bcad4 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFFileStoreOperation.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFFileStoreOperation.java @@ -1,85 +1,85 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ - -package org.eclipse.tcf.te.tcf.remote.core.operation; - -import static java.text.MessageFormat.format; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.tcf.services.IFileSystem; -import org.eclipse.tcf.services.IFileSystem.DoneStat; -import org.eclipse.tcf.services.IFileSystem.FileAttrs; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; -import org.eclipse.tcf.te.tcf.remote.core.TCFFileStore; -import org.eclipse.tcf.te.tcf.remote.core.nls.Messages; -import org.eclipse.tcf.te.tcf.remote.core.operation.PeerInfo.DoneGetFileSystem; -import org.eclipse.tcf.te.tcf.remote.core.operation.PeerInfo.DoneGetUser; - -public abstract class TCFFileStoreOperation extends TCFOperation { - private static final Map fPeerInfos = new HashMap(); - - private final TCFFileStore fFileStore; - - protected TCFFileStoreOperation(TCFFileStore fileStore) { - fFileStore = fileStore; - } - - protected final TCFFileStore getFileStore() { - return fFileStore; - } - - protected final String getPath() { - return fFileStore.getPath().toString(); - } - - protected final IPeerNode getPeerNode() { - return fFileStore.getConnection().getPeerNode(); - } - - private final PeerInfo getPeerInfo(IPeerNode peerNode) { - String key = peerNode.getName(); - PeerInfo result = fPeerInfos.get(key); - if (result == null) { - result = new PeerInfo(); - fPeerInfos.put(key, result); - } - return result; - } - - protected final void getFileSystem(DoneGetFileSystem callback) { - IPeerNode peerNode = getPeerNode(); - if (peerNode == null) { - setError(createStatus(format(Messages.TCFFileStoreOperation_errorNotConnected, fFileStore.getConnection().getName()), null)); - } else { - getPeerInfo(peerNode).getFileSystem(peerNode, callback); - } - } - - protected final void getUser(IFileSystem fileSystem, DoneGetUser callback) { - IPeerNode peerNode = getPeerNode(); - if (peerNode == null) { - setError(createStatus(format(Messages.TCFFileStoreOperation_errorNotConnected, fFileStore.getConnection().getName()), null)); - } else { - getPeerInfo(peerNode).getUser(fileSystem, callback); - } - } - - protected final void stat(IFileSystem fileSystem, TCFFileStore fileStore, DoneStat doneStat) { - FileAttrs attrs = fileStore.getAttributes(); - if (attrs != null) { - doneStat.doneStat(null, null, attrs); - } else { - fileSystem.stat(fileStore.getPath().toString(), doneStat); - } - } -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ + +package org.eclipse.tcf.te.tcf.remote.core.operation; + +import static java.text.MessageFormat.format; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.tcf.services.IFileSystem; +import org.eclipse.tcf.services.IFileSystem.DoneStat; +import org.eclipse.tcf.services.IFileSystem.FileAttrs; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; +import org.eclipse.tcf.te.tcf.remote.core.TCFFileStore; +import org.eclipse.tcf.te.tcf.remote.core.nls.Messages; +import org.eclipse.tcf.te.tcf.remote.core.operation.PeerInfo.DoneGetFileSystem; +import org.eclipse.tcf.te.tcf.remote.core.operation.PeerInfo.DoneGetUser; + +public abstract class TCFFileStoreOperation extends TCFOperation { + private static final Map fPeerInfos = new HashMap(); + + private final TCFFileStore fFileStore; + + protected TCFFileStoreOperation(TCFFileStore fileStore) { + fFileStore = fileStore; + } + + protected final TCFFileStore getFileStore() { + return fFileStore; + } + + protected final String getPath() { + return fFileStore.getPath(); + } + + protected final IPeerNode getPeerNode() { + return fFileStore.getConnection().getPeerNode(); + } + + private final PeerInfo getPeerInfo(IPeerNode peerNode) { + String key = peerNode.getName(); + PeerInfo result = fPeerInfos.get(key); + if (result == null) { + result = new PeerInfo(); + fPeerInfos.put(key, result); + } + return result; + } + + protected final void getFileSystem(DoneGetFileSystem callback) { + IPeerNode peerNode = getPeerNode(); + if (peerNode == null) { + setError(createStatus(format(Messages.TCFFileStoreOperation_errorNotConnected, fFileStore.getConnection().getName()), null)); + } else { + getPeerInfo(peerNode).getFileSystem(peerNode, callback); + } + } + + protected final void getUser(IFileSystem fileSystem, DoneGetUser callback) { + IPeerNode peerNode = getPeerNode(); + if (peerNode == null) { + setError(createStatus(format(Messages.TCFFileStoreOperation_errorNotConnected, fFileStore.getConnection().getName()), null)); + } else { + getPeerInfo(peerNode).getUser(fileSystem, callback); + } + } + + protected final void stat(IFileSystem fileSystem, TCFFileStore fileStore, DoneStat doneStat) { + FileAttrs attrs = fileStore.getAttributes(); + if (attrs != null) { + doneStat.doneStat(null, null, attrs); + } else { + fileSystem.stat(fileStore.getPath(), doneStat); + } + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationChildStores.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationChildStores.java index bc26a8fe1..1ec700ee8 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationChildStores.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationChildStores.java @@ -71,6 +71,7 @@ public class TCFOperationChildStores extends TCFFileStoreOperation @Override public void doneOpen(IToken token, FileSystemException error, IFileHandle handle) { if (error != null && (path.length() == 0 || path.equals("/"))) { //$NON-NLS-1$ + getFileStore().setIsArtificialRoot(); readRoots(); } else if (!shallAbort(error)) { setFileHandle(handle); diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationMkDir.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationMkDir.java index 293b4c339..a110bcfb1 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationMkDir.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.core/src/org/eclipse/tcf/te/tcf/remote/core/operation/TCFOperationMkDir.java @@ -1,88 +1,88 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.core.operation; - -import org.eclipse.core.filesystem.IFileStore; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.tcf.protocol.IToken; -import org.eclipse.tcf.services.IFileSystem; -import org.eclipse.tcf.services.IFileSystem.DoneMkDir; -import org.eclipse.tcf.services.IFileSystem.DoneStat; -import org.eclipse.tcf.services.IFileSystem.FileAttrs; -import org.eclipse.tcf.services.IFileSystem.FileSystemException; -import org.eclipse.tcf.te.tcf.remote.core.TCFFileStore; -import org.eclipse.tcf.te.tcf.remote.core.operation.PeerInfo.DoneGetFileSystem; - -public final class TCFOperationMkDir extends TCFFileStoreOperation { - - protected final boolean fShallow; - - public TCFOperationMkDir(TCFFileStore filestore, boolean shallow) { - super(filestore); - fShallow = shallow; - } - - @Override - protected void doExecute() { - getFileSystem(new DoneGetFileSystem() { - @Override - public void done(final IFileSystem fileSystem, IStatus status) { - if (shallAbort(status)) - return; - - DoneMkDir callback = new DoneMkDir() { - @Override - public void doneMkDir(IToken token, FileSystemException error) { - if (shallAbort(error)) - return; - setResult(null); - } - }; - mkdir(fileSystem, getFileStore(), callback); - } - }); - } - - protected void mkdir(final IFileSystem fs, final TCFFileStore fileStore, final DoneMkDir callback) { - stat(fs, fileStore, new DoneStat() { - @Override - public void doneStat(IToken token, FileSystemException error, FileAttrs attrs) { - if (error == null) { - fileStore.setAttributes(attrs); - } - if (error == null && attrs.isDirectory()) { - // Directory exists, ok. - callback.doneMkDir(token, null); - } else if (error != null && error.getStatus() != IFileSystem.STATUS_NO_SUCH_FILE) { - // Error and file exists - callback.doneMkDir(token, error); - } else { - // Directory does not exist - final IFileStore parent = fShallow ? null : fileStore.getParent(); - if (parent instanceof TCFFileStore) { - mkdir(fs, (TCFFileStore) parent, new DoneMkDir() { - @Override - public void doneMkDir(IToken token, FileSystemException error) { - if (error != null) { - callback.doneMkDir(token, error); - } else { - fs.mkdir(fileStore.getPath().toString(), null, callback); - } - } - }); - } else { - fs.mkdir(fileStore.getPath().toString(), null, callback); - } - } - } - }); - } -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.core.operation; + +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.tcf.protocol.IToken; +import org.eclipse.tcf.services.IFileSystem; +import org.eclipse.tcf.services.IFileSystem.DoneMkDir; +import org.eclipse.tcf.services.IFileSystem.DoneStat; +import org.eclipse.tcf.services.IFileSystem.FileAttrs; +import org.eclipse.tcf.services.IFileSystem.FileSystemException; +import org.eclipse.tcf.te.tcf.remote.core.TCFFileStore; +import org.eclipse.tcf.te.tcf.remote.core.operation.PeerInfo.DoneGetFileSystem; + +public final class TCFOperationMkDir extends TCFFileStoreOperation { + + protected final boolean fShallow; + + public TCFOperationMkDir(TCFFileStore filestore, boolean shallow) { + super(filestore); + fShallow = shallow; + } + + @Override + protected void doExecute() { + getFileSystem(new DoneGetFileSystem() { + @Override + public void done(final IFileSystem fileSystem, IStatus status) { + if (shallAbort(status)) + return; + + DoneMkDir callback = new DoneMkDir() { + @Override + public void doneMkDir(IToken token, FileSystemException error) { + if (shallAbort(error)) + return; + setResult(null); + } + }; + mkdir(fileSystem, getFileStore(), callback); + } + }); + } + + protected void mkdir(final IFileSystem fs, final TCFFileStore fileStore, final DoneMkDir callback) { + stat(fs, fileStore, new DoneStat() { + @Override + public void doneStat(IToken token, FileSystemException error, FileAttrs attrs) { + if (error == null) { + fileStore.setAttributes(attrs); + } + if (error == null && attrs.isDirectory()) { + // Directory exists, ok. + callback.doneMkDir(token, null); + } else if (error != null && error.getStatus() != IFileSystem.STATUS_NO_SUCH_FILE) { + // Error and file exists + callback.doneMkDir(token, error); + } else { + // Directory does not exist + final IFileStore parent = fShallow ? null : fileStore.getParent(); + if (parent instanceof TCFFileStore) { + mkdir(fs, (TCFFileStore) parent, new DoneMkDir() { + @Override + public void doneMkDir(IToken token, FileSystemException error) { + if (error != null) { + callback.doneMkDir(token, error); + } else { + fs.mkdir(fileStore.getPath(), null, callback); + } + } + }); + } else { + fs.mkdir(fileStore.getPath(), null, callback); + } + } + } + }); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/META-INF/MANIFEST.MF index eaf245022..94e96509a 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/META-INF/MANIFEST.MF +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/META-INF/MANIFEST.MF @@ -1,21 +1,21 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.tcf.te.tcf.remote.ui;singleton:=true -Bundle-Version: 1.4.0.qualifier -Bundle-Activator: org.eclipse.tcf.te.tcf.remote.ui.activator.UIPlugin -Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.0", - org.eclipse.remote.ui;bundle-version="1.1.0", - org.eclipse.remote.core;bundle-version="1.0.0", - org.eclipse.tcf.te.tcf.remote.core;bundle-version="1.4.0", - org.eclipse.core.filesystem;bundle-version="1.3.200", - org.eclipse.ui;bundle-version="3.8.0", - org.eclipse.ui.ide;bundle-version="3.8.1", - org.eclipse.tcf.te.tcf.locator;bundle-version="1.4.0" -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-ActivationPolicy: lazy -Bundle-Localization: plugin -Export-Package: org.eclipse.tcf.te.tcf.remote.ui, - org.eclipse.tcf.te.tcf.remote.ui.activator;x-internal:=true, - org.eclipse.tcf.te.tcf.remote.ui.nls;x-internal:=true +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %pluginName +Bundle-SymbolicName: org.eclipse.tcf.te.tcf.remote.ui;singleton:=true +Bundle-Version: 1.4.0.qualifier +Bundle-Activator: org.eclipse.tcf.te.tcf.remote.ui.activator.UIPlugin +Bundle-Vendor: %providerName +Require-Bundle: org.eclipse.core.runtime;bundle-version="3.8.0", + org.eclipse.remote.ui;bundle-version="2.0.0", + org.eclipse.remote.core;bundle-version="2.0.0", + org.eclipse.tcf.te.tcf.remote.core;bundle-version="1.4.0", + org.eclipse.core.filesystem;bundle-version="1.3.200", + org.eclipse.ui;bundle-version="3.8.0", + org.eclipse.ui.ide;bundle-version="3.8.1", + org.eclipse.tcf.te.tcf.locator;bundle-version="1.4.0" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-ActivationPolicy: lazy +Bundle-Localization: plugin +Export-Package: org.eclipse.tcf.te.tcf.remote.ui, + org.eclipse.tcf.te.tcf.remote.ui.activator;x-internal:=true, + org.eclipse.tcf.te.tcf.remote.ui.nls;x-internal:=true diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/plugin.xml index f2c9ed343..901d88cae 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/plugin.xml +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/plugin.xml @@ -1,21 +1,26 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFFileSystemContributor.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFFileSystemContributor.java index 6d66e4ba4..e18a4c79b 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFFileSystemContributor.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFFileSystemContributor.java @@ -1,88 +1,82 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.ui; - -import java.net.URI; -import java.net.URISyntaxException; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.preferences.IEclipsePreferences; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.osgi.util.NLS; -import org.eclipse.remote.core.IRemoteConnection; -import org.eclipse.remote.core.IRemotePreferenceConstants; -import org.eclipse.remote.core.IRemoteServices; -import org.eclipse.remote.core.RemoteServices; -import org.eclipse.remote.ui.IRemoteUIFileManager; -import org.eclipse.remote.ui.IRemoteUIServices; -import org.eclipse.remote.ui.RemoteUIServices; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.tcf.te.tcf.remote.core.TCFConnection; -import org.eclipse.tcf.te.tcf.remote.core.TCFEclipseFileSystem; -import org.eclipse.tcf.te.tcf.remote.core.TCFRemoteServices; -import org.eclipse.tcf.te.tcf.remote.ui.activator.UIPlugin; -import org.eclipse.tcf.te.tcf.remote.ui.nls.Messages; -import org.eclipse.ui.ide.fileSystem.FileSystemContributor; - -public class TCFFileSystemContributor extends FileSystemContributor { - private static final String REMOTE_CORE_PLUGIN_ID = "org.eclipse.remote.core"; //$NON-NLS-1$ - - @Override - public URI browseFileSystem(String initialPath, Shell shell) { - IRemoteServices services = RemoteServices.getRemoteServices(TCFRemoteServices.TCF_ID); - IRemoteUIServices uiServices = RemoteUIServices.getRemoteUIServices(services); - IRemoteUIFileManager uiFileMgr = uiServices.getUIFileManager(); - uiFileMgr.showConnections(true); - String original = setPreferredService(TCFRemoteServices.TCF_ID); - try { - String path = uiFileMgr.browseDirectory(shell, Messages.TCFFileSystemContributor_browseFileSystem_title, initialPath, 0); - if (path != null) { - IRemoteConnection conn = uiFileMgr.getConnection(); - if (conn instanceof TCFConnection) { - TCFConnection tcfConn = (TCFConnection) conn; - try { - return TCFEclipseFileSystem.getURIFor(tcfConn, path); - } catch (URISyntaxException e) { - Platform.getLog(UIPlugin.getDefault().getBundle()).log( - new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), NLS.bind(Messages.TCFFileSystemContributor_errorCreateURIForPath, conn.getName(), path), e)); - } - } - } - } finally { - setPreferredService(original); - } - return null; - } - - private String setPreferredService(String id) { - IEclipsePreferences node = InstanceScope.INSTANCE.getNode(REMOTE_CORE_PLUGIN_ID); - String key = IRemotePreferenceConstants.PREF_REMOTE_SERVICES_ID; - String old = node.get(key, null); - if (id == null) { - node.remove(key); - } else { - node.put(key, id); - } - return old; - } - - @Override - public URI getURI(String string) { - try { - return new URI(string); - } catch (URISyntaxException e) { - // Ignore - } - return null; - } +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.ui; + +import java.net.URI; + +import org.eclipse.core.filesystem.URIUtil; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.core.IRemotePreferenceConstants; +import org.eclipse.remote.core.IRemoteServicesManager; +import org.eclipse.remote.internal.core.RemotePath; +import org.eclipse.remote.ui.IRemoteUIFileService; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.tcf.te.tcf.remote.core.TCFConnection; +import org.eclipse.tcf.te.tcf.remote.core.TCFConnectionManager; +import org.eclipse.tcf.te.tcf.remote.core.TCFFileStore; +import org.eclipse.tcf.te.tcf.remote.ui.activator.UIPlugin; +import org.eclipse.tcf.te.tcf.remote.ui.nls.Messages; +import org.eclipse.ui.ide.fileSystem.FileSystemContributor; + +public class TCFFileSystemContributor extends FileSystemContributor { + private static final String REMOTE_CORE_PLUGIN_ID = "org.eclipse.remote.core"; //$NON-NLS-1$ + + @Override + public URI browseFileSystem(String initialPath, Shell shell) { + IRemoteServicesManager manager = UIPlugin.getService(IRemoteServicesManager.class); + if (manager == null) + return null; + IRemoteConnectionType connectionType = manager.getConnectionType(TCFConnection.CONNECTION_TYPE_ID); + if (connectionType == null) + return null; + + IRemoteUIFileService uiFileMgr = connectionType.getService(IRemoteUIFileService.class); + + uiFileMgr.showConnections(true); + String original = setPreferredService(TCFConnection.CONNECTION_TYPE_ID); + try { + String path = uiFileMgr.browseDirectory(shell, Messages.TCFFileSystemContributor_browseFileSystem_title, initialPath, 0); + if (path != null) { + path = workaroundBug472329(path); + TCFConnection conn = TCFConnectionManager.INSTANCE.mapConnection(uiFileMgr.getConnection()); + if (conn != null) { + return TCFFileStore.toURI(conn, path); + } + } + } finally { + setPreferredService(original); + } + return null; + } + + private String workaroundBug472329(String path) { + return TCFFileStore.stripNoSlashMarker(path); + } + + private String setPreferredService(String id) { + IEclipsePreferences node = InstanceScope.INSTANCE.getNode(REMOTE_CORE_PLUGIN_ID); + String key = IRemotePreferenceConstants.PREF_CONNECTION_TYPE_ID; + String old = node.get(key, null); + if (id == null) { + node.remove(key); + } else { + node.put(key, id); + } + return old; + } + + @Override + public URI getURI(String string) { + return URIUtil.toURI(RemotePath.forPosix(string).toString()); + } } \ No newline at end of file diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIConnectionService.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIConnectionService.java new file mode 100644 index 000000000..080b68eff --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIConnectionService.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.ui; + +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.ui.AbstractRemoteUIConnectionService; +import org.eclipse.remote.ui.IRemoteUIConnectionWizard; +import org.eclipse.swt.widgets.Shell; + +public class TCFUIConnectionService extends AbstractRemoteUIConnectionService { + + private IRemoteConnectionType fConnectionType; + + public TCFUIConnectionService(IRemoteConnectionType connectionType) { + fConnectionType = connectionType; + } + + @Override + public IRemoteUIConnectionWizard getConnectionWizard(Shell shell) { + return null; + } + + @Override + public IRemoteConnectionType getConnectionType() { + return fConnectionType; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileManager.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileManager.java deleted file mode 100644 index 0f4862e0d..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileManager.java +++ /dev/null @@ -1,100 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - Initial API and implementation - * Markus Schorn - Adapted for TCF remote service - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.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.ui.IRemoteUIFileManager; -import org.eclipse.remote.ui.dialogs.RemoteResourceBrowser; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Shell; - -public class TCFUIFileManager implements IRemoteUIFileManager { - private IRemoteConnection fConnection = null; - private boolean fShowConnections = false; - - @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(fShowConnections); - browser.setConnection(fConnection); - if (browser.open() == Window.CANCEL) { - return null; - } - fConnection = 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(fShowConnections); - browser.setConnection(fConnection); - if (browser.open() == Window.CANCEL) { - return null; - } - fConnection = browser.getConnection(); - IFileStore resource = browser.getResource(); - if (resource == null) { - return null; - } - return resource.toURI().getPath(); - } - - @Override - public List 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(fShowConnections); - browser.setConnection(fConnection); - if (browser.open() == Window.CANCEL) { - return null; - } - fConnection = browser.getConnection(); - List paths = new ArrayList(); - for (IFileStore store : browser.getResources()) { - paths.add(store.toURI().getPath()); - } - return paths; - } - - @Override - public IRemoteConnection getConnection() { - return fConnection; - } - - @Override - public void setConnection(IRemoteConnection connection) { - this.fConnection = connection; - } - - @Override - public void showConnections(boolean enable) { - fShowConnections = enable; - } -} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileService.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileService.java new file mode 100644 index 000000000..55a9f2d3e --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIFileService.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2007, 2015 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - Initial API and implementation + * Markus Schorn - Adapted for TCF remote service + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.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.ui.IRemoteUIFileService; +import org.eclipse.remote.ui.dialogs.RemoteResourceBrowser; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.tcf.te.tcf.remote.core.TCFFileStore; + +public class TCFUIFileService implements IRemoteUIFileService { + private IRemoteConnection fConnection = null; + private boolean fShowConnections = false; + private final IRemoteConnectionType fConnectionType; + + public TCFUIFileService(IRemoteConnectionType connectionType) { + fConnectionType = connectionType; + } + + @Override + public IRemoteConnectionType getConnectionType() { + return fConnectionType; + } + + @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(fShowConnections); + browser.setConnection(fConnection); + if (browser.open() == Window.CANCEL) { + return null; + } + fConnection = browser.getConnection(); + IFileStore resource = browser.getResource(); + if (resource == null) { + return null; + } + return TCFFileStore.toPath(resource.toURI()); + } + + @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(fShowConnections); + browser.setConnection(fConnection); + if (browser.open() == Window.CANCEL) { + return null; + } + fConnection = browser.getConnection(); + IFileStore resource = browser.getResource(); + if (resource == null) { + return null; + } + return TCFFileStore.toPath(resource.toURI()); + } + + @Override + public List 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(fShowConnections); + browser.setConnection(fConnection); + if (browser.open() == Window.CANCEL) { + return null; + } + fConnection = browser.getConnection(); + List paths = new ArrayList(); + for (IFileStore store : browser.getResources()) { + paths.add(TCFFileStore.toPath(store.toURI())); + } + return paths; + } + + @Override + public IRemoteConnection getConnection() { + return fConnection; + } + + @Override + public void setConnection(IRemoteConnection connection) { + this.fConnection = connection; + } + + @Override + public void showConnections(boolean enable) { + fShowConnections = enable; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServices.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServices.java deleted file mode 100644 index bd74a8e3b..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServices.java +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013, 2015 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - Initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.ui; - -import org.eclipse.remote.core.IRemoteServices; -import org.eclipse.remote.ui.IRemoteUIConnectionManager; -import org.eclipse.remote.ui.IRemoteUIFileManager; -import org.eclipse.remote.ui.IRemoteUIServices; -import org.eclipse.tcf.te.tcf.remote.core.TCFRemoteServices; - - -public class TCFUIServices implements IRemoteUIServices { - - private TCFRemoteServices fServices; - - public TCFUIServices(IRemoteServices services) { - fServices = (TCFRemoteServices) services; - } - - @Override - public String getId() { - return fServices.getId(); - } - - @Override - public String getName() { - return fServices.getName(); - } - - @Override - public IRemoteUIConnectionManager getUIConnectionManager() { - return null; - } - - @Override - public IRemoteUIFileManager getUIFileManager() { - return new TCFUIFileManager(); - } -} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServicesFactory.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServicesFactory.java index e325a4be3..90c3a8eee 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServicesFactory.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/TCFUIServicesFactory.java @@ -1,22 +1,26 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.ui; - -import org.eclipse.remote.core.IRemoteServices; -import org.eclipse.remote.ui.IRemoteUIServices; -import org.eclipse.remote.ui.IRemoteUIServicesFactory; - -public class TCFUIServicesFactory implements IRemoteUIServicesFactory { - @Override - public IRemoteUIServices getServices(IRemoteServices services) { - return new TCFUIServices(services); - } -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.ui; + +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.core.IRemoteConnectionType.Service; + +public class TCFUIServicesFactory implements IRemoteConnectionType.Service.Factory { + + @Override + public T getService(IRemoteConnectionType connectionType, Class service) { + if (service.isAssignableFrom(TCFUIFileService.class)) + return service.cast(new TCFUIFileService(connectionType)); + if (service.isAssignableFrom(TCFUIConnectionService.class)) + return service.cast(new TCFUIConnectionService(connectionType)); + return null; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/activator/UIPlugin.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/activator/UIPlugin.java index c4e7c2cc2..194819ddd 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/activator/UIPlugin.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.remote.ui/src/org/eclipse/tcf/te/tcf/remote/ui/activator/UIPlugin.java @@ -1,66 +1,67 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Markus Schorn - initial API and implementation - *******************************************************************************/ -package org.eclipse.tcf.te.tcf.remote.ui.activator; - -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class UIPlugin extends AbstractUIPlugin { - // The shared instance - private static UIPlugin plugin; - - /** - * The constructor - */ - public UIPlugin() { - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static UIPlugin getDefault() { - return plugin; - } - - /** - * Convenience method which returns the unique identifier of this plugin. - */ - public static String getUniqueIdentifier() { - if (getDefault() != null && getDefault().getBundle() != null) { - return getDefault().getBundle().getSymbolicName(); - } - return "org.eclipse.tcf.te.tcf.remote.ui"; //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - -} +/******************************************************************************* + * Copyright (c) 2014, 2015 Wind River Systems, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.remote.ui.activator; + +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 UIPlugin extends AbstractUIPlugin { + private static final String PLUGIN_ID = "org.eclipse.tcf.te.tcf.remote.ui"; //$NON-NLS-1$ + + // The shared instance + private static UIPlugin plugin; + + /** + * The constructor + */ + public UIPlugin() { + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static UIPlugin getDefault() { + return plugin; + } + + /** + * Convenience method which returns the unique identifier of this plugin. + */ + public static String getUniqueIdentifier() { + return PLUGIN_ID; + } + + @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 T getService(Class service) { + if (plugin == null) + return null; + BundleContext context = plugin.getBundle().getBundleContext(); + ServiceReference ref = context.getServiceReference(service); + return ref != null ? context.getService(ref) : null; + } +} -- cgit v1.2.3