From: Ioana Grigoropol <ioana.grigoro...@gmail.com>

- when creating a new bitbake commander project, a bunch of information 
relevant for the project is set in the project information map
- when closing & restarting Eclipse, having a Bitbake commander project in the 
workspace an deadlock occurs due to the following:
        - Eclipse Resources container tries to restore all projects that were 
previously in the workspace
        - when trying to restore our BB project, we will try to determine what 
was the remote connection for that specific project, given its URI
                - we can only determine the connection by calling RSE plugin & 
we must wait for it to be initialized
        - the RSE plugin is initialized after the Resource container is 
finishes, and since this process is blocked waiting for a later one, a deadlock 
occurs

- in order to fix this problem, perform the following steps:
        - when the Eclipse Resource container asks for the store of our project
                - return a NullFileStore
                - register as a listener of the RSEInitJob in order to get 
notified when the job is finished
                - restore the project information when the RSE API is up by 
triggering the internal file system core manager
        - restoring the information:
                - for the local implementation:
                        - the connection of the project is missing -> retrive 
it by invoking RSE
                - for the remote implementation:
                        - the only URI for the project is the oefs one
                        - we cannot change this uri to point to the real one 
since it will block the refresh on the project
                        - we cannot determine the real URI form the oefs one 
since we have no clue what is the host(ip)
                   -> solution:
                        - when creating the BBC project
                                - save the information about the real URI of 
the project in the metadata of the workspace
                        - when restoring the project
                                - retrieve the information from the metadata 
location
- fixed also the Project Description of the Location to display the real URI of 
the files

Signed-off-by: Ioana Grigoropol <ioana.grigoro...@gmail.com>
---
 .../src/org/yocto/bc/bitbake/ShellSession.java     |    2 +-
 .../src/org/yocto/bc/ui/Activator.java             |    4 +-
 .../org/yocto/bc/ui/filesystem/OEFileSystem.java   |   10 +--
 .../src/org/yocto/bc/ui/model/ProjectInfo.java     |   11 ++-
 .../src/org/yocto/bc/ui/model/YoctoHostFile.java   |   10 +++
 .../yocto/bc/ui/wizards/install/InstallWizard.java |    1 +
 .../org.yocto.remote.utils/META-INF/MANIFEST.MF    |    6 +-
 .../src/org/yocto/remote/utils/RemoteHelper.java   |   79 ++++++++++++++++++++
 8 files changed, 113 insertions(+), 10 deletions(-)

diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java 
b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
index 11d677a..724b7d0 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
@@ -18,7 +18,7 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.Writer;
-
+       
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.rse.core.model.IHost;
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java 
b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java
index 5c43ba8..f53592c 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java
@@ -108,7 +108,7 @@ public class Activator extends AbstractUIPlugin {
                
                BBSession bbs = (BBSession) bbSessionMap.get(projectRoot);
                
-               if (bbs == null) {
+               if (bbs == null || bbs.getShell() == null) {
                        bbs = new BBSession(getShellSession(projectInfo, null, 
monitor), projectRoot);
                        bbSessionMap.put(projectRoot, bbs);
                }
@@ -190,7 +190,7 @@ public class Activator extends AbstractUIPlugin {
                
                ShellSession ss = (ShellSession) shellMap.get(absolutePath);
                
-               if (ss == null) {
+               if (ss == null && 
RemoteHelper.isInitialized(projInfo.getOriginalURI())) {
                        IHostFile remoteHostFile = 
RemoteHelper.getRemoteHostFile(projInfo.getConnection(), 
absolutePath.getPath(), monitor);
                        ss = new ShellSession(projInfo, remoteHostFile, 
ProjectInfoHelper.getInitScriptPath(absolutePath));
                }
diff --git 
a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/filesystem/OEFileSystem.java 
b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/filesystem/OEFileSystem.java
index 357edc1..b814c4c 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/filesystem/OEFileSystem.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/filesystem/OEFileSystem.java
@@ -11,7 +11,6 @@
  
*******************************************************************************/
 package org.yocto.bc.ui.filesystem;
 
-import java.io.File;
 import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.util.ArrayList;
@@ -22,14 +21,16 @@ import java.util.Map;
 import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.filesystem.IFileSystem;
 import org.eclipse.core.filesystem.provider.FileSystem;
+import org.eclipse.core.internal.filesystem.NullFileStore;
+import org.eclipse.core.internal.resources.LocalMetaArea;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
-
 import org.yocto.bc.bitbake.BBSession;
 import org.yocto.bc.ui.Activator;
 import org.yocto.bc.ui.model.ProjectInfo;
-import org.yocto.bc.ui.model.YoctoHostFile;
 
 /**
  * A filesystem that ignores specific OE directories that contain derived 
information.
@@ -64,8 +65,7 @@ public class OEFileSystem extends FileSystem {
                                config = Activator.getBBSession(projInfo, new 
NullProgressMonitor());
                                config.initialize();
                        } catch (Exception e) {
-                               e.printStackTrace();
-                               return new OEIgnoreFile(new 
YoctoHostFile(projInfo, uri));
+                               return new NullFileStore(new 
Path(uri.getPath()));
                        }
 
                        if (config.get("TMPDIR") == null || 
config.get("DL_DIR") == null || config.get("SSTATE_DIR")== null) {
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java 
b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java
index 79e5f87..119782d 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java
@@ -61,6 +61,13 @@ public class ProjectInfo implements IModelElement {
        public void setLocationURI(URI location) {
                if (this.location == null)
                        this.location = new YoctoLocation();
+               if (location.getScheme().equalsIgnoreCase("oefs")) {
+                       if (this.name ==  null) {
+                               String path = location.getPath();
+                               this.name = 
path.substring(path.lastIndexOf("/") + 1);
+                       }
+                       location = 
RemoteHelper.retrieveURIFromMetaArea(this.name);
+               }
                this.location.setOriginalURI(location);
                try {
                        this.location.setOEFSURI(new 
URI(ProjectInfoHelper.OEFS_SCHEME + location.getPath() ));
@@ -79,7 +86,7 @@ public class ProjectInfo implements IModelElement {
        }
 
        public IHost getConnection() {
-               if (connection == null) {
+               if (connection == null && 
RemoteHelper.isInitialized(getOriginalURI())) {
                        connection = 
RemoteHelper.getRemoteConnectionForURI(location.getOriginalURI(), new 
NullProgressMonitor());
                }
                return connection;
@@ -99,6 +106,8 @@ public class ProjectInfo implements IModelElement {
 
        public IFileService getFileService(IProgressMonitor monitor){
                try {
+                       if (!RemoteHelper.isInitialized(getOriginalURI()))
+                               return null;
                        return 
RemoteHelper.getConnectedRemoteFileService(connection, monitor);
                } catch (Exception e) {
                        e.printStackTrace();
diff --git 
a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/YoctoHostFile.java 
b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/YoctoHostFile.java
index eaa26df..7113efb 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/YoctoHostFile.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/YoctoHostFile.java
@@ -313,4 +313,14 @@ public class YoctoHostFile implements IHostFile{
        public void setFileService(IFileService fileService) {
                this.fileService = fileService;
        }
+
+       @Override
+       public String toString() {
+               URI uri = this.projectInfo.getOriginalURI();
+               try {
+                       return new URI(uri.getScheme(), uri.getHost(), 
fileURI.getPath(), uri.getFragment()).toString();
+               } catch (URISyntaxException e) {
+                       return fileURI.toString();
+               }
+       }
 }
diff --git 
a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java
 
b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java
index 5df375e..f3ecfc4 100644
--- 
a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java
+++ 
b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/install/InstallWizard.java
@@ -195,6 +195,7 @@ public class InstallWizard extends FiniteStateWizard 
implements
                                Activator.putProjInfo(pinfo.getOEFSURI(), 
pinfo);
 
                                container.run(false, false, new 
CreateBBCProjectOperation(pinfo));
+                               
RemoteHelper.storeURIInMetaArea(pinfo.getProjectName(), uri);
                                return true;
                        }
                } catch (Exception e) {
diff --git a/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF 
b/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF
index 06d14f8..08a76cc 100644
--- a/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF
+++ b/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF
@@ -8,9 +8,13 @@ Require-Bundle: org.eclipse.ui,
  org.eclipse.core.runtime
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Import-Package: org.eclipse.rse.core,
+Import-Package: org.eclipse.core.internal.filesystem,
+ org.eclipse.core.internal.resources,
+ org.eclipse.core.resources,
+ org.eclipse.rse.core,
  org.eclipse.rse.core.model,
  org.eclipse.rse.core.subsystems,
+ org.eclipse.rse.internal.core,
  org.eclipse.rse.internal.services.local.shells,
  org.eclipse.rse.internal.services.shells,
  org.eclipse.rse.internal.terminals.ui,
diff --git 
a/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java 
b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java
index e9118d6..cd33d29 100644
--- 
a/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java
+++ 
b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java
@@ -13,19 +13,30 @@ package org.yocto.remote.utils;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.PrintWriter;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
+import org.eclipse.core.internal.filesystem.InternalFileSystemCore;
+import org.eclipse.core.internal.resources.LocalMetaArea;
+import org.eclipse.core.internal.resources.Workspace;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
@@ -34,12 +45,14 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.rse.core.IRSECoreStatusCodes;
+import org.eclipse.rse.core.IRSEInitListener;
 import org.eclipse.rse.core.IRSESystemType;
 import org.eclipse.rse.core.RSECorePlugin;
 import org.eclipse.rse.core.model.IHost;
 import org.eclipse.rse.core.model.ISubSystemConfigurationCategories;
 import org.eclipse.rse.core.model.ISystemRegistry;
 import org.eclipse.rse.core.subsystems.ISubSystem;
+import org.eclipse.rse.internal.core.RSEInitJob;
 import org.eclipse.rse.services.IService;
 import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
 import org.eclipse.rse.services.files.IFileService;
@@ -62,6 +75,72 @@ public class RemoteHelper {
        public static final int TOTALWORKLOAD = 100;
        private static Map<IHost, RemoteMachine> machines;
 
+       public static IPath getWorkspaceMetaArea(){
+               Workspace workspace = (Workspace)ResourcesPlugin.getWorkspace();
+               LocalMetaArea metaDataArea = workspace.getMetaArea();
+               return metaDataArea.getLocation();
+       }
+
+       public static void storeURIInMetaArea(String projName, URI uri){
+               IPath path = getWorkspaceMetaArea();
+               String sep = File.separator;
+               File f = new File(path.toString() + sep + ".projects" + sep + 
projName + sep + ".originalURI");
+               PrintWriter writer;
+               try {
+                       writer = new PrintWriter(f);
+                       writer.println(uri.getScheme());
+                       writer.println(uri.getHost());
+                       writer.println(uri.getPath());
+                       writer.println(uri.getFragment());
+                       writer.close();
+               } catch (FileNotFoundException e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public static URI retrieveURIFromMetaArea(String projName){
+               IPath path = getWorkspaceMetaArea();
+               String sep = File.separator;
+               File f = new File(path.toString() + sep + ".projects" + sep + 
projName + sep + ".originalURI");
+               try {
+                       BufferedReader buf = new BufferedReader(new 
FileReader(f));
+                       String line = null;
+                       List<String> elems = new ArrayList<String>();
+                       while((line = buf.readLine()) != null){
+                               if (line.equals("null"))
+                                       line = null;
+                               elems.add(line);
+                       }
+                       buf.close();
+                       if (elems.size() == 4){
+                               URI uri = new URI(elems.get(0), elems.get(1), 
elems.get(2), elems.get(3));
+                               return uri;
+                       }
+               } catch (IOException e) {
+                       e.printStackTrace();
+               } catch (URISyntaxException e) {
+                       e.printStackTrace();
+               }
+               return null;
+       }
+
+       public static boolean isInitialized(final URI uri){
+               boolean init = 
RSECorePlugin.isInitComplete(RSECorePlugin.INIT_MODEL);
+               if (!init) {
+                       RSEInitJob.getInstance().addInitListener(new 
IRSEInitListener() {
+                               @Override
+                               public void phaseComplete(int arg0) {
+                                       try {
+                                               
InternalFileSystemCore.getInstance().getStore(uri);
+                                       } catch (CoreException e) {
+                                               e.printStackTrace();
+                                       }
+                               }
+                       });
+               }
+               return init;
+       }
+
        public static IHost getRemoteConnectionByName(String remoteConnection) {
                if (remoteConnection == null)
                        return null;
-- 
1.7.10.4

_______________________________________________
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto

Reply via email to