Hi Ioana,

With the latest changes, now with a remote project if I want to restore the 
project, I'm getting following errors:


Failed to read the project description file (.project) for 'poky'.  The file 
has been changed on disk, and it now contains invalid information.  The project 
will not function properly until the description file is restored to a valid 
state.

This is when I tried on my windows machine.

Thanks,
Jessica

-----Original Message-----
From: yocto-boun...@yoctoproject.org [mailto:yocto-boun...@yoctoproject.org] On 
Behalf Of Ioana Grigoropol
Sent: Friday, June 21, 2013 7:27 AM
To: yocto@yoctoproject.org
Cc: Ioana Grigoropol
Subject: [yocto] [PATCH v2] Fix Eclipse workspace deadlock when restoring

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/OEFileSyste
+++ m.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.ja
+++ va
@@ -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/Instal
+++ lWizard.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/RemoteHe
+++ lper.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
_______________________________________________
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto

Reply via email to