Improve initialisation
[lgpl/argeo-commons.git] / org.argeo.cms.jshell / src / org / argeo / cms / jshell / CmsJShell.java
index a3fcf3f808a2be65cb2921c8fe13b2a293f84225..d9d7d799523fec81658e4c0fb71ca701adff5b3e 100644 (file)
@@ -16,6 +16,7 @@ import java.util.UUID;
 import org.argeo.api.cms.CmsLog;
 import org.argeo.api.cms.CmsState;
 import org.argeo.api.uuid.UuidFactory;
+import org.argeo.cms.util.FsUtils;
 import org.argeo.cms.util.OS;
 import org.argeo.internal.cms.jshell.osgi.OsgiExecutionControlProvider;
 import org.osgi.framework.Bundle;
@@ -40,18 +41,42 @@ public class CmsJShell {
 
        public void start() throws Exception {
                // TODO better define application id, make it configurable
-               String applicationID = cmsState.getStatePath("").getFileName().toString();
+               String applicationID;
+               if (Files.exists(cmsState.getStatePath("dev.properties"))) { // in Eclipse
+                       applicationID = cmsState.getStatePath("").getFileName().toString();
+               } else {
+                       applicationID = cmsState.getStatePath("").getParent().getFileName().toString();
+               }
 
                // TODO centralise state run dir
                stateRunDir = OS.getRunDir().resolve(applicationID);
 
+               // TODO factorise create/delete pattern
                jshBase = stateRunDir.resolve(JShellClient.JSH);
+               if (Files.exists(jshBase)) {
+                       log.warn(jshBase + " already exists, deleting it...");
+                       FsUtils.delete(jshBase);
+               }
                Files.createDirectories(jshBase);
-               jshLinkedDir = Files.createSymbolicLink(cmsState.getStatePath(JShellClient.JSH), jshBase);
+               jshLinkedDir = cmsState.getStatePath(JShellClient.JSH);
+               if (Files.exists(jshLinkedDir)) {
+                       log.warn(jshLinkedDir + " already exists, deleting it...");
+                       FsUtils.delete(jshLinkedDir);
+               }
+               Files.createSymbolicLink(jshLinkedDir, jshBase);
 
                jtermBase = stateRunDir.resolve(JShellClient.JTERM);
+               if (Files.exists(jtermBase)) {
+                       log.warn(jtermBase + " already exists, deleting it...");
+                       FsUtils.delete(jtermBase);
+               }
                Files.createDirectories(jtermBase);
-               jtermLinkedDir = Files.createSymbolicLink(cmsState.getStatePath(JShellClient.JTERM), jtermBase);
+               jtermLinkedDir = cmsState.getStatePath(JShellClient.JTERM);
+               if (Files.exists(jtermLinkedDir)) {
+                       log.warn(jtermLinkedDir + " already exists, deleting it...");
+                       FsUtils.delete(jtermLinkedDir);
+               }
+               Files.createSymbolicLink(jtermLinkedDir, jtermBase);
 
                log.info("Local JShell on " + jshBase + ", linked to " + jshLinkedDir);
                log.info("Local JTerm on " + jtermBase + ", linked to " + jtermLinkedDir);
@@ -137,7 +162,8 @@ public class CmsJShell {
                String symbolicName = bundleSnDir.getFileName().toString();
                Bundle fromBundle = OsgiExecutionControlProvider.getBundleFromSn(symbolicName);
                if (fromBundle == null) {
-                       log.error("Ignoring bundle " + symbolicName + " because it was not found");
+                       log.error("Removing directory for bundle " + symbolicName + " because it was not found in runtime...");
+                       FsUtils.delete(bundleSnDir);
                        return;
                }
                Long bundleId = fromBundle.getBundleId();
@@ -154,6 +180,11 @@ public class CmsJShell {
                } catch (IOException e) {
                        log.error("Cannot remove " + jshLinkedDir);
                }
+               try {
+                       Files.delete(jtermLinkedDir);
+               } catch (IOException e) {
+                       log.error("Cannot remove " + jtermLinkedDir);
+               }
        }
 
        public void setCmsState(CmsState cmsState) {