VIEW: ROOTSTRAP: Check "ruby" package before creating a new rootstrap
authordonghyuk.yang <donghyuk.yang@samsung.com>
Tue, 21 Jan 2014 10:42:02 +0000 (19:42 +0900)
committerdonghyuk.yang <donghyuk.yang@samsung.com>
Tue, 21 Jan 2014 10:42:02 +0000 (19:42 +0900)
 The IDE internally uses image-creator tool when a new rootstrap is
created. The "ruby" package should be installed because image-creator
tool is implemented by "ruby".
 Show error message if the "ruby" package is not installed.

Change-Id: I183c21d4efa8be4a915816717d44923675af8222
Signed-off-by: donghyuk.yang <donghyuk.yang@samsung.com>
org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkg/commander/PkgCommandTarget.java
org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkg/commander/deb/DebCommanderHost.java [new file with mode: 0644]
org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkg/tools/DpkgTool.java [new file with mode: 0644]
org.tizen.nativeplatform/src/org/tizen/nativeplatform/types/PkgTypes.java
org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapUIMessages.properties
org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapView.java

index f8d37d2..bcdaef2 100644 (file)
@@ -3,6 +3,7 @@ package org.tizen.nativeplatform.pkg.commander;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.tizen.nativecommon.build.SmartBuildInterface;
+import org.tizen.nativeplatform.pkg.commander.deb.DebCommanderHost;
 import org.tizen.nativeplatform.pkg.commander.rpm.RpmCommanderDevice;
 import org.tizen.nativeplatform.pkg.commander.rpm.RpmCommanderHost;
 import org.tizen.nativeplatform.pkg.commander.rpm.RpmCommanderRootstrap;
@@ -89,6 +90,8 @@ public class PkgCommandTarget {
             if (type.equals(PkgTypes.RPM)) {
                 hsCommander = new RpmCommanderHost(useConsoleLog);
                 hsCommander.setHttpProxy(http_proxy);
+            } else if (type.equals(PkgTypes.DPKG)) {
+                hsCommander = new DebCommanderHost();
             }
         }
         return hsCommander;
@@ -105,6 +108,8 @@ public class PkgCommandTarget {
                     dvCommander = new RpmCommanderDevice(device);
                     dvCommander.setHttpProxy(http_proxy);
                 }
+            } else if (type.equals(PkgTypes.DPKG)) {
+                return null;
             }
         }
         return dvCommander;
@@ -124,6 +129,8 @@ public class PkgCommandTarget {
                     rtCommander = new RpmCommanderRootstrap(new Path(rootPath));
                     rtCommander.setHttpProxy(http_proxy);
                 }
+            } else if (type.equals(PkgTypes.DPKG)) {
+                return null;
             }
         }
         return rtCommander;
diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkg/commander/deb/DebCommanderHost.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkg/commander/deb/DebCommanderHost.java
new file mode 100644 (file)
index 0000000..ca9800a
--- /dev/null
@@ -0,0 +1,296 @@
+package org.tizen.nativeplatform.pkg.commander.deb;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.tizen.nativeplatform.pkg.commander.ICommandStatus;
+import org.tizen.nativeplatform.pkg.commander.IPkgCommander;
+import org.tizen.nativeplatform.pkg.model.PkgInfo;
+import org.tizen.nativeplatform.pkg.model.PkgStatus;
+import org.tizen.nativeplatform.pkg.tools.DpkgTool;
+import org.tizen.nativeplatform.pkgmgr.PackageManagerOuputReceiver;
+import org.tizen.nativeplatform.repo.model.Repository;
+import org.tizen.nativeplatform.types.CmdTargetTypes;
+import org.tizen.nativeplatform.types.PkgInstallTypes;
+import org.tizen.nativeplatform.util.CommandLauncher;
+
+public class DebCommanderHost implements IPkgCommander {
+
+    protected final String CMD_DELIMITER = ";";
+
+    public DebCommanderHost() {
+    }
+
+    @Override
+    public PackageManagerOuputReceiver getOutputReceiver() {
+        return null;
+    }
+
+    @Override
+    public void setHttpProxy(String proxy) {
+
+    }
+
+    @Override
+    public String getArchFromFile(String filePath) {
+        return null;
+    }
+
+    @Override
+    public String getNameFromFile(String filePath) {
+        return null;
+    }
+
+    @Override
+    public String getVerFromFile(String filePath) {
+        return null;
+    }
+
+    @Override
+    public String[] getArch(String pkg) {
+        return null;
+    }
+
+    @Override
+    public String[] getName(String pkg) {
+        return null;
+    }
+
+    @Override
+    public String[] getVer(String pkg) {
+        return null;
+    }
+
+    @Override
+    public String[] getVer(String pkg, TOOL tool) {
+        return null;
+    }
+
+    @Override
+    public boolean is80386File(String filePath) {
+        return false;
+    }
+
+    @Override
+    public boolean isArmFile(String filePath) {
+        return false;
+    }
+
+    @Override
+    public ICommandStatus installLocalPkg(String[] files, TOOL type, IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus installLocalPkg(String[] files, IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus installLocalPkg(String file, IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus installRemotePkg(String[] pkgs, IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus installRemotePkg(String pkg, IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus uninstallPkg(String[] pkgs, IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus uninstallPkg(String pkg, IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus copyFilesToTmpDir(String[] fileList) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus copyFile(String srcPath, String dstPath) {
+        return null;
+    }
+
+    @Override
+    public PkgInfo getPkgInfo(String pkg, TOOL type) {
+        return null;
+    }
+
+    @Override
+    public List<PkgStatus> getAllPkgList() {
+        return null;
+    }
+
+    @Override
+    public Map<String, PkgStatus> getAllPkgMap() {
+        return null;
+    }
+
+    @Override
+    public Map<String, PkgStatus> getRemotePkgList() {
+        return null;
+    }
+
+    @Override
+    public Map<String, PkgStatus> getLocalPkgList() {
+        return null;
+    }
+
+    @Override
+    public Map<String, PkgStatus> getWhatProvides(String capability) {
+        return null;
+    }
+
+    @Override
+    public List<Repository> getRepoList() {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus upgrade(IProgressMonitor monitor) {
+        return null;
+    }
+
+    @Override
+    public void resetRepo() {
+    }
+
+    @Override
+    public ICommandStatus refreshRepoList() {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus addRepo(String name, String url) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus addLocalRepo(String name, String path) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus removeRepo(String name) {
+        return null;
+    }
+
+    @Override
+    public boolean checkPkgInstalled(String pkg) {
+        String result = "";
+        String command = makeCommand(DpkgTool.statusCommand(pkg));
+        try {
+            result = CommandLauncher.executeOutput(command);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            return false;
+        }
+
+        for (String line : result.split("\n")) {
+            if (line.startsWith("Package:")) {
+                String[] splited = line.split(":");
+                if (splited.length > 1) {
+                    if (splited[1].trim().equals(pkg)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean existsFile(String file) {
+        return false;
+    }
+
+    @Override
+    public ICommandStatus getMd5Checksum(String path) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus makeDir(String path) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus removeFile(String path) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus changeSmack(String path, String a_label, String e_label) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus getSmack(String paths) {
+        return null;
+    }
+
+    @Override
+    public CmdTargetTypes getCommandType() {
+        return null;
+    }
+
+    @Override
+    public boolean isRunningApp(String appId) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public ICommandStatus killApp(String appId) {
+        return null;
+    }
+
+    @Override
+    public ICommandStatus launchApp(String appId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public PkgInstallTypes searchPkg(String pkg) {
+        return null;
+    }
+
+    @Override
+    public String getSrcPkgName(String pkg) {
+        return null;
+    }
+
+    @Override
+    public String getLogs() {
+        return null;
+    }
+
+    protected String makeCommand(String... cmds) {
+        StringBuffer sbCommand = new StringBuffer();
+        int size = cmds.length;
+        for (int i = 0; i < size; i++) {
+            String cmd = cmds[i];
+            cmd = cmd.trim();
+            if (cmd.isEmpty()) {
+                continue;
+            }
+            if (i != size - 1) {
+                cmd = (cmd.endsWith(";")) ? cmd : cmd + CMD_DELIMITER;
+            }
+            sbCommand.append(cmd);
+        }
+        return sbCommand.toString();
+    }
+}
diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkg/tools/DpkgTool.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkg/tools/DpkgTool.java
new file mode 100644 (file)
index 0000000..702ed84
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Native Platform
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:
+ * Donghyuk Yang <donghyuk.yang@samsung.com>  
+ * DongHee Yang <donghee.yang@samsung.com>
+ * Kangho Kim <kh5325.kim@samsung.com>
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+
+package org.tizen.nativeplatform.pkg.tools;
+
+public class DpkgTool {
+
+    public static final String NAME = "dpkg";
+
+    private final static String TOOL = "dpkg";
+    private final static String WS = " ";
+    private final static String STATUS_OP = "--status";
+    
+    public static String statusCommand(String pkg) {
+        return makeCommand(STATUS_OP, pkg);
+    }
+
+    private static String makeCommand(String... options) {
+        StringBuffer sbCommand = new StringBuffer(TOOL + WS);
+        for (String op : options) {
+            op = op.trim();
+            if (op.isEmpty()) {
+                continue;
+            }
+            sbCommand.append(op + WS);
+        }
+        return sbCommand.toString().trim();
+    }
+}
index 953d45b..7fc5aca 100644 (file)
@@ -28,7 +28,8 @@
 package org.tizen.nativeplatform.types;
 
 public enum PkgTypes {
-    RPM("rpm");
+    RPM("rpm"),
+    DPKG("deb");
     
     final String ext;
 
index 0235afb..82e4b69 100644 (file)
@@ -45,6 +45,7 @@ GenRootDlg.Error.Gen.Rootstrap.Failed = Generating rootstrap failed!!\n
 GenRootDlg.Error.NoAnyRepos = There is no any repositories!
 GenRootDlg.Error.Incorrect.Info = Failed to validate information for generating rootstrap.
 GenRootDlg.Error.Empty.Arch = Architecture is empty
+GenRootDlg.Error.Miss.Prerequisite = \"%s\" package is not installed in your machine.\nTry to command \"sudo apt-get install %s\".
 
 
 ChangeConfFileDlg.Title = Change (build) configuration file
index cd0c75f..bff12cc 100644 (file)
@@ -98,6 +98,7 @@ import org.tizen.nativecommon.build.SmartBuildInterface;
 import org.tizen.nativecommon.build.exception.SBIException;
 import org.tizen.nativeplatform.Activator;
 import org.tizen.nativeplatform.build.PlatformConfigurationManager;
+import org.tizen.nativeplatform.pkg.commander.IPkgCommander;
 import org.tizen.nativeplatform.pkg.commander.PkgCommandTarget;
 import org.tizen.nativeplatform.pkgmgr.PkgMgrInitializer;
 import org.tizen.nativeplatform.pkgmgr.ui.RPMPackageDialog;
@@ -107,7 +108,7 @@ import org.tizen.nativeplatform.repo.model.Repository;
 import org.tizen.nativeplatform.rootstrap.BaseFileSystemGenerator;
 import org.tizen.nativeplatform.rootstrap.IRootstrapChangedListener;
 import org.tizen.nativeplatform.rootstrap.RootstrapManager;
-import org.tizen.nativeplatform.util.CommandLauncher;
+import org.tizen.nativeplatform.types.PkgTypes;
 import org.tizen.nativeplatform.util.GBSArchitectureChecker;
 import org.tizen.nativeplatform.util.PlatformProjectUtil;
 import org.tizen.nativeplatform.views.model.PlatformRootstrap;
@@ -137,6 +138,7 @@ public class RootstrapView extends ViewPart {
     private Map<String, Thread> threadMap = new HashMap<String, Thread>();
 
     private static final String PLATFORM_PERSPECTIVE_ID = "org.tizen.nativeplatform.perspective";
+    private static final String PREREQUISITE_PKG = "ruby";
 
     private final String BUNDLE_NAME = RootstrapView.class.getPackage().getName()
             + ".RootstrapUIMessages";//$NON-NLS-1$
@@ -527,17 +529,26 @@ public class RootstrapView extends ViewPart {
     }
 
     private void showAddDialog() {
-        RootstrapGenDialog dlg = new RootstrapGenDialog(shell);
-        if (dlg.open() == RootstrapGenDialog.OK) {
-            String rootstrapName = dlg.getRootstrapName();
-            String arch = GBSArchitectureChecker.changeToSupportedArchitecture(dlg
-                    .getSelectionTab().getArchitecture());
-            List<String> repositoryURLs = dlg.getSelectionTab().getRepositoryURLs();
-            List<Repository> repoURLs = RepoManager.createRepoList(repositoryURLs);
-
-            boolean immediateGen = dlg.getSelectionTab().isImmediateGenerateChecked();
-            IPath buildConfFile = dlg.getSelectionTab().getBuildConfFile();
-            genRootstrap(rootstrapName, arch, repoURLs, immediateGen, buildConfFile);
+        PkgCommandTarget target = new PkgCommandTarget(PkgTypes.DPKG);
+        IPkgCommander dpkgCommander = target.getHostCommander();
+
+        if (!dpkgCommander.checkPkgInstalled(PREREQUISITE_PKG)) {
+            String msg = String.format(resources.getString("GenRootDlg.Error.Miss.Prerequisite"), 
+                    PREREQUISITE_PKG, PREREQUISITE_PKG);
+            DialogUtil.openErrorDialog(msg);
+        } else {
+            RootstrapGenDialog dlg = new RootstrapGenDialog(shell);
+            if (dlg.open() == RootstrapGenDialog.OK) {
+                String rootstrapName = dlg.getRootstrapName();
+                String arch = GBSArchitectureChecker.changeToSupportedArchitecture(dlg
+                        .getSelectionTab().getArchitecture());
+                List<String> repositoryURLs = dlg.getSelectionTab().getRepositoryURLs();
+                List<Repository> repoURLs = RepoManager.createRepoList(repositoryURLs);
+    
+                boolean immediateGen = dlg.getSelectionTab().isImmediateGenerateChecked();
+                IPath buildConfFile = dlg.getSelectionTab().getBuildConfFile();
+                genRootstrap(rootstrapName, arch, repoURLs, immediateGen, buildConfFile);
+            }
         }
     }