INTERNAL: bug fix in app list management 44/27544/1
authorgreatim <jaewon81.lim@samsung.com>
Mon, 15 Sep 2014 18:24:36 +0000 (03:24 +0900)
committergreatim <jaewon81.lim@samsung.com>
Mon, 15 Sep 2014 18:24:36 +0000 (03:24 +0900)
fix the bug that running process tracing is not possible.
rearrange app list in appcombo (user application will be top of the list)

Change-Id: Ieff69e40cb06cba17a3a573095ad7948df152632
Signed-off-by: greatim <jaewon81.lim@samsung.com>
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/AnalyzerConstants.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/AutoStartManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/communicator/DACommunicator.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/communicator/IDECommunicator.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/ApplistManager.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/model/DeviceInfo.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/project/AppInfo.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/project/PackageInfo.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/project/Project.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/Communicator30.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/ToolbarArea.java

index 12198a4..e3419b0 100644 (file)
@@ -58,6 +58,9 @@ public class AnalyzerConstants {
        public static final String DEFAULT_IMAGE_NAME = "noImage.jpg"; //$NON-NLS-1$
        public final static String PROBE_LIB_TIZEN = "da_probe_tizen.so"; //$NON-NLS-1$
        public final static String PROBE_LIB_OSP = "da_probe_osp.so"; //$NON-NLS-1$
+       
+       public static final String TIZEN_APP_PATH = "/opt/apps"; //$NON-NLS-1$
+       public static final String TIZEN_USR_APP_PATH = "/opt/usr/apps"; //$NON-NLS-1$
 
        /* Save Data table */
        public static final String LEAK_DATA_TABLE_NAME = "LeakData"; //$NON-NLS-1$
@@ -347,9 +350,12 @@ public class AnalyzerConstants {
        
        public final static String LAUNCH_APP = "launch_app";//$NON-NLS-1$
        public final static String APPCONTROL = "_AppControl";//$NON-NLS-1$
-       public final static String RUNNING_PROCESS = "[Running process]";//$NON-NLS-1$
-       public final static String WITHOUT_EXECUTABLE = "[Without executable]";//$NON-NLS-1$
-       public final static String COMMON_EXECUTABLE = "[Common executable]";//$NON-NLS-1$
+       public final static String RUNNING_PROCESS = "_Running process_";//$NON-NLS-1$
+       public final static String RUNNING_PROCESS_LABEL = "[Running process]";//$NON-NLS-1$
+       public final static String WITHOUT_EXECUTABLE = "_Without executable_";//$NON-NLS-1$
+       public final static String WITHOUT_EXECUTABLE_LABEL = "[Without executable]";//$NON-NLS-1$
+       public final static String COMMON_EXECUTABLE = "_Common executable_";//$NON-NLS-1$
+       public final static String COMMON_EXECUTABLE_LABEL = "[Common executable]";//$NON-NLS-1$
        
        public final static int SASH_WIDTH = 4;
 }
index a35bd60..c6e1a69 100644 (file)
@@ -31,7 +31,6 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.tizen.dynamicanalyzer.communicator.DACommunicator;
 import org.tizen.dynamicanalyzer.model.DeviceInfo;
-import org.tizen.dynamicanalyzer.project.AppInfo;
 import org.tizen.dynamicanalyzer.project.PackageInfo;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
@@ -132,7 +131,7 @@ public class AutoStartManager implements Runnable {
                        Logger.debug("invalid application name :" + appid);
                        return;
                }
-               final String appLabel = pkgInfo.getMainApp().getInfo(AppInfo.PROPERTY.LABEL.index);
+               final String appLabel = pkgInfo.getMainApp().getLabel();
                Logger.debug("IDE recv - deviceName: " + deviceName + " appName : " + appLabel);
 
                ToolbarArea.getInstance().setDeviceComboText(deviceName);
index 8bee963..06d3412 100644 (file)
@@ -48,6 +48,7 @@ import org.tizen.dynamicanalyzer.common.HostResult;
 import org.tizen.dynamicanalyzer.common.path.PathConstants;
 import org.tizen.dynamicanalyzer.common.path.PathManager;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.control.ApplistManager;
 import org.tizen.dynamicanalyzer.model.DeviceInfo;
 import org.tizen.dynamicanalyzer.project.AppInfo;
 import org.tizen.dynamicanalyzer.project.PackageInfo;
@@ -230,81 +231,80 @@ public class DACommunicator {
                return devNameList;
        }
 
-       public static Map<String, PackageInfo> getAppListFromTarget() {
+       public static Map<String, PackageInfo> updateAppListFromTarget() {
                DeviceInfo curDev = GlobalInformation.getCurrentDeviceInfo();
                if (curDev == null) {
                        return null;
                }
 
-               cmdResultMultiLines.clear();
+               final List<String> unittestLines = new ArrayList<String>();
+               final List<String> imeLines = new ArrayList<String>();
+               final List<String> pkginfoLines = new ArrayList<String>();
+
                CommunicatorUtils.execHostCommand(AnalyzerShellCommands.DACOMMAND_FIND_UNITTEST,
                                new MultiLineReceiver() {
                                        @Override
                                        public void processNewLines(String[] appLines) {
                                                for (int i = 0; i < appLines.length; i++) {
-                                                       filterMultiLines.add(appLines[i]);
+                                                       unittestLines.add(appLines[i]);
                                                }
                                        }
                                });
 
-               curDev.parseUnittestList(cmdResultMultiLines);
-
-               cmdResultMultiLines.clear();
                CommunicatorUtils.execShellCommand(AnalyzerShellCommands.DACOMMAND_FIND_IME,
                                new MultiLineReceiver() {
                                        @Override
                                        public void processNewLines(String[] appLines) {
                                                for (int i = 0; i < appLines.length; i++) {
-                                                       filterMultiLines.add(appLines[i]);
+                                                       imeLines.add(appLines[i]);
                                                }
                                        }
                                });
 
-               curDev.parseImeList(cmdResultMultiLines);
-
-               cmdResultMultiLines.clear();
                CommunicatorUtils.execShellCommand(AnalyzerShellCommands.CMD_APPLICATION_LIST,
                                new MultiLineReceiver() {
                                        @Override
                                        public void processNewLines(String[] appLines) {
                                                for (int i = 0; i < appLines.length; i++) {
-                                                       cmdResultMultiLines.add(appLines[i]);
+                                                       pkginfoLines.add(appLines[i]);
                                                }
                                        }
                                });
-               cmdResultMultiLines.add("");
+               pkginfoLines.add("");
 
                // add lines for running process
-               cmdResultMultiLines.add(AppInfo.PROPERTY.APPID.name + ":"
-                               + AnalyzerConstants.RUNNING_PROCESS);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.PACKAGE.name + ":"
-                               + AnalyzerConstants.RUNNING_PROCESS);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.LABEL.name + ":"
-                               + AnalyzerConstants.RUNNING_PROCESS);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.APPTYPE.name + ":" + AppInfo.APPTYPE_RUNNING);
-               cmdResultMultiLines.add("");
+               pkginfoLines.add(PackageInfo.PKGTYPE + "[unknown]" + PackageInfo.PKGID + "["
+                               + AnalyzerConstants.RUNNING_PROCESS + "]");
+               pkginfoLines.add(AppInfo.PROPERTY.APPID.name + ":" + AnalyzerConstants.RUNNING_PROCESS);
+               pkginfoLines.add(AppInfo.PROPERTY.PACKAGE.name + ":" + AnalyzerConstants.RUNNING_PROCESS);
+               pkginfoLines.add(AppInfo.PROPERTY.LABEL.name + ":"
+                               + AnalyzerConstants.RUNNING_PROCESS_LABEL);
+               pkginfoLines.add(AppInfo.PROPERTY.APPTYPE.name + ":" + AppInfo.APPTYPE_RUNNING);
+               pkginfoLines.add("");
 
                // add lines for without-executable
-               cmdResultMultiLines.add(AppInfo.PROPERTY.APPID.name + ":"
-                               + AnalyzerConstants.COMMON_EXECUTABLE);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.PACKAGE.name + ":"
-                               + AnalyzerConstants.COMMON_EXECUTABLE);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.LABEL.name + ":"
-                               + AnalyzerConstants.COMMON_EXECUTABLE);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.APPTYPE.name + ":" + AppInfo.APPTYPE_EXEC);
-               cmdResultMultiLines.add("");
+               pkginfoLines.add(PackageInfo.PKGTYPE + "[unknown]" + PackageInfo.PKGID + "["
+                               + AnalyzerConstants.COMMON_EXECUTABLE + "]");
+               pkginfoLines.add(AppInfo.PROPERTY.APPID.name + ":" + AnalyzerConstants.COMMON_EXECUTABLE);
+               pkginfoLines.add(AppInfo.PROPERTY.PACKAGE.name + ":" + AnalyzerConstants.COMMON_EXECUTABLE);
+               pkginfoLines.add(AppInfo.PROPERTY.LABEL.name + ":"
+                               + AnalyzerConstants.COMMON_EXECUTABLE_LABEL);
+               pkginfoLines.add(AppInfo.PROPERTY.APPTYPE.name + ":" + AppInfo.APPTYPE_EXEC);
+               pkginfoLines.add("");
 
                // add lines for without-executable
-               cmdResultMultiLines.add(AppInfo.PROPERTY.APPID.name + ":"
-                               + AnalyzerConstants.WITHOUT_EXECUTABLE);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.PACKAGE.name + ":"
-                               + AnalyzerConstants.WITHOUT_EXECUTABLE);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.LABEL.name + ":"
-                               + AnalyzerConstants.WITHOUT_EXECUTABLE);
-               cmdResultMultiLines.add(AppInfo.PROPERTY.APPTYPE.name + ":" + AppInfo.APPTYPE_NONE);
-               cmdResultMultiLines.add("");
-
-               curDev.parseAppList(cmdResultMultiLines);
+               pkginfoLines.add(PackageInfo.PKGTYPE + "[unknown]" + PackageInfo.PKGID + "["
+                               + AnalyzerConstants.WITHOUT_EXECUTABLE + "]");
+               pkginfoLines.add(AppInfo.PROPERTY.APPID.name + ":" + AnalyzerConstants.WITHOUT_EXECUTABLE);
+               pkginfoLines
+                               .add(AppInfo.PROPERTY.PACKAGE.name + ":" + AnalyzerConstants.WITHOUT_EXECUTABLE);
+               pkginfoLines.add(AppInfo.PROPERTY.LABEL.name + ":"
+                               + AnalyzerConstants.WITHOUT_EXECUTABLE_LABEL);
+               pkginfoLines.add(AppInfo.PROPERTY.APPTYPE.name + ":" + AppInfo.APPTYPE_NONE);
+               pkginfoLines.add("");
+
+               curDev.updatePackageList(ApplistManager.parseTizenPkginfo(pkginfoLines, unittestLines,
+                               imeLines, curDev.getIDevice().getAppInstallPath()));
 
                return curDev.getPackageInfoHash();
        }
@@ -346,24 +346,23 @@ public class DACommunicator {
 
                return processMap;
        }
-       
+
        public static String getProcessNameFromTarget(int pid) {
                if (null == GlobalInformation.getCurrentDeviceInfo()) {
                        return null;
                }
                String processName = null;
                cmdResultMultiLines.clear();
-               String command = String.format( AnalyzerShellCommands.CMD_PROCESS_NAME, pid );
+               String command = String.format(AnalyzerShellCommands.CMD_PROCESS_NAME, pid);
                // get process name from target
-               CommunicatorUtils.execShellCommand(command,
-                               new MultiLineReceiver() {
-                                       @Override
-                                       public void processNewLines(String[] appLines) {
-                                               for (int i = 0; i < appLines.length; i++) {
-                                                       cmdResultMultiLines.add(appLines[i]);
-                                               }
-                                       }
-                               });
+               CommunicatorUtils.execShellCommand(command, new MultiLineReceiver() {
+                       @Override
+                       public void processNewLines(String[] appLines) {
+                               for (int i = 0; i < appLines.length; i++) {
+                                       cmdResultMultiLines.add(appLines[i]);
+                               }
+                       }
+               });
                processName = cmdResultMultiLines.get(1);
                return processName;
        }
@@ -392,7 +391,7 @@ public class DACommunicator {
 
                        for (Map.Entry<String, PackageInfo> entry : pkgHash.entrySet()) {
                                AppInfo app = entry.getValue().getMainApp();
-                               String label = app.getInfo(AppInfo.PROPERTY.LABEL.index);
+                               String label = app.getLabel();
                                if (appLabel.equals(label)) {
                                        return entry.getValue();
                                }
index c3710aa..ad649df 100644 (file)
@@ -358,7 +358,7 @@ public class IDECommunicator implements Runnable {
                        return;
                }
 
-               DACommunicator.getAppListFromTarget();
+               DACommunicator.updateAppListFromTarget();
                PackageInfo pkgInfo = null;
                if (projectType.equals(PROJECT_TYPE_OSP) || projectType.equals(PROJECT_TYPE_EFL)
                                || projectType.equals(PROJECT_TYPE_WEBAPP)) {
@@ -444,7 +444,7 @@ public class IDECommunicator implements Runnable {
                }
 
                if (pkgInfo != null) {
-                       final String appLabel = pkgInfo.getMainApp().getInfo(AppInfo.PROPERTY.LABEL.index);
+                       final String appLabel = pkgInfo.getMainApp().getLabel();
                        Logger.debug("IDE recv - deviceName: " + deviceName + " appName : " + appLabel);
 
                        Display.getDefault().syncExec(new Runnable() {
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/ApplistManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/ApplistManager.java
new file mode 100644 (file)
index 0000000..26c3c90
--- /dev/null
@@ -0,0 +1,164 @@
+package org.tizen.dynamicanalyzer.control;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.project.AppInfo;
+import org.tizen.dynamicanalyzer.project.PackageInfo;
+
+public class ApplistManager {
+       public static Map<String, PackageInfo> parseTizenPkginfo(List<String> pkginfo,
+                       List<String> unittest, List<String> ime, String appInstallPath) {
+               Map<String, PackageInfo> pkgInfoHash = new HashMap<String, PackageInfo>();
+
+               List<String> unittestList = parseTizenUnittest(appInstallPath, unittest);
+               List<String> imeList = parseTizenIme(ime);
+
+               PackageInfo pkg = null;
+               AppInfo app = null;
+
+               int size = pkginfo.size();
+               for (int i = 0; i < size; i++) {
+                       String line = pkginfo.get(i);
+                       if (line.startsWith(PackageInfo.PKGTYPE)) {
+                               // make new package information
+                               pkg = makePackage(line);
+                               if (pkg != null) {
+                                       pkgInfoHash.put(pkg.getPackageId(), pkg);
+                               }
+                               app = null;
+                       } else if (line.startsWith(AppInfo.PROPERTY.APPID.name)) {
+                               if (pkg != null) {
+                                       // make new application information
+                                       app = makeApplication(line);
+                                       if (app != null) {
+                                               if (!isInList(unittestList, pkg.getPackageId())
+                                                               && !isInList(imeList, app.getAppId())) {
+                                                       pkg.addAppInfo(app);
+                                               } else {
+                                                       app = null;
+                                               }
+                                       }
+                               } else {
+                                       app = null;
+                               }
+                       } else if (!line.isEmpty()) {
+                               if (app != null) {
+                                       constructAppProperty(app, line);
+                               }
+                       }
+               }
+
+               return pkgInfoHash;
+       }
+
+       private static List<String> parseTizenUnittest(String appInstallPath, List<String> lines) {
+               if (lines.isEmpty()) {
+                       return null;
+               }
+
+               List<String> unittestList = new ArrayList<String>();
+               for (String line : lines) {
+                       if (line.contains(appInstallPath)) {
+                               line = line.replaceFirst(appInstallPath + CommonConstants.SLASH,
+                                               CommonConstants.EMPTY);
+                               int index = line.indexOf(CommonConstants.SLASH);
+                               line = line.substring(0, index);
+                               unittestList.add(line);
+                       }
+               }
+
+               return unittestList;
+       }
+
+       private static List<String> parseTizenIme(List<String> lines) {
+               if (lines.isEmpty()) {
+                       return null;
+               }
+
+               List<String> imeList = new ArrayList<String>();
+               for (String line : lines) {
+                       String appId = "appid";//$NON-NLS-1$
+                       if (line.contains("apptype") && line.contains("c++app")) {
+                               line = line.trim();
+                               int index = line.indexOf(appId);
+                               // 2 means length of String " ["
+                               line = line.substring(index + appId.length() + 2, line.length() - 1);
+                               imeList.add(line);
+                       }
+               }
+
+               return imeList;
+       }
+
+       private static PackageInfo makePackage(String line) {
+               PackageInfo pkgInfo = new PackageInfo();
+
+               String[] splited = line.split("[\\[\\]]");
+               int size = splited.length;
+               for (int i = 0; i < size - 1; i += 2) {
+                       String key = splited[i].trim();
+                       String value = splited[i + 1].trim();
+                       if (key.equals(PackageInfo.PKGTYPE)) {
+                               pkgInfo.setPkgType(value);
+                       } else if (key.equals(PackageInfo.PKGID)) {
+                               pkgInfo.setPackageId(value);
+                       } else if (key.equals(PackageInfo.VERSION)) {
+                               pkgInfo.setVersion(value);
+                       } else if (key.equals(PackageInfo.INSTALLTIME)) {
+                               pkgInfo.setInstallTime(Long.parseLong(value));
+                       }
+               }
+
+               if (pkgInfo.getPackageId() != null) {
+                       return pkgInfo;
+               } else {
+                       return null;
+               }
+       }
+
+       private static AppInfo makeApplication(String line) {
+               if (!line.startsWith(AppInfo.PROPERTY.APPID.name)) {
+                       return null;
+               }
+
+               AppInfo appInfo = new AppInfo();
+               if (constructAppProperty(appInfo, line)) {
+                       return appInfo;
+               } else {
+                       return null;
+               }
+       }
+
+       private static boolean constructAppProperty(AppInfo app, String line) {
+               int index = line.indexOf(':');
+               if (index > 0) {
+                       String key = line.substring(0, index).trim();
+                       String value = line.substring(index + 1, line.length()).trim();
+
+                       AppInfo.PROPERTY p = AppInfo.PROPERTY.get(key);
+                       if (p != null) {
+                               app.setInfo(p.index, value);
+                       }
+
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       private static boolean isInList(List<String> list, String item) {
+               if (null != list && !list.isEmpty()) {
+                       for (String id : list) {
+                               if (id.equals(item)) {
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       }
+
+}
index 58c07dd..07c370d 100644 (file)
@@ -27,9 +27,8 @@
 package org.tizen.dynamicanalyzer.model;
 
 import java.net.Socket;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
+import java.util.Iterator;
 import java.util.Map;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
@@ -38,7 +37,6 @@ import org.tizen.dynamicanalyzer.communicator.BaseCommunicator;
 import org.tizen.dynamicanalyzer.communicator.Communicator22;
 import org.tizen.dynamicanalyzer.communicator.CommunicatorUtils;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.project.AppInfo;
 import org.tizen.dynamicanalyzer.project.DeviceStatusInfo;
 import org.tizen.dynamicanalyzer.project.PackageInfo;
 import org.tizen.dynamicanalyzer.swap.communicator.Communicator30;
@@ -54,10 +52,6 @@ public class DeviceInfo {
        private boolean configSuccess = false;
 
        private Map<String, PackageInfo> pkgInfoHash = new HashMap<String, PackageInfo>();
-       private List<String> pkgInfoString = new ArrayList<String>();
-
-       private List<String> unittestList = new ArrayList<String>();
-       private List<String> imeList = new ArrayList<String>();
 
        private DeviceStatusInfo statusInfo = null;
 
@@ -180,151 +174,41 @@ public class DeviceInfo {
                configSuccess = success;
        }
 
-       public void parseUnittestList(List<String> lines) {
-               unittestList.clear();
-               if (lines.isEmpty()) {
-                       return;
-               }
-
-               String appInstallPath = getIDevice().getAppInstallPath();
-
-               for (String line : lines) {
-                       if (line.contains(appInstallPath)) {
-                               line = line.replaceFirst(appInstallPath + CommonConstants.SLASH,
-                                               CommonConstants.EMPTY);
-                               int index = line.indexOf(CommonConstants.SLASH);
-                               line = line.substring(0, index);
-                               unittestList.add(line);
-                       }
-               }
-       }
-
-       public void parseImeList(List<String> lines) {
-               imeList.clear();
-               if (lines.isEmpty()) {
-                       return;
-               }
-
-               for (String line : lines) {
-                       String appId = "appid";//$NON-NLS-1$
-                       if (line.contains("apptype") && line.contains("c++app")) {
-                               line = line.trim();
-                               int index = line.indexOf(appId);
-                               // 2 means length of String " ["
-                               line = line.substring(index + appId.length() + 2, line.length() - 1);
-                               imeList.add(line);
-                       }
-               }
-       }
-
-       public void parseAppList(List<String> lines) {
-               if (changedAppList(lines)) {
-                       pkgInfoString.clear();
-                       pkgInfoString.addAll(lines);
-
-                       // parsing app list lines
-                       pkgInfoHash.clear();
-
-                       int size = lines.size();
-
-                       for (int i = 0; i < size; i++) {
-                               if (lines.get(i).startsWith("Appid")) {
-                                       List<String> applines = new ArrayList<String>();
-
-                                       int k;
-                                       for (k = 0; k + i < size; k++) {
-                                               String inputLine = lines.get(k + i);
-                                               if (inputLine.isEmpty()) {
-                                                       continue;
-                                               } else if (k != 0 && inputLine.startsWith("Appid")) {
-                                                       break;
-                                               }
-                                               applines.add(inputLine);
-                                       }
-                                       i += k - 1;
-
-                                       AppInfo appInfo = makeAppInfo(applines);
-
-                                       String appID = appInfo.getAppId();
-                                       String pkgID = appInfo.getPackageId();
-
-                                       if (!isUnittest(pkgID) && !isIME(appID)) {
-                                               PackageInfo pkgInfo = pkgInfoHash.get(pkgID);
-                                               if (null == pkgInfo) {
-                                                       pkgInfo = new PackageInfo(pkgID);
-                                                       pkgInfoHash.put(pkgID, pkgInfo);
-                                               }
-                                               pkgInfo.addAppInfo(appInfo);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       private AppInfo makeAppInfo(List<String> lines) {
-               AppInfo appInfo = new AppInfo();
-               for (int i = 0; i < lines.size(); i++) {
-                       String line = lines.get(i);
-                       int index = line.indexOf(':');
-                       if (index > 0) {
-                               String key = line.substring(0, index).trim();
-                               String data = line.substring(index + 1, line.length()).trim();
-
-                               AppInfo.PROPERTY p = AppInfo.PROPERTY.get(key);
-                               if (p != null) {
-                                       appInfo.setInfo(p.index, data);
-                               }
-                       }
-               }
-
-               return appInfo;
-       }
-
-       private boolean changedAppList(List<String> strings) {
-               if (pkgInfoString != null) {
-                       if (pkgInfoString.size() == strings.size()) {
-                               int i;
-                               int ssize = pkgInfoString.size();
-                               for (i = 0; i < ssize; i++) {
-                                       if (pkgInfoString.get(i) == null) {
-                                               if (strings.get(i) != null) {
-                                                       break;
-                                               }
-                                       } else if (strings.get(i) == null) {
-                                               break;
-                                       } else if (!pkgInfoString.get(i).equals(strings.get(i))) {
-                                               break;
+       public void updatePackageList(Map<String, PackageInfo> newPackages) {
+               // remove package of old map which does not exist of new map
+               // also update package info if install time of package is changed
+               synchronized (pkgInfoHash) {
+                       Iterator<Map.Entry<String, PackageInfo>> iter = pkgInfoHash.entrySet().iterator();
+                       while (iter.hasNext()) {
+                               Map.Entry<String, PackageInfo> entry = iter.next();
+                               String pkgid = entry.getKey();
+                               PackageInfo oldpkg = entry.getValue();
+                               PackageInfo newpkg = newPackages.get(pkgid);
+
+                               if (newpkg == null) {
+                                       // remove package
+                                       iter.remove();
+                               } else {
+                                       if (oldpkg.getInstallTime() != newpkg.getInstallTime()) {
+                                               // update package
+                                               entry.setValue(newpkg);
                                        }
                                }
-
-                               if (i == ssize)
-                                       return false;
                        }
                }
 
-               return true;
-       }
-
-       private boolean isUnittest(String pkgId) {
-               if (null != unittestList && !unittestList.isEmpty()) {
-                       for (String id : unittestList) {
-                               if (id.equals(pkgId)) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
+               // add package of new map which does not exist of old map
+               for (Map.Entry<String, PackageInfo> entry : newPackages.entrySet()) {
+                       String pkgid = entry.getKey();
+                       PackageInfo newpkg = entry.getValue();
+                       PackageInfo oldpkg = pkgInfoHash.get(pkgid);
 
-       private boolean isIME(String appId) {
-               if (null != imeList && !imeList.isEmpty()) {
-                       for (String id : imeList) {
-                               if (id.equals(appId)) {
-                                       return true;
+                       if (oldpkg == null) {
+                               // add package to pkgInfoHash
+                               synchronized (pkgInfoHash) {
+                                       pkgInfoHash.put(pkgid, newpkg);
                                }
                        }
                }
-               return false;
        }
-
 }
index 7148fda..a246c6d 100644 (file)
@@ -37,6 +37,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.AnalyzerShellCommands;
 import org.tizen.dynamicanalyzer.common.ElfSymbolExtractor;
 import org.tizen.dynamicanalyzer.common.path.PathManager;
@@ -66,9 +67,8 @@ public class AppInfo {
                SCRREADER(11, "screenreader"),
                SUPPORT(12, "support-disable"),
                USERDATA(13, "user_data"),
-               INSTALL(14, "InstallTime"),
-               DEBUGPATH(15, "DebugFilePath"),
-               SRCPATH(16, "SourcePath");
+               DEBUGPATH(14, "DebugFilePath"),
+               SRCPATH(15, "SourcePath");
 
                public final int index;
                public final String name;
@@ -123,14 +123,6 @@ public class AppInfo {
        public AppInfo() {
        }
 
-       public String getInstallTime() {
-               return properties.get(PROPERTY.INSTALL.index);
-       }
-
-       public void setInstallTime(String installTime) {
-               properties.set(PROPERTY.INSTALL.index, installTime);
-       }
-
        public String getDebugFilePath() {
                return properties.get(PROPERTY.DEBUGPATH.index);
        }
@@ -335,6 +327,10 @@ public class AppInfo {
        public String getPackageId() {
                return properties.get(PROPERTY.PACKAGE.index);
        }
+       
+       public String getLabel() {
+               return properties.get(PROPERTY.LABEL.index);
+       }
 
        public String getExecPath() {
                return properties.get(PROPERTY.EXEC.index);
@@ -362,10 +358,12 @@ public class AppInfo {
                                                                                                                                                        // get
                                                                                                                                                        // path
                                if (getAppType().contains(APPTYPE_CPP)) {
-                                       exec = exec.replaceFirst("/opt/apps", "/opt/usr/apps");
+                                       exec = exec.replaceFirst(AnalyzerConstants.TIZEN_APP_PATH,
+                                                       AnalyzerConstants.TIZEN_USR_APP_PATH);
                                        exec += CommonConstants.EXTENSION_EXEC_FILE;
                                } else if (getAppType().contains(APPTYPE_CAPP)) {
-                                       exec = exec.replaceFirst("/opt/apps", "/opt/usr/apps");
+                                       exec = exec.replaceFirst(AnalyzerConstants.TIZEN_APP_PATH,
+                                                       AnalyzerConstants.TIZEN_USR_APP_PATH);
                                }
                                execPath = exec;
                        } else {
index af73f90..94758aa 100644 (file)
@@ -29,13 +29,23 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class PackageInfo {
+       public static final String PKGTYPE = "pkg_type";
+       public static final String PKGID = "pkgid";
+       public static final String VERSION = "version";
+       public static final String INSTALLTIME = "installed_time";
 
        private String id = null;
-       private List<AppInfo> appInfos = null;
+       private String pkgType = null;
+       private String version = null;
+       private long installTime = 0;
+
+       private List<AppInfo> appInfos = new ArrayList<AppInfo>();
+       
+       public PackageInfo() {
+       }
 
        public PackageInfo(String pkgId) {
                id = pkgId;
-               appInfos = new ArrayList<AppInfo>();
        }
 
        public void addAppInfo(AppInfo appInfo) {
@@ -60,12 +70,40 @@ public class PackageInfo {
                return id;
        }
 
+       public void setPackageId(String pkgid) {
+               this.id = pkgid;
+       }
+
        public List<AppInfo> getAppInfos() {
                return appInfos;
        }
-       
+
        // TODO: ensure main app is the first app in package
        public AppInfo getMainApp() {
                return appInfos.get(0);
        }
+
+       public String getPkgType() {
+               return pkgType;
+       }
+
+       public void setPkgType(String pkgType) {
+               this.pkgType = pkgType;
+       }
+
+       public String getVersion() {
+               return version;
+       }
+
+       public void setVersion(String version) {
+               this.version = version;
+       }
+
+       public long getInstallTime() {
+               return installTime;
+       }
+
+       public void setInstallTime(long installTime) {
+               this.installTime = installTime;
+       }
 }
index b406b61..0e43446 100755 (executable)
@@ -301,8 +301,7 @@ public class Project {
                        addConfigHistory(currentConfig);
                }
 
-               setAppName(GlobalInformation.getCurrentApplication().getMainApp()
-                               .getInfo(AppInfo.PROPERTY.LABEL.index));
+               setAppName(GlobalInformation.getCurrentApplication().getMainApp().getLabel());
                setPackageID(GlobalInformation.getCurrentApplication().getPackageId());
                DeviceInfo deviceName = GlobalInformation.getCurrentDeviceInfo();
                if (null != deviceName && null != deviceName.getIDevice().getSerialNumber()
index a8c4809..e793783 100755 (executable)
@@ -399,6 +399,10 @@ public class Communicator30 extends BaseCommunicator {
 
                if (AnalyzerConstants.RUNNING_PROCESS.equals(selectedPkg.getPackageId())) {
                        Map<Integer, String> selProcess = selectedPkg.getMainApp().getRunningProcesses();
+                       if (selProcess == null) {
+                               return HostResult.ERR_BIN_INFO_GET_FAIL;
+                       }
+
                        int binCount = selProcess.size();
                        preMsg = ByteUtil.getByte(binCount);
 
index f0b26a5..bde9cde 100755 (executable)
@@ -250,7 +250,7 @@ public class ToolbarArea {
 
                                        PackageInfo selectedPkg = DACommunicator.getPkgInfoByLabel(appName);
                                        if (null != selectedPkg) {
-                                               if (appName.equals(AnalyzerConstants.RUNNING_PROCESS)) {
+                                               if (appName.equals(AnalyzerConstants.RUNNING_PROCESS_LABEL)) {
                                                        Shell shell = WorkbenchUtil.getWorkbenchWindow().getShell();
                                                        ProcessExplorerDialog pdialog = new ProcessExplorerDialog(shell);
                                                        pdialog.setProcessList(selectedPkg.getMainApp().getRunningProcesses());
@@ -264,7 +264,7 @@ public class ToolbarArea {
                                                        if (selectedPkg.getMainApp().getRunningProcesses() == null) {
                                                                enablestart = false;
                                                        }
-                                               } else if (appName.equals(AnalyzerConstants.COMMON_EXECUTABLE)) {
+                                               } else if (appName.equals(AnalyzerConstants.COMMON_EXECUTABLE_LABEL)) {
                                                        // TODO : implement to select common executable
                                                }
 
@@ -797,7 +797,7 @@ public class ToolbarArea {
 
                        if (null != packageID && DACommunicator.getPkgInfoByPkgId(packageID) != null) {
                                pkgInfo = DACommunicator.getPkgInfoByPkgId(packageID);
-                               appCombo.setText(pkgInfo.getMainApp().getInfo(AppInfo.PROPERTY.LABEL.index));
+                               appCombo.setText(pkgInfo.getMainApp().getLabel());
                        } else {
                                pkgInfo = DACommunicator.getPkgInfoByLabel(pkgs.get(0));
                                appCombo.select(0);
@@ -862,13 +862,13 @@ public class ToolbarArea {
                }
        }
 
-       private void addToAppCombo(List<String> labels) {
+       private void addToAppCombo(List<PackageInfo> pkglist) {
                appCombo.initCombo();
 
-               if (labels != null && labels.size() > 0) {
-                       int itemsSize = labels.size();
+               if (pkglist != null && pkglist.size() > 0) {
+                       int itemsSize = pkglist.size();
                        for (int i = 0; i < itemsSize; i++) {
-                               appCombo.add(labels.get(i));
+                               appCombo.add(pkglist.get(i).getMainApp().getLabel());
                        }
                } else {
                        appCombo.add(CommonConstants.EMPTY);
@@ -876,50 +876,85 @@ public class ToolbarArea {
        }
 
        private void addToAppComboFromTarget() {
-               Map<String, PackageInfo> pkgInfos = DACommunicator.getAppListFromTarget();
+               Map<String, PackageInfo> pkgInfos = DACommunicator.updateAppListFromTarget();
 
-               List<String> labelList = new ArrayList<String>();
+               List<PackageInfo> pkgList = new ArrayList<PackageInfo>();
                if (pkgInfos != null) {
                        // TODO : reconstruct real app list for app combo
                        // relation between package and app?
                        for (Map.Entry<String, PackageInfo> entry : pkgInfos.entrySet()) {
-                               AppInfo mainapp = entry.getValue().getMainApp();
+                               PackageInfo pkg = entry.getValue();
+                               AppInfo mainapp = pkg.getMainApp();
                                if (!mainapp.getAppId().contains(AnalyzerConstants.APPCONTROL)) {
-                                       String label = mainapp.getInfo(AppInfo.PROPERTY.LABEL.index);
+                                       String label = mainapp.getLabel();
                                        if (label.isEmpty()) {
                                                label = mainapp.getExecFileName();
                                                mainapp.setInfo(AppInfo.PROPERTY.LABEL.index, label);
                                        }
-                                       labelList.add(label);
+                                       pkgList.add(pkg);
                                }
                        }
                }
 
                // sort label list by alphabet
-               Collections.sort(labelList, new Comparator<String>() {
+               Collections.sort(pkgList, new Comparator<PackageInfo>() {
                        @Override
-                       public int compare(String o1, String o2) {
-                               int len1 = o1.length();
-                               int len2 = o2.length();
+                       public int compare(PackageInfo pkg1, PackageInfo pkg2) {
+                               AppInfo app1 = pkg1.getMainApp();
+                               AppInfo app2 = pkg2.getMainApp();
+                               String o1 = app1.getLabel();
+                               String o2 = app2.getLabel();
 
                                if (o1.startsWith("[") && !o2.startsWith("[")) {
                                        return 1;
                                } else if (!o1.startsWith("[") && o2.startsWith("[")) {
                                        return -1;
                                } else {
-                                       int len = len1 > len2 ? len2 : len1;
-                                       for (int i = 0; i < len; i++) {
-                                               if (o1.charAt(i) > o2.charAt(i)) {
-                                                       return 1;
-                                               } else if (o1.charAt(i) < o2.charAt(i)) {
+                                       String exe1 = app1.getExecPath();
+                                       String exe2 = app2.getExecPath();
+                                       if (exe1.startsWith(AnalyzerConstants.TIZEN_APP_PATH)
+                                                       || exe1.startsWith(AnalyzerConstants.TIZEN_USR_APP_PATH)) {
+                                               if (exe2.startsWith(AnalyzerConstants.TIZEN_APP_PATH)
+                                                               || exe2.startsWith(AnalyzerConstants.TIZEN_USR_APP_PATH)) {
+                                                       // both packages are user packages
+                                                       // compare install time
+                                                       long time1 = pkg1.getInstallTime();
+                                                       long time2 = pkg2.getInstallTime();
+                                                       if (time1 < time2) {
+                                                               return 1;
+                                                       } else {
+                                                               return -1;
+                                                       }
+                                               } else {
+                                                       // pkg1 is user package but pkg2 is not user package
                                                        return -1;
                                                }
-                                       }
+                                       } else {
+                                               if (exe2.startsWith(AnalyzerConstants.TIZEN_APP_PATH)
+                                                               || exe2.startsWith(AnalyzerConstants.TIZEN_USR_APP_PATH)) {
+                                                       // pkg1 is not user package but pkg2 is user package
+                                                       return 1;
+                                               } else {
+                                                       // both packages are not user packages
+                                                       // compare label
+                                                       int len1 = o1.length();
+                                                       int len2 = o2.length();
+
+                                                       int len = len1 > len2 ? len2 : len1;
+                                                       for (int i = 0; i < len; i++) {
+                                                               if (o1.charAt(i) > o2.charAt(i)) {
+                                                                       return 1;
+                                                               } else if (o1.charAt(i) < o2.charAt(i)) {
+                                                                       return -1;
+                                                               }
+                                                       }
 
-                                       if (len1 > len2) {
-                                               return 1;
-                                       } else if (len1 < len2) {
-                                               return -1;
+                                                       if (len1 > len2) {
+                                                               return 1;
+                                                       } else if (len1 < len2) {
+                                                               return -1;
+                                                       }
+                                               }
                                        }
                                }
 
@@ -927,7 +962,7 @@ public class ToolbarArea {
                        }
                });
 
-               addToAppCombo(labelList);
+               addToAppCombo(pkgList);
        }
 
        public void setAppComboText(final String text) {
@@ -951,7 +986,7 @@ public class ToolbarArea {
                        GlobalInformation.setCurrentApplication(pkgInfo);
                        GlobalInformation.getCurrentDeviceInfo().getCommunicator().onAppSelected(pkgInfo);
                        GlobalInformation.getCurrentDeviceInfo().setSelectedPackageID(pkgInfo.getPackageId());
-                       appCombo.setText(pkgInfo.getMainApp().getInfo(AppInfo.PROPERTY.LABEL.index));
+                       appCombo.setText(pkgInfo.getMainApp().getLabel());
                }
        }
 
@@ -981,7 +1016,7 @@ public class ToolbarArea {
                                        setStartButtonState(false);
                                        return;
                                }
-                               
+
                                DeviceInfo curDev = GlobalInformation.getCurrentDeviceInfo();
                                if (curDev == null) {
                                        setStartButtonState(false);
@@ -995,7 +1030,7 @@ public class ToolbarArea {
                                        setStartButtonState(false);
                                        return;
                                }
-                               
+
                                setStartButtonState(true);
                                // startButton.setButtonEnabled(true);
                        }