Revert "Revert "Merge branch 'tizen' into mw and update package version"" 23/29723/1
authorjuyoung kim <j0.kim@samsung.com>
Mon, 3 Nov 2014 09:25:18 +0000 (01:25 -0800)
committerjuyoung kim <j0.kim@samsung.com>
Mon, 3 Nov 2014 09:25:18 +0000 (01:25 -0800)
This reverts commit 67d7e2f95c572262aff384a3a1dd77cebc689519.

Change-Id: I5cbdd001522953ff9d5420c079dde6809aa77b6b

124 files changed:
org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/resources/ColorResources.java
org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/theme/DAThemeWhite.java
org.tizen.dynamicanalyzer.common/src/org/tizen/dynamicanalyzer/constant/CommonConstants.java
org.tizen.dynamicanalyzer.widgets/src/org/tizen/dynamicanalyzer/widgets/chart/DAChartRenderer.java
org.tizen.dynamicanalyzer.widgets/src/org/tizen/dynamicanalyzer/widgets/chartBoard/DAChartBoardItem.java
org.tizen.dynamicanalyzer.widgets/src/org/tizen/dynamicanalyzer/widgets/chartBoard/DAChartBoardItemCell.java
org.tizen.dynamicanalyzer.workbench/dynamicanalyzer.product
org.tizen.dynamicanalyzer.workbench/src/org/tizen/dynamicanalyzer/common/path/PathConstants.java
org.tizen.dynamicanalyzer.workbench/src/org/tizen/dynamicanalyzer/common/path/PathManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/collection/IndexedHashMap.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/AnalyzerPlugin.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/AnalyzerShellCommands.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/DALimit.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/Global.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/HostResult.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/communicator/CommunicatorUtils.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/communicator/DACommunicator.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/ApplistManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/database/DBConstants.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/handlers/OpenTraceHandler.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/logparser/LogCenterConstants.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/FilePageLabels.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/FilePageLabels.properties
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.properties
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/UserErrorWarningLabels.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/UserErrorWarningLabels.properties
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/swap/callstack/BaseCallstackManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/callstack/SWAPCallStackManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/channel/control/FunctionInst.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/AckMessage.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/Communicator30.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/SwapErrorCode.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/ErrorCode.java with 73% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/logparser/MessageParser.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/model/data/ProfileData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DeviceExplorer/DADeviceExplorer.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/InputRow.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DAFileExplorer.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/FileExplorer/DAFileExplorer.java with 98% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DAFileExplorerEmptyCellRenderer.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/FileExplorer/DAFileExplorerEmptyCellRenderer.java with 96% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DAFileExplorerTableRenderer.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/FileExplorer/DAFileExplorerTableRenderer.java with 97% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DAFileTreeExplorer.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DAFileTreeExplorer.java with 98% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DAFileTreeExplorerRenderer.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DAFileTreeExplorerRenderer.java with 97% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DAFileTreeExplorerToggleRenderer.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DAFileTreeExplorerToggleRenderer.java with 98% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DeviceExplorer.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DeviceExplorer/DeviceExplorer.java with 67% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DeviceExplorerDialog.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DeviceExplorer/DeviceExplorerDilaog.java with 92% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DeviceExplorerTableRenderer.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/ExplorerUtil.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/ExplorerUtil.java with 96% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/FileExplorerDialog.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/FileExplorer/FileExplorerDialog.java with 97% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/FileTreeExplorerDialog.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/FileExplorerDialog.java with 96% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChart.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChartBoard.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChartRenderer.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChartView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileDetailInfoView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/data/FileAccessDB.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/data/FileAccessorDB.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/data/FileApiDB.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/data/FileStatusDB.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/manager/FileDataMaker.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/manager/FileDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/model/FileAccess.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/model/FileAccessor.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/model/FileEvent.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/model/FileSelectedData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/model/FileStatus.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackDataDBTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackInserter.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/SummaryDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionUsageProfiler.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfileDataMaker.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingChildDataDBTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadChartManager.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadDetailInfoView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadPage.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadPageData.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/SyncChart.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/SyncChartBoard.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/ThreadChart.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/ThreadChartBoard.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/ThreadChartView.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadChartView.java with 50% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIInserter.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataDBTable.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataInserter.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventDBTable.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventInserter.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadDataManager.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventInserter.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadLoadDataMaker.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadSyncDataMaker.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadThreadDataMaker.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/SyncAPIDBTable.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIDBTable.java with 58% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/SyncDataDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/SyncEventDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/ThreadAPIDBTable.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadAPIDBTable.java with 56% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/ThreadDataDBTable.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadDataDBTable.java with 54% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/ThreadEventDBTable.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventDBTable.java with 53% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncData.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadData.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java [deleted file]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageData.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageDataEvent.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadPageDataEvent.java with 90% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageSyncData.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageSyncDataEvent.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataEvent.java with 80% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageThreadData.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageThreadDataEvent.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataEvent.java with 81% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionEntryDBTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionExitDBTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/chart/ScreenshotChart.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/chart/UIEventChart.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/ToolbarArea.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/configuration/BinarySettingsPage.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/setting/SettingDialog.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/setting/SettingDialogBinarySettingsPage.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/utils/AnalyzerUtil.java
package/changelog
package/pkginfo.manifest

index 6065aa2..4029264 100755 (executable)
@@ -329,7 +329,8 @@ public class ColorResources {
        public static Color FILE_ACCESS_WRITE = getColor("file_access_write"); //$NON-NLS-1$\r
        public static Color FILE_ACCESS_CONCURRENT_READ = getColor("file_access_concurrent_read"); //$NON-NLS-1$\r
        public static Color FILE_ACCESS_CONCURRENT_WRITE = getColor("file_access_concurrent_write"); //$NON-NLS-1$\r
-       public static Color FILE_LOCK_ACQUIRED = getColor("file_lock_acquired"); //$NON-NLS-1$\r
+       public static Color FILE_LOCK = getColor("file_lock"); //$NON-NLS-1$\r
+       public static Color FILE_UNLOCK = getColor("file_unlock"); //$NON-NLS-1$file_unlock\r
        public static Color FILE_LOCK_WAITING = getColor("file_lock_waiting"); //$NON-NLS-1$\r
        public static Color FILE_OTHER_OPERATION = getColor("file_other_operation"); //$NON-NLS-1$\r
        public static Color FILE_OPENED = getColor("file_opened"); //$NON-NLS-1$\r
index c8c24f0..3759fb8 100644 (file)
@@ -339,7 +339,8 @@ public class DAThemeWhite extends DATheme {
                setColor("file_access_write",new RGB(131, 207, 232)); //$NON-NLS-1$
                setColor("file_access_concurrent_read",  new RGB(40, 160, 198)); //$NON-NLS-1$
                setColor("file_access_concurrent_write",  new RGB(40, 160, 198)); //$NON-NLS-1$
-               setColor("file_lock_acquired", new RGB(229, 123, 206)); //$NON-NLS-1$
+               setColor("file_lock", new RGB(229, 123, 206)); //$NON-NLS-1$
+               setColor("file_unlock", new RGB(125, 61, 204)); //$NON-NLS-1$
                setColor("file_lock_waiting", new RGB(194, 79, 167)); //$NON-NLS-1$
                setColor("file_other_operation",  new RGB(173, 173, 173)); //$NON-NLS-1$
                setColor("file_other_operation",  new RGB(173, 173, 173)); //$NON-NLS-1$
index 00a2ecd..00cbfc4 100644 (file)
@@ -32,6 +32,7 @@ public class CommonConstants {
        /* special character */
        public static final String EMPTY = ""; //$NON-NLS-1$
        public static final String SPACE = " "; //$NON-NLS-1$
+       public static final String DOUBLE_SPACE = "  "; //$NON-NLS-1$
        public static final String TAB = "      "; //$NON-NLS-1$
        public static final String SLASH = "/"; //$NON-NLS-1$
        public static final String BSLASH = "\\"; //$NON-NLS-1$
@@ -40,6 +41,7 @@ public class CommonConstants {
        public static final String CMD_SPLIT_DOT = "\\."; //$NON-NLS-1$
        public static final String NEW_LINE_CHAR = "\\n"; //$NON-NLS-1$
        public static final String NEW_LINE = "\n"; //$NON-NLS-1$
+       public static final String DOUBLE_NEW_LINE = "\n\n"; //$NON-NLS-1$
        public static final String DOT = "."; //$NON-NLS-1$
        public static final String COMMA = ","; //$NON-NLS-1$
        public static final String COLON = ":"; //$NON-NLS-1$
index f4107d9..2a4a327 100644 (file)
@@ -223,7 +223,7 @@ public class DAChartRenderer {
                }
 
                drawAxis(gc);
-               
+
                /*
                 * draw chart information
                 */
@@ -231,7 +231,7 @@ public class DAChartRenderer {
                        gc.setForeground(ColorResources.CHART_INFO);
                        gc.setFont(FontResources.CHART_INFO_FONT);
                        gc.drawImage(ImageResources.CHART_INFO, r.x + 5, (r.y + r.height) / 2 - 4);
-                       gc.drawText(chart.getInformation(), r.x + 18, 
+                       gc.drawText(chart.getInformation(), r.x + 18,
                                        (r.y + r.height / 2 - gc.textExtent(chart.getInformation()).y / 2), true);
                }
        }
@@ -622,8 +622,13 @@ public class DAChartRenderer {
 
                int totalHeight;
                if (plot instanceof DAUIEventChartPlot) {
-                       totalHeight = DAChartPlotTooltip.TOOLTIP_TEXT_HEIGHT
+                       if (!tooltipTexts.isEmpty()) {
+                               totalHeight = gc.textExtent(tooltipTexts.get(0)).y
+                                               + DAChartPlotTooltip.TOOLTIP_MARGIN + DAChartPlotTooltip.TOOLTIP_MARGIN;
+                       } else {
+                               totalHeight = DAChartPlotTooltip.TOOLTIP_TEXT_HEIGHT
                                        + DAChartPlotTooltip.TOOLTIP_MARGIN + DAChartPlotTooltip.TOOLTIP_MARGIN;
+                       }
                } else {
                        totalHeight = seriesCountPerColumn * DAChartPlotTooltip.TOOLTIP_TEXT_HEIGHT
                                        + DAChartPlotTooltip.TOOLTIP_MARGIN + DAChartPlotTooltip.TOOLTIP_BOTTOM_MARGIN
@@ -642,9 +647,11 @@ public class DAChartRenderer {
                } else {
                        startY = (r.y + r.height / 2) - (totalHeight / 2);
                }
-
-               int tooltipBoxWidth = (preTextWidthMargin + textWidthMax)
-                               * (tooltipSize / seriesCountPerColumn) + DAChartPlotTooltip.TOOLTIP_MARGIN;
+               int rowCount = tooltipSize / seriesCountPerColumn;
+               if ((tooltipSize % seriesCountPerColumn) != 0) {
+                       rowCount++;
+               }
+               int tooltipBoxWidth = (preTextWidthMargin + textWidthMax) * rowCount + DAChartPlotTooltip.TOOLTIP_MARGIN;
                gc.setAlpha(150);
                gc.setBackground(tooltip.getBackgroundColor());
                gc.setForeground(tooltip.getForegroundColor());
@@ -1490,8 +1497,17 @@ public class DAChartRenderer {
                Color colorB = series.getSecondColor();
                float aAmount = (float) (1.0 - bAmount);
                float r = colorA.getRed() * aAmount + colorB.getRed() * bAmount;
+               if (r < 0) {
+                       r = 0;
+               }
                float g = colorA.getGreen() * aAmount + colorB.getGreen() * bAmount;
+               if (g < 0) {
+                       g = 0;
+               }
                float b = colorA.getBlue() * aAmount + colorB.getBlue() * bAmount;
+               if (b < 0) {
+                       b = 0;
+               }
                return new Color(Display.getCurrent(), (int) r, (int) g, (int) b);
        }
 
index d42b279..09c72b7 100644 (file)
@@ -73,6 +73,23 @@ public class DAChartBoardItem extends Composite {
                this.layout();
        }
        
+       private void initWidget(String name, String fullName, Image icon, int chartStyle) {
+               heightRatio = getBoardItemHeightRatio();
+
+               this.setLayout(new FormLayout());
+               itemCell = new DAChartBoardItemCell(this, name, icon, chartStyle);
+               itemCell.setFullName(fullName);
+               itemCell.addExpandToggleButton();
+
+               FormData data = new FormData();
+               data.top = new FormAttachment(0, 0);
+               data.left = new FormAttachment(0, 0);
+               data.right = new FormAttachment(100, 0);
+               data.height = (int) (heightRatio * height);
+               itemCell.setLayoutData(data);
+               this.layout();
+       }
+       
        public DAChartBoardItem(DAChartBoard parent, String itemName) {
                super(parent.getItemList(), SWT.NONE);
                parentBoard = parent;
@@ -80,6 +97,26 @@ public class DAChartBoardItem extends Composite {
                initWidget(itemName, null, DAChart.CHART_STYLE_NORMAL);
                parentBoard.registerItem(this);
        }
+       
+       //to show full title
+       public DAChartBoardItem(DAChartBoard parent, String itemName, String fullName) {
+               super(parent.getItemList(), SWT.NONE);
+               parentBoard = parent;
+               height = parent.getItemHeight();
+               initWidget(itemName, fullName, null, DAChart.CHART_STYLE_NORMAL);
+               parentBoard.registerItem(this);
+       }
+       
+       //to show full title
+       public DAChartBoardItem(DAChartBoardItem parent, String itemName, String fullName) {
+               super(parent.getChildItemList(), SWT.NONE);
+               parentItem = parent;
+               height = parent.getChartBoard().getItemHeight();
+               depth = parent.getDepth() + 1;
+               initWidget(itemName, fullName, null, DAChart.CHART_STYLE_NORMAL);
+               parentItem.registerItem(this);
+       }
+       
        // for sorting of chart items   
        public DAChartBoardItem(DAChartBoard parent, String itemName,
                        Object o, Comparator c) {
@@ -103,7 +140,7 @@ public class DAChartBoardItem extends Composite {
        public DAChartBoardItem(DAChartBoardItem parent, String itemName) {
                super(parent.getChildItemList(), SWT.NONE);
                parentItem = parent;
-               height = parent.getItemHeight();
+               height = parent.getChartBoard().getItemHeight();
                depth = parent.getDepth() + 1;
                initWidget(itemName, null, DAChart.CHART_STYLE_NORMAL);
                parentItem.registerItem(this);
@@ -113,7 +150,7 @@ public class DAChartBoardItem extends Composite {
                        Object o, Comparator c) {
                super(parent.getChildItemList(), SWT.NONE);
                parentItem = parent;
-               height = parent.getItemHeight();
+               height = parent.getChartBoard().getItemHeight();
                depth = parent.getDepth() + 1;
                sortObj = o;
                initWidget(itemName, null, DAChart.CHART_STYLE_NORMAL);
@@ -124,7 +161,7 @@ public class DAChartBoardItem extends Composite {
                        int chartStyle) {
                super(parent.getChildItemList(), SWT.NONE);
                parentItem = parent;
-               height = parent.getItemHeight();
+               height = parent.getChartBoard().getItemHeight();
                depth = parent.getDepth() + 1;
                initWidget(itemName, icon, chartStyle);
                parentItem.registerItem(this);
index cebbf75..f7e9454 100644 (file)
@@ -80,6 +80,8 @@ public class DAChartBoardItemCell extends Composite {
        private PaintListener nameCellPaintListener;
        private boolean hasAdditionalInfo = false;
        
+       private String itemFullName = null;
+       
        //FIXME for debugging
        public String getItemName() {
                return itemName;
@@ -265,6 +267,25 @@ public class DAChartBoardItemCell extends Composite {
                                boolean bToggled = expandButton.isToggled();
                                parentItem.callbackSelect(true);
                                parentItem.callbackExpand(bToggled);
+                               
+                               PaintListener fullNameCellPaintListener = (new PaintListener() {
+                                       @Override
+                                       public void paintControl(PaintEvent e) {        // draw full name
+                                               Rectangle rect = ((Canvas) (e.widget)).getClientArea();
+                                               drawNameCellBackGround(e.gc, rect);
+                                               Point point = e.gc.textExtent(itemFullName, SWT.DRAW_DELIMITER);
+                                               int startY = rect.height / 2 - point.y / 2 + NAME_CELL_DEFAULT_MARGIN;
+                                               e.gc.setForeground(ColorResources.BLACK);
+                                               drawText(e.gc, itemFullName, rect, startY);
+                                       }
+                               });
+                               if(itemFullName != null) {
+                                       if(bToggled) {
+                                               nameCell.addPaintListener(fullNameCellPaintListener);
+                                       }else{
+                                               nameCell.addPaintListener(nameCellPaintListener);
+                                       }                                       
+                               }
                                nameCell.redraw();
                        }
                });
@@ -381,4 +402,8 @@ public class DAChartBoardItemCell extends Composite {
                nameCellCurrentBGColorEnd = endColor;   
                nameCell.redraw();
        }
+       
+       public void setFullName(String fullName) {
+               this.itemFullName = fullName;
+       }
 }
index 2ed5668..99af921 100755 (executable)
@@ -16,8 +16,8 @@
    <launcherArgs>
       <programArgs>-data @noDefault</programArgs>
       <vmArgs>-XX:MaxPermSize=64m
--Xms512m
--Xmx512m
+-Xms256m
+-Xmx1024m
 -XX:+UseParNewGC
 -XX:+UseConcMarkSweepGC</vmArgs>
       <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
index 20c8c17..77b0199 100644 (file)
@@ -44,6 +44,7 @@ public class PathConstants {
        public static final String IDE_FOLDER_NAME = "ide"; //$NON-NLS-1$
        public static final String PLUGINS_FOLDER_NAME = "plugins"; //$NON-NLS-1$
        public static final String BASE_PLATFORM_PLUGIN_FOLDER_NAME = "org.tizen.base.platform"; //$NON-NLS-1$
+       public static final String PLATFORM_IDE_PLUGIN_NAME = "org.tizen.nativeplatform"; //$NON-NLS-1$
        public static final String WORKBENCH_PLUGIN_FOLDER_NAME = "org.tizen.dynamicanalyzer.workbench"; //$NON-NLS-1$
        public static final String ABOUT_FILE_NAME = "about.mappings"; //$NON-NLS-1$
        public static final String SINGLETON_LOCK_FILE = "active_da";//$NON-NLS-1$
index 75b15b3..9ddbb50 100755 (executable)
@@ -51,8 +51,8 @@ public class PathManager {
        public static final String DA_INSTALL_PATH = TIZEN_SDK_INSTALL_PATH + File.separator
                        + PathConstants.TOOLS_FOLDER_NAME + File.separator
                        + PathConstants.DYNAMIC_ANALYZER_FOLDER_NAME;
-       public static final String DA_AUTOTEST_PATH = TIZEN_SDK_DATA_PATH + File.separator
-                       + "test" + File.separator + PathConstants.DYNAMIC_ANALYZER_FOLDER_NAME;
+       public static final String DA_AUTOTEST_PATH = TIZEN_SDK_DATA_PATH + File.separator + "test"
+                       + File.separator + PathConstants.DYNAMIC_ANALYZER_FOLDER_NAME;
        public static final String DA_READELF_PATH = DA_INSTALL_PATH + File.separator
                        + PathConstants.TARGET_FOLDER_NAME;
 
@@ -71,10 +71,10 @@ public class PathManager {
        public static final String DA_TOOL_FOLDER_PATH = DA_INSTALL_PATH + File.separator
                        + PathConstants.TOOL_FOLDER_NAME;
 
-       public static final String DA_DEBUG_DATA_CHANNEL_LOG_FILE = DA_LOG_PATH
-                       + File.separator + "data.log"; //$NON-NLS-1$
-       public static final String DA_DEBUG_CONTROL_CHANNEL_LOG_FILE = DA_LOG_PATH
-                       + File.separator + "control.log"; //$NON-NLS-1$
+       public static final String DA_DEBUG_DATA_CHANNEL_LOG_FILE = DA_LOG_PATH + File.separator
+                       + "data.log"; //$NON-NLS-1$
+       public static final String DA_DEBUG_CONTROL_CHANNEL_LOG_FILE = DA_LOG_PATH + File.separator
+                       + "control.log"; //$NON-NLS-1$
        public static final String DA_BINARY_AUTO_SAVE_FILE = DA_SAVE_PATH + File.separator
                        + "BinarySettings.save";
 
@@ -146,11 +146,11 @@ public class PathManager {
                        String platformVersion = platform.replaceAll("[A-Za-z]", "");//$NON-NLS-1$
 
                        if (Double.parseDouble(platformVersion) < 2.1) {
-                               tizenHeaderSouecePath = String.format(tempPath, platformName,
-                                               currentDevie, platformVersion + ".cpp");//$NON-NLS-1$
+                               tizenHeaderSouecePath = String.format(tempPath, platformName, currentDevie,
+                                               platformVersion + ".cpp");//$NON-NLS-1$
                        } else {
-                               tizenHeaderSouecePath = String.format(tempPath, platformName,
-                                               currentDevie, platformVersion + ".native");//$NON-NLS-1$
+                               tizenHeaderSouecePath = String.format(tempPath, platformName, currentDevie,
+                                               platformVersion + ".native");//$NON-NLS-1$
                        }
                }
 
@@ -160,10 +160,9 @@ public class PathManager {
        // currently not used
        public static String getTargetPath(String platform) {
                if (null != platform && !platform.isEmpty()) {
-                       return TIZEN_SDK_INSTALL_PATH + File.separator
-                                       + PathConstants.PLATFORM_FOLDER_NAME + File.separator + platform
-                                       + File.separator + PathConstants.DYNAMIC_ANALYZER_FOLDER_NAME
-                                       + File.separator;
+                       return TIZEN_SDK_INSTALL_PATH + File.separator + PathConstants.PLATFORM_FOLDER_NAME
+                                       + File.separator + platform + File.separator
+                                       + PathConstants.DYNAMIC_ANALYZER_FOLDER_NAME + File.separator;
                } else {
                        return DA_INSTALL_PATH + File.separator + PathConstants.TARGET_FOLDER_NAME
                                        + File.separator;
@@ -199,6 +198,32 @@ public class PathManager {
                return aboutFilePath;
        }
 
+       public static boolean checkPlatformPlugin() {
+               String idePluginPath = TIZEN_SDK_INSTALL_PATH + File.separator
+                               + PathConstants.IDE_FOLDER_NAME + File.separator
+                               + PathConstants.PLUGINS_FOLDER_NAME;
+
+               File dir = new File(idePluginPath);
+               String[] files;
+               if (dir.exists()) {
+                       files = dir.list(new FilenameFilter() {
+
+                               @Override
+                               public boolean accept(File dir, String name) {
+                                       return name.contains(PathConstants.PLATFORM_IDE_PLUGIN_NAME);
+                               }
+                       });
+               } else {
+                       return false;
+               }
+
+               if (null == files || files.length < 1) {
+                       return false;
+               }
+
+               return true;
+       }
+
        public static String getWorkbenchPluginPath() {
                String aboutFolderPath = TIZEN_SDK_INSTALL_PATH + File.separator
                                + PathConstants.TOOLS_FOLDER_NAME + File.separator
@@ -230,9 +255,9 @@ public class PathManager {
 
        public static String getRootstrapsPath(String platform) {
                if (platform != null) {
-                       return TIZEN_SDK_INSTALL_PATH + File.separator
-                                       + PathConstants.PLATFORM_FOLDER_NAME + File.separator + platform
-                                       + File.separator + PathConstants.TIZEN_FOLDER_ROOTSTRAPS;
+                       return TIZEN_SDK_INSTALL_PATH + File.separator + PathConstants.PLATFORM_FOLDER_NAME
+                                       + File.separator + platform + File.separator
+                                       + PathConstants.TIZEN_FOLDER_ROOTSTRAPS;
                } else {
                        return "";
                }
@@ -245,40 +270,37 @@ public class PathManager {
                        returnstr = DA_TOOL_FOLDER_PATH + File.separator
                                        + PathConstants.WINDOW_ACTIVATOR_WINDOWS;
                } else if (CommonUtil.isMac()) {
-                       returnstr = DA_TOOL_FOLDER_PATH + File.separator
-                                       + PathConstants.WINDOW_ACTIVATOR_MACOS;
+                       returnstr = DA_TOOL_FOLDER_PATH + File.separator + PathConstants.WINDOW_ACTIVATOR_MACOS;
                } else if (CommonUtil.isLinux()) {
-                       returnstr = DA_TOOL_FOLDER_PATH + File.separator
-                                       + PathConstants.WINDOW_ACTIVATOR_LINUX;
+                       returnstr = DA_TOOL_FOLDER_PATH + File.separator + PathConstants.WINDOW_ACTIVATOR_LINUX;
                } else {
                        returnstr = null;
                }
 
                return returnstr;
        }
-       
+
        public static String getTestLogPath() {
                String returnstr = null;
 
                returnstr = getTizenSdkDataPath();
-               if (returnstr == null)  return returnstr;
-               return returnstr + File.separator + PathConstants.DYNAMIC_ANALYZER_FOLDER_NAME  
-                               + File.separator + PathConstants.TEST_FOLDER_NAME;  
+               if (returnstr == null)
+                       return returnstr;
+               return returnstr + File.separator + PathConstants.DYNAMIC_ANALYZER_FOLDER_NAME
+                               + File.separator + PathConstants.TEST_FOLDER_NAME;
        }
-       
+
        public static String getDebugInfoScript() {
                String path = null;
-               
+
                if (CommonUtil.isLinux() || CommonUtil.isMac()) {
-                       path = DA_TOOL_FOLDER_PATH + File.separator
-                       + PathConstants.DEBUGINFO_LINUX_MAC;
+                       path = DA_TOOL_FOLDER_PATH + File.separator + PathConstants.DEBUGINFO_LINUX_MAC;
                } else if (CommonUtil.isWin()) {
-                       path = DA_TOOL_FOLDER_PATH + File.separator
-                       + PathConstants.DEBUGINFO_WINDOWS;
+                       path = DA_TOOL_FOLDER_PATH + File.separator + PathConstants.DEBUGINFO_WINDOWS;
                } else { // should never be here
-                       Logger.error("Unknown host OS!\n");                     
+                       Logger.error("Unknown host OS!\n");
                }
-               
+
                return path;
        }
 }
index de4f317..2ad90b5 100644 (file)
@@ -55,7 +55,7 @@ public class IndexedHashMap<K, V extends Indexable> {
        }
 
        public V getByIndex(int index) {
-               if (index < dataList.size()) {
+               if (index >= 0 && index < dataList.size()) {
                        return dataList.get(index);
                } else {
                        return null;
index e567a98..c6f7336 100644 (file)
@@ -51,6 +51,9 @@ public class AnalyzerPlugin extends AbstractUIPlugin {
        public void start(BundleContext context) throws Exception {\r
                super.start(context);\r
                plugin = this;\r
+               \r
+               // check for platform sdk\r
+               Global.setPlatformSDK(PathManager.checkPlatformPlugin());\r
 \r
                // Adds workbench listener.\r
                IWorkbench workbench = PlatformUI.getWorkbench();\r
index 6e6395f..0f94308 100755 (executable)
@@ -39,13 +39,14 @@ public class AnalyzerShellCommands {
        public static final String CMD_UPLOAD_FILE_LIST = "du -b " + //$NON-NLS-1$
                        PathConstants.DA_REMOTE_PATH + AnalyzerConstants.READELF_BIN;
        public static final String CMD_PROCESS_NAME = "ps -p %d -o comm=rcu_sched";
+       public static final String CMD_GET_FILE_SIZE = "stat -c %s";
 
        // via da_command
-       public static final String DACOMMAND_KILL_MANAGER = "da killmanager";
-       public static final String DACOMMAND_RUN_MANAGER = "da runmanager";
-       public static final String DACOMMAND_FIND_UNITTEST = "da findunittest";
-       public static final String DACOMMAND_CHECK_VERSION = "da getversion";
-       public static final String DACOMMAND_READLINK = "da readlink ";
+       public static final String DACOMMAND_KILL_MANAGER = "profile killmanager";
+       public static final String DACOMMAND_RUN_MANAGER = "profile runmanager";
+       public static final String DACOMMAND_FIND_UNITTEST = "profile findunittest";
+       public static final String DACOMMAND_CHECK_VERSION = "profile getversion";
+       public static final String DACOMMAND_READLINK = "profile readlink ";
 
        // direct shell command
        public static final String CMD_FIND_IME = "/usr/bin/pkginfo --arg-flt 10 http://tizen.org/category/ime";
index 711ad81..62a3469 100644 (file)
@@ -68,6 +68,7 @@ public class DALimit {
        public static final int MAX_BINARY_COUNT = (int) Math.pow(2, 16); // 65535
        public static final int MAX_FUNCTION_COUNT = (int) Math.pow(2, 20);     // 1,048,576
        public static final int MAX_FUNCTION_ARGUMENTS_COUNT = FUNCTION_ARGUMENTS_FORMAT_LENGTH; // Because "MAX_FUNCTION_ARGUMENTS_COUNT < FUNCTION_ARGUMENTS_FORMAT_LENGTH" is always true
+       public static final long MAX_DAEMON_LOG_SIZE = 1024*1024;       // 1 mega byte
        
        // Leak 
        public static final int MAX_LEAK_CHECK_BUFFER_SIZE = (int) Math.pow(2, 20); // 1,048,576
@@ -77,6 +78,8 @@ public class DALimit {
        public static final int MAX_FILE_ACCESS_COUNT = ((int) Math.pow(2, 10))*100; // 102400 // 102400
        public static final int MAX_STRING_LENGTH = 16;
        
+       // Callstack
+       public static final int MAX_CALLSTACK_SEQTIMEMAP_SIZE = 100000;
        
        
        public static void stopTraceAndOpenWarningDialog() {
index ad5368c..c6892d3 100644 (file)
@@ -38,17 +38,27 @@ import org.tizen.dynamicanalyzer.swap.channel.control.RunTimeConfiguration;
 // This class is for global information that can be accessed from anywhere in dynamic analyzer code.
 // So this class contains only static methods and variables.
 public class Global {
+       private static boolean isPlatformSDK = false;
+       
        private static DeviceInfo currentDevice = null;
        private static PackageInfo currentApplication = null;
        private static Project currentProject = null;
        private static RunTimeConfiguration currentConfiguration = null;
 
+       public static boolean isPlatformSDK() {
+               return isPlatformSDK;
+       }
+
+       public static void setPlatformSDK(boolean isPlatformSDK) {
+               Global.isPlatformSDK = isPlatformSDK;
+       }
+
        public static DeviceInfo getCurrentDeviceInfo() {
                return currentDevice;
        }
 
        public static void setCurrentDeviceInfo(DeviceInfo device) {
-               currentDevice = device;
+               Global.currentDevice = device;
        }
 
        public static PackageInfo getCurrentApplication() {
@@ -56,7 +66,7 @@ public class Global {
        }
 
        public static void setCurrentApplication(PackageInfo pkgInfo) {
-               currentApplication = pkgInfo;
+               Global.currentApplication = pkgInfo;
        }
 
        public static RunTimeConfiguration getCurrentConfiguration() {
@@ -64,17 +74,17 @@ public class Global {
        }
 
        public static void setCurrentConfiguration(RunTimeConfiguration currentConfig) {
-               currentConfiguration = currentConfig;
-       }
-
-       public static void setProject(Project p) {
-               currentProject = p;
+               Global.currentConfiguration = currentConfig;
        }
 
        public static Project getProject() {
                return currentProject;
        }
 
+       public static void setProject(Project p) {
+               Global.currentProject = p;
+       }
+
        public static String getFunctionName(int id) {
                if (currentProject != null) {
                        return currentProject.getFunctionName(id);
index ba6331e..b74bfbe 100755 (executable)
@@ -53,13 +53,13 @@ public enum HostResult {
 
        ERR_READELF_UPLOAD_FAILED(-205, "readelf file size is different!!"),
 
-       ERR_DEVICE_IS_NULL(-301, "current device is null"),
+       ERR_DEVICE_IS_NULL(-301, "Current device is not available"),
 
        ERR_DEVICE_IS_OFFLINE(-302, "current device is offline"),
 
        ERR_SELECTED_APP_IS_NULL(-401, "selected app is null"),
 
-       ERR_MSG_START_FAIL(-501, "start message is not ok"),
+       ERR_MSG_START_FAIL(-501, "Current application is not available"),
 
        ERR_MSG_STOP_FAIL(-502, "stop message is not ok"),
 
@@ -74,6 +74,8 @@ public enum HostResult {
        ERR_BIN_INFO_GET_FAIL(-507, "binary info get fail..."),
        
        ERR_RECEIVE_ACK_FAIL(-508, "receiving ack message fail..."),
+       
+       ERR_BY_SECURITY_REASON(-601, "error by security reason"),
 
        ERR_DA_IS_EXIT(-901, "Dynamic Analyzer is closing"),
 
index 68ef308..4dcd0f7 100755 (executable)
@@ -284,8 +284,8 @@ public class CommunicatorUtils {
 
        public static int getRemotePort(IDevice device) {
                int remotePort = -1;
+               
                // add error check
-               System.out.print("Getting Port Progress \n ");
                long start = System.currentTimeMillis();
                while ((System.currentTimeMillis() - start) < PORT_WAIT_TIME) {
                        try {
@@ -335,9 +335,9 @@ public class CommunicatorUtils {
 
                System.out.print("\n");
                if (remotePort < 0) {
-                       Logger.debug("!!port get failed!!");
+                       Logger.error("!!failed to get port number of da manager!!");
                } else {
-                       Logger.debug("!!port get success!! : " + remotePort);
+                       Logger.debug("!!succeeded to get port number!! : " + remotePort);
                }
 
                return remotePort;
index 2fe8184..73931df 100644 (file)
@@ -43,6 +43,7 @@ import org.eclipse.swt.widgets.Display;
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.AnalyzerShellCommands;
+import org.tizen.dynamicanalyzer.common.DALimit;
 import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.common.HostResult;
 import org.tizen.dynamicanalyzer.common.path.PathConstants;
@@ -363,7 +364,12 @@ public class DACommunicator {
                                }
                        }
                });
-               processName = cmdResultMultiLines.get(1);
+               if (cmdResultMultiLines.size() == 1) {
+                       processName = "unknow proccess";//$NON-NLS-1$
+               } else {
+                       processName = cmdResultMultiLines.get(1);
+               }
+
                return processName;
        }
 
@@ -448,22 +454,7 @@ public class DACommunicator {
                                }
                        });
 
-                       Logger.debug("device disconnected : " + device.getSerialNumber());
-                       DeviceInfo deviceInfo = getDeviceByName(device.getSerialNumber());
-                       DeviceInfo selectedDevice = Global.getCurrentDeviceInfo();
-                       if (null != devices && !devices.isEmpty()) {
-                               devices.remove(deviceInfo);
-                               if (!AnalyzerManager.isRunning()) {
-                                       updateToolbarDevice();
-                               }
-                               if (isRunning()) {
-                                       if (selectedDevice.getIDevice().getSerialNumber()
-                                                       .equals(deviceInfo.getIDevice().getSerialNumber())) {
-                                               Logger.debug("Disconnected while DA is running."); //$NON-NLS-1$
-                                               DACommunicator.setRunning(false);
-                                       }
-                               }
-                       }
+                       onDisconnectedInternal(device);
 
                        Display.getDefault().syncExec(new Runnable() {
                                @Override
@@ -484,24 +475,7 @@ public class DACommunicator {
                                }
                        });
 
-                       Logger.debug("device connected : " + device.getSerialNumber());
-                       // addDevice(device);
-                       if (!AnalyzerManager.isRunning()) {
-                               DeviceInfo devInfo = new DeviceInfo(device);
-                               HostResult result = readVersion(devInfo);
-                               if (result.isSuccess()) {
-                                       devInfo.initCommunicator();
-                                       updateToolbarDevice();
-                               }
-                       }
-                       if (null != Global.getCurrentDeviceInfo() && null != Global.getCurrentApplication()) {
-                               Display.getDefault().syncExec(new Runnable() {
-                                       @Override
-                                       public void run() {
-                                               ToolbarArea.getInstance().setStartButtonEnablement(true);
-                                       }
-                               });
-                       }
+                       onConnectedInternal(device);
 
                        Display.getDefault().syncExec(new Runnable() {
                                @Override
@@ -523,23 +497,9 @@ public class DACommunicator {
                        });
 
                        Logger.debug("device changed : " + device.getSerialNumber() + "   " + changeMask);
-                       if (1 == changeMask) {
-                               if (!AnalyzerManager.isRunning()) {
-                                       DeviceInfo devInfo = new DeviceInfo(device);
-                                       HostResult result = readVersion(devInfo);
-                                       if (result.isSuccess()) {
-                                               devInfo.initCommunicator();
-                                               updateToolbarDevice();
-                                       }
-                               }
-                               if (null != Global.getCurrentDeviceInfo() && null != Global.getCurrentApplication()) {
-                                       Display.getDefault().syncExec(new Runnable() {
-                                               @Override
-                                               public void run() {
-                                                       ToolbarArea.getInstance().setStartButtonEnablement(true);
-                                               }
-                                       });
-                               }
+                       if (1 == changeMask) { // state changed (offline -> online, vice versa)
+                               onDisconnectedInternal(device);
+                               onConnectedInternal(device);
                        } else {
                                Logger.debug("device changed type :" + changeMask);
                        }
@@ -552,6 +512,45 @@ public class DACommunicator {
                        });
                }
 
+               private void onDisconnectedInternal(IDevice device) {
+                       Logger.debug("device disconnected : " + device.getSerialNumber());
+                       DeviceInfo deviceInfo = getDeviceByName(device.getSerialNumber());
+                       DeviceInfo selectedDevice = Global.getCurrentDeviceInfo();
+                       if (null != devices && !devices.isEmpty()) {
+                               devices.remove(deviceInfo);
+                               if (!AnalyzerManager.isRunning()) {
+                                       updateToolbarDevice();
+                               }
+                               if (isRunning()) {
+                                       if (selectedDevice.getIDevice().getSerialNumber()
+                                                       .equals(deviceInfo.getIDevice().getSerialNumber())) {
+                                               Logger.debug("Disconnected while DA is running."); //$NON-NLS-1$
+                                               DACommunicator.setRunning(false);
+                                       }
+                               }
+                       }
+               }
+
+               private void onConnectedInternal(IDevice device) {
+                       Logger.debug("device connected : " + device.getSerialNumber());
+                       // addDevice(device);
+                       if (!AnalyzerManager.isRunning()) {
+                               DeviceInfo devInfo = new DeviceInfo(device);
+                               HostResult result = readVersion(devInfo);
+                               if (result.isSuccess()) {
+                                       devInfo.initCommunicator();
+                                       updateToolbarDevice();
+                               }
+                       }
+                       if (null != Global.getCurrentDeviceInfo() && null != Global.getCurrentApplication()) {
+                               Display.getDefault().syncExec(new Runnable() {
+                                       @Override
+                                       public void run() {
+                                               ToolbarArea.getInstance().setStartButtonEnablement(true);
+                                       }
+                               });
+                       }
+               }
        };
 
        public static void updateToolbarDevice() {
@@ -615,16 +614,37 @@ public class DACommunicator {
 
        public static void pullDaemonLog() {
                final String from = PathConstants.DA_DAEMON_LOG_PATH;
-               final String to = PathManager.DA_LOG_PATH + File.separator + DAEMONLOG_PREFIX
-                               + PathManager.getLogPostFix();//$NON-NLS-1$ 
-               SyncResult res = CommunicatorUtils.pull(from, to);
-               if (null != res && res.isOk()) {
-                       Logger.debug("daemon log copying success!!");//$NON-NLS-1$ 
-               } else {
-                       Logger.debug("Failed to get " + from); //$NON-NLS-1$ 
+               String command = AnalyzerShellCommands.CMD_GET_FILE_SIZE + CommonConstants.SPACE + from;
+
+               cmdResultMultiLines.clear();
+               CommunicatorUtils.execShellCommand(command, new MultiLineReceiver() {
+                       @Override
+                       public void processNewLines(String[] lines) {
+                               for (int i = 0; i < lines.length; i++) {
+                                       cmdResultMultiLines.add(lines[i]);
+                               }
+                       }
+               });
+
+               long filesize = -1;
+               if (cmdResultMultiLines.size() > 0) {
+                       filesize = Long.parseLong(cmdResultMultiLines.get(0));
                }
 
-               AnalyzerUtil.checkLogs(PathManager.DA_LOG_PATH, DAEMONLOG_PREFIX, DAEMONLOG_COUNT);
+               if (filesize > 0 && filesize < DALimit.MAX_DAEMON_LOG_SIZE) {
+                       final String to = PathManager.DA_LOG_PATH + File.separator + DAEMONLOG_PREFIX
+                                       + PathManager.getLogPostFix();//$NON-NLS-1$ 
+                       SyncResult res = CommunicatorUtils.pull(from, to);
+                       if (null != res && res.isOk()) {
+                               Logger.debug("daemon log copying success!!");//$NON-NLS-1$ 
+                       } else {
+                               Logger.debug("Failed to get " + from); //$NON-NLS-1$ 
+                       }
+
+                       AnalyzerUtil.checkLogs(PathManager.DA_LOG_PATH, DAEMONLOG_PREFIX, DAEMONLOG_COUNT);
+               } else {
+                       Logger.debug("daemon log file is too large or does not exist");
+               }
        }
 
        // public static String getLocalhost() {
index 5906aa2..00821bc 100644 (file)
@@ -31,6 +31,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.project.AppInfo;
 import org.tizen.dynamicanalyzer.project.PackageInfo;
@@ -134,15 +135,19 @@ public class ApplistManager {
                                pkgInfo.setPackageId(value);
                        } else if (key.equals(PackageInfo.VERSION)) {
                                pkgInfo.setVersion(value);
+                       } else if (key.equals(PackageInfo.PRELOAD)) {
+                               pkgInfo.setPreload(Integer.parseInt(value));
                        } else if (key.equals(PackageInfo.INSTALLTIME)) {
                                pkgInfo.setInstallTime(Long.parseLong(value));
                        }
                }
-
-               if (pkgInfo.getPackageId() != null) {
-                       return pkgInfo;
-               } else {
+               
+               if (pkgInfo.getPackageId() == null) {
                        return null;
+               } else if (!Global.isPlatformSDK() && pkgInfo.getPreload() != 0) {
+                       return null;
+               } else {
+                       return pkgInfo;
                }
        }
 
index 11519d7..26d49c1 100644 (file)
@@ -78,13 +78,17 @@ public class DBConstants {
         */
 
        // length of string type column
+       public static final int SHORT_TEXT_LEN = 64;
        public static final int TEXT_LEN = 256;
        public static final int BIG_TEXT_LEN = 1024;
+       public static final int LONG_TEXT_LEN = 4096;
        public static final int BIGBIG_TEXT_LEN = 16384;
 
+       public static final String SHORT_TEXT =  "VARCHAR(" + SHORT_TEXT_LEN + ")";//$NON-NLS-1$
        public static final String TEXT = "VARCHAR(" + TEXT_LEN + ")";//$NON-NLS-1$
        public static final String BIG_TEXT = "VARCHAR(" + BIG_TEXT_LEN + ")";//$NON-NLS-1$
        public static final String BIGBIG_TEXT = "VARCHAR(" + BIGBIG_TEXT_LEN + ")";//$NON-NLS-1$
+       public static final String LONG_TEXT = "VARCHAR(" + LONG_TEXT_LEN + ")";//$NON-NLS-1$
        public static final String TEXT_LIB_NAME = "VARCHAR(1024)";//$NON-NLS-1$
 
        // types type constant
index c2f095d..597d073 100644 (file)
@@ -250,21 +250,25 @@ public class OpenTraceHandler extends AbstractHandler {
                boolean isSuccess = true;
                List<List<Object>> profilingChilds = FunctionUsageProfiler.getInstance()
                                .getProfilingChildDataTable().getProfilingChildDataFromDB();
-               if (null == profilingChilds) {
+               if (null == profilingChilds || 0 == profilingChilds.size()) {
                        Logger.debug("failed - loadProfilingChildData");
                        isSuccess = false;
                } else {
-                       for (int i = 0; i < profilingChilds.size(); i++) {
+                       int size = profilingChilds.size();
+                       for (int i = 0; i < size; i++) {
                                List<Object> data = profilingChilds.get(i);
                                int parentID = (Integer) data.get(ProfilingChildDataDBTable.COLUMN.PROFILINGDATAID.index);
                                int pid = (Integer) data.get(ProfilingChildDataDBTable.COLUMN.PID.index);
-                               int childID = (Integer) data.get(ProfilingChildDataDBTable.COLUMN.CHILDDATAID.index);
 
+                               @SuppressWarnings("unchecked")
+                               List<Integer> childSeqList = 
+                                               (List<Integer>) data.get(ProfilingChildDataDBTable.COLUMN.CHILDSEQARRAY.index);
+       
                                ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
                                                .getProfileDataMakerByPid(pid);
                                ProfilingData parent = profiler.getProfilingDataMap().get(parentID);
                                ProfilingChildData child = parent.getChildData();
-                               child.getChildren().add(childID);
+                               child.getChildren().addAll(childSeqList);
                        }
                }
                return isSuccess;
index b9be2b1..b7f7d03 100644 (file)
@@ -52,8 +52,8 @@ public class LogCenterConstants {
        public static final int FD_API_TYPE_LOCK_START = 14;
        public static final int FD_API_TYPE_LOCK_END = 15;
        public static final int FD_API_TYPE_UNLOCK = 16;
-       public static final int FD_API_TYPE_LOCK_WAIT_START = 17;
-       public static final int FD_API_TYPE_LOCK_WAIT_END = 18;         
+       public static final int FD_API_TYPE_LOCK_AUTORELEASE = 17;
+       public static final int FD_API_TYPE_FAIL = 18;
 
        /* network api type */
        public static final int SOCKET_API_FD_OPEN = 0;
index 0bbaf13..8dc1fe0 100644 (file)
@@ -74,11 +74,16 @@ public class FilePageLabels extends NLS {
        public static String FILE_CHART_TOOLTIP_READ;
        public static String FILE_CHART_TOOLTIP_CONCURRENT_READ;
        public static String FILE_CHART_TOOLTIP_LOCK;
+       public static String FILE_CHART_TOOLTIP_UNLOCK;
+       public static String FILE_CHART_TOOLTIP_LOCK_AUTORELEASE;
        public static String FILE_CHART_TOOLTIP_LOCK_WAIT;
+       public static String FILE_CHART_TOOLTIP_FAIL;
+       
        
        public static String FILE_API_DB;
        public static String FILE_STATUS_DB;
        public static String FILE_ACCESS_DB;
+       public static String FILE_ACCESSOR_DB;
        
        public static String FILE_CHART_LOCK;
        
index 7981169..00b6894 100644 (file)
@@ -41,12 +41,16 @@ FILE_CHART_TOOLTIP_WRITE=WRITE
 FILE_CHART_TOOLTIP_CONCURRENT_WRITE=CONCURRENT WRITE
 FILE_CHART_TOOLTIP_READ=READ
 FILE_CHART_TOOLTIP_CONCURRENT_READ=CONCURRENT READ
-FILE_CHART_TOOLTIP_LOCK=LOCKED
+FILE_CHART_TOOLTIP_LOCK=LOCK
+FILE_CHART_TOOLTIP_UNLOCK=UNLOCK
 FILE_CHART_TOOLTIP_LOCK_WAIT=LOCK WAITING
+FILE_CHART_TOOLTIP_LOCK_AUTORELEASE=AUTO RELEASE
+FILE_CHART_TOOLTIP_FAIL=FAIL
 
 FILE_API_DB=FILE_API_DB
 FILE_STATUS_DB=FILE_STATUS_DB
 FILE_ACCESS_DB=FILE_ACCESS_DB
+FILE_ACCESSOR_DB=FILE_ACCESSOR_DB
        
 TIME_MS = ms
 
index 29201d5..4745350 100644 (file)
@@ -32,6 +32,7 @@ import org.eclipse.osgi.util.NLS;
 public class ThreadPageLabels extends NLS {
        private static final String BUNDLE_NAME = "org.tizen.dynamicanalyzer.nl.ThreadPageLabels"; //$NON-NLS-1$
        public static String THREAD_CHART_THREAD;
+       public static String THREAD_CHART_SYNC;
        public static String THREAD_CHART_TITLE;
        public static String THREAD_DETAILS_TITLE;
        public static String SYNC_CHART_TITLE;
index 39e285a..fbd56c4 100644 (file)
@@ -36,6 +36,8 @@ public class UserErrorWarningLabels extends NLS {
        public static String ERROR_LIB_NOT_FOUND_INRPM;
        public static String ERROR_NO_APPID_FOR_LAUNCHPAD;
        public static String ERROR_DEVICE_CONNECTION;
+       
+       public static String ERROR_BY_SECURITY_REASON;
 
        public static String WARNING_PATH_NOT_FOUND;
        public static String WARNING_FILE_NOT_FOUND;
index f608c90..3fe3a57 100644 (file)
@@ -4,6 +4,8 @@ ERROR_LIB_NOT_FOUND_INRPM=Library file cannot be found in rpm package.
 ERROR_NO_APPID_FOR_LAUNCHPAD=There is no appid for launch_app.
 ERROR_DEVICE_CONNECTION=Failed to connect with the device.\nPlease re-run Dynamic Analyzer and reboot the device.
 
+ERROR_BY_SECURITY_REASON=You cannot analyze this application for the security reason.
+
 WARNING_PATH_NOT_FOUND=Path cannot be found.
 WARNING_FILE_NOT_FOUND=File cannot be found.
 
index 4124449..86b1347 100644 (file)
@@ -104,10 +104,12 @@ public class AppInfo {
 
        private ElfSymbolExtractor symbolExtractor = new ElfSymbolExtractor();
 
+       // temporary information
+       private String execPath = null;
        private String execFileName = null;
+
        private List<String> localPackagePath = null;
        private Map<Integer, String> runningProcesses = null;
-       private String execPath = null;
 
        private static List<String> readlinkResult = new ArrayList<String>();
        private List<String> properties = new ArrayList<String>();
@@ -157,6 +159,10 @@ public class AppInfo {
 
        public void setInfo(int index, String data) {
                properties.set(index, data);
+               if (index == PROPERTY.EXEC.index) {
+                       execFileName = null;
+                       execPath = null;
+               }
        }
 
        public String getInfo(int index) {
@@ -327,7 +333,7 @@ public class AppInfo {
        public String getPackageId() {
                return properties.get(PROPERTY.PACKAGE.index);
        }
-       
+
        public String getLabel() {
                return properties.get(PROPERTY.LABEL.index);
        }
@@ -350,13 +356,10 @@ public class AppInfo {
                                                readlinkResult.add(appLines[i]);
                                        }
                                }
-                       }); // get actual file path using da readlink command (inside target
-                               // platform)
+                       }); // get actual file path using da readlink command (inside target platform)
 
-                       if (readlinkResult.isEmpty() || readlinkResult.size() > 1) { // fail
-                                                                                                                                                       // to
-                                                                                                                                                       // get
-                                                                                                                                                       // path
+                       if (readlinkResult.isEmpty() || readlinkResult.size() > 1) {
+                               // fail to get path
                                if (getAppType().contains(APPTYPE_CPP)) {
                                        exec = exec.replaceFirst(AnalyzerConstants.TIZEN_APP_PATH,
                                                        AnalyzerConstants.TIZEN_USR_APP_PATH);
index 94758aa..4c15f86 100644 (file)
@@ -32,11 +32,13 @@ 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 PRELOAD = "preload";
        public static final String INSTALLTIME = "installed_time";
 
        private String id = null;
        private String pkgType = null;
        private String version = null;
+       private int preload = 0;                // 1 for preload, otherwise 0
        private long installTime = 0;
 
        private List<AppInfo> appInfos = new ArrayList<AppInfo>();
@@ -98,6 +100,14 @@ public class PackageInfo {
        public void setVersion(String version) {
                this.version = version;
        }
+       
+       public int getPreload() {
+               return preload;
+       }
+       
+       public void setPreload(int preload) {
+               this.preload = preload;
+       }
 
        public long getInstallTime() {
                return installTime;
index a646dd6..cba3a3c 100644 (file)
@@ -85,7 +85,7 @@ public abstract class BaseCallstackManager {
        }
 
        protected ConcurrentHashMap<Integer, ConcurrentHashMap<Long, CallStackUnit>> callstackApiAddrByPidMap = new ConcurrentHashMap<Integer, ConcurrentHashMap<Long, CallStackUnit>>();
-       protected ConcurrentHashMap<Long, CallStackData> callstackDataBySeqMap = new ConcurrentHashMap<Long, CallStackData>();
+       protected ConcurrentSkipListMap<Long, CallStackData> callstackDataBySeqMap = new ConcurrentSkipListMap<Long, CallStackData>();
        protected String userFunctionBin = null;
        protected HashMap<Integer, List<CallStackItem>> userCallstackByTidMap = new HashMap<Integer, List<CallStackItem>>();
        protected HashMap<Integer, DuplicateUserCall> dupUserCallByTidMap = new HashMap<Integer, DuplicateUserCall>();
@@ -97,6 +97,9 @@ public abstract class BaseCallstackManager {
        abstract public void makeUserCallstackforRange(LogData log, ProfileDataMaker profiler);
 
        abstract public void makeCallstackWithoutBacktrace(LogData inputData);
+       abstract public long getSeqOfUserCallstackForTime(int tid, long time);  
+       abstract public List<Long> getCallstackAddrListFromSeq(long seq);
+       abstract public List<List<Long>> getArrayOfAddrListFromSeq(List<Long> seqs);
 
        public void offerCallStackUnit(CallStackUnit csu) {
                if (callstackInserter != null) {
@@ -114,13 +117,6 @@ public abstract class BaseCallstackManager {
                return;
        }
 
-       public List<Integer> getPidsOfCallstackApiAddrMap() {
-               ArrayList<Integer> pids = new ArrayList<Integer>();
-               pids.addAll(callstackApiAddrByPidMap.keySet());
-
-               return pids;
-       }
-
        public Map<Long, CallStackUnit> getCallStackApiAddrByPidMap(int pid) {
                if (null == callstackApiAddrByPidMap) {
                        callstackApiAddrByPidMap = new ConcurrentHashMap<Integer, ConcurrentHashMap<Long, CallStackUnit>>();
@@ -134,9 +130,9 @@ public abstract class BaseCallstackManager {
                return callstackApiByAddrMap;
        }
 
-       public Map<Long, CallStackData> getCallStackDataBySeqMap() {
+       public NavigableMap<Long, CallStackData> getCallStackDataBySeqMap() {
                if (null == callstackDataBySeqMap) {
-                       callstackDataBySeqMap = new ConcurrentHashMap<Long, CallStackData>();
+                       callstackDataBySeqMap = new ConcurrentSkipListMap<Long, CallStackData>();
                }
                return callstackDataBySeqMap;
        }
@@ -159,6 +155,13 @@ public abstract class BaseCallstackManager {
                }
                return seqByTimeMap;
        }
+       
+       public List<Integer> getTidsOfSeqTimeMap() {
+               ArrayList<Integer> tids = new ArrayList<Integer>();
+               tids.addAll(seqTimeByTidMap.keySet());
+
+               return tids;
+       }
 
        public String getUserFunctionPosition() {
                if (userFunctionBin == null || userFunctionBin.isEmpty()) {
index e920416..32d1b22 100644 (file)
@@ -34,9 +34,12 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.Global;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.project.BinaryInfo;
 import org.tizen.dynamicanalyzer.project.LibraryObject;
@@ -52,6 +55,8 @@ import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackInserter;
 import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackItem;
 import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
 import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionExitDBTable;
 import org.tizen.dynamicanalyzer.util.Logger;
 
 public class SWAPCallStackManager extends BaseCallstackManager {
@@ -302,8 +307,16 @@ public class SWAPCallStackManager extends BaseCallstackManager {
                        return;
                }
 
-               List<CallStackItem> probeCallstack = new ArrayList<CallStackItem>(getUserCallstack(tid));
-               int size = probeCallstack.size();
+               long userCallstackSeq = getSeqOfUserCallstackForTime(tid, time);
+               List<Long> addrs = null;
+               int size = 0;
+               
+               if (-1 != userCallstackSeq) { // seq for usercallstack is found
+                       addrs = getCallstackAddrListFromSeq(userCallstackSeq);
+                       if (null != addrs) { // callstack data for seq is found
+                               size = addrs.size();
+                       }
+               }
 
                CallStackData callstackData = new CallStackData(seq);
 
@@ -317,7 +330,10 @@ public class SWAPCallStackManager extends BaseCallstackManager {
                                offerCallStackUnit(callbackApi);
                                addrMap.put(LogCenterConstants.USER_FUNCTION_CALLBACK_FUNC_ADDR, callbackApi);
                        }
-                       probeCallstack.add(new CallStackItem(callbackApi));
+                       if (null == addrs) {
+                               addrs = new ArrayList<Long>();
+                       }
+                       addrs.add(0, LogCenterConstants.USER_FUNCTION_CALLBACK_FUNC_ADDR);
                } else {
                        CallStackUnit callerCallstackUnit = addrMap.get(callerAddr);
                        if (null == callerCallstackUnit) {
@@ -327,22 +343,105 @@ public class SWAPCallStackManager extends BaseCallstackManager {
                                addrMap.put(callerAddr, callerCallstackUnit);
                        }
 
-                       CallStackUnit topUserCallstack = probeCallstack.get(size - 1).getCallStackUnit();
+                       CallStackUnit topUserCallstack = addrMap.get(addrs.get(0));
                        if (callerCallstackUnit.getFunctionId() == topUserCallstack.getFunctionId()) {
-                               probeCallstack.set(size - 1, new CallStackItem(callerCallstackUnit));
+                               addrs.set(0, callerAddr);
                        } else {
                                Logger.debug("probe caller is not the same as top of user callstack"); //$NON-NLS-1$
                        }
                }
 
-               size = probeCallstack.size();
-               for (int i = size - 1; i >= 0; i--) {
-                       callstackData.getAddrs().add(probeCallstack.get(i).getCallStackUnit().getAddr());
+               size = addrs.size();
+               for (int i = 0; i < size; i++) {
+                       callstackData.getAddrs().add(addrs.get(i));
                }
                offerCallStackData(callstackData);
                getCallStackDataBySeqMap().put(seq, callstackData);
        }
 
+       // to make callstack for sample, probe
+       public long getSeqOfUserCallstackForTime(int tid, long time) {
+               long seq = -1;
+               String query;
+               long entrySeq = -1, exitSeq = -1;
+               ResultSet rs;
+               NavigableMap<Long, Long> seqByTimeMap = getSeqTimeByTidMap(tid);
+               Long callstackTime = seqByTimeMap.floorKey(time);
+               
+               if (null != callstackTime) { // found from memory
+                       seq = seqByTimeMap.get(callstackTime);
+               } else { // select from database
+                       try {
+                               query = String.format(FunctionEntryDBTable.USERCALLSTACK_QUERY, time);
+                               rs = SqlConnectionManager.executeQueryRS(query);
+                               if (rs.next()) {
+                                       entrySeq = rs.getLong(1);
+                               }
+                               SqlConnectionManager.releaseResultSet(rs);
+                               
+                               query = String.format(FunctionExitDBTable.USERCALLSTACK_QUERY, time);
+                               rs = SqlConnectionManager.executeQueryRS(query);
+                               if (rs.next()) {
+                                       exitSeq = rs.getLong(1);
+                               }
+                               SqlConnectionManager.releaseResultSet(rs);
+                               if (entrySeq < exitSeq) { // greater seq which time is less than sample/probe time
+                                       seq = exitSeq;
+                               } else {
+                                       seq = entrySeq;
+                               }                       
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       }
+               }
+               
+               return seq;
+       }
+       
+       public List<Long> getCallstackAddrListFromSeq(long seq) {
+               List<Long> addrs = null;
+               CallStackData csd = getCallStackDataBySeqMap().get(seq);
+               
+               if (null == csd) { // callstackdata is not in memory, find from DB
+                       List<List<Object>> callStackAddrs = CallStackInserter.getInstance()
+                                       .getCallStackDataTable().getCallStackAddrsFromDB(seq);
+                       
+                       if (null == callStackAddrs || 0 == callStackAddrs.size()
+                                       || null == callStackAddrs.get(0)) { // not found
+                               Logger.debug("CallStackData is not found for seq : " + seq);
+                               return null;
+                       }
+                       
+                       @SuppressWarnings("unchecked")
+                       List<Long> addressList = (List<Long>) callStackAddrs.get(0).get(0);
+
+                       addrs = new ArrayList<Long>();
+                       addrs.addAll(addressList);
+               } else { // callstackdata is in memory
+                       addrs = csd.getAddrs();
+               }               
+               return addrs;
+       }
+//TODO: 1. execute select query once 2. change return type - <seq, List<Long>>
+//TODO: 3. additional discussion with leak analysis implementer if needed 
+       public List<List<Long>> getArrayOfAddrListFromSeq(List<Long> seqs) {
+               List<List<Long>> addrsList = null;
+               if (null == seqs) {
+                       return null;
+               }
+               
+               addrsList = new ArrayList<List<Long>>();
+               int size = seqs.size();
+               for (int i = 0; i < size; i++) {
+                       List<Long> addrs = getCallstackAddrListFromSeq(seqs.get(i));
+                       if (null != addrs) {
+                               addrsList.add(addrs);
+                       }
+               }
+               
+               return addrsList;
+       }
+       
        public void clear() {
                callstackApiAddrByPidMap.clear();
                callstackDataBySeqMap.clear();
index d212bdb..5406bd9 100755 (executable)
@@ -60,4 +60,18 @@ public class FunctionInst implements Streamable {
 
        }
 
+       // FIXME: black list hard coded.
+       // function instrumentation black list
+       public static boolean isInBlacklist(String funcname) {
+               if (funcname.equals("_start")) {
+                       return true;
+               }
+
+               if (funcname.contains("get_pc_thunk")) {
+                       return true;
+               }
+
+               return false;
+       }
+
 }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/AckMessage.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/AckMessage.java
new file mode 100644 (file)
index 0000000..50744cf
--- /dev/null
@@ -0,0 +1,71 @@
+package org.tizen.dynamicanalyzer.swap.communicator;
+
+import static org.tizen.dynamicanalyzer.constant.CommonConstants.INT_SIZE;
+
+import java.util.Arrays;
+
+import org.tizen.dynamicanalyzer.util.ByteUtil;
+
+public class AckMessage {
+       private int msgID = -1;
+       private int payloadLength = -1;
+       private int returnCode = -1;
+       private byte[] payload = null; // this payload include returnCode
+
+       public static AckMessage NOACK = new AckMessage(SwapErrorCode.SUCCESS);
+
+       public AckMessage() {
+
+       }
+
+       private AckMessage(SwapErrorCode errorcode) {
+               this.msgID = 0;
+               this.returnCode = errorcode.getErrorNumber();
+       }
+
+       public int getMsgID() {
+               return msgID;
+       }
+
+       public int getPayloadLength() {
+               return payloadLength;
+       }
+
+       public int getReturnCode() {
+               return returnCode;
+       }
+
+       public byte[] getPayload() {
+               return payload;
+       }
+
+       public boolean isSuccess() {
+               if (returnCode == SwapErrorCode.SUCCESS.getErrorNumber()) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       public boolean isCorrectID(int msgid) {
+               if (this.msgID == msgid) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       public void parseAck(byte[] message) {
+               int index = 0;
+               this.msgID = ByteUtil.toInt(message, index);
+               index += INT_SIZE;
+               this.payloadLength = ByteUtil.toInt(message, index);
+               index += INT_SIZE;
+               if (message.length > index) {
+                       this.payload = Arrays.copyOfRange(message, index, message.length);
+
+                       // the first value of payload is usually return code
+                       this.returnCode = ByteUtil.toInt(this.payload, 0);
+               }
+       }
+}
index 7d80f24..04c88dd 100755 (executable)
@@ -33,6 +33,7 @@ import static org.tizen.dynamicanalyzer.common.AnalyzerConstants.MSG_KEEP_ALIVE_
 import static org.tizen.dynamicanalyzer.common.AnalyzerConstants.MSG_START_ACK;
 import static org.tizen.dynamicanalyzer.common.AnalyzerConstants.MSG_STOP_ACK;
 import static org.tizen.dynamicanalyzer.common.AnalyzerConstants.MSG_TARGET_INFO_ACK;
+import static org.tizen.dynamicanalyzer.common.AnalyzerConstants.MSG_GET_PROCESS_ADD_INFO_ACK;
 import static org.tizen.dynamicanalyzer.constant.CommonConstants.INT_SIZE;
 import static org.tizen.dynamicanalyzer.constant.CommonConstants.LONG_SIZE;
 
@@ -62,7 +63,6 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.AnalyzerShellCommands;
 import org.tizen.dynamicanalyzer.common.ElfSymbolExtractor;
-import org.tizen.dynamicanalyzer.common.ErrorCode;
 import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.common.HostResult;
 import org.tizen.dynamicanalyzer.common.path.PathManager;
@@ -74,6 +74,7 @@ import org.tizen.dynamicanalyzer.handlers.ReplayTraceHandler;
 import org.tizen.dynamicanalyzer.model.AddrSymbolPair;
 import org.tizen.dynamicanalyzer.model.DeviceInfo;
 import org.tizen.dynamicanalyzer.nl.ConfigureLabels;
+import org.tizen.dynamicanalyzer.nl.UserErrorWarningLabels;
 import org.tizen.dynamicanalyzer.project.AppInfo;
 import org.tizen.dynamicanalyzer.project.BinaryInfo;
 import org.tizen.dynamicanalyzer.project.DeviceStatusInfo;
@@ -196,7 +197,8 @@ public class Communicator30 extends BaseCommunicator {
                UserSpaceInst userSpaceInst = getUserSpaceInst();
                Logger.performance("TEST", "Start Trace", "Set application inst");
 
-               if (userSpaceInst == null) {
+               if (userSpaceInst == null || userSpaceInst.getAppInstList().isEmpty()) {
+                       StartProcessManager.getInstance().setValue(100); // set progress bar to 100%
                        Logger.error("cannot get user space inst");
                        return HostResult.ERR_MSG_START_FAIL;
                }
@@ -230,11 +232,8 @@ public class Communicator30 extends BaseCommunicator {
                        }
                }
 
-               // data receive thread create and start
-               Thread dataThread = new Thread(null, new DataChannelThread(),
-                               AnalyzerConstants.COMMUNICATOR_RECEIVE_THREAD);
                // start message send
-               HostResult result = handleControlMessage(curDev, ret);
+               AckMessage result = handleControlMessage(curDev, ret);
                Logger.performance("TEST", "Start Trace", "Make and Send start message");
 
                // FIX
@@ -243,58 +242,41 @@ public class Communicator30 extends BaseCommunicator {
                        StartProcessManager.getInstance().setValue(100);
                }
 
-               if (result.isSuccess()) {
-                       if (!isCorrectAck(MSG_START_ACK, result)) {
-                               HostResult failResult = HostResult.ERR_MSG_START_FAIL;
-                               failResult.setMessage(ErrorCode.getError(getReturnId(result.getRet())).toString());
-                               DACommunicator.setRunning(false);
-                               dataThread = null;
-                               return failResult;
-                       } else { // right ack for start
-                               byte[] data = result.getRet();
-                               int index = 0;
-                               index += INT_SIZE; // message id
-                               index += INT_SIZE; // payload length
-                               index += INT_SIZE; // return id
-                               int sec = ByteUtil.toInt(data, index);
-                               index += INT_SIZE;
-                               int nano = ByteUtil.toInt(data, index);
-
-                               Global.getProject().setProfilingStartTime(new DATime(sec, nano));
-                       }
+               if (result != null && result.isCorrectID(MSG_START_ACK) && result.isSuccess()) {
+                       byte[] payload = result.getPayload();
+                       int index = INT_SIZE; // return code
+                       int sec = ByteUtil.toInt(payload, index);
+                       index += INT_SIZE;
+                       int nano = ByteUtil.toInt(payload, index);
+                       index += INT_SIZE;
+
+                       Global.getProject().setProfilingStartTime(new DATime(sec, nano));
+
+                       // data receive thread create and start
+                       Thread dataThread = new Thread(null, new DataChannelThread(),
+                                       AnalyzerConstants.COMMUNICATOR_RECEIVE_THREAD);
+                       dataThread.start();
+                       Logger.performance("TEST", "Start Trace", "Start data receiving thread");
+
+                       ToolbarArea.getInstance().startTimer();
+                       Logger.performance("TEST", "Start Trace", "Start Timer");
+                       SWAPLogParser.startLogParser();
+                       Logger.performance("TEST", "Start Trace", "Start SWAP log parser thread");
+
+                       // start registered data manager thread
+                       DataManagerRegistry.startThreads();
+                       Logger.performance("TEST", "Start Trace", "Start DataManager threads");
+
+                       /* Timeline */
+                       UpdateViewTimer.start();
+                       Logger.performance("TEST", "Start Trace", "Start Update view timer");
+
+                       Logger.debug("Start recorder, timer, log parser, file, thread, ui, profile , update timer");
+                       return HostResult.SUCCESS;
                } else {
                        DACommunicator.setRunning(false);
-                       dataThread = null;
-                       return result;
+                       return HostResult.ERR_MSG_START_FAIL;
                }
-
-               dataThread.start();
-               Logger.performance("TEST", "Start Trace", "Start data receiving thread");
-
-               // success start trace!!
-               byte[] payload = getMessagePayload(result.getRet());
-               DATime profilingStartTime = new DATime();
-               int index = 0;
-               int sec = ByteUtil.toInt(payload, index);
-               index += INT_SIZE;
-               int nano = ByteUtil.toInt(payload, index);
-               index += INT_SIZE;
-               profilingStartTime.setSec(sec);
-               profilingStartTime.setNano(nano);
-
-               ToolbarArea.getInstance().startTimer();
-               Logger.performance("TEST", "Start Trace", "Start Timer");
-               SWAPLogParser.startLogParser();
-               Logger.performance("TEST", "Start Trace", "Start SWAP log parser thread");
-               // start registered data manager thread
-               DataManagerRegistry.startThreads();
-               Logger.performance("TEST", "Start Trace", "Start DataManager threads");
-
-               /* Timeline */
-               UpdateViewTimer.start();
-               Logger.performance("TEST", "Start Trace", "Start Update view timer");
-               Logger.debug("Start recorder, timer, log parser, file, thread, ui, profile , update timer");
-               return result;
        }
 
        private UserSpaceInst getUserSpaceInst() {
@@ -401,8 +383,8 @@ public class Communicator30 extends BaseCommunicator {
                for (int i = 0; i < size; i++) {
                        AddrSymbolPair addrSymbol = symbols.get(i);
                        String symbol = addrSymbol.getSymbol();
-                       // FIXME: black list hard coded.
-                       if (symbol.contains("__i686.get_pc_thunk")) {
+
+                       if (FunctionInst.isInBlacklist(symbol)) {
                                continue;
                        }
 
@@ -461,19 +443,21 @@ public class Communicator30 extends BaseCommunicator {
                int length = preMsg.length;
                byte[] msg = ByteUtil.getByte(msgBinInfo, length, preMsg);
 
-               HostResult result = handleControlMessage(curDevice, msg);
-
-               if (!result.isSuccess() || !isCorrectAck(MSG_BINARY_INFO_ACK, result)) {
-                       return HostResult.ERR_BIN_INFO_GET_FAIL;
-               }
+               AckMessage result = handleControlMessage(curDevice, msg);
 
-               // parse binary info
-               byte[] payload = getMessagePayload(result.getRet());
-               List<BinaryInfo> bininfos = new ArrayList<BinaryInfo>();
+               if (result != null && result.isCorrectID(MSG_BINARY_INFO_ACK)) {
+                       if (result.isSuccess()
+                                       || (result.getReturnCode() == SwapErrorCode.ERR_WRONG_MESSAGE_DATA
+                                                       .getErrorNumber() && result.getPayloadLength() > INT_SIZE)) {
 
-               parseBinaryInfo(payload, paths, bininfos);
+                               // parse binary info
+                               List<BinaryInfo> bininfos = new ArrayList<BinaryInfo>();
+                               parseBinaryInfo(result.getPayload(), paths, bininfos);
+                               return HostResult.SUCCESS;
+                       }
+               }
 
-               return result;
+               return HostResult.ERR_BIN_INFO_GET_FAIL;
        }
 
        private String getFileName(String fullPath) {
@@ -485,15 +469,20 @@ public class Communicator30 extends BaseCommunicator {
        }
 
        private HostResult pullTheFile(String from, String to) {
+               boolean becomeSuper = false;
 
                try {
-                       Global.getCurrentDeviceInfo().getIDevice().becomeSuperUser(true);
+                       becomeSuper = Global.getCurrentDeviceInfo().getIDevice().becomeSuperUser(true);
                } catch (TimeoutException e) {
                        e.printStackTrace();
                } catch (SdbCommandRejectedException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
+               } finally {
+                       if (!becomeSuper) {
+                               return HostResult.ERR_BY_SECURITY_REASON;
+                       }
                }
 
                SyncResult res = CommunicatorUtils.pull(from, to);
@@ -526,7 +515,8 @@ public class Communicator30 extends BaseCommunicator {
                                .getSelectedFeatureValue(ConfigureLabels.FEATURE_DETAIL_VALUE_FUNCTION_PROFILING_SAMPLING_RATE);
                if (samplingPeriod < 0) {
                        samplingPeriod = target.getAvailableFeature(
-                                       ConfigureLabels.FEATURE_DETAIL_VALUE_FUNCTION_PROFILING_SAMPLING_RATE).getDefaultValue();
+                                       ConfigureLabels.FEATURE_DETAIL_VALUE_FUNCTION_PROFILING_SAMPLING_RATE)
+                                       .getDefaultValue();
                }
                rt.setSystemTracePeriod(systemPeriod);
                rt.setSamplingPeriod(samplingPeriod);
@@ -535,34 +525,31 @@ public class Communicator30 extends BaseCommunicator {
                int length = rtByte.length;
                byte[] msg = ByteUtil.getByte(config, length, rtByte);
 
-               // ByteUtils.printByteArrayForStart(msg);
+               AckMessage result = handleControlMessage(devInfo, msg);
 
-               HostResult result = handleControlMessage(devInfo, msg);
+               if (result != null && result.isCorrectID(MSG_CONFIG_ACK) && result.isSuccess()) {
+                       if (AnalyzerManager.isRunning()) {
+                               rt.setApplyTime(ToolbarArea.getInstance().getTime());
+                               Global.getProject().addConfigHistory(rt);
+                       } else {
+                               rt.setApplyTime(0); // set time of configuration to zero
+                       }
 
-               if (result.isSuccess()) {
-                       if (isCorrectAck(MSG_CONFIG_ACK, result)) {
-                               if (AnalyzerManager.isRunning()) {
-                                       rt.setApplyTime(ToolbarArea.getInstance().getTime());
-                                       Global.getProject().addConfigHistory(rt);
-                               } else {
-                                       rt.setApplyTime(0); // set time of configuration to zero
+                       Global.setCurrentConfiguration(rt);
+                       return HostResult.SUCCESS;
+               } else {
+                       Display.getDefault().asyncExec(new Runnable() {
+                               @Override
+                               public void run() {
+                                       final Shell shell = WorkbenchUtil.getWorkbenchWindow().getShell();
+                                       DADialog dialog = new DADialog(shell, SWT.NONE, 550, 153);
+                                       dialog.setIcon(ImageResources.DIALOG_WARNING_ICON);
+                                       dialog.setMessage("Configuration failed..");
+                                       dialog.open();
                                }
-
-                               Global.setCurrentConfiguration(rt);
-                               return result;
-                       }
+                       });
+                       return HostResult.ERR_MSG_RUNTIME_FAIL;
                }
-               Display.getDefault().asyncExec(new Runnable() {
-                       @Override
-                       public void run() {
-                               final Shell shell = WorkbenchUtil.getWorkbenchWindow().getShell();
-                               DADialog dialog = new DADialog(shell, SWT.NONE, 550, 153);
-                               dialog.setIcon(ImageResources.DIALOG_WARNING_ICON);
-                               dialog.setMessage("Configuration failed..");
-                               dialog.open();
-                       }
-               });
-               return HostResult.ERR_MSG_RUNTIME_FAIL;
        }
 
        @Override
@@ -571,14 +558,13 @@ public class Communicator30 extends BaseCommunicator {
                        byte[] stop = ByteUtil.toBytes(AnalyzerConstants.MSG_STOP_SWAP);
                        int length = 0;
                        byte[] stopMsg = ByteUtil.getByte(stop, length);
-                       HostResult result = handleControlMessage(stopMsg);
+                       AckMessage result = handleControlMessage(stopMsg);
 
-                       if (result.isSuccess()) {
-                               if (isCorrectAck(MSG_STOP_ACK, result)) {
-                                       return result;
-                               }
+                       if (result != null && result.isCorrectID(MSG_STOP_ACK) && result.isSuccess()) {
+                               return HostResult.SUCCESS;
                        }
                }
+
                return HostResult.ERR_MSG_STOP_FAIL;
        }
 
@@ -603,21 +589,21 @@ public class Communicator30 extends BaseCommunicator {
                }
        }
 
-       public HostResult handleControlMessage(byte[] message) {
+       public AckMessage handleControlMessage(byte[] message) {
                DeviceInfo curDev = Global.getCurrentDeviceInfo();
                if (curDev != null) {
                        return handleControlMessage(curDev, message);
                } else {
-                       return HostResult.ERR_DEVICE_IS_NULL;
+                       return null;
                }
        }
 
-       public HostResult handleControlMessage(DeviceInfo device, byte[] message) {
+       public AckMessage handleControlMessage(DeviceInfo device, byte[] message) {
                if (device != null) {
                        return handleControlMessage(device, message, true,
                                        AnalyzerConstants.CONTROL_SOCKET_TIMEOUT);
                } else {
-                       return HostResult.ERR_DEVICE_IS_NULL;
+                       return null;
                }
        }
 
@@ -634,9 +620,9 @@ public class Communicator30 extends BaseCommunicator {
         *            when wait for ack message, time limit of waiting by millisec
         * @return HostResult
         */
-       public HostResult handleControlMessage(DeviceInfo device, byte[] message, boolean waitack,
+       public AckMessage handleControlMessage(DeviceInfo device, byte[] message, boolean waitack,
                        int timeout) {
-               HostResult result = null;
+               AckMessage retack = null;
                Socket controlSock = device.getControlSock();
 
                try {
@@ -652,7 +638,7 @@ public class Communicator30 extends BaseCommunicator {
                                synchronized (controlSock) {
                                        controlSock.getOutputStream().write(message);
                                        if (!waitack) {
-                                               return HostResult.SUCCESS;
+                                               return AckMessage.NOACK;
                                        }
 
                                        Logger.debug("wait for ack of message [" + ByteUtil.toInt(message) + "]");
@@ -697,39 +683,30 @@ public class Communicator30 extends BaseCommunicator {
                                if (readsize > 0) {
                                        byte[] buf = new byte[readsize];
                                        System.arraycopy(cbuf, 0, buf, 0, readsize);
-                                       result = HostResult.SUCCESS;
                                        int ackId = ByteUtil.toInt(buf);
 
                                        // for debug
-                                       System.out.print("ack id : ");
-                                       AnalyzerUtil.printHexdecimal(ackId);
-                                       Logger.debug();
+                                       Logger.debug("ack id : " + AnalyzerUtil.toHexdecimal(ackId));
 
-                                       result.setRet(buf);
+                                       retack = new AckMessage();
+                                       retack.parseAck(buf);
                                } else {
-                                       result = HostResult.ERR_RECEIVE_ACK_FAIL;
-                                       result.setMessage(result.getMessage());
+                                       Logger.warning("Read size for ack message is zero");
                                }
                        } else {
-                               result = HostResult.ERR_CONTROL_SOCKET_CONNECTION_CLOSED;
-                               result.setMessage("Control socket connection is closed");
+                               Logger.warning("Control socket connection is closed");
                        }
                } catch (SocketException e) {
-                       result = HostResult.ERR_EXCEPTION_OCCURRED;
-                       result.setMessage(e.getMessage());
                        e.printStackTrace();
                } catch (SocketTimeoutException e) {
-                       result = HostResult.ERR_EXCEPTION_OCCURRED;
-                       result.setMessage(e.getMessage());
                        e.printStackTrace();
                } catch (IOException e) {
-                       result = HostResult.ERR_EXCEPTION_OCCURRED;
-                       result.setMessage(e.getMessage());
                        e.printStackTrace();
                } finally {
                        blocked = false;
                }
-               return result;
+
+               return retack;
        }
 
        private HostResult createControlSocket(DeviceInfo device) {
@@ -795,52 +772,28 @@ public class Communicator30 extends BaseCommunicator {
 
        public HostResult getTargetInfo(DeviceInfo device) {
                Logger.debug("Send target info...");
-               HostResult result = handleControlMessage(device,
+               AckMessage result = handleControlMessage(device,
                                ByteUtil.getByte(AnalyzerConstants.MSG_TARGET_INFO, 0));
-               if (result.isSuccess()) {
-                       // FIXME : log parsing
-                       byte[] data = result.getRet();
-                       int index = INT_SIZE * 3;
-
-                       if (isCorrectAck(MSG_TARGET_INFO_ACK, result)) {
-                               processTargetInfo(data, index, device.getDeviceStatusInfo());
-                               return result;
+               if (result != null && result.isCorrectID(MSG_TARGET_INFO_ACK)) {
+                       if (result.isSuccess()) {
+                               processTargetInfo(result.getPayload(), INT_SIZE, device.getDeviceStatusInfo());
+                               return HostResult.SUCCESS;
                        }
                }
+
                return HostResult.ERR_TARGET_INFO_GET_FAIL;
        }
 
        @Override
        public HostResult sendKeepAliveMessage(DeviceInfo device) {
                Logger.debug("Send keep alive message...");
-               HostResult result = handleControlMessage(device,
+               AckMessage result = handleControlMessage(device,
                                ByteUtil.getByte(AnalyzerConstants.MSG_KEEP_ALIVE, 0));
-               if (result.isSuccess()) {
-                       Logger.debug("keep alive message ack :" + result.getMessage());
-
-                       if (isCorrectAck(MSG_KEEP_ALIVE_ACK, result)) {
-                               return result;
-                       }
-               }
-               return HostResult.ERR_KEEP_ALIVE;
-       }
-
-       private boolean isCorrectAck(int ackType, HostResult result) {
-               byte[] data = result.getRet();
-               int index = 0;
-               int msgId = ByteUtil.toInt(data, index);
-               index += INT_SIZE;
-               int paylen = ByteUtil.toInt(data, index);
-               index += INT_SIZE;
-               int retId = ByteUtil.toInt(data, index);
-               index += INT_SIZE;
-
-               if (ackType == msgId) {
-                       if (paylen != INT_SIZE || retId == ErrorCode.SUCCESS.getErrorNumber()) {
-                               return true;
-                       }
+               if (result != null && result.isCorrectID(MSG_KEEP_ALIVE_ACK) && result.isSuccess()) {
+                       return HostResult.SUCCESS;
+               } else {
+                       return HostResult.ERR_KEEP_ALIVE;
                }
-               return false;
        }
 
        @Override
@@ -908,21 +861,6 @@ public class Communicator30 extends BaseCommunicator {
                Global.getCurrentDeviceInfo().releaseDataSock();
        }
 
-       private int getReturnId(byte[] data) {
-               int index = INT_SIZE * 2;
-               return ByteUtil.toInt(data, index);
-       }
-
-       private byte[] getMessagePayload(byte[] data) {
-               int index = INT_SIZE;
-               int size = ByteUtil.toInt(data, index);
-               index += INT_SIZE * 2;
-               size -= INT_SIZE;
-               byte[] payload = new byte[size];
-               System.arraycopy(data, index, payload, 0, size);
-               return payload;
-       }
-
        private byte[] getFunctionArgs(String symbol) {
                int start = symbol.indexOf(CommonConstants.OPEN_BRACKET);
                int end = symbol.indexOf(CommonConstants.CLOSE_BRACKET);
@@ -988,7 +926,12 @@ public class Communicator30 extends BaseCommunicator {
        public HostResult sendScreenShotRequest() {
                byte[] msg = ByteUtil.getByte(AnalyzerConstants.MSG_GET_SCREENSHOT, 0);
 
-               return handleControlMessage(Global.getCurrentDeviceInfo(), msg, false, 0);
+               AckMessage result = handleControlMessage(Global.getCurrentDeviceInfo(), msg, false, 0);
+               if (result != null && result.isSuccess()) {
+                       return HostResult.SUCCESS;
+               } else {
+                       return HostResult.ERR_MSG_SEND_FAIL;
+               }
        }
 
        public HostResult sendSWAPMessage(int messageId, List<BinarySettingData> settings) {
@@ -1025,22 +968,15 @@ public class Communicator30 extends BaseCommunicator {
                                FunctionInst functionInst = new FunctionInst();
                                AddrSymbolPair addrSymbol = symbols.get(i);
                                String symbol = addrSymbol.getSymbol();
-                               // FIXME: black list hard coded.
-                               if (symbol.contains("__i686.get_pc_thunk")) {
+
+                               if (FunctionInst.isInBlacklist(symbol)) {
                                        exSize++;
                                        continue;
                                }
+
                                functionInst.setAddr(addrSymbol.getAddr());
                                functionInst.setArgs(getFunctionArgs(addrSymbol.getSymbol()));
                                functionInstList.add(functionInst);
-
-                               // for debug
-                               // System.out.print("LIB : addr ");
-                               // AnalyzerUtil.printHexdecimal(addrSymbol.getAddr());
-                               // System.out.print("   symbol " + addrSymbol.getSymbol()
-                               // + "   args ");
-                               // ByteUtils.printByteArray(functionInst.getArgs());
-                               // System.out.println();
                        }
                        size = size - exSize;
                        libInst = ByteUtil.getByte(libInst, binaryPath, size);
@@ -1054,17 +990,18 @@ public class Communicator30 extends BaseCommunicator {
                msg = ByteUtil.getByte(msg, length, libInst);
 
                // ByteUtils.printByteArrayForStart(msg);
-               HostResult result = handleControlMessage(curDev, msg);
+               AckMessage result = handleControlMessage(curDev, msg);
 
                int ackMsg = AnalyzerConstants.MSG_SWAP_INST_ADD_ACK;
                if (messageId == AnalyzerConstants.MSG_SWAP_INST_REMOVE) {
                        ackMsg = AnalyzerConstants.MSG_SWAP_INST_REMOVE_ACK;
                }
-               if (!result.isSuccess() || !isCorrectAck(ackMsg, result)) {
+
+               if (result != null && result.isCorrectID(ackMsg) && result.isSuccess()) {
+                       return HostResult.SUCCESS;
+               } else {
                        return HostResult.ERR_BIN_INFO_GET_FAIL;
                }
-
-               return HostResult.SUCCESS;
        }
 
        public Map<Integer, String> sendProcessAddInfoMessage(List<Integer> pids) {
@@ -1088,28 +1025,29 @@ public class Communicator30 extends BaseCommunicator {
                        int length = sendbin.length;
                        byte[] msg = ByteUtil.getByte(AnalyzerConstants.MSG_GET_PROCESS_ADD_INFO, length,
                                        sendbin);
-                       HostResult result = handleControlMessage(curDev, msg, true,
+                       AckMessage result = handleControlMessage(curDev, msg, true,
                                        AnalyzerConstants.PROC_ADD_INFO_TIMEOUT);
 
-                       if (result.isSuccess()
-                                       && isCorrectAck(AnalyzerConstants.MSG_GET_PROCESS_ADD_INFO_ACK, result)) {
-                               // parse binary info
-                               byte[] payload = getMessagePayload(result.getRet());
-                               int index = 0;
+                       if (result != null && result.isCorrectID(MSG_GET_PROCESS_ADD_INFO_ACK)) {
+                               if (result.isSuccess() || result.getPayloadLength() > INT_SIZE) {
+                                       // parse binary info
+                                       byte[] payload = result.getPayload();
+                                       int index = INT_SIZE;
 
-                               int count = ByteUtil.toInt(payload, index);
-                               index += INT_SIZE;
+                                       int count = ByteUtil.toInt(payload, index);
+                                       index += INT_SIZE;
 
-                               if (count > 0) {
-                                       infoMap = new HashMap<Integer, String>();
+                                       if (count > 0) {
+                                               infoMap = new HashMap<Integer, String>();
 
-                                       for (int i = 0; i < count; i++) {
-                                               int pid = ByteUtil.toInt(payload, index);
-                                               index += INT_SIZE;
-                                               String cmdname = ByteUtil.getString(payload, index);
-                                               index += ByteUtil.getStringLength(payload, index);
+                                               for (int i = 0; i < count; i++) {
+                                                       int pid = ByteUtil.toInt(payload, index);
+                                                       index += INT_SIZE;
+                                                       String cmdname = ByteUtil.getString(payload, index);
+                                                       index += ByteUtil.getStringLength(payload, index);
 
-                                               infoMap.put(Integer.valueOf(pid), cmdname);
+                                                       infoMap.put(Integer.valueOf(pid), cmdname);
+                                               }
                                        }
                                }
                        }
@@ -1137,25 +1075,27 @@ public class Communicator30 extends BaseCommunicator {
                int length = sendBin.length;
                byte[] msg = ByteUtil.getByte(AnalyzerConstants.MSG_BINARY_INFO, length, sendBin);
 
-               HostResult result = handleControlMessage(msg);
-
-               if (!result.isSuccess() || !isCorrectAck(MSG_BINARY_INFO_ACK, result)) {
-                       return HostResult.ERR_BIN_INFO_GET_FAIL;
-               }
+               AckMessage result = handleControlMessage(msg);
 
-               // parse binary info
-               byte[] payload = getMessagePayload(result.getRet());
-               List<BinaryInfo> bininfos = new ArrayList<BinaryInfo>();
+               if (result != null && result.isCorrectID(MSG_BINARY_INFO_ACK)) {
+                       if (result.isSuccess()
+                                       || (result.getReturnCode() == SwapErrorCode.ERR_WRONG_MESSAGE_DATA
+                                                       .getErrorNumber() && result.getPayloadLength() > INT_SIZE)) {
 
-               parseBinaryInfo(payload, binPaths, bininfos);
+                               // parse binary info
+                               List<BinaryInfo> bininfos = new ArrayList<BinaryInfo>();
+                               parseBinaryInfo(result.getPayload(), binPaths, bininfos);
+                               return HostResult.SUCCESS;
+                       }
+               }
 
-               return result;
+               return HostResult.ERR_BIN_INFO_GET_FAIL;
        }
 
        private void parseBinaryInfo(byte[] payload, List<String> targetPaths,
                        List<BinaryInfo> outBinaries) {
                HostResult result;
-               int index = 0;
+               int index = INT_SIZE;
 
                DeviceInfo curDevice = Global.getCurrentDeviceInfo();
 
@@ -1193,6 +1133,20 @@ public class Communicator30 extends BaseCommunicator {
                                result = pullTheFile(targetPath, localBinaryPath);
                                if (result.isSuccess()) {
                                        binInfo.setTempBinaryPath(localBinaryPath);
+                               } else if (result.equals(HostResult.ERR_BY_SECURITY_REASON)) {
+                                       // popup by security reason
+                                       Display.getDefault().syncExec(new Runnable() {
+                                               @Override
+                                               public void run() {
+                                                       final Shell shell = WorkbenchUtil.getWorkbenchWindow().getShell();
+                                                       DADialog dialog = new DADialog(shell, SWT.NONE, 480, 153);
+                                                       dialog.setIcon(ImageResources.DIALOG_ERROR_ICON);
+                                                       dialog.setMessage(UserErrorWarningLabels.ERROR_BY_SECURITY_REASON);
+                                                       dialog.open();
+                                               }
+                                       });
+
+                                       return;
                                }
                        } else {
                                // if local binary exist already, then check for md5sum
@@ -1232,6 +1186,20 @@ public class Communicator30 extends BaseCommunicator {
                                        result = pullTheFile(targetPath, localBinaryPath);
                                        if (result.isSuccess()) {
                                                binInfo.setTempBinaryPath(localBinaryPath);
+                                       } else if (result.equals(HostResult.ERR_BY_SECURITY_REASON)) {
+                                               // popup by security reason
+                                               Display.getDefault().syncExec(new Runnable() {
+                                                       @Override
+                                                       public void run() {
+                                                               final Shell shell = WorkbenchUtil.getWorkbenchWindow().getShell();
+                                                               DADialog dialog = new DADialog(shell, SWT.NONE, 480, 153);
+                                                               dialog.setIcon(ImageResources.DIALOG_ERROR_ICON);
+                                                               dialog.setMessage(UserErrorWarningLabels.ERROR_BY_SECURITY_REASON);
+                                                               dialog.open();
+                                                       }
+                                               });
+
+                                               return;
                                        }
                                } else {
                                        binInfo.setTempBinaryPath(localBinaryPath);
@@ -1248,7 +1216,8 @@ public class Communicator30 extends BaseCommunicator {
                } else if (CommonUtil.isMac()) {
                        cmd = AnalyzerShellCommands.CMD_MAC_MD_5_SUM;
                } else if (CommonUtil.isWin()) {
-                       cmd = PathManager.DA_TOOL_FOLDER_PATH + File.separator + AnalyzerShellCommands.CMD_WIN_MD_5_SUM;
+                       cmd = PathManager.DA_TOOL_FOLDER_PATH + File.separator
+                                       + AnalyzerShellCommands.CMD_WIN_MD_5_SUM;
                } else { // should never be here
                        Logger.error("Unknown host OS!\n");
                }
@@ -24,9 +24,9 @@
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.common;
+package org.tizen.dynamicanalyzer.swap.communicator;
 
-public enum ErrorCode {
+public enum SwapErrorCode {
        SUCCESS(0, "Success"),
 
        ERR_LOCKFILE_CREATE_FAILED(-101, "Lock file create failed"),
@@ -35,11 +35,9 @@ public enum ErrorCode {
 
        ERR_INITIALIZE_SYSTEM_INFO_FAILED(-103, "Initialize system info failed"),
 
-       ERR_HOST_SERVER_SOCKET_CREATE_FAILED(-104,
-                       "host server socket create failed"),
+       ERR_HOST_SERVER_SOCKET_CREATE_FAILED(-104, "host server socket create failed"),
 
-       ERR_TARGET_SERVER_SOCKET_CREATE_FAILED(-105,
-                       "target server socket create failed"),
+       ERR_TARGET_SERVER_SOCKET_CREATE_FAILED(-105, "target server socket create failed"),
 
        ERR_WRONG_MESSAGE_FORMAT(-201, "Wrong message format"),
 
@@ -49,16 +47,18 @@ public enum ErrorCode {
 
        ERR_CANNOT_START_PROFILING(-204, "cannot start profiling"),
 
+       ERR_SER_SOCK_CREATE(-900, "Server socket creation failed"),
+
+       ERR_SER_SOCK_BIND(-901, "Server socket bind failed"),
+
+       ERR_SER_SOCK_LISTEN(-902, "Server socket listen failed"),
+
        ERR_NOT_DEFINED(-999, "Unknown error");
 
        private final String message;
        private final int errNo;
 
-       public static final int ERROR_MSG_INDEX = 0;
-       public static final int ERROR_LENGTH_INDEX = 1;
-       public static final int ERROR_NUMBER_INDEX = 2;
-
-       private ErrorCode(int num, String msg) {
+       private SwapErrorCode(int num, String msg) {
                errNo = num;
                message = msg;
        }
@@ -71,13 +71,13 @@ public enum ErrorCode {
                return message;
        }
 
-       public static ErrorCode getError(int num) {
-               ErrorCode[] errors = values();
+       public static SwapErrorCode getError(int num) {
+               SwapErrorCode[] errors = values();
                for (int i = 0; i < errors.length; i++) {
                        if (errors[i].getErrorNumber() == num) {
                                return errors[i];
                        }
                }
-               return ErrorCode.ERR_NOT_DEFINED;
+               return SwapErrorCode.ERR_NOT_DEFINED;
        }
 }
index 3ec8eb0..7201225 100755 (executable)
@@ -63,7 +63,7 @@ import org.tizen.dynamicanalyzer.swap.model.DATime;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.swap.model.data.LogDataFactory;
 import org.tizen.dynamicanalyzer.swap.model.data.LogDataUtils;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataManager;
 import org.tizen.dynamicanalyzer.ui.toolbar.StartProcessManager;
 import org.tizen.dynamicanalyzer.ui.toolbar.StopLogProcessor;
 import org.tizen.dynamicanalyzer.ui.toolbar.StopProcessManager;
@@ -72,7 +72,6 @@ import org.tizen.dynamicanalyzer.util.ByteUtil;
 import org.tizen.dynamicanalyzer.util.CommonUtil;
 import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.util.UnsignedInt;
-import org.tizen.dynamicanalyzer.util.WorkbenchUtil;
 import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
 
 public class MessageParser {
@@ -87,7 +86,7 @@ public class MessageParser {
        static final int MSG_BUFFER_MAX = 5000;
        static final int MSG_BUFFER_TIMER_DELAY = 5;
        static final int MSG_BUFFER_TIMER_PERIOD = 1000; // 1 second
-       static final int WAITING_TIME = 100;
+       static final int WAITING_TIME = 10;
 
        public static final int MSG_HEADER_SIZE = 20;
        final int MSG_PAYLOAD_SIZE_INDEX = 16;
@@ -230,7 +229,7 @@ public class MessageParser {
 
                AnalyzerManager.setProcessInfoArrived(true);
 
-               ThreadChartManager.getInstance().getThreadDataManager().createMainThreadItem(pid);
+               ThreadDataManager.getInstance().getThreadDataMaker().createMainThreadItem(pid);
        }
 
        private void memoryMapChanged(byte[] data) {
index e4a47d3..6067dd4 100644 (file)
@@ -201,6 +201,7 @@ public class ProfileData extends LogData {
                                LibraryObject obj = null;
                                ProcessMemoryMap pmap = process.getProcessMemoryMap(time);
                                if (pmap == null || (obj = pmap.getLibraryByAddress(pcAddr)) == null) {
+                                       Logger.error("cannot find library for the pid and address : " + pid + ", " + pcAddr);
                                        binaryId = -1;
                                } else {
                                        binaryId = obj.getBinaryID();
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DeviceExplorer/DADeviceExplorer.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/DeviceExplorer/DADeviceExplorer.java
deleted file mode 100644 (file)
index bac36d4..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * Jaewon Lim <jaewon81.lim@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.swap.platform.ui.DeviceExplorer;
-
-import org.eclipse.nebula.widgets.grid.GridItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.tizen.dynamicanalyzer.swap.platform.ui.ExplorerUtil;
-import org.tizen.dynamicanalyzer.util.Logger;
-import org.tizen.sdblib.service.FileEntry;
-import org.tizen.sdblib.service.FileEntryType;
-
-public class DADeviceExplorer extends DeviceExplorer {
-       public DADeviceExplorer(Composite parent) {
-               super(parent);
-       }
-
-       @Override
-       public void updateData() {
-               if (null == current) {
-                       if (null == root) {
-                               Logger.debug("Root is empty");
-                               return;
-                       }
-                       current = root;
-               }
-               table.removeAll();
-               inputText.setText(current.getFullPath());
-
-               if (!current.getFullPath().equals(root.getFullPath())) {
-                       GridItem parentItem = new GridItem(table, SWT.NONE);
-                       parentItem.setText(ExplorerUtil.PARENT_STR);
-                       parentItem.setData(ExplorerUtil.DATA_FIEL_KEY, current.getParent());
-               }
-               FileEntry[] children = current.getChildren();
-               int selectionIndex = -1;
-
-               if (null != children) {
-                       int size = children.length;
-                       // dirs
-                       for (int i = 0; i < size; i++) {
-                               FileEntry child = children[i];
-                               if (!child.isDirectory()
-                                               || child.getType() == FileEntryType.DirectoryLink) {
-                                       continue;
-                               }
-
-                               GridItem item = new GridItem(table, SWT.NONE);
-                               item.setText(child.getName());
-                               item.setData(ExplorerUtil.DATA_FIEL_KEY, child);
-                               if (null != selectionStr
-                                               && selectionStr.equals(child.getFullPath())) {
-                                       int index = table.indexOf(item);
-                                       // table.getVerticalBar().setSelection(index);
-                                       table.setSelection(index);
-                                       selected = child;
-                                       inputText.setText(child.getFullPath());
-                                       selectionIndex = index;
-                               }
-                       }
-
-                       // files
-                       for (int i = 0; i < size; i++) {
-                               FileEntry child = children[i];
-                               if (child.isDirectory()
-                                               || child.getType() == FileEntryType.Link) {
-                                       continue;
-                               }
-
-                               if (null != filter && !child.getName().contains(filter)) {
-                                       continue;
-                               }
-                               GridItem item = new GridItem(table, SWT.NONE);
-                               item.setText(child.getName());
-                               item.setData(ExplorerUtil.DATA_FIEL_KEY, child);
-                               if (null != selectionStr
-                                               && selectionStr.equals(child.getFullPath())) {
-                                       int index = table.indexOf(item);
-                                       table.setSelection(index);
-                                       selected = child;
-                                       inputText.setText(child.getFullPath());
-                                       selectionIndex = index;
-                               }
-                       }
-                       table.getVerticalBar().setMaximum(size);
-                       table.getVerticalBar().setSelection(selectionIndex);
-               }
-               table.update();
-       }
-
-}
index 0f5d68c..2f62cfe 100644 (file)
@@ -44,7 +44,7 @@ import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
 import org.tizen.dynamicanalyzer.swap.platform.BinarySettingData;
 import org.tizen.dynamicanalyzer.swap.platform.BinarySettingManager;
-import org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer.FileExplorerDialog;
+import org.tizen.dynamicanalyzer.ui.common.explorer.FileExplorerDialog;
 import org.tizen.dynamicanalyzer.util.CommonUtil;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
@@ -25,7 +25,7 @@
  * 
  */
 
-package org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer;
+package org.tizen.dynamicanalyzer.ui.common.explorer;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -49,7 +49,6 @@ import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.swap.platform.ui.ExplorerUtil;
 import org.tizen.dynamicanalyzer.ui.widgets.DAGrid;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableHeaderRenderer;
 import org.tizen.dynamicanalyzer.util.Logger;
@@ -24,7 +24,7 @@
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer;
+package org.tizen.dynamicanalyzer.ui.common.explorer;
 
 import java.io.File;
 
@@ -37,7 +37,6 @@ import org.eclipse.swt.graphics.Rectangle;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
-import org.tizen.dynamicanalyzer.swap.platform.ui.ExplorerUtil;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableCellRenderer;
 import org.tizen.sdblib.service.FileEntry;
 
@@ -25,7 +25,7 @@
  * 
  */
 
-package org.tizen.dynamicanalyzer.swap.platform.ui.DeviceExplorer;
+package org.tizen.dynamicanalyzer.ui.common.explorer;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -48,9 +48,6 @@ import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.swap.platform.ui.ExplorerUtil;
-import org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer.DAFileExplorerEmptyCellRenderer;
-import org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer.DAFileExplorerTableRenderer;
 import org.tizen.dynamicanalyzer.ui.widgets.DAGrid;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableHeaderRenderer;
 import org.tizen.dynamicanalyzer.util.Logger;
@@ -67,16 +64,21 @@ public class DeviceExplorer extends Composite {
        protected static int FILE = 1;
        protected static int DIRECTORY = 2;
 
+       private static int PERMISSION_STR_LENGTH = 10;
+       private static int PERMISSION_FILTER_LENGTH = 3;
+
        protected Grid table = null;
        protected DAText inputText = null;
        protected DACustomButton goButton = null;
 
        protected IDevice device = null;
        protected FileEntry root = null;
-       protected FileEntry current = null;
+       protected FileEntry currentDir = null;
        protected FileEntry selected = null;
 
-       protected String filter = null;
+       protected String nameFilter = null;
+       protected String permissionFilterStr = null;
+       private int permissionFilter = 0; // all permission is allowed
 
        protected String selectionStr = null;
 
@@ -86,15 +88,14 @@ public class DeviceExplorer extends Composite {
                public void widgetSelected(SelectionEvent e) {
                        GridItem[] selections = table.getSelection();
                        GridItem selection = selections[0];
-                       FileEntry file = (FileEntry) selection
-                                       .getData(ExplorerUtil.DATA_FIEL_KEY);
+                       FileEntry file = (FileEntry) selection.getData(ExplorerUtil.DATA_FIEL_KEY);
+
                        Logger.debug("Selected : " + file.getFullPath());
                        selected = file;
-                       inputText.setText(selected.getFullPath());
-                       inputText.setBackground(ColorResources.WHITE);
 
-                       int length = inputText.getText().length();
-                       inputText.getControl().setSelection(length, length);
+                       // inputText.setText(selected.getFullPath());
+                       inputText.setBackground(ColorResources.WHITE);
+                       inputText.getControl().setSelection(inputText.getText().length());
                }
 
                @Override
@@ -107,20 +108,18 @@ public class DeviceExplorer extends Composite {
 
                @Override
                public void mouseUp(MouseEvent e) {
-                       // TODO Auto-generated method stub
 
                }
 
                @Override
                public void mouseDown(MouseEvent e) {
-                       // TODO Auto-generated method stub
 
                }
 
                @Override
                public void mouseDoubleClick(MouseEvent e) {
                        if (selected.isDirectory() || selected.isRoot()) {
-                               current = selected;
+                               currentDir = selected;
                                updateData();
                        }
                }
@@ -138,10 +137,9 @@ public class DeviceExplorer extends Composite {
 
                @Override
                public void keyReleased(KeyEvent e) {
-                       if (e.keyCode == 13) {
+                       if (e.keyCode == 13) { // press enter
                                adjustInput();
-                               inputText.getControl().setSelection(
-                                               inputText.getText().length());
+                               inputText.getControl().setSelection(inputText.getText().length());
                        } else {
 
                        }
@@ -156,12 +154,12 @@ public class DeviceExplorer extends Composite {
 
                @Override
                public void focusLost(FocusEvent e) {
-                       // TODO Auto-generated method stub
 
                }
 
                @Override
                public void focusGained(FocusEvent e) {
+                       // remove selection
                        GridItem[] selections = new GridItem[0];
                        table.setSelection(selections);
 
@@ -170,7 +168,7 @@ public class DeviceExplorer extends Composite {
                }
        };
 
-       public DeviceExplorer(Composite parent) {
+       public DeviceExplorer(Composite parent, boolean multiSelection) {
                super(parent, SWT.NONE);
                this.setLayout(new FormLayout());
                this.setBackground(ColorResources.DIALOG_BG_UPPER);
@@ -195,12 +193,19 @@ public class DeviceExplorer extends Composite {
                goButton.setText("Go");
                goButton.addClickListener(goButtonClickListener);
 
-               table = new DAGrid(this, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
+               int style = SWT.BORDER | SWT.V_SCROLL;
+               if (multiSelection) {
+                       style |= SWT.MULTI;
+               } else {
+                       style |= SWT.SINGLE;
+               }
+
+               table = new DAGrid(this, style);
                table.setBackground(ColorResources.TABLE_CONTENTS_NORMAL);
                table.setForeground(ColorResources.TABLE_CONTENTS_FONT_COLOR);
                setColumns();
                table.setEmptyCellRenderer(new DAFileExplorerEmptyCellRenderer());
-               table.setItemHeight(46);
+               table.setItemHeight(32);
 
                data = new FormData();
                data.top = new FormAttachment(inputText.getControl(), 7);
@@ -213,31 +218,31 @@ public class DeviceExplorer extends Composite {
                table.addMouseListener(tableMouseListener);
        }
 
-       public void setColumns() {
+       private void setColumns() {
                GridColumn fileColumn = new GridColumn(table, SWT.NONE);
-               fileColumn.setCellRenderer(new DAFileExplorerTableRenderer());
+               fileColumn.setCellRenderer(new DeviceExplorerTableRenderer());
                fileColumn.setHeaderRenderer(new DATableHeaderRenderer());
                fileColumn.setText("File");
                fileColumn.setWidth(450);
        }
 
        public void updateData() {
-               if (null == current) {
+               if (null == currentDir) {
                        if (null == root) {
                                Logger.debug("Root is empty");
                                return;
                        }
-                       current = root;
+                       currentDir = root;
                }
                table.removeAll();
-               inputText.setText(current.getFullPath());
+               inputText.setText(currentDir.getFullPath());
 
-               if (!current.getFullPath().equals(root.getFullPath())) {
+               if (!currentDir.getFullPath().equals(root.getFullPath())) {
                        GridItem parentItem = new GridItem(table, SWT.NONE);
                        parentItem.setText(ExplorerUtil.PARENT_STR);
-                       parentItem.setData(ExplorerUtil.DATA_FIEL_KEY, current.getParent());
+                       parentItem.setData(ExplorerUtil.DATA_FIEL_KEY, currentDir.getParent());
                }
-               FileEntry[] children = current.getChildren();
+               FileEntry[] children = currentDir.getChildren();
                int selectionIndex = -1;
 
                if (null != children) {
@@ -245,17 +250,15 @@ public class DeviceExplorer extends Composite {
                        // dirs
                        for (int i = 0; i < size; i++) {
                                FileEntry child = children[i];
-                               if (!child.isDirectory()) {
+                               if (!child.isDirectory() || child.getType() == FileEntryType.DirectoryLink) {
                                        continue;
                                }
 
                                GridItem item = new GridItem(table, SWT.NONE);
                                item.setText(child.getName());
                                item.setData(ExplorerUtil.DATA_FIEL_KEY, child);
-                               if (null != selectionStr
-                                               && selectionStr.equals(child.getFullPath())) {
+                               if (null != selectionStr && selectionStr.equals(child.getFullPath())) {
                                        int index = table.indexOf(item);
-                                       // table.getVerticalBar().setSelection(index);
                                        table.setSelection(index);
                                        selected = child;
                                        inputText.setText(child.getFullPath());
@@ -266,20 +269,26 @@ public class DeviceExplorer extends Composite {
                        // files
                        for (int i = 0; i < size; i++) {
                                FileEntry child = children[i];
-                               if (child.isDirectory()) {
+                               if (child.isDirectory() || child.getType() == FileEntryType.Link) {
                                        continue;
                                }
 
-                               if (null != filter && !child.getName().contains(filter)) {
+                               if (null != nameFilter && !child.getName().contains(nameFilter)) {
                                        continue;
                                }
+
+                               if (permissionFilter != 0) {
+                                       int permission = getPermission(child.getPermissions());
+                                       if((permission & permissionFilter) != permissionFilter) {
+                                               continue;
+                                       }
+                               }
+
                                GridItem item = new GridItem(table, SWT.NONE);
                                item.setText(child.getName());
                                item.setData(ExplorerUtil.DATA_FIEL_KEY, child);
-                               if (null != selectionStr
-                                               && selectionStr.equals(child.getFullPath())) {
+                               if (null != selectionStr && selectionStr.equals(child.getFullPath())) {
                                        int index = table.indexOf(item);
-                                       // table.getVerticalBar().setSelection(index);
                                        table.setSelection(index);
                                        selected = child;
                                        inputText.setText(child.getFullPath());
@@ -295,8 +304,7 @@ public class DeviceExplorer extends Composite {
        public void setRoot(String r) {
                if (null != device && null != r && !r.isEmpty()) {
                        FileEntry rootDir = device.getFileEntry(r);
-                       if (null == rootDir
-                                       || (!rootDir.isDirectory() && !rootDir.isRoot())) {
+                       if (null == rootDir || (!rootDir.isDirectory() && !rootDir.isRoot())) {
                                Logger.debug("root path is invalid");
                                return;
                        } else {
@@ -305,8 +313,8 @@ public class DeviceExplorer extends Composite {
                }
        }
 
-       public Grid getTable() {
-               return table;
+       public void addTableMouseListener(MouseListener listener) {
+               table.addMouseListener(listener);
        }
 
        public List<FileEntry> getSelection() {
@@ -321,12 +329,10 @@ public class DeviceExplorer extends Composite {
                                        continue;
                                }
 
-                               FileEntry entry = (FileEntry) selection
-                                               .getData(ExplorerUtil.DATA_FIEL_KEY);
+                               FileEntry entry = (FileEntry) selection.getData(ExplorerUtil.DATA_FIEL_KEY);
                                fileEntries.add(entry);
                        }
-               } else if (null != inputText.getText()
-                               && !inputText.getText().isEmpty()) {
+               } else if (null != inputText.getText() && !inputText.getText().isEmpty()) {
                        String path = inputText.getText();
                        FileEntry file = device.getFileEntry(path);
                        if (null != file) {
@@ -348,49 +354,95 @@ public class DeviceExplorer extends Composite {
                                Logger.debug("invalid path");
                                return result;
                        } else if (!file.isDirectory() && !file.isRoot()) {
-                               current = file.getParent();
+                               currentDir = file.getParent();
                                selectionStr = file.getFullPath();
                                result = FILE;
                        } else {
-                               current = file;
+                               currentDir = file;
                                selectionStr = CommonConstants.EMPTY;
                                result = DIRECTORY;
                        }
                        updateData();
-                       return result;
                }
                return result;
        }
 
        private void adjustInput() {
+               String errorstr = null;
+
                String path = inputText.getText();
-               if (null == path || path.isEmpty()) {
-                       Logger.debug("path must not empty");
-                       // inputText.setBackground(ColorResources.RED);
-                       // info.setText("Empty path");
-                       inputText.setText(current.getFullPath());
-                       return;
+               if (null != path && !path.isEmpty()) {
+                       if (path.contains(root.getFullPath())) {
+                               if (setCurrent(path) != FAIL) {
+                                       inputText.setBackground(ColorResources.WHITE);
+                               } else {
+                                       errorstr = "Failed to set current directory";
+                               }
+                       } else {
+                               errorstr = "Out of root range";
+                       }
+               } else {
+                       errorstr = "path must not empty";
                }
 
-               if (!path.contains(root.getFullPath())) {
-                       Logger.debug("Out of root range");
+               if (errorstr != null) {
+                       Logger.debug(errorstr);
                        // inputText.setBackground(ColorResources.RED);
-                       // info.setText("Out of root range");
-                       inputText.setText(current.getFullPath());
-                       return;
+                       // info.setText(errorstr);
+                       inputText.setText(currentDir.getFullPath());
                }
-
-               int ret = setCurrent(path);
-               if (ret != FAIL) {
-                       inputText.setBackground(ColorResources.WHITE);
-               } else {
-                       // inputText.setBackground(ColorResources.RED);
-                       // info.setText("Invalid path");
-                       inputText.setText(current.getFullPath());
+       }
+       
+       private int getPermission(String permissionStr) {
+               int permission = 0; 
+               if(permissionStr != null && permissionStr.length() == PERMISSION_STR_LENGTH) {
+                       for (int i = 1; i < permissionStr.length(); i++) {
+                               permission = permission << 1;
+                               switch (permissionStr.charAt(i)) {
+                               case 'r':
+                               case 'w':
+                               case 'x':
+                                       permission = permission | 1;
+                                       break;
+                               default:
+                                       // other letter is possible for permission string
+                                       // but it is not necessary to parsing
+                                       break;
+                               }
+                       }
                }
+               
+               return permission;
+       }
+
+       /**
+        * set filename filter to filter file entry by file name
+        * 
+        * @param filter
+        *            file name filter string
+        */
+       public void setNameFilter(String filter) {
+               this.nameFilter = filter;
        }
 
-       public void setFilterString(String filter) {
-               this.filter = filter;
+       /**
+        * set permission filter to filter file entry by permission
+        * 
+        * @param filter
+        *            permission filter string (ex. 755)
+        */
+       public void setPermissionFilter(String filter) {
+               if (filter == null || filter.length() == PERMISSION_FILTER_LENGTH) {
+                       this.permissionFilterStr = filter;
+
+                       if (filter != null) {
+                               int userclass = filter.charAt(0) - '0';
+                               int groupclass = filter.charAt(1) - '0';
+                               int otherclass = filter.charAt(2) - '0';
+                               permissionFilter = userclass << 6 | groupclass << 3 | otherclass;
+                       } else {
+                               permissionFilter = 0;
+                       }
+               }
        }
 }
@@ -25,7 +25,7 @@
  * 
  */
 
-package org.tizen.dynamicanalyzer.swap.platform.ui.DeviceExplorer;
+package org.tizen.dynamicanalyzer.ui.common.explorer;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -47,26 +47,25 @@ import org.tizen.dynamicanalyzer.appearance.DesignConstants;
 import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.nl.WidgetLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.swap.platform.ui.ExplorerUtil;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
 import org.tizen.dynamicanalyzer.widgets.da.base.DAButton;
 import org.tizen.dynamicanalyzer.widgets.da.base.DAMessageBox;
 import org.tizen.sdblib.service.FileEntry;
 
-public class DeviceExplorerDilaog extends DAMessageBox {
+public class DeviceExplorerDialog extends DAMessageBox {
        private DeviceExplorer explorer = null;
        private DACustomButton okButton = null;
        private DACustomButton cancelButton = null;
 
-       public DeviceExplorerDilaog(Shell parentShell) {
+       public DeviceExplorerDialog(Shell parentShell, boolean multiSelection) {
                super(parentShell);
                shell.setLayout(new FormLayout());
                shell.setSize(446, 600);
                shell.setBackground(ColorResources.DIALOG_BG_UPPER);
                shell.setText("Select binary");
 
-               explorer = new DADeviceExplorer(shell);
+               explorer = new DeviceExplorer(shell, multiSelection);
                FormData data = new FormData();
                data.top = new FormAttachment(0, 17);
                data.left = new FormAttachment(0, 6);
@@ -138,7 +137,7 @@ public class DeviceExplorerDilaog extends DAMessageBox {
                        }
                });
 
-               explorer.getTable().addMouseListener(new MouseListener() {
+               explorer.addTableMouseListener(new MouseListener() {
 
                        @Override
                        public void mouseUp(MouseEvent e) {
@@ -184,7 +183,11 @@ public class DeviceExplorerDilaog extends DAMessageBox {
                return explorer;
        }
 
-       public void setFilter(String filter) {
-               explorer.setFilterString(filter);
+       public void setNameFilter(String filter) {
+               explorer.setNameFilter(filter);
+       }
+       
+       public void setPermissionFilter(String filter) {
+               explorer.setPermissionFilter(filter);
        }
 }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DeviceExplorerTableRenderer.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/common/explorer/DeviceExplorerTableRenderer.java
new file mode 100644 (file)
index 0000000..a636d08
--- /dev/null
@@ -0,0 +1,174 @@
+package org.tizen.dynamicanalyzer.ui.common.explorer;
+
+import java.io.File;
+
+import org.eclipse.nebula.widgets.grid.GridItem;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.resources.FontResources;
+import org.tizen.dynamicanalyzer.resources.ImageResources;
+import org.tizen.dynamicanalyzer.ui.widgets.table.DATableCellRenderer;
+import org.tizen.sdblib.service.FileEntry;
+
+public class DeviceExplorerTableRenderer extends DATableCellRenderer {
+       @Override
+       public void paint(GC gc, Object value) {
+               textTopMargin = 8;
+
+               GridItem item = (GridItem) value;
+
+               gc.setFont(item.getFont(getColumn()));
+
+               boolean drawAsSelected = isSelected();
+
+               boolean drawBackground = true;
+
+               if (isCellSelected()) {
+                       drawAsSelected = true;// (!isCellFocus());
+               }
+
+               if (drawAsSelected) {
+                       gc.setForeground(ColorResources.EXPLORER_SELECT_START);
+                       gc.setBackground(ColorResources.EXPLORER_SELECT_END);
+               } else {
+                       if (item.getParent().isEnabled()) {
+                               gc.setBackground(ColorResources.EXPLORER_CELL_BG);
+                       } else {
+                               gc.setBackground(getDisplay().getSystemColor(
+                                               SWT.COLOR_WIDGET_BACKGROUND));
+                       }
+               }
+
+               if (drawBackground && drawAsSelected) {
+                       gc.fillGradientRectangle(getBounds().x, getBounds().y,
+                                       getBounds().width, getBounds().height, true);
+               } else if (drawBackground) {
+                       gc.fillRectangle(getBounds().x, getBounds().y + 1,
+                                       getBounds().width, getBounds().height);
+               }
+
+               int x = leftMargin;
+
+               if (isCheck()) {
+                       checkRenderer.setChecked(item.getChecked(getColumn()));
+                       checkRenderer.setGrayed(item.getGrayed(getColumn()));
+                       if (!item.getParent().isEnabled()) {
+                               checkRenderer.setGrayed(true);
+                       }
+                       checkRenderer.setHover(getHoverDetail().equals("check")); //$NON-NLS-1$
+
+                       checkRenderer.setBounds(getBounds().x + x,
+                                       (getBounds().height - checkRenderer.getBounds().height) / 2
+                                                       + getBounds().y, checkRenderer.getBounds().width,
+                                       checkRenderer.getBounds().height);
+                       checkRenderer.paint(gc, null);
+
+                       x += checkRenderer.getBounds().width + insideMargin;
+               }
+
+               int width = getBounds().width - x - rightMargin;
+
+               String text = item.getText(getColumn());
+
+               if (getAlignment() == SWT.RIGHT) {
+                       int len = gc.stringExtent(text).x;
+                       if (len < width) {
+                               x += width - len;
+                       }
+               } else if (getAlignment() == SWT.CENTER) {
+                       int len = gc.stringExtent(text).x;
+                       if (len < width) {
+                               x += (width - len) / 2;
+                       }
+               }
+
+               if (drawAsSelected) {
+                       gc.setForeground(ColorResources.BLACK);
+               } else {
+                       Color fontColor = item.getForeground();
+                       if (null != fontColor) {
+                               gc.setForeground(item.getForeground());
+                       } else {
+                               gc.setForeground(ColorResources.BLACK);
+                       }
+               }
+
+               Image image = null;
+               Object object = item.getData(ExplorerUtil.DATA_FIEL_KEY);
+               if (object instanceof File) {
+                       File file = (File) object;
+                       if (file.isDirectory()) {
+                               image = ImageResources.FILE_TYPE_DIR;
+                       } else if (file.isFile()) {
+                               image = ImageResources.FILE_TYPE_FILE;
+                       } else {
+                               image = ImageResources.FILE_TYPE_ETC;
+                       }
+               } else if (object instanceof FileEntry) {
+                       FileEntry entry = (FileEntry) object;
+                       switch (entry.getType()) {
+                       case File:
+                               image = ImageResources.FILE_TYPE_FILE;
+                               break;
+                       case Link:
+                               image = ImageResources.FILE_TYPE_FILE_LINK;
+                               break;
+                       case Directory:
+                               image = ImageResources.FILE_TYPE_DIR;
+                               break;
+                       case DirectoryLink:
+                               image = ImageResources.FILE_TYPE_DIR_LINK;
+                               break;
+                       case RootEmulator:
+                               image = ImageResources.FILE_TYPE_EMULATOR;
+                               break;
+                       case RootDevice:
+                               image = ImageResources.FILE_TYPE_DEVICE;
+                               break;
+                       default:
+                               image = ImageResources.FILE_TYPE_ETC;
+                               break;
+                       }
+               }
+
+               int imageTopMargin = 0;
+               int imageLeftMargin = 16;
+               int textLeftMargin = 66;
+               Rectangle rect = getBounds();
+               gc.drawImage(image, rect.x + imageLeftMargin, rect.y + imageTopMargin);
+               gc.setFont(FontResources.getDADefaultFont());
+               gc.drawText(text, rect.x + textLeftMargin, rect.y + textTopMargin, true);
+
+               if (item.getParent().getLinesVisible()) {
+                       gc.setForeground(ColorResources.EXPLORER_CELL_LINE);
+                       gc.drawLine(rect.x, rect.y + rect.height,
+                                       rect.x + rect.width - 1, rect.y
+                                                       + rect.height);
+                       // gc.drawLine(getBounds().x + getBounds().width - 1, getBounds().y,
+                       // getBounds().x + getBounds().width - 1, getBounds().y
+                       // + getBounds().height);
+               }
+
+               if (isCellFocus()) {
+                       Rectangle focusRect = new Rectangle(getBounds().x - 1,
+                                       getBounds().y - 1, getBounds().width,
+                                       getBounds().height + 1);
+
+                       gc.setForeground(ColorResources.RED);
+                       gc.drawRectangle(focusRect);
+
+                       if (isFocus()) {
+                               focusRect.x++;
+                               focusRect.width -= 2;
+                               focusRect.y++;
+                               focusRect.height -= 2;
+
+                               gc.drawRectangle(focusRect);
+                       }
+               }
+       }
+}
@@ -24,7 +24,7 @@
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer;
+package org.tizen.dynamicanalyzer.ui.common.explorer;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -46,7 +46,6 @@ import org.eclipse.swt.widgets.Shell;
 import org.tizen.dynamicanalyzer.appearance.DesignConstants;
 import org.tizen.dynamicanalyzer.nl.WidgetLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.swap.platform.ui.ExplorerUtil;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
 import org.tizen.dynamicanalyzer.widgets.da.base.DAButton;
@@ -24,7 +24,7 @@
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.swap.platform.ui;
+package org.tizen.dynamicanalyzer.ui.common.explorer;
 
 import org.eclipse.nebula.widgets.grid.Grid;
 import org.eclipse.nebula.widgets.grid.GridItem;
@@ -43,12 +43,12 @@ import org.tizen.dynamicanalyzer.widgets.da.base.DAButton;
 import org.tizen.dynamicanalyzer.widgets.da.base.DAMessageBox;
 import org.tizen.sdblib.service.FileEntry;
 
-public class FileExplorerDialog extends DAMessageBox {
+public class FileTreeExplorerDialog extends DAMessageBox {
        private DAFileTreeExplorer explorerTree = null;
        private DACustomButton okButton = null;
        private DACustomButton cancelButton = null;
 
-       public FileExplorerDialog(Shell parentShell) {
+       public FileTreeExplorerDialog(Shell parentShell) {
                super(parentShell);
                shell.setLayout(new FormLayout());
                shell.setSize(500, 600);
index b16cc9d..f3c6369 100644 (file)
@@ -26,6 +26,8 @@
 
 package org.tizen.dynamicanalyzer.ui.file;
 
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -38,12 +40,15 @@ import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.error.ErrorCodeManager;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.model.TableInput;
 import org.tizen.dynamicanalyzer.swap.model.data.FileData;
 import org.tizen.dynamicanalyzer.ui.file.manager.FileDataManager;
+import org.tizen.dynamicanalyzer.ui.file.model.FileAccessor;
 import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
+import org.tizen.dynamicanalyzer.ui.file.model.FileSelectedData;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DAApiListTableComposite;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
@@ -51,6 +56,8 @@ import org.tizen.dynamicanalyzer.utils.Formatter;
 
 
 public class FileApiListTable extends DAApiListTableComposite {
+       private FileDataManager fileDataManager = FileDataManager.getInstance();
+       
        public FileApiListTable(Composite parent, int compStyle, int tableStyle) {
                super(parent, compStyle, tableStyle);
                table.addSelectionListener(new SelectionListener() {
@@ -102,118 +109,159 @@ public class FileApiListTable extends DAApiListTableComposite {
                long rangeEndTime = view.getRangeEndTime();
                
                HashMap<String, Integer> findStartAPITableIndexHashMap = new HashMap<String, Integer>();
+               HashMap<Integer, Long> findStartTimeHashMap = new HashMap<Integer, Long>();
                List<Integer> removeTableIndex = new ArrayList<Integer>();
                List<TableInput> input = new ArrayList<TableInput>();
                
-               List<FileEvent> contents = FileDataManager.getInstance().getSelectedTableAPIList();
-               if(contents == null) {
-                       return null;
-               }
-               for (int i = 0; i < contents.size(); i++) {
-                       FileEvent contentTemp = contents.get(i);
-                       List<String> contentText = new ArrayList<String>();
-                       List<String> contentData = new ArrayList<String>();
-
-                       Integer startLogIndex = 0;
-                       int fdApiType = contentTemp.getFdApiType();
+               FileSelectedData selectedData = fileDataManager.getSelectedData();
+               ResultSet rs = fileDataManager.getApiDB().selectAPI(
+                               selectedData.getFileId(),
+                               selectedData.getAccessorId(),
+                               selectedData.isParentChart());
+               FileAccessor accessor = selectedData.getFileAccessor();
+               boolean isParentChart = selectedData.isParentChart();
+               String filePath = null;
+               int pid = -1;
+               int tid = -1;
+               if (rs != null) {
+                       try {
+                               int i = -1;
+                               int index = 0;
+                               while (rs.next()) {
+                                       i++;
+                                       index++;
+                                       
+                                       List<String> contentText = new ArrayList<String>();
+                                       List<String> contentData = new ArrayList<String>();
+                                       Integer startLogIndex = 0;
 
-                       long seq = contentTemp.getSeq();
-                       contentText.add(0, Long.toString(seq));
-                       contentData.add(Long.toString(seq));
-                       long time = contentTemp.getTime();
+                                       long seq = rs.getLong(1);
+                                       long fd = rs.getLong(2);
+                                       int fdApiType = rs.getInt(3);
+                                       long time = rs.getLong(4);
+                                       int apiId = rs.getInt(5);
+                                       long errno = rs.getLong(6);
+                                       long fileSize = rs.getLong(7);
+                                       long ioSize = rs.getLong(8);
+                                       String returns = rs.getString(9);
+                                       String args = rs.getString(10); 
+                                       
+                                       if(isParentChart){
+                                               filePath = rs.getString(11);
+                                               pid = rs.getInt(12);
+                                               tid = rs.getInt(13);    
+                                       }else{
+                                               filePath = accessor.getFilePath();
+                                               pid = accessor.getPid();
+                                               tid = accessor.getTid();
+                                       }
+                                       
+                                       FileEvent fileEvent = new FileEvent(seq,  filePath, pid,
+                                                       tid, fd, fdApiType, apiId, time, fileSize, ioSize,
+                                                       args, returns, errno);
+                                       
+                                       String apiName = Global.getFunctionName(apiId);
+                                       long startTime = 0;
+                                       
+                                       boolean isExistStartTimeLog = false;
+                                       if (fdApiType == LogCenterConstants.FD_API_TYPE_READ_START
+                                                       || fdApiType == LogCenterConstants.FD_API_TYPE_WRITE_START
+                                                       ||  fdApiType == LogCenterConstants.FD_API_TYPE_LOCK_START) {
+                                               String keString = apiName + pid + tid + fd;
+                                               findStartAPITableIndexHashMap.put(keString, i);
+                                               findStartTimeHashMap.put(i, time);
+                                               index--;
+                                       } else if (fdApiType == LogCenterConstants.FD_API_TYPE_READ_END
+                                                       || fdApiType == LogCenterConstants.FD_API_TYPE_WRITE_END
+                                                       ||  fdApiType == LogCenterConstants.FD_API_TYPE_LOCK_END) {
+                                               String keString = apiName + pid + tid + fd;
+                                               startLogIndex = findStartAPITableIndexHashMap.get(keString);
+                                               findStartAPITableIndexHashMap.remove(keString);
+                                               if (null != startLogIndex) {
+                                                       contentText.add(input.get(startLogIndex.intValue())
+                                                                       .getText().get(1)); // start time
+                                                       contentData.add(input.get(startLogIndex.intValue())
+                                                                       .getText().get(1));
 
-                       boolean isExistStartTimeLog = false;
-                       if (fdApiType == LogCenterConstants.FD_API_TYPE_READ_START
-                                       || fdApiType == LogCenterConstants.FD_API_TYPE_WRITE_START
-                                       ||  fdApiType == LogCenterConstants.FD_API_TYPE_LOCK_START) {
-                               String keString = contentTemp.getApiName()
-                                               + contentTemp.getPid() + contentTemp.getTid() + contentTemp.getFdValue();
-                               findStartAPITableIndexHashMap.put(keString, i);
+                                                       startTime = findStartTimeHashMap.get(startLogIndex);
+                                                       String timeFormat = Formatter
+                                                                       .toTimeFormat(time - startTime);
+                                                       String removeTimeFormat = timeFormat.replace(
+                                                                       "00:", CommonConstants.EMPTY);//$NON-NLS-1$
 
-                       } else if (fdApiType == LogCenterConstants.FD_API_TYPE_READ_END
-                                       || fdApiType == LogCenterConstants.FD_API_TYPE_WRITE_END
-                                       ||  fdApiType == LogCenterConstants.FD_API_TYPE_LOCK_END) {
-                               String keString = contentTemp.getApiName()
-                                               + contentTemp.getPid() + contentTemp.getTid() + contentTemp.getFdValue();
-                               startLogIndex = findStartAPITableIndexHashMap.get(keString);
-                               findStartAPITableIndexHashMap.remove(keString);
-                               if (null != startLogIndex) {
-                                       contentText.add(input.get(startLogIndex.intValue())
-                                                       .getText().get(1)); // start time
-                                       contentData.add(input.get(startLogIndex.intValue())
-                                                       .getText().get(1));
+                                                       contentText.add(removeTimeFormat); // elapsed time
+                                                       contentData.add(Long.toString(time - startTime));
+                                                       
+                                                       isExistStartTimeLog = true;
+                                                       removeTableIndex.add(startLogIndex.intValue());
+                                               } else {
+                                                       contentText.add(Formatter.toTimeFormat(time)); // start//
+                                                       contentData.add(Long.toString(time));
+                                                       contentText.add("00.000");//$NON-NLS-1$
+                                                       contentData.add("00.000");//$NON-NLS-1$
+                                               }
+                                       }
 
-                                       long startTime = contents.get(startLogIndex.intValue()).getTime();
-                                       String timeFormat = Formatter
-                                                       .toTimeFormat(time - startTime);
-                                       String removeTimeFormat = timeFormat.replace(
-                                                       "00:", CommonConstants.EMPTY);//$NON-NLS-1$
+                                       if (!isExistStartTimeLog) {
+                                               contentText.add(Formatter.toTimeFormat(time)); // start time
+                                               contentData.add(Long.toString(time));
+                                               contentText.add("00.000");//$NON-NLS-1$ //elapsed time
+                                               contentData.add("00.000");//$NON-NLS-1$                                                         
+                                       }
 
-                                       contentText.add(removeTimeFormat); // elapsed time
-                                       contentData.add(Long.toString(time - startTime));
+                                       contentText.add(0, Integer.toString(index));
+                                       contentData.add(0, Integer.toString(index));
                                        
-                                       isExistStartTimeLog = true;
-                                       removeTableIndex.add(startLogIndex.intValue());
-                               } else {
-                                       contentText.add(Formatter.toTimeFormat(contentTemp
-                                                       .getTime())); // start//
-                                       contentData.add(Long.toString(contentTemp.getTime()));
-                                       contentText.add("00.000");//$NON-NLS-1$
-                                       contentData.add("00.000");//$NON-NLS-1$
-                               }
-                       }
-
-                       if (!isExistStartTimeLog) {
-                               contentText.add(Formatter.toTimeFormat(time)); // start time
-                               contentData.add(Long.toString(time));
-                               contentText.add("00.000");//$NON-NLS-1$                                                 //elapsed time
-                               contentData.add("00.000");//$NON-NLS-1$                                                         
-                       }
-
-                       contentText.add(Integer.toString(contentTemp.getPid()));
-                       contentData.add(Integer.toString(contentTemp.getPid()));
+                                       contentText.add(Integer.toString(pid));
+                                       contentData.add(Integer.toString(pid));
 
-                       contentText.add(Integer.toString(contentTemp.getTid()));
-                       contentData.add(Integer.toString(contentTemp.getTid()));
-                       
-                       contentText.add(Long.toString(contentTemp.getFdValue()));
-                       contentData.add(Long.toString(contentTemp.getFdValue()));
-
-                       contentText.add(Global.getFunctionName(contentTemp.getApiId()));
-                       contentData.add(Global.getFunctionName(contentTemp.getApiId()));
+                                       contentText.add(Integer.toString(tid));
+                                       contentData.add(Integer.toString(tid));
+                                       
+                                       contentText.add(Long.toString(fd));
+                                       contentData.add(Long.toString(fd));
 
-                       contentText.add(contentTemp.getArgs());
-                       contentData.add(contentTemp.getArgs());
+                                       contentText.add(apiName);
+                                       contentData.add(apiName);
 
-                       contentText.add(contentTemp.getReturn());
-                       contentData.add(contentTemp.getReturn());
+                                       contentText.add(args);
+                                       contentData.add(args);
+                                       
+                                       contentText.add(returns);
+                                       contentData.add(returns);
+                                       
+                                       contentText.add(Long.toString(seq));
+                                       contentData.add(Long.toString(seq));
 
-                       String errMsg = ErrorCodeManager.getInatance()
-                                       .getErrorCode(contentTemp.getErrno()).name();
-                       if (null == errMsg) {
-                               errMsg = "undefined error code"; //$NON-NLS-1$
-                       }
-                       contentText.add(errMsg);
-                       contentData.add(errMsg);
-                       contentText.add(Long.toString(contentTemp.getFileSize()));
-                       contentData.add(Long.toString(contentTemp.getFileSize()));
+                                       String errMsg = ErrorCodeManager.getInatance()
+                                                       .getErrorCode(errno).name();
+                                       if (null == errMsg) {
+                                               errMsg = "undefined error code"; //$NON-NLS-1$
+                                       }
 
-                       DATableDataFormat tableData = new DATableDataFormat(
-                                       contentTemp.getSeq());
-                       tableData.setLogData(contentTemp);
-                       tableData.getData().addAll(contentData);
-                       TableInput tableInput = new TableInput();
-                       tableInput.setText(contentText);
-                       tableInput.setData(tableData);
-                       if (!errMsg.contains("SUCCESS")) {//$NON-NLS-1$
-                               tableInput.setFailed(true);
-                       }
-                       input.add(tableInput);
+                                       // create DATableDataFormat
+                                       DATableDataFormat tableData = new DATableDataFormat(seq);
+                                       tableData.setLogData(fileEvent);
+                                       tableData.getData().addAll(contentData);
+                                       TableInput tableInput = new TableInput();
+                                       tableInput.setText(contentText);
+                                       tableInput.setData(tableData);
+                                       if (!errMsg.contains("SUCCESS")) {//$NON-NLS-1$
+                                               tableInput.setFailed(true);
+                                       }
+                                       input.add(tableInput);
 
-                       if (time >= rangeStartTime && time <= rangeEndTime) {
-                               tableInput.setInRange(true);
+                                       if (time >= rangeStartTime && time <= rangeEndTime) {
+                                               tableInput.setInRange(true);
+                                       }
+                               }
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
                        }
                }
+               
                int removeCount = 0;
                for (int index : removeTableIndex) {
                        int removeIndex = index - removeCount;
index 5722dd9..485e8a0 100644 (file)
@@ -26,8 +26,6 @@
 
 package org.tizen.dynamicanalyzer.ui.file;
 
-import java.util.List;
-
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
@@ -37,7 +35,6 @@ import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.nl.FilePageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.ui.file.manager.FileDataManager;
-import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
 import org.tizen.dynamicanalyzer.ui.file.model.FileSelectedData;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
@@ -145,17 +142,11 @@ public class FileApiListView extends DAViewComposite {
                }
                
                // if new event is put from swap, update table 
-               List<FileEvent> events = manager.getApiDB().selectAPITable(
-                               selectedData.getFilePath(), selectedData.getPid(),
-                               selectedData.getTid(), 
-                               selectedData.isParentChart());
-               if(events != null) {
-                       if (tableComp.getTable().getItemCount() > 0
-                                       && events.size() != tableComp.getTable().getItemCount()) {
-                               manager.setSelectedTableAPIList(events);
-                               isUpdate = true;
-                       }
-               }
+               /*int newTotal = manager.getApiDB().getTotal();
+               if(tableComp.getTable().getItemCount() > 0 && newTotal > currentTotal) {
+                       manager.setSelectedData(selectedData);
+                       isUpdate = true;
+               }*/
                
                return isUpdate;
        }
@@ -184,12 +175,8 @@ public class FileApiListView extends DAViewComposite {
                                if (null == selectedData) {
                                        return;
                                }
-                               manager.setSelectedTableAPIList(
-                                               manager.getApiDB().
-                                               selectAPITable(selectedData.getFilePath(),
-                                                               selectedData.getPid(), 
-                                                               selectedData.getTid(), 
-                                                               selectedData.isParentChart()));
+                               
+                               manager.setSelectedData(selectedData);
 
                                tableComp.updateTable();
                                tableComp.setSelectionByTime(selectionStartTime,
index a101c2c..3ad7b18 100644 (file)
@@ -29,13 +29,11 @@ package org.tizen.dynamicanalyzer.ui.file;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.swt.graphics.Color;
-import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.nl.FilePageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.ui.file.model.FileAccess;
-import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
+import org.tizen.dynamicanalyzer.ui.file.model.FileAccessor;
 import org.tizen.dynamicanalyzer.ui.file.model.FileStatus;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.utils.Formatter;
@@ -56,35 +54,22 @@ public class FileChart {
        private DAChartSeries accessSeries;
        
        private String filePath = null;
-       private int pid = -1;
-       private int tid = -1;
-       private long fd = -1;
-       private long fileSize = 0;
-       //private int parentChartIndex = -1;
+       private int fileId = -1;
+       
+       private FileAccessor fileAccessor = null;
        private int chartIndex = -1;
        
        private boolean isTarget = false;
        
-       public FileChart(String filePath) {
-               this.filePath = filePath;
-       }
-       
-       public FileChart(String filePath, int pid, int tid, long fd) {
+       public FileChart(String filePath, int fileId) {
                this.filePath = filePath;
-               this.pid = pid;
-               this.tid = tid;
-               this.fd = fd;
+               this.fileId = fileId;
        }
        
-       public FileChart(int pid, int tid, long fd, String filePath, long fileSize,
-                       boolean isTarget, int chartIndex) {
-               this.filePath = filePath;
-               this.pid = pid;
-               this.tid = tid;
-               this.fd = fd;
-               this.fileSize = fileSize;
-               this.isTarget = isTarget;
+       public FileChart(FileAccessor fileAccessor, int chartIndex, boolean isTarget) {
+               this.fileAccessor = fileAccessor;
                this.chartIndex = chartIndex;
+               this.isTarget = isTarget;
        }
 
        public void setItem(DAChartBoardItem item) {
@@ -105,42 +90,15 @@ public class FileChart {
        }
        
        /**
-        * Update API series chart
-        * @param apiList
-        */
-       public void updateApiSeries(List<FileEvent> apiList){
-               for(int i=0; i < apiList.size(); i++) {
-                       FileEvent event = apiList.get(i);
-                       if(!event.getFilePath().equals(this.filePath) || 
-                                       event.getPid() != this.pid ||
-                                       event.getTid() != this.tid) {
-                               continue;
-                       }
-                       double time = event.getTime() / TimelineConstants.MEGA_DOUBLE;
-                       String apiName = Global.getFunctionName(event.getApiId());
-                       Color color = ColorResources.FILE_API_FAILED;
-                       
-                       DAChartSeriesItem seriesItem  = new DAChartSeriesItem(time,
-                                       DAChartSeriesItem.SERIES_AREA_BAR, color, color, apiName);
-                       accessSeries.addSeriesItem(seriesItem);
-               }
-               chart.redraw();
-       }
-       
-       /**
         * Update access series chart - read/write/lock event
         * @param accessList
         */
        public void updateAccessSeries(List<FileAccess> accessList) {
                for(int i=0; i < accessList.size(); i++) {
                        FileAccess data = accessList.get(i);
-                       if(!data.getFilePath().equals(this.filePath) ||
-                                       data.getPid() != this.pid ||
-                                       data.getTid() != this.tid ||
-                                       data.getErroNo() != 0) {
+                       if(data.getAccessorId() != this.fileAccessor.getAccessorId()) {
                                continue;
                        }
-                       
                        double startTime = data.getStartTime() / TimelineConstants.MEGA_DOUBLE;
                        double endTime = data.getEndTime() / TimelineConstants.MEGA_DOUBLE;
                        
@@ -152,13 +110,13 @@ public class FileChart {
                                                        startTime, DAChartSeriesItem.SERIES_AREA_START,
                                                        ColorResources.FILE_ACCESS_CONCURRENT_READ,
                                                        ColorResources.FILE_ACCESS_CONCURRENT_READ, false,
-                                                       FilePageLabels.FILE_CHART_TOOLTIP_CONCURRENT_READ));
+                                                       data.getTooltip()));
                                        if(endTime > 0) { 
                                                accessSeries.addSeriesItem(new DAChartSeriesItem(
                                                                endTime, DAChartSeriesItem.SERIES_AREA_END,
                                                                ColorResources.FILE_ACCESS_CONCURRENT_READ, 
                                                                ColorResources.FILE_ACCESS_CONCURRENT_READ, false,
-                                                               FilePageLabels.FILE_CHART_TOOLTIP_CONCURRENT_READ));
+                                                               data.getTooltip()));
                                        } // else, if endTime <=0, still accessing
                                }else{
                                        // the file has been read by only one process or thread
@@ -166,13 +124,13 @@ public class FileChart {
                                                        startTime, DAChartSeriesItem.SERIES_AREA_START,
                                                        ColorResources.FILE_ACCESS_READ, 
                                                        ColorResources.FILE_ACCESS_READ, false,
-                                                       FilePageLabels.FILE_CHART_TOOLTIP_READ));
+                                                       data.getTooltip()));
                                        if(endTime > 0) {
                                                accessSeries.addSeriesItem(new DAChartSeriesItem(
                                                                endTime, DAChartSeriesItem.SERIES_AREA_END,
                                                                ColorResources.FILE_ACCESS_READ, 
                                                                ColorResources.FILE_ACCESS_READ, false,
-                                                               FilePageLabels.FILE_CHART_TOOLTIP_READ));
+                                                               data.getTooltip()));
                                        } // else, if endTime <=0, still accessing
                                }
                                break;
@@ -183,13 +141,13 @@ public class FileChart {
                                                        startTime, DAChartSeriesItem.SERIES_AREA_START,
                                                        ColorResources.FILE_ACCESS_CONCURRENT_WRITE, 
                                                        ColorResources.FILE_ACCESS_CONCURRENT_WRITE, false,
-                                                       FilePageLabels.FILE_CHART_TOOLTIP_CONCURRENT_WRITE));
+                                                       data.getTooltip()));
                                        if(endTime > 0) { 
                                                accessSeries.addSeriesItem(new DAChartSeriesItem(
                                                                endTime, DAChartSeriesItem.SERIES_AREA_END,
                                                                ColorResources.FILE_ACCESS_CONCURRENT_WRITE, 
                                                                ColorResources.FILE_ACCESS_CONCURRENT_WRITE, false,
-                                                               FilePageLabels.FILE_CHART_TOOLTIP_CONCURRENT_WRITE));
+                                                               data.getTooltip()));
                                        } // else, if endTime <=0, still accessing
                                }else{
                                        // the file has been written by only one process or thread
@@ -197,43 +155,47 @@ public class FileChart {
                                                        startTime, DAChartSeriesItem.SERIES_AREA_START,
                                                        ColorResources.FILE_ACCESS_WRITE, 
                                                        ColorResources.FILE_ACCESS_WRITE, false,
-                                                       FilePageLabels.FILE_CHART_TOOLTIP_WRITE));
+                                                       data.getTooltip()));
                                        if(endTime > 0) {
                                                accessSeries.addSeriesItem(new DAChartSeriesItem(
                                                                endTime, DAChartSeriesItem.SERIES_AREA_END,
                                                                ColorResources.FILE_ACCESS_WRITE, 
                                                                ColorResources.FILE_ACCESS_WRITE, false,
-                                                               FilePageLabels.FILE_CHART_TOOLTIP_WRITE));
+                                                               data.getTooltip()));
                                        }// else, if endTime <=0, still accessing
                                }
                                break;
                        case LogCenterConstants.FD_API_TYPE_LOCK_START:
                                lockSeries.addSeriesItem(new DAChartSeriesItem(
                                                startTime, DAChartSeriesItem.SERIES_AREA_START,
-                                               ColorResources.FILE_LOCK_ACQUIRED
-                                               ColorResources.FILE_LOCK_ACQUIRED, false,
-                                               FilePageLabels.FILE_CHART_TOOLTIP_LOCK));
+                                               ColorResources.FILE_LOCK, 
+                                               ColorResources.FILE_LOCK, false,
+                                               data.getTooltip()));
                                if(endTime > 0){
                                        lockSeries.addSeriesItem(new DAChartSeriesItem(
                                                        endTime, DAChartSeriesItem.SERIES_AREA_END,
-                                                       ColorResources.FILE_LOCK_ACQUIRED,
-                                                       ColorResources.FILE_LOCK_ACQUIRED, false,
-                                                       FilePageLabels.FILE_CHART_TOOLTIP_LOCK));
+                                                       ColorResources.FILE_LOCK,
+                                                       ColorResources.FILE_LOCK, false,
+                                                       data.getTooltip()));
                                }// else, if endTime <=0, still accessing
                                break;
-                       case LogCenterConstants.FD_API_TYPE_LOCK_WAIT_START:
-                               lockSeries.addSeriesItem(new DAChartSeriesItem(startTime,
-                                               DAChartSeriesItem.SERIES_AREA_START,
-                                               ColorResources.FILE_LOCK_WAITING,
-                                               ColorResources.FILE_LOCK_WAITING, false,
-                                               FilePageLabels.FILE_CHART_TOOLTIP_LOCK_WAIT));
-                               if (endTime > 0) {
-                                       lockSeries.addSeriesItem(new DAChartSeriesItem(endTime,
-                                                       DAChartSeriesItem.SERIES_AREA_END,
-                                                       ColorResources.FILE_LOCK_WAITING,
-                                                       ColorResources.FILE_LOCK_WAITING, false,
-                                                       FilePageLabels.FILE_CHART_TOOLTIP_LOCK_WAIT));
-                               }// else, if endTime <=0, still accessing
+                       case LogCenterConstants.FD_API_TYPE_UNLOCK:
+                               lockSeries.addSeriesItem(new DAChartSeriesItem(
+                                               startTime, DAChartSeriesItem.SERIES_AREA_BAR, 
+                                               ColorResources.FILE_UNLOCK, ColorResources.FILE_UNLOCK, 
+                                               data.getTooltip()));
+                               break;
+                       case LogCenterConstants.FD_API_TYPE_LOCK_AUTORELEASE:
+                               lockSeries.addSeriesItem(new DAChartSeriesItem(
+                                               startTime, DAChartSeriesItem.SERIES_AREA_BAR, 
+                                               ColorResources.FILE_UNLOCK, ColorResources.FILE_UNLOCK, 
+                                               data.getTooltip()));
+                               break;
+                       case LogCenterConstants.FD_API_TYPE_FAIL:
+                               accessSeries.addSeriesItem(new DAChartSeriesItem(
+                                               startTime, DAChartSeriesItem.SERIES_AREA_BAR, 
+                                               ColorResources.FILE_API_FAILED, ColorResources.FILE_API_FAILED, 
+                                               data.getTooltip()));
                                break;
                        }
                }
@@ -251,8 +213,7 @@ public class FileChart {
 
                for(int i =0; i < statusList.size(); i++) {
                        FileStatus data = statusList.get(i);
-                       if(!data.getFilePath().equals(this.filePath)
-                                       || data.getErrNo() != 0) {
+                       if(data.getFileId() != this.fileId) {
                                continue;
                        }
                        double time = Formatter.longTimeToDoubleTime(data.getEventTime());
@@ -309,18 +270,18 @@ public class FileChart {
                }
        }
        
-       public FileChart getChildChart(FileEvent event) {
+       public FileChart getChildChart(FileAccessor accessor) {
                int size = child.size();
                FileChart row;
                for (int i = 0; i < size; i++) {
                        row = child.get(i);
-                       if (row.getPid() == event.getPid()
-                                       && row.getTid() == event.getTid()){
+                       if (row.getFileAccessor().equals(accessor)){
                                return row;
                        }
                }
                return null;
        }
+       
        public DAChartBoardItem getItem() {
                return item;
        }
@@ -358,38 +319,6 @@ public class FileChart {
                this.filePath = filePath;
        }
 
-       public int getPid() {
-               return pid;
-       }
-
-       public void setPid(int pid) {
-               this.pid = pid;
-       }
-
-       public int getTid() {
-               return tid;
-       }
-
-       public void setTid(int tid) {
-               this.tid = tid;
-       }
-       
-       public long getFileSize() {
-               return fileSize;
-       }
-       
-       public void getFileSize(long fileSize) {
-               this.fileSize = fileSize;
-       }
-       
-       public long getFd() {
-               return fd;
-       }
-       
-       public void setFd(long fd) {
-               this.fd = fd;
-       }
-       
        public void setTarget(boolean isTarget) {
                this.isTarget = isTarget;
        }
@@ -405,4 +334,20 @@ public class FileChart {
        public void setChartIndex(int index) {
                this.chartIndex = index;
        }
+       
+       public int getFileId() {
+               return fileId;
+       }
+       
+       public void setFileId(int fileId) {
+               this.fileId = fileId;
+       }
+       
+       public void setFileAccessor(FileAccessor fileAccessor) {
+               this.fileAccessor = fileAccessor;
+       }
+       
+       public  FileAccessor getFileAccessor() {
+               return fileAccessor;
+       }
 }
\ No newline at end of file
index 0ceb3f3..c50b42d 100644 (file)
@@ -28,12 +28,10 @@ package org.tizen.dynamicanalyzer.ui.file;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 
 import org.eclipse.swt.widgets.Composite;
-import org.tizen.dynamicanalyzer.common.DALimit;
 import org.tizen.dynamicanalyzer.communicator.DACommunicator;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.nl.FilePageLabels;
@@ -48,13 +46,13 @@ import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListen
 import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
 import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
 import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
-import org.tizen.dynamicanalyzer.ui.file.data.FileApiDB;
 import org.tizen.dynamicanalyzer.ui.file.manager.FileDataMaker;
 import org.tizen.dynamicanalyzer.ui.file.manager.FileDataManager;
 import org.tizen.dynamicanalyzer.ui.file.model.FileAccess;
-import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
+import org.tizen.dynamicanalyzer.ui.file.model.FileAccessor;
 import org.tizen.dynamicanalyzer.ui.file.model.FileSelectedData;
 import org.tizen.dynamicanalyzer.ui.file.model.FileStatus;
+import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
 import org.tizen.dynamicanalyzer.utils.Formatter;
@@ -72,14 +70,18 @@ public class FileChartBoard extends DAChartBoard {
        private List<FileChart> chartList = new ArrayList<FileChart>();
        private FileDataManager fileChartManager = FileDataManager.getInstance();
        private FileDataMaker dataMaker;
-       private FileApiDB apiDB;
        private int parentChartIndex = -1;
-       private Map<HashSet<Object>, int[]> chartIndexMap = new HashMap<HashSet<Object>, int[]>();
+       private int preSelectionPId = -1;
+       private Map<Integer, int[]> chartIndexMap = new HashMap<Integer, int[]>();
+       public static final int FILE_NAME_MAX_LENGTH = 12;
+       public static final int FILE_NAME_SHOW_LINENUM = 2;
+       public static final int PROCESS_NAME_MAX_LENGTH = 16;
+       public static final int PROCESS_NAME_SHOW_LINENUM = 1;
+       public static final int MAX_LINE = 10;
        
        public FileChartBoard(Composite parent, String title) {
                super(parent, title);
                dataMaker = fileChartManager.getFileChartDataMaker();
-               apiDB = fileChartManager.getApiDB();
        }
 
        @Override
@@ -110,7 +112,7 @@ public class FileChartBoard extends DAChartBoard {
                addNewFileChartRows();
                updateStatusSeries();
                updateAccessSeries();
-               updateApiSeries();
+               chartFilteringByPId();
        }
 
        public void clear() {
@@ -127,33 +129,59 @@ public class FileChartBoard extends DAChartBoard {
                }
        }
 
-       /**
-        * create chart rows
-        */
+       private void chartFilteringByPId() {
+               if (null == getItemList()) {
+                       return;
+               }
+               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
+               if (preSelectionPId != -1 && preSelectionPId != selectedPid) {
+                       return;
+               }
+
+               int parentIndex = 0;
+               for (FileChart chart : chartList) {
+                       if (!chart.isParentChart()) {
+                               continue;
+                       }
+                       if (selectedPid == 0) {
+                               showItem(parentIndex);
+                       } else if (selectedPid == chart.getFileAccessor().getPid()) {
+                               showItem(parentIndex);
+                       } else {
+                               hideItem(parentIndex);
+                       }
+                       parentIndex++;
+               }
+               preSelectionPId = selectedPid;
+       }
+       
        private void addNewFileChartRows() {
                FileChart parent = null;
                FileChart child = null;
                String filePath = null;
-
-               List<FileEvent> eventList = dataMaker.getFileEventList();
-               if (eventList == null) {
-                       // no file event at all.
-                       if(dataMaker.getFileApiList() != null) {
-                               eventList = dataMaker.getFileApiList();
+               boolean isTarget = false;
+               int fileId = 0;
+
+               // 1. get accessorlist from data maker
+               List<FileAccessor> accessorList = dataMaker.getFileAccessor();
+               if (accessorList == null) {
+                       if(dataMaker.getFileAccessorList() != null) {
+                               accessorList = dataMaker.getFileAccessorList();
                        }else {
                                return;
                        }
                }
 
-               for (FileEvent event : eventList) {
-                       filePath = event.getFilePath();
-                       parent = getParentChart(filePath);
+               for (FileAccessor accessor : accessorList) {
+                       filePath = accessor.getFilePath();
+                       fileId = accessor.getFileId();
+                       isTarget = accessor.isTarget();
+                       parent = getParentChart(fileId);
+                       
                        if (parent == null) {
                                parentChartIndex++;
-                               parent = new FileChart(filePath);
-                               child = new FileChart(event.getPid(), event.getTid(),
-                                               event.getFdValue(), event.getFilePath(),
-                                               event.getFileSize(), event.isTarget(), parentChartIndex);
+                               parent = new FileChart(filePath, fileId);
+                               child = new FileChart(accessor,  parentChartIndex, isTarget);
                                parent.addChild(child);
                                parent.setChartIndex(parentChartIndex);
                                createChartItem(null, parent);
@@ -162,11 +190,9 @@ public class FileChartBoard extends DAChartBoard {
                                chartList.add(child);
                                putChartIndextoMap(child, parent);
                        } else {
-                               child = parent.getChildChart(event);
+                               child = parent.getChildChart(accessor);
                                if (child == null) {
-                                       child = new FileChart(event.getPid(), event.getTid(),
-                                                       event.getFdValue(), event.getFilePath(),
-                                                       event.getFileSize(), event.isTarget(), parent.getChartIndex());
+                                       child = new FileChart(accessor, parent.getChartIndex(), isTarget);
                                        parent.addChild(child);
                                        createChartItem(parent, child);
                                        chartList.add(child);
@@ -176,6 +202,7 @@ public class FileChartBoard extends DAChartBoard {
                }
        }
        
+       
        /**
         * Drawing the chart title 1. parent: file name: max 2line, last: ... 2.
         * child: "pid(PID) \n tid(TID)"
@@ -186,29 +213,30 @@ public class FileChartBoard extends DAChartBoard {
        private void createChartItem(FileChart parent, FileChart fileChart) {
                DAChartBoardItem item;
                DAChart chart;
-
                if (parent != null) { // child chart row
                        DAChartBoardItem parentItem = parent.getItem();
                        StringBuffer title = new StringBuffer();
-                       int pid = fileChart.getPid();
+                       //StringBuffer fullTitle = new StringBuffer();
+                       int pid = fileChart.getFileAccessor().getPid();
                        String processName = null;
-                       if(fileChart.isTarget()) {
-                               processName = AnalyzerUtil.getProcessName(fileChart.getPid());
+                       String porcessInfo = fileChart.getFileAccessor().getPid() + "(PID)"//$NON-NLS-1$
+                                       + CommonConstants.NEW_LINE + fileChart.getFileAccessor().getTid() + "(TID)";//$NON-NLS-1$
+                       if(fileChart.getFileAccessor().isTarget()) {
+                               processName = AnalyzerUtil.getProcessName(fileChart.getFileAccessor().getPid());
                        } else {
                                processName = DACommunicator.getProcessNameFromTarget(pid);
                        }
                        if(processName!=null){
-                               processName = splitTitle(processName,  DALimit.MAX_STRING_LENGTH);
-                               title.append(processName + CommonConstants.NEW_LINE);
+                               title.append(processName + CommonConstants.NEW_LINE + porcessInfo);
                        }else{
-                               title.append("unKnown process" + CommonConstants.NEW_LINE);
+                               title.append("unKnown process" + CommonConstants.NEW_LINE + porcessInfo);
                        }
-                       title.append(fileChart.getPid() + "(PID)"
-                                       + CommonConstants.NEW_LINE + fileChart.getTid() + "(TID)");
-                       item = new DAChartBoardItem(parentItem, title.toString());
+                       String name = splitTitle(title.toString(), PROCESS_NAME_MAX_LENGTH, false, PROCESS_NAME_SHOW_LINENUM);
+                       String fullName = splitTitle(title.toString(), PROCESS_NAME_MAX_LENGTH, false, MAX_LINE);
+                       item = new DAChartBoardItem(parentItem, name, fullName);
                        chart = item.getChart();
-                       item.setData(new FileSelectedData(fileChart.getFilePath(), fileChart.getPid(), 
-                                       fileChart.getTid(), fileChart.getFd(), false));
+                       // add a selected data 
+                       item.setData(new FileSelectedData(fileChart.getFileAccessor(),  false));
                        // disable non-target rows
                        if(!fileChart.isTarget()) {
                                item.setSelectable(false);
@@ -216,11 +244,11 @@ public class FileChartBoard extends DAChartBoard {
                        initFileChart(chart, false);
                } else { // parent chart row
                        String fileName = fileChart.getFileName();
-                       String title = splitTitle(fileName,  DALimit.MAX_STRING_LENGTH);
-                       item = new DAChartBoardItem(this, title);
-                       item.setData(new FileSelectedData(fileChart.getFilePath(),
-                                       fileChart.getPid(), fileChart.getTid(), fileChart.getFd(),
-                                       fileChart.getFileSize(), true));
+                       String title = splitTitle(fileName, FILE_NAME_MAX_LENGTH, true, FILE_NAME_SHOW_LINENUM);
+                       String fullName = splitTitle(fileName, FILE_NAME_MAX_LENGTH, true, MAX_LINE);
+                       item = new DAChartBoardItem(this, title, fullName);
+                       // add a selected data
+                       item.setData(new FileSelectedData(fileChart.getFileId(), true));
                        chart = item.getChart();
                        initFileChart(chart, true);
                }
@@ -229,14 +257,6 @@ public class FileChartBoard extends DAChartBoard {
                chart.redraw();
        }
        
-       private String splitTitle(String name, int maxLen) {
-               String title = name;
-               if (name.length() > maxLen ) {
-                       title = name.substring(0, maxLen) + "...";
-               }
-               return title;
-       }
-
        /**
         * update file open status
         */
@@ -259,38 +279,16 @@ public class FileChartBoard extends DAChartBoard {
                if (chartList.size() > 0) {
                        List<FileAccess> accessList = getVisibleAccessList();
                        for (FileChart chart : chartList) {
-                               chart.updateAccessSeries(accessList);
-                       }
-               }
-       }
-
-       /**
-        * update file api
-        */
-       private void updateApiSeries() {
-               if (chartList.size() > 0) {
-                       /*List<FileEvent> apiList = apiDB.selectAPISeries(
-                                       getVisibleStartTime(), getVisibleEndTime());*/
-                       List<FileEvent> apiList = apiDB.selectFailedAPISeries(
-                                       getVisibleStartTime(), getVisibleEndTime());
-                       if (null == apiList) {
-                               // no file event within the selected time range.
-                               return;
-                       }
-                       for (FileChart chart : chartList) {
-                               if (chart.isParentChart()) {
-                                       continue;
+                               if(!chart.isParentChart()) {
+                                       chart.updateAccessSeries(accessList);
                                }
-                               chart.updateApiSeries(apiList);
                        }
-               } else { // chartList.size() <= 0
-                                       // no data at all
                }
        }
 
-       private FileChart getParentChart(String filePath) {
+       private FileChart getParentChart(int id) {
                for (FileChart chart : chartList) {
-                       if (chart.getFilePath().equals(filePath) && chart.isParentChart()) {
+                       if (chart.getFileId()==id && chart.isParentChart()) {
                                return chart;
                        }
                }
@@ -328,33 +326,86 @@ public class FileChartBoard extends DAChartBoard {
        }
 
        private void putChartIndextoMap(FileChart childChart, FileChart parentChart ) {
-               HashSet<Object> set = new HashSet<Object>();
-               set.add(childChart.getFilePath());
-               set.add(childChart.getPid());
-               set.add(childChart.getTid());
-               chartIndexMap.put(set, new int[] { parentChart.getChartIndex(),
-                               parentChart.getLastChildChartIndex() });
+               chartIndexMap.put(childChart.getFileAccessor().getAccessorId(), 
+                               new int[] { parentChart.getChartIndex(), parentChart.getLastChildChartIndex() });
        }
        
-       public int[] getChartIndex(FileEvent event) {
-               HashSet<Object> set = new HashSet<Object>();
-               set.add(event.getFilePath());
-               set.add(event.getPid());
-               set.add(event.getTid());
-               if(chartIndexMap.containsKey(set)) {
-                       return chartIndexMap.get(set);
+       public int[] getChartIndex(int accessorId) {
+               if(chartIndexMap.containsKey(accessorId)) {
+                       return chartIndexMap.get(accessorId);
                }
-               Logger.error("couldn't find index:" + event.getFilePath() + ","
-                               + event.getPid() + "," + event.getTid());
+               Logger.error("couldn't find index:" + accessorId );
                return new int[]{0, 0};
        }
        
+       private String splitTitle(String name, int maxLen, boolean isParent, int line) {
+               String titleString = null;
+               String title[] = null;
+               int i = 1;
+               int len = name.length();
+               if (!isParent) {
+                       title = name.split("\n");
+                       name = title[0];
+               }
+               if (len > maxLen) {
+                       String slice = splitTitle(name, maxLen);
+                       String spare = name.substring(maxLen, name.length());
+                       titleString = slice;
+                       if (spare.length() <= maxLen) {
+                               if (line > 1) {
+                                       titleString += (CommonConstants.NEW_LINE + spare);
+                               } else {
+                                       titleString += "...";//$NON-NLS-1$
+                               }
+                       } else {
+                               while (spare.length() > maxLen) {
+                                       i++;
+                                       slice = splitTitle(spare, maxLen);
+                                       spare = spare.substring(maxLen, spare.length());
+                                       titleString += (CommonConstants.NEW_LINE + slice);
+                                       if (i >= line) {
+                                               break;
+                                       }
+                               }
+                               if (i < line) {
+                                       titleString += (CommonConstants.NEW_LINE + spare);
+                               } else {
+                                       String temp = (titleString.substring(titleString.length()
+                                                       - maxLen, titleString.length() - 3) + "...");//$NON-NLS-1$
+                                       String text = titleString.substring(0, titleString.length()
+                                                       - maxLen);
+                                       text += temp;
+                                       titleString = text;
+                               }
+                       }
+               } else {
+                       titleString = name;
+               }
+               if (!isParent) {
+                       titleString += (CommonConstants.NEW_LINE + title[1]
+                                       + CommonConstants.NEW_LINE + title[2]);
+               }
+               return titleString;
+       }
+
+       private String splitTitle(String text, int maxLen) {
+               String spare = null;
+               int len = text.length();
+               if(len > maxLen) {
+                       spare = text.substring(0, maxLen);
+               }else{
+                       spare = text;
+               }
+               return spare;
+       }
+       
+       
        private void initFileChart(DAChart chart, boolean isParent) {
                if (null == chart) {
                        return;
                }
                DAChartPlot plot = chart.getPlot();
-
+               chart.setChartRenderer(new FileChartRenderer());        // need to custom Chart Render for file chart
                if (isParent) {
                        DAChartSeries statusSeries = new DAChartSeries(
                                        FilePageLabels.FILE_CHART_SERIES,
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChartRenderer.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChartRenderer.java
new file mode 100644 (file)
index 0000000..89490f3
--- /dev/null
@@ -0,0 +1,299 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyeran kim <hyearn74.kim@samsung.com>
+ * Jungwook Ryu <jungwook.ryu@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.file;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartRenderer;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
+import org.tizen.dynamicanalyzer.widgets.helper.ColorResources;
+
+public class FileChartRenderer extends DAChartRenderer {
+       @Override
+       protected void drawToGc(GC gc, DAChart chart) {
+               if (!preDraw(gc, chart)) {
+                       return;
+               }
+               for (int i = 0; i < seriesList.size(); i++) {
+                       drawSeries(gc, seriesList.get(i), i, seriesList.size());
+               }
+       }
+
+       /*
+        * This method is one of Chart renderer. Real chart using this method is
+        * File Analysis chart. This renderer draws Rectangle and bar in multi line
+        * and need specific seriesItem type. Type is possible SERIES_AREA_START,
+        * SERIES_AREA_END, SERIES_AREA_BAR.
+        */
+       private void drawSeries(GC gc, DAChartSeries series, int seriesIndex, int seriesSize) {
+               List<DAChartSeriesItem> seriesItems = series.getSeriesItemList();
+               if (null == seriesItems) {
+                       return;
+               }
+
+               int seriesItemSize = seriesItems.size();
+               if (seriesItemSize < 1) {
+                       return;
+               }
+               int index = series.getPrevIndexByXvalue(plot.getVisibleStartX());
+               if (index < 0) {
+                       index = 0;
+               }
+
+               final int MARGIN_PERCENT = 20; // It's mean 20%
+               final int STATE_AREA_BAR_WIDTH = 1;
+               final int DIAGONAL_DIVIDE = 16; // divided in 16 pieces for diagonal box
+                                                                               // size.
+               final Color DIAGONAL_BOX_COLOR = ColorResources.WHITE;
+               /*
+                * Formula to divide in equal series heights.
+                */
+               int margin = (int) ((r.height * (MARGIN_PERCENT / 100.0)) / (seriesSize + 1));
+               int areaHeight = (r.height - margin * (seriesSize + 1)) / seriesSize;
+               int pixcelStartY = (margin * (seriesIndex + 1)) + (areaHeight * seriesIndex);
+
+               List<DAChartSeriesItem> barSeriesItems = new ArrayList<DAChartSeriesItem>();
+               /*
+                * 1. Draw Start/End Status Area.
+                */
+               for (int i = 0; i < seriesItemSize; i++) {
+                       DAChartSeriesItem seriesItem = seriesItems.get(i);
+                       DAChartSeriesItem endSeriesItem = null;
+
+                       int type = (int) seriesItem.getY();
+                       if (DAChartSeriesItem.SERIES_AREA_START == type) {
+                               int startCount = 1;
+                               /*
+                                * Find end series item matched with start series item.
+                                */
+                               for (int ii = i + 1; ii < seriesItemSize; ii++) {
+                                       DAChartSeriesItem nextSeriesItem = seriesItems.get(ii);
+                                       int nextType = (int) nextSeriesItem.getY();
+                                       if (nextType == DAChartSeriesItem.SERIES_AREA_START) {
+                                               startCount += 1;
+                                       } else if (nextType == DAChartSeriesItem.SERIES_AREA_END) {
+                                               --startCount;
+                                               if (startCount == 0) {
+                                                       endSeriesItem = nextSeriesItem;
+                                                       break;
+                                               }
+                                       }
+                               }
+                               Color foreGroundColor = seriesItem.getGradationForegroundColor();
+                               Color backGroundcolor = seriesItem.getColor();
+                               gc.setForeground(foreGroundColor);
+                               gc.setBackground(backGroundcolor);
+
+                               int pixcelStartX = plot.getXPixcelFromX(seriesItem.getX(), r);
+                               int pixcelWidth;
+                               if (endSeriesItem != null) {
+                                       pixcelWidth = plot.getXPixcelFromX(endSeriesItem.getX(), r) - pixcelStartX;
+                               } else {
+                                       /*
+                                        * endSeriesItem is null when end series is not exist. this
+                                        * case, draw it as much as getValidEndX.
+                                        */
+                                       pixcelWidth = plot.getXPixcelFromX(plot.getValidEndX(), r) - pixcelStartX;
+                               }
+                               if (pixcelWidth == 0) { // If diffence is less than 1 second.
+                                                                               // draw 1 pixcel force.
+                                       pixcelWidth = 1;
+                               }
+                               gc.fillRectangle(pixcelStartX, pixcelStartY, pixcelWidth, areaHeight);
+
+                               /*
+                                * If it's needed, draw diagonal line. diagonal line is composed
+                                * of square boxes. Direction of diagonal line is right top to
+                                * left down like "/".
+                                */
+                               if (seriesItem.getDiagonal()) {
+                                       int diagonalBoxSize = areaHeight / DIAGONAL_DIVIDE;
+                                       gc.setForeground(DIAGONAL_BOX_COLOR);
+                                       gc.setBackground(DIAGONAL_BOX_COLOR);
+                                       for (int j = 0; j < 16; j++) {
+                                               int boxY = pixcelStartY + (diagonalBoxSize * j);
+                                               // Formula to draw diagonal line like "/"
+                                               for (int k = 3 - (j % 4) - (j / 4); k < pixcelWidth; k = k + 3) {
+                                                       int boxX = diagonalBoxSize * k + pixcelStartX;
+                                                       if (pixcelStartX <= boxX && boxX <= pixcelWidth + pixcelStartX - diagonalBoxSize) {
+                                                               gc.fillRectangle(boxX, boxY, diagonalBoxSize, diagonalBoxSize);
+                                                       }
+                                               }
+                                       }
+                               }
+                       } else if (DAChartSeriesItem.SERIES_AREA_BAR == type) {
+                               barSeriesItems.add(seriesItem);
+                       }
+               }
+
+               /*
+                * 2. Draw Bar series
+                */
+               for (int i = 0; i < barSeriesItems.size(); i++) {
+                       DAChartSeriesItem barSeriesItem = barSeriesItems.get(i);
+                       Color foreGroundColor = barSeriesItem.getGradationForegroundColor();
+                       Color backGroundcolor = barSeriesItem.getColor();
+                       gc.setForeground(foreGroundColor);
+                       gc.setBackground(backGroundcolor);
+                       int pixcelStartX = plot.getXPixcelFromX(barSeriesItem.getX(), r);
+                       gc.fillRectangle(pixcelStartX, pixcelStartY, STATE_AREA_BAR_WIDTH, areaHeight);
+               }
+       }
+
+       @Override
+       protected void drawTooltip(GC gc) {
+               DAChartPlotTooltip tooltip = plot.getTooltip();
+               if (tooltip == null || tooltip.shouldBeDrawn() == false || tooltip.getStartVal() == -1) {
+                       return;
+               }
+
+               gc.setFont(tooltip.getFont());
+
+               List<String> tooltipTexts = new ArrayList<String>();
+               List<String> tooltipTimes = new ArrayList<String>();
+               List<Color> tooltipColor = new ArrayList<Color>();
+
+               // make text,time & draw auxiliary line
+               int textWidthMax = 0;
+               double realXVal = tooltip.getStartVal();
+               int tooltipSize = 0;
+
+               int seriesIndex = (int) (seriesList.size() * tooltip.getYPosRatio());
+               DAChartSeries series = seriesList.get(seriesIndex);
+
+               int index = series.getPrevIndexByXvalue(realXVal);
+               String text = "";
+               String time = "";
+               Color color;
+               if (index >= 0) {
+                       double xVal = series.getSeriesItemList().get(index).getX();
+
+                       text += series.getName() + ": ";
+                       time += toTimeFormat(xVal);
+
+                       if (true == series.isSummarizeTooltip() && true == checkOverlapFromPrevItem(series, index)) {
+                               text += series.getSummarizeString();
+                       } else {
+                               text += series.getSeriesItemList().get(index).getTooltipText();
+                       }
+
+                       gc.setForeground(tooltip.getLineColor());
+                       gc.setLineStyle(SWT.LINE_DOT);
+                       gc.setLineWidth(1);
+                       gc.drawLine(plot.getXPixcelFromX(xVal), 0, plot.getXPixcelFromX(xVal), r.height);
+                       gc.setLineStyle(SWT.LINE_CUSTOM);
+
+                       // event color
+                       color = series.getSeriesItemList().get(index).getColor();
+               } else {
+                       return;
+               }
+
+               tooltipTexts.add(text);
+               tooltipTimes.add(time);
+               tooltipColor.add(color);
+
+               int textWidth = gc.textExtent(text).x + DAChartPlotTooltip.TOOLTIP_TIME_MARGIN + gc.textExtent(time).x;
+               if (textWidthMax < textWidth) {
+                       textWidthMax = textWidth;
+               }
+
+               /*
+                * Drawing Tooltip Box
+                */
+               int preTextWidthMargin = DAChartPlotTooltip.TOOLTIP_MARGIN + DAChartPlotTooltip.TOOLTIP_SERIES_RECT_LENGTH
+                               + DAChartPlotTooltip.TOOLTIP_MARGIN;
+               int startX = getTooltipStartX(realXVal, textWidthMax + preTextWidthMargin, DAChartPlotTooltip.TOOLTIP_MARGIN);
+
+               int totalHeight;
+               if (!tooltipTexts.isEmpty()) {
+                       totalHeight = gc.textExtent(tooltipTexts.get(0)).y + DAChartPlotTooltip.TOOLTIP_MARGIN
+                                       + DAChartPlotTooltip.TOOLTIP_MARGIN;
+               } else {
+                       totalHeight = DAChartPlotTooltip.TOOLTIP_TEXT_HEIGHT + DAChartPlotTooltip.TOOLTIP_MARGIN
+                                       + DAChartPlotTooltip.TOOLTIP_MARGIN;
+               }
+
+               int startY;
+               tooltipSize = seriesList.size();
+               int heightPerSeries = r.height / tooltipSize;
+               int currentSeries = ((int) (tooltip.getYPosRatio() * tooltipSize) + 1);
+               startY = r.y + (heightPerSeries * (currentSeries - 1)) + (heightPerSeries / 2) - (totalHeight / 2);
+               if (r.height - startY - totalHeight < 0) {
+                       startY = r.height - totalHeight - 1;
+                       if (startY < 0) {
+                               startY = DAChartPlotTooltip.TOOLTIP_MARGIN;
+                       }
+               }
+               gc.setAlpha(150);
+               gc.setBackground(tooltip.getBackgroundColor());
+               gc.setForeground(tooltip.getForegroundColor());
+               gc.fillGradientRectangle(startX, startY, preTextWidthMargin + textWidthMax + DAChartPlotTooltip.TOOLTIP_MARGIN,
+                               totalHeight, true);
+               gc.setAlpha(255);
+               gc.setForeground(tooltip.getLineColor());
+               gc.drawRoundRectangle(startX, startY, preTextWidthMargin + textWidthMax + DAChartPlotTooltip.TOOLTIP_MARGIN,
+                               totalHeight, 5, 5);
+               gc.setFont(tooltip.getFont());
+
+               /*
+                * Drawing Tooltip contents (color square, text, time)
+                */
+               int y = startY + DAChartPlotTooltip.TOOLTIP_MARGIN;
+               Color col = tooltipColor.get(0);
+               if (col == null) {
+                       gc.setBackground(series.getColor());
+               } else {
+                       gc.setBackground(col);
+               }
+
+               gc.fillRectangle(startX + DAChartPlotTooltip.TOOLTIP_MARGIN, y + DAChartPlotTooltip.TOOLTIP_TEXT_HEIGHT / 2
+                               - DAChartPlotTooltip.TOOLTIP_SERIES_RECT_LENGTH / 2, DAChartPlotTooltip.TOOLTIP_SERIES_RECT_LENGTH,
+                               DAChartPlotTooltip.TOOLTIP_SERIES_RECT_LENGTH);
+               gc.setBackground(tooltip.getBackgroundColor());
+
+               gc.setForeground(tooltip.getTextColor());
+               gc.drawText(tooltipTexts.get(0), startX + DAChartPlotTooltip.TOOLTIP_MARGIN
+                               + DAChartPlotTooltip.TOOLTIP_SERIES_RECT_LENGTH + DAChartPlotTooltip.TOOLTIP_MARGIN, y,
+                               SWT.DRAW_DELIMITER | SWT.DRAW_TRANSPARENT);
+
+               gc.setForeground(tooltip.getTimeColor());
+               String timeStr = tooltipTimes.get(0);
+               gc.drawText(tooltipTimes.get(0), startX + DAChartPlotTooltip.TOOLTIP_MARGIN
+                               + DAChartPlotTooltip.TOOLTIP_SERIES_RECT_LENGTH + DAChartPlotTooltip.TOOLTIP_MARGIN + textWidthMax
+                               - DAChartPlotTooltip.TOOLTIP_MARGIN - gc.textExtent(timeStr).x, y, SWT.DRAW_DELIMITER
+                               | SWT.DRAW_TRANSPARENT);
+       }
+}
index a61c7f1..9e7f52a 100644 (file)
 
 package org.tizen.dynamicanalyzer.ui.file;
 
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import org.eclipse.swt.custom.StackLayout;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.nl.FilePageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
@@ -39,7 +42,6 @@ import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.ui.common.SetRangeMarkerMouseMoveListener;
 import org.tizen.dynamicanalyzer.ui.common.UICommonConstants;
 import org.tizen.dynamicanalyzer.ui.file.manager.FileDataManager;
-import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.ui.timeline.logparser.LifecycleLogParser;
@@ -80,19 +82,13 @@ public class FileChartView extends DAViewComposite {
                        @Override
                        public void handleSelectionEvent(DAChartBoardItem item) {
                                lastSelectedItemForSummary = item;
-                               AnalyzerManager
-                                               .getCurrentPage().updateView(
-                                                               new DASelectionData(
-                                                                               FilePage.chartViewID,
-                                                                               (long) (((DAChartPlotIntervalMarker) fileChartBoard
-                                                                                               .getMarkers()
-                                                                                               .get(UICommonConstants.SELECTION_MARKER_INDEX))
-                                                                                               .getStartVal() * TimelineConstants.MEGA_DOUBLE),
-                                                                               (long) (((DAChartPlotIntervalMarker) fileChartBoard
-                                                                                               .getMarkers()
-                                                                                               .get(UICommonConstants.SELECTION_MARKER_INDEX))
-                                                                                               .getEndVal() * TimelineConstants.MEGA_DOUBLE),
-                                                                               item.getData(), null));
+                               DAChartPlotIntervalMarker intervalMarker = (DAChartPlotIntervalMarker) fileChartBoard
+                                               .getMarkers().get(UICommonConstants.SELECTION_MARKER_INDEX);
+                               long selectiedStartTime = (long) (intervalMarker.getStartVal() * TimelineConstants.MEGA_DOUBLE);
+                               long selectiedEndTime = (long) (intervalMarker.getEndVal() * TimelineConstants.MEGA_DOUBLE);
+                               AnalyzerManager.getCurrentPage().updateView(
+                                                               new DASelectionData(FilePage.chartViewID, 
+                                                                               selectiedStartTime, selectiedEndTime, item.getData(), null));
                        }
                });
 
@@ -165,19 +161,29 @@ public class FileChartView extends DAViewComposite {
                                if (null != obData && (obData instanceof LogData)) { // summary
                                        LogData ldata = (LogData) obData;
                                        dataTime = ldata.getTime();
+                                       
                                        long seq = ldata.getSeq();
-                                       FileEvent event = chartManager.getApiDB().selectFileEventBySeq(seq);
-                                       if(event != null) {
-                                               int selectedIndex[] = fileChartBoard.getChartIndex(event);
-                                               fileChartBoard.selectItem(selectedIndex[0], selectedIndex[1]);
-                                               if (null != lastSelectedItemForSummary) {
-                                                       AnalyzerManager.getCurrentPage().updateView(
-                                                                       new DASelectionData(FilePage.chartViewID,
-                                                                                       dataTime, dataTime,
-                                                                                       lastSelectedItemForSummary.getData(),
-                                                                                       null));
+                                        
+                                       ResultSet rs = chartManager.getApiDB().selectFileEventBySeq(seq);
+                                       if (rs != null) {
+                                               try {
+                                                       if (rs.next()) {
+                                                               int selectedIndex[] = fileChartBoard.getChartIndex(rs.getInt(1));
+                                                               fileChartBoard.selectItem(selectedIndex[0], selectedIndex[1]);
+                                                               if (null != lastSelectedItemForSummary) {
+                                                                       AnalyzerManager.getCurrentPage().updateView(
+                                                                                       new DASelectionData(FilePage.chartViewID,
+                                                                                                       dataTime, dataTime,
+                                                                                                       lastSelectedItemForSummary.getData(),
+                                                                                                       null));
+                                                               }
+                                                       }
+                                               } catch (SQLException e) {
+                                                       e.printStackTrace();
+                                               } finally {
+                                                       SqlConnectionManager.releaseResultSet(rs);
                                                }
-                                       } // else, no need to update
+                                       }
                                }
                        } else {
                                dataTime = selData.getStartTime();
index 342f38c..44980d5 100644 (file)
@@ -26,7 +26,8 @@
 
 package org.tizen.dynamicanalyzer.ui.file;
 
-import java.util.List;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.PaintEvent;
@@ -34,22 +35,30 @@ import org.eclipse.swt.events.PaintListener;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Canvas;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.nl.AnalyzerLabels;
 import org.tizen.dynamicanalyzer.nl.FilePageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.ui.file.manager.FileDataManager;
-import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
+import org.tizen.dynamicanalyzer.ui.file.model.FileAccessor;
 import org.tizen.dynamicanalyzer.ui.file.model.FileSelectedData;
 import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite;
 import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData;
 
 public class FileDetailInfoView extends DAViewComposite {
+       
        private Canvas canvas = null;
        private String fileName = AnalyzerLabels.EMPTY_STRING;
        private String filePath = AnalyzerLabels.EMPTY_STRING;
@@ -60,7 +69,10 @@ public class FileDetailInfoView extends DAViewComposite {
        private int failedApiCount = 0;
 
        private FileDataManager fileChartManager = FileDataManager.getInstance();
-
+       
+       private Text detailText = null;
+       private Label labelMessage = null;
+       
        private void init() {
                fileName = AnalyzerLabels.EMPTY_STRING;
                filePath = AnalyzerLabels.EMPTY_STRING;
@@ -76,49 +88,37 @@ public class FileDetailInfoView extends DAViewComposite {
                this.setLayout(new FillLayout());
 
                setTitle(FilePageLabels.FILE_DETAILS_TITLE);
+               
+               Composite detailCom = getContentArea();
+               detailCom.setBackground(ColorResources.VIEW_BG_COLOR);
+               detailCom.setLayout(new FormLayout());
+               FormData labelData = new FormData();
+               labelData.top = new FormAttachment(0, 0);
+               labelData.left = new FormAttachment(0, 0);
+               labelData.right = new FormAttachment(100, 0);
+               labelData.bottom = new FormAttachment(100, 0);
+               detailCom.setLayoutData(labelData);
 
-               Composite contents = getContentArea();
+               Composite contents = detailCom;
                contents.setBackground(ColorResources.VIEW_BG_COLOR);
-               contents.setLayout(new FillLayout());
-               canvas = new Canvas(contents, SWT.TRANSPARENT);
-               canvas.addPaintListener(new PaintListener() {
-
-                       @Override
-                       public void paintControl(PaintEvent e) {
-                               int x = 0;
-                               int y = 0;
-                               Rectangle rect = canvas.getBounds();
-                               e.gc.setBackground(ColorResources.VIEW_BG_COLOR);
-                               e.gc.fillRectangle(rect.x, rect.y, rect.width, rect.height);
-                               e.gc.setForeground(ColorResources.TABLE_CONTENTS_FONT_COLOR);
-                               e.gc.setFont(FontResources.DETAIL_INFO_FONT);
-
-                               String pathLabel = FilePageLabels.FILE_DETAILS_FILE_PATH;
-                               Point pathSize = e.gc.textExtent(pathLabel, SWT.DRAW_MNEMONIC);
-                               int fontHeight = pathSize.y + 5;
-                               e.gc.drawString(FilePageLabels.FILE_DETAILS_FILE_PATH
-                                               + filePath, x + 10, y += fontHeight);
-                               
-                               e.gc.drawString( FilePageLabels.FILE_DETAILS_FILE_NAME 
-                                               + fileName, x += 10, y += fontHeight);
-                               
-                               e.gc.drawString(
-                                               FilePageLabels.FILE_DETAILS_TOTAL_SIZE
-                                                               + Long.toString(fileSize), x, y += fontHeight);
-                               e.gc.drawString(
-                                               FilePageLabels.FILE_DETAILS_READ_SIZE
-                                                               + Long.toString(readSize), x, y += fontHeight);
-                               e.gc.drawString(
-                                               FilePageLabels.FILE_DETAILS_WRITE_SIZE
-                                                               + Long.toString(writeSize), x, y += fontHeight);
-                               e.gc.drawString(
-                                               FilePageLabels.FILE_DETAILS_API_COUNT
-                                                               + Integer.toString(apiCount), x,
-                                               y += fontHeight);
-                               e.gc.drawString(FilePageLabels.FILE_DETAILS_FAILED_API_COUNT
-                                               + Integer.toString(failedApiCount), x, y += fontHeight);
-                       }
-               });
+               contents.setLayout(new FormLayout());
+
+               detailText = new Text(contents, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+               detailText.setBackground(ColorResources.VIEW_BG_COLOR);
+               detailText.setForeground(ColorResources.TABLE_CONTENTS_FONT_COLOR);
+               detailText.setFont(FontResources.DETAIL_INFO_FONT);
+
+               FormData buttonData = new FormData();
+               buttonData.top = new FormAttachment(labelMessage, 0);
+               buttonData.left = new FormAttachment(0, 0);
+               buttonData.right = new FormAttachment(100, 0);
+               buttonData.bottom = new FormAttachment(100, 0);
+               detailText.setLayoutData(buttonData);
+               detailText.getVerticalBar().setVisible(true);
+               detailText.getHorizontalBar().setVisible(true);
+               
+               showDetailInfoContents();
+
        }
 
        @Override
@@ -140,61 +140,122 @@ public class FileDetailInfoView extends DAViewComposite {
 
        private void updateData(FileSelectedData selectData) {
                failedApiCount = 0;
-               List<FileEvent> events = null;
-               events = fileChartManager.getApiDB().selectAPITable(
-                               selectData.getFilePath(), selectData.getPid(),
-                               selectData.getTid(), selectData.isParentChart());
-               if (events != null) {
-                       filePath = events.get(0).getFilePath();
-                       fileName = events.get(0).getFileName();
-                       fileSize = events.get(events.size()-1).getFileSize();
-                       
-                       long readSize = 0;
-                       long writeSize = 0;
-                       int apiCount = events.size();
-                       for(FileEvent data : events) {
-                               switch(data.getFdApiType()) {
-                               case LogCenterConstants.FD_API_TYPE_OPEN:
-                               case LogCenterConstants.FD_API_TYPE_CLOSE:
-                               case LogCenterConstants.FD_API_TYPE_OTHERS:
-                               case LogCenterConstants.FD_API_TYPE_UNLOCK:
-                                       if(data.getErrno() != 0) {
-                                               failedApiCount++;
-                                       }
-                                       break;
-                               case LogCenterConstants.FD_API_TYPE_LOCK_END:
-                                       if(data.getErrno() != 0) {
-                                               failedApiCount++;
-                                       }
-                                       apiCount--;
-                                       break;
-                               case LogCenterConstants.FD_API_TYPE_READ_END:
-                                       if(data.getErrno() != 0) {
-                                               failedApiCount++;
+               ResultSet rs = fileChartManager.getApiDB().selectAPI(
+                               selectData.getFileId(),
+                               selectData.getAccessorId(),
+                               selectData.isParentChart());
+               boolean isParentChart = selectData.isParentChart();
+               FileAccessor accessor = selectData.getFileAccessor();
+               String path = null;
+               if (rs != null) {
+                       try {
+                               long readSize = 0;
+                               long writeSize = 0;
+                               int apiCount = 0;
+                               
+                               while (rs.next()) {
+                                       apiCount++;
+                                       if(rs.isFirst()) {
+                                               if(isParentChart){
+                                                       path = rs.getString(11);
+                                               }else{
+                                                       path = accessor.getFilePath();
+                                               }
+                                               boolean isFindSpliter = false;
+                                               for(int i= path.length()-1; i > 0; i--) {
+                                                       char character = path.charAt(i);
+                                                       if(Character.toString(character).matches("\\/")) { //$NON-NLS-1$*/
+                                                               filePath = path.substring(0, i+1);
+                                                               fileName = path.substring(i+1, path.length());
+                                                               isFindSpliter = true;
+                                                               break;
+                                                       }
+                                               }
+                                               if(!isFindSpliter) {
+                                                       fileName = path;
+                                                       filePath = AnalyzerLabels.EMPTY_STRING;
+                                               }
+                                       }else if(rs.isLast()) {
+                                               fileSize = rs.getLong(7);
                                        }
-                                       readSize += data.getSize();
-                                       // except *_end event among the API count
-                                       apiCount--;
-                                       break;
-                               case LogCenterConstants.FD_API_TYPE_WRITE_END:
-                                       if(data.getErrno() != 0) {
-                                               failedApiCount++;
+                                       int apiType = rs.getInt(3);
+                                       long errno = rs.getInt(6);
+                                       long ioSize = rs.getLong(8);
+                                       
+                                       switch(apiType) {
+                                       case LogCenterConstants.FD_API_TYPE_OPEN:
+                                       case LogCenterConstants.FD_API_TYPE_CLOSE:
+                                       case LogCenterConstants.FD_API_TYPE_OTHERS:
+                                       case LogCenterConstants.FD_API_TYPE_UNLOCK:
+                                               if(errno != 0) {
+                                                       failedApiCount++;
+                                               }
+                                               break;
+                                       case LogCenterConstants.FD_API_TYPE_LOCK_END:
+                                               if(errno != 0) {
+                                                       failedApiCount++;
+                                               }
+                                               apiCount--;
+                                               break;
+                                       case LogCenterConstants.FD_API_TYPE_READ_END:
+                                               if(errno != 0) {
+                                                       failedApiCount++;
+                                               }
+                                               readSize += ioSize;
+                                               // except *_end event among the API count
+                                               apiCount--;
+                                               break;
+                                       case LogCenterConstants.FD_API_TYPE_WRITE_END:
+                                               if(errno != 0) {
+                                                       failedApiCount++;
+                                               }
+                                               writeSize += ioSize;
+                                               // except *_end event among the API count
+                                               apiCount--;
+                                               break;
+                                       default:
+                                               break;
                                        }
-                                       writeSize += data.getSize();
-                                       // except *_end event among the API count
-                                       apiCount--;
-                                       break;
-                               default:
-                                       break;
                                }
+                               this.apiCount = apiCount;
+                               this.readSize = readSize;
+                               this.writeSize = writeSize;
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
                        }
-                       this.apiCount = apiCount;
-                       this.readSize = readSize;
-                       this.writeSize = writeSize;
+                       
+                       showDetailInfoContents();
                }
-               canvas.redraw();
        }
 
+       private void showDetailInfoContents() {
+               StringBuffer strDetailView = new StringBuffer(CommonConstants.DOUBLE_NEW_LINE);
+               strDetailView.append(CommonConstants.DOUBLE_SPACE + FilePageLabels.FILE_DETAILS_FILE_PATH );
+               strDetailView.append(filePath);
+               strDetailView.append(CommonConstants.DOUBLE_NEW_LINE);
+               strDetailView.append(CommonConstants.DOUBLE_SPACE + FilePageLabels.FILE_DETAILS_FILE_NAME);
+               strDetailView.append(fileName);
+               strDetailView.append(CommonConstants.DOUBLE_NEW_LINE);
+               strDetailView.append(CommonConstants.DOUBLE_SPACE + FilePageLabels.FILE_DETAILS_TOTAL_SIZE);
+               strDetailView.append(fileSize);
+               strDetailView.append(CommonConstants.DOUBLE_NEW_LINE);
+               strDetailView.append(CommonConstants.DOUBLE_SPACE + FilePageLabels.FILE_DETAILS_READ_SIZE);
+               strDetailView.append(readSize);
+               strDetailView.append(CommonConstants.DOUBLE_NEW_LINE);
+               strDetailView.append(CommonConstants.DOUBLE_SPACE + FilePageLabels.FILE_DETAILS_WRITE_SIZE);
+               strDetailView.append(writeSize);
+               strDetailView.append(CommonConstants.DOUBLE_NEW_LINE);
+               strDetailView.append(CommonConstants.DOUBLE_SPACE + FilePageLabels.FILE_DETAILS_API_COUNT);
+               strDetailView.append(apiCount);
+               strDetailView.append(CommonConstants.DOUBLE_NEW_LINE);
+               strDetailView.append(CommonConstants.DOUBLE_SPACE + FilePageLabels.FILE_DETAILS_FAILED_API_COUNT);
+               strDetailView.append(failedApiCount);
+               strDetailView.append(CommonConstants.DOUBLE_NEW_LINE);
+               detailText.setText(strDetailView.toString());
+       }
+       
        @Override
        public Control getControl() {
                return canvas;
@@ -203,6 +264,6 @@ public class FileDetailInfoView extends DAViewComposite {
        @Override
        public void clear() {
                init();
-               canvas.redraw();
+               showDetailInfoContents();
        }
 }
index a67867d..4ea9582 100644 (file)
@@ -27,6 +27,7 @@
 package org.tizen.dynamicanalyzer.ui.file.data;
 
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
@@ -38,100 +39,113 @@ import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.nl.FilePageLabels;
 import org.tizen.dynamicanalyzer.ui.file.model.FileAccess;
 
-// read, write, lock
 public class FileAccessDB extends DBTable {
-       private static final String TABLE_NAME = FilePageLabels.FILE_ACCESS_DB;
-
+       private static final String ACCESS_TABLE = FilePageLabels.FILE_ACCESS_DB;
+       private static final String DBTYPE_TOOLTIP = "VARCHAR(256)";//$NON-NLS-1$
+       
        public static enum COLUMN {
-               PID(0, "pid"),
-               TID(1, "tid"),
-               FILE_PATH(2, "filePath"),
-               FD(3, "fd"),
-               API_TYPE(4, "apiType"),
-               START_TIME(5, "startTime"),
-               END_TIME(6, "endTime"),
-               ERRNO(7, "errNo"),
-               FILE_SIZE(8, "fileSize");
+               ACCESSOR_ID(1, "ACCESSOR_ID"),
+               API_TYPE(2, "API_TYPE"),
+               START_TIME(3, "START_TIME"),
+               END_TIME(4, "END_TIME"),
+               TOOLTIP(5, "TOOLTIP");
                
-               private final int value;
+               private final int index;
                private final String name;
-               private COLUMN(int value, String name) {
-                       this.value = value;
+               private COLUMN(int index, String name) {
+                       this.index = index;
                        this.name = name;
                }
 
-               public int getValue() {
-                       return value;
+               public int getIndex() {
+                       return index;
                }
                
                public String getName() {
                        return name;
                }
        }
-               
+
        public FileAccessDB() {
-               addColumn(new DBColumn(COLUMN.PID.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.TID.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.FILE_PATH.getName(), DBConstants.EMPTY, DBConstants.BIG_TEXT));
-               addColumn(new DBColumn(COLUMN.FD.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.API_TYPE.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.START_TIME.getName(), DBConstants.NOT_NULL, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.END_TIME.getName(), DBConstants.NOT_NULL, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.ERRNO.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.FILE_SIZE.getName(), DBConstants.EMPTY, DBConstants.LONG));
+               addColumn(new DBColumn(COLUMN.ACCESSOR_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.API_TYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.START_TIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.END_TIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.TOOLTIP.name, DBConstants.EMPTY, DBTYPE_TOOLTIP));
        }
        
        @Override
        public String getTableName() {
-               return TABLE_NAME;
+               return ACCESS_TABLE;
        }
 
        private static final String selectAll = selectAll();
        private static final String SELECT_QUERY = "select "
                        + selectAll
-                       + " from " + TABLE_NAME; //$NON-NLS-1$
+                       + " from " + ACCESS_TABLE; 
+       
+       public List<FileAccess> executeQueryRS(String query) {
+               List<FileAccess> resultData = new ArrayList<FileAccess>();
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               if (rs != null) {
+                       try {
+                               while (rs.next()) {
+                                       FileAccess access= getDataFromResultSet(rs);
+                                       if (access != null) {
+                                               resultData.add(access);
+                                       }
+                               }
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
+                       }
+               }
+               return resultData;
+       }
+       
+       public FileAccess getDataFromResultSet(ResultSet rs) {
+               FileAccess access = null;
+               try {
+                       access = new FileAccess(
+                                       rs.getInt(COLUMN.ACCESSOR_ID.index),
+                                       rs.getInt(COLUMN.API_TYPE.index),
+                                       rs.getLong(COLUMN.START_TIME.index),
+                                       rs.getLong(COLUMN.END_TIME.index),
+                                       rs.getString(COLUMN.TOOLTIP.index)
+                                       );
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               return access;
+       }
        
        public void insert(FileAccess insertData) {
                List<List<Object>> insertDataList = new ArrayList<List<Object>>();
                insertDataList.add(insertData.getDBData());
                insertData(insertDataList);
        }
-
+       
        public List<FileAccess> select() {
                String query = String.format(SELECT_QUERY);
                
                List<FileAccess> accessList = new ArrayList<FileAccess>();
-               
-               List<List<Object>> result = SqlConnectionManager.executeQuery(query);
-               if (null == result || result.size() == 0 || result.get(0).size() == 0) {
-                       return accessList;
-               }
-               
-               for (List<Object> data : result) {
-                       accessList.add(new FileAccess(data));
-               }
+               accessList = executeQueryRS(query);
                return accessList;
        }
-       
+
        public static String selectAll() {
                StringBuffer selectAllColumn = new StringBuffer();
-               selectAllColumn.append(COLUMN.PID.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.TID.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FILE_PATH.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FD.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.API_TYPE.getName());
+               selectAllColumn.append(COLUMN.ACCESSOR_ID.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.START_TIME.getName());
+               selectAllColumn.append(COLUMN.API_TYPE.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.END_TIME.getName());
+               selectAllColumn.append(COLUMN.START_TIME.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.ERRNO.getName());
+               selectAllColumn.append(COLUMN.END_TIME.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FILE_SIZE.getName());
+               selectAllColumn.append(COLUMN.TOOLTIP.name);
                return selectAllColumn.toString();
        }
        
@@ -144,15 +158,11 @@ public class FileAccessDB extends DBTable {
                        isPrepared = false;
                } else {
                        try {
-                               prep.setInt(1, (Integer)(rowData.get(COLUMN.PID.getValue())));
-                               prep.setInt(2, (Integer)(rowData.get(COLUMN.TID.getValue())));
-                               prep.setString(3, (String)(rowData.get(COLUMN.FILE_PATH.getValue())));
-                               prep.setLong(4, (Long)(rowData.get(COLUMN.FD.getValue())));
-                               prep.setInt(5, (Integer)(rowData.get(COLUMN.API_TYPE.getValue())));
-                               prep.setLong(6, (Long)(rowData.get(COLUMN.START_TIME.getValue())));
-                               prep.setLong(7, (Long)(rowData.get(COLUMN.END_TIME.getValue())));
-                               prep.setLong(8, (Long)(rowData.get(COLUMN.ERRNO.getValue())));
-                               prep.setLong(9, (Long)(rowData.get(COLUMN.FILE_SIZE.getValue())));
+                               prep.setInt(1, (Integer)(rowData.get(0)));
+                               prep.setInt(2, (Integer)(rowData.get(1)));
+                               prep.setLong(3, (Long)(rowData.get(2)));
+                               prep.setLong(4, (Long)(rowData.get(3)));
+                               prep.setString(5, (String)(rowData.get(4)));
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/data/FileAccessorDB.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/data/FileAccessorDB.java
new file mode 100644 (file)
index 0000000..b75f87d
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyeran Kim <Hyeran74.kim@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.file.data;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
+import org.tizen.dynamicanalyzer.nl.FilePageLabels;
+import org.tizen.dynamicanalyzer.ui.file.model.FileAccessor;
+
+public class FileAccessorDB  extends DBTable {
+       private static final String ACCESSOR_TABLE = FilePageLabels.FILE_ACCESSOR_DB;
+       private static final String DBTYPE_FILEPATH = "VARCHAR(4096)";//$NON-NLS-1$
+
+       public static enum COLUMN {
+               ACCESSOR_ID(1, "ACCESSOR_ID"),
+               FILE_ID(2, "FILE_ID"),
+               FILE_PATH(3, "FILE_PATH"),
+               PID(4, "PID"),
+               TID(5, "TID"),
+               IS_TARGET(6, "IS_TARGET");
+               
+               
+               private final int index;
+               private final String name;
+               private COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+
+               public int getIndex() {
+                       return index;
+               }
+               
+               public String getName() {
+                       return name;
+               }
+       }
+               
+       public FileAccessorDB() {
+               addColumn(new DBColumn(COLUMN.ACCESSOR_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.FILE_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.FILE_PATH.name, DBConstants.NOT_NULL, DBTYPE_FILEPATH));
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.IS_TARGET.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_BOOLEAN));
+       }
+       
+       
+       @Override
+       public String getTableName() {
+               return ACCESSOR_TABLE;
+       }
+
+       private static final String selectAll = selectAll();
+       private static final String SELECT_QUERY = "select "
+                       + selectAll
+                       + " from " + ACCESSOR_TABLE; //$NON-NLS-1$
+       
+       public List<FileAccessor> executeQueryRS(String query) {
+               List<FileAccessor> resultData = new ArrayList<FileAccessor>();
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               if (rs != null) {
+                       try {
+                               while (rs.next()) {
+                                       FileAccessor accessor = getDataFromResultSet(rs);
+                                       if (accessor != null) {
+                                               resultData.add(accessor);
+                                       }
+                               }
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
+                       }
+               }
+               return resultData;
+       }
+       
+       public FileAccessor getDataFromResultSet(ResultSet rs) {
+               FileAccessor accessor = null;
+               try {
+                       accessor = new FileAccessor(
+                                       rs.getInt(COLUMN.ACCESSOR_ID.index),
+                                       rs.getInt(COLUMN.FILE_ID.index),
+                                       rs.getString(COLUMN.FILE_PATH.index),
+                                       rs.getInt(COLUMN.PID.index),
+                                       rs.getInt(COLUMN.TID.index),
+                                       rs.getBoolean(COLUMN.IS_TARGET.index)
+                                       );
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               return accessor;
+       }
+       
+       public void insert(FileAccessor insertData) {
+               List<List<Object>> insertDataList = new ArrayList<List<Object>>();
+               insertDataList.add(insertData.getDBData());
+               insertData(insertDataList);
+       }
+
+       public List<FileAccessor> select() {
+               String query = String.format(SELECT_QUERY);
+               
+               List<FileAccessor> accessorList = new ArrayList<FileAccessor>();
+               accessorList = executeQueryRS(query);
+               return accessorList;
+       }
+       
+       public static String selectAll() {
+               StringBuffer selectAllColumn = new StringBuffer();
+               selectAllColumn.append(COLUMN.ACCESSOR_ID.name);
+               selectAllColumn.append(",");
+               selectAllColumn.append(COLUMN.FILE_ID.name);
+               selectAllColumn.append(",");
+               selectAllColumn.append(COLUMN.FILE_PATH.name);
+               selectAllColumn.append(",");
+               selectAllColumn.append(COLUMN.PID.name);
+               selectAllColumn.append(",");
+               selectAllColumn.append(COLUMN.TID.name);
+               selectAllColumn.append(",");
+               selectAllColumn.append(COLUMN.IS_TARGET.name);
+               return selectAllColumn.toString();
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(1, (Integer)(rowData.get(0)));
+                               prep.setInt(2, (Integer)(rowData.get(1)));
+                               prep.setString(3, (String)(rowData.get(2)));
+                               prep.setLong(4, (Integer)(rowData.get(3)));
+                               prep.setInt(5, (Integer)(rowData.get(4)));
+                               prep.setBoolean(6, (Boolean)(rowData.get(5)));
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               return isPrepared;
+       }
+}
index 9ba6b7a..d72e7f7 100644 (file)
@@ -27,6 +27,7 @@
 package org.tizen.dynamicanalyzer.ui.file.data;
 
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
@@ -37,38 +38,37 @@ import org.tizen.dynamicanalyzer.database.DBTable;
 import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.nl.FilePageLabels;
 import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
-import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 
 public class FileApiDB extends DBTable {
-       private static final String TABLE_NAME = FilePageLabels.FILE_API_DB;
+       private static final String API_TABLE = FilePageLabels.FILE_API_DB;
+       private static final String ACCESSOR_TABLE = FilePageLabels.FILE_ACCESSOR_DB;
+       private static final String DBTYPE_RETUREN_VALUE = "VARCHAR(1024)";//$NON-NLS-1$
+       private static final String DBTYPE_ARGUMENTS_VALUE = "VARCHAR(1024)";//$NON-NLS-1$
        
        public static enum COLUMN {
-               SEQ(0, "seq"),
-               FILE_PATH(1, "filePath"),
-               PID(2, "pid"),
-               TID(3, "tid"),
-               FD(4, "fd"),
-               API_TYPE(5, "apiType"),
-               EVENT_TIME(6, "eventTime"),
-               API_ID(7, "apiId"),
-               ERRNO(8, "errNo"),
-               IO_SIZE(9, "ioSize"),
-               FILE_SIZE(10, "fileSize"),
-               SIZE(11, "size"),
-               RETURN_VALUE(12, "returnValue"),
-               ARGS(13, "args"),
-               TARGET(14, "target");
+               SEQUENCE_NUMBER(1, "SEQUENCE_NUMBER"),
+               FILE_ID(2, "FILE_ID"),
+               ACCESSOR_ID(3, "ACCESSOR_ID"),
+               FD(4, "FD"),
+               API_TYPE(5, "API_TYPE"),
+               EVENT_TIME(6, "EVENT_TIME"),
+               API_ID(7, "API_ID"),
+               ERRNO(8, "ERRNO"),
+               IO_SIZE(9, "IO_SIZE"),
+               FILE_SIZE(10, "FILE_SIZE"),
+               RETURN_VALUE(11, "RETURN_VALUE"),
+               ARGUMENTS_VALUE(12, "ARGUMENTS_VALUE");
                
-               private final int value;
-               private final String name;
+               public final int index;
+               public final String name;
 
-               private COLUMN(int value, String name) {
-                       this.value = value;
+               private COLUMN(int index, String name) {
+                       this.index = index;
                        this.name = name;
                }
 
-               public int getValue() {
-                       return value;
+               public int getIndex() {
+                       return index;
                }
                
                public String getName() {
@@ -78,204 +78,180 @@ public class FileApiDB extends DBTable {
 
        @Override
        public String getTableName() {
-               return TABLE_NAME;
+               return API_TABLE;
        }
-
+       
        public FileApiDB() {
-               addColumn(new DBColumn(COLUMN.SEQ.getName(), DBConstants.NOT_NULL, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.FILE_PATH.getName(), DBConstants.EMPTY, DBConstants.BIG_TEXT));
-               addColumn(new DBColumn(COLUMN.PID.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.TID.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.FD.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.API_TYPE.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.EVENT_TIME.getName(), DBConstants.NOT_NULL, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.API_ID.getName(), DBConstants.EMPTY, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.ERRNO.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.IO_SIZE.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.FILE_SIZE.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.SIZE.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.RETURN_VALUE.getName(), DBConstants.EMPTY, DBConstants.BIG_TEXT));
-               addColumn(new DBColumn(COLUMN.ARGS.getName(), DBConstants.EMPTY, DBConstants.BIG_TEXT));
-               addColumn(new DBColumn(COLUMN.TARGET.getName(), DBConstants.NOT_NULL, DBConstants.BOOLEAN));
+               addColumn(new DBColumn(COLUMN.SEQUENCE_NUMBER.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.FILE_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.ACCESSOR_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.FD.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.API_TYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.EVENT_TIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.API_ID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.ERRNO.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.IO_SIZE.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.FILE_SIZE.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.RETURN_VALUE.name, DBConstants.EMPTY, DBTYPE_RETUREN_VALUE));
+               addColumn(new DBColumn(COLUMN.ARGUMENTS_VALUE.name, DBConstants.EMPTY, DBTYPE_ARGUMENTS_VALUE));
        }
        
        private static final String selectAllColumn = selectAllColumn();
-       private static final String SELECT_API_SERIES = "select " 
-                       + selectAllColumn
-                       +" from "
-                       + TABLE_NAME + " where %s <= " 
-                       + COLUMN.EVENT_TIME.getName() + " and "
-                       + COLUMN.EVENT_TIME.getName()
-                       + " <= %s";
-       
-       private static final String SELECT_FAILED_API_SERIES = "select " 
-                       + selectAllColumn
-                       +" from "
-                       + TABLE_NAME + " where %s <= " 
-                       + COLUMN.EVENT_TIME.getName() + " and "
-                       + COLUMN.EVENT_TIME.getName()
-                       + " <= %s" + " and "
-                       + COLUMN.ERRNO.getName() + " != '0'" + " and "
-                       + COLUMN.TARGET.getName() + " = 'true'";
-       
-       private static final String SELECT_APIS_FOR_CHILD = "select "
-                       + selectAllColumn
-                       +" from "
-                       + TABLE_NAME + " where " 
-                       + COLUMN.FILE_PATH.getName() + " = '%s'" + " and "
-                       + COLUMN.PID.getName() + " = '%d'" + " and "
-                       + COLUMN.TID.getName() + " = '%d'" + " and "
-                       + COLUMN.TARGET.getName() + " = 'true'";
 
-       private static final String SELECT_APIS_FOR_PARENT= "select "
-                       + selectAllColumn
-                       + " from "
-                       + TABLE_NAME + " where " 
-                       + COLUMN.FILE_PATH.getName()  + " = '%s'" + " and "
-                       + COLUMN.TARGET.getName() + " = 'true'";
+       private static final String SELECT_APIS_FOR_CHILD = 
+                       "select "
+                       + "SEQUENCE_NUMBER, FD, API_TYPE, EVENT_TIME, API_ID, ERRNO, "
+                       + "IO_SIZE, FILE_SIZE, RETURN_VALUE, ARGUMENTS_VALUE "
+                       + "from " + API_TABLE
+                       + " where "
+                       + "ACCESSOR_ID" + " = '%d'"; 
+               
+
+       private static final String SELECT_APIS_FOR_PARENT= 
+                       "select "
+                       + "api.SEQUENCE_NUMBER, api.FD, api.API_TYPE, api.EVENT_TIME, api.API_ID, api.ERRNO, "
+                       + "api.IO_SIZE, api.FILE_SIZE, api.RETURN_VALUE, api.ARGUMENTS_VALUE, "
+                       + "accessor.FILE_PATH, accessor.PID, accessor.TID "
+                       + "from " + API_TABLE + " api, " + ACCESSOR_TABLE + " accessor " 
+                       + "where "
+                       + "api.FILE_ID" + " = '%d'"+ " and " + "api.ACCESSOR_ID = accessor.ACCESSOR_ID";
        
        private static final String SELECT_FILE_EVENT_BY_SEQ = "select "
-                       //+ selectAllColumn
-                       + COLUMN.SEQ.getName() + " , "
-                       + COLUMN.FILE_PATH.getName() + " , "
-                       + COLUMN.PID.getName() + " , "
-                       + COLUMN.TID.getName()
-                       + " from "
-                       + TABLE_NAME + " where " 
-                       + COLUMN.SEQ.getName()  + " = '%d'"+ " and "
-                       + COLUMN.TARGET.getName() + " = 'true'";
+                       + COLUMN.ACCESSOR_ID.name
+                       + " from " + API_TABLE 
+                       + " where " 
+                       + COLUMN.SEQUENCE_NUMBER.name  + " = '%d'";
+       
+       private static final String SELECT_APIS_COUNT = 
+                       "select COUNT(*) from " + API_TABLE;
        
        private static final String SELECT_ALL = "select "
                        + selectAllColumn
                        + " from "
-                       + TABLE_NAME + " where " 
-                       + COLUMN.TARGET.getName() + " = 'true'";
+                       + API_TABLE;
        
-       public void insert(List<List<Object>> insertData) {
-               insertData(insertData);
+       public ResultSet executeQuery(String query) {
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               return rs;
        }
        
-       // for updating api series chart
-       public List<FileEvent> selectAPISeries(double visibleStartTime,
-                       double visibleEndTime) {
-               double selectStartTime = visibleStartTime * TimelineConstants.MEGA_DOUBLE;
-               double selectEndTime = visibleEndTime * TimelineConstants.MEGA_DOUBLE;
-               
-               String query = String.format(SELECT_API_SERIES, selectStartTime, selectEndTime);
-               
-               List<List<Object>> result = SqlConnectionManager.executeQuery(query);
-               if (null == result || result.size() == 0 || result.get(0).size() == 0) {
-                       return null;
-               }
-               List<FileEvent> apiList = new ArrayList<FileEvent>();
-               for (List<Object> data : result) {
-                       apiList.add(new FileEvent(data));
+       public List<FileEvent> executeQueryRS(String query) {
+               List<FileEvent> resultData = new ArrayList<FileEvent>();
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               if (rs != null) {
+                       try {
+                               while (rs.next()) {
+                                       FileEvent event= getDataFromResultSet(rs);
+                                       if (event != null) {
+                                               resultData.add(event);
+                                       }
+                               }
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
+                       }
                }
-               return apiList;
+               return resultData;
        }
        
-       // for updating api series chart
-       public List<FileEvent> selectFailedAPISeries(double visibleStartTime,
-                       double visibleEndTime) {
-               double selectStartTime = visibleStartTime
-                               * TimelineConstants.MEGA_DOUBLE;
-               double selectEndTime = visibleEndTime * TimelineConstants.MEGA_DOUBLE;
-
-               String query = String.format(SELECT_FAILED_API_SERIES, selectStartTime,
-                               selectEndTime);
-
-               List<List<Object>> result = SqlConnectionManager.executeQuery(query);
-               if (null == result || result.size() == 0 || result.get(0).size() == 0) {
+       public FileEvent getDataFromResultSet(ResultSet rs) {
+               FileEvent event = null;
+               try {
+                       event = new FileEvent(
+                                       rs.getLong(COLUMN.SEQUENCE_NUMBER.index),
+                                       rs.getInt(COLUMN.FILE_ID.index),
+                                       rs.getInt(COLUMN.ACCESSOR_ID.index),
+                                       rs.getLong(COLUMN.FD.index),
+                                       rs.getInt(COLUMN.API_TYPE.index),
+                                       rs.getInt(COLUMN.API_ID.index),
+                                       rs.getLong(COLUMN.EVENT_TIME.index),
+                                       rs.getLong(COLUMN.FILE_SIZE.index),
+                                       rs.getLong(COLUMN.IO_SIZE.index),
+                                       rs.getString(COLUMN.ARGUMENTS_VALUE.index),
+                                       rs.getString(COLUMN.RETURN_VALUE.index),
+                                       rs.getLong(COLUMN.ERRNO.index)
+                                       );
+               } catch (SQLException e) {
+                       e.printStackTrace();
                        return null;
                }
-               List<FileEvent> apiList = new ArrayList<FileEvent>();
-               for (List<Object> data : result) {
-                       apiList.add(new FileEvent(data));
-               }
-               return apiList;
+               return event;
        }
-
-       // for updating api table view
-       public List<FileEvent> selectAPITable(String filePath, int pid, int tid,
+       
+       public void insert(List<List<Object>> insertData) {
+               insertData(insertData);
+       }
+       
+       // for updating api table view and detail view
+       public ResultSet selectAPI(int fileId, int accessorId,
                        boolean isParentChart) {
-               String query = String.format(SELECT_APIS_FOR_CHILD, filePath, pid, tid);
+               String query = null;
                if (isParentChart) {
-                       query = String
-                                       .format(SELECT_APIS_FOR_PARENT, filePath);
-               }
-               List<List<Object>> result = SqlConnectionManager.executeQuery(query);
-               if (null == result || result.size() == 0 || result.get(0).size() == 0) {
-                       return null;
+                       query = String.format(SELECT_APIS_FOR_PARENT, fileId);
+               }else{
+                       query = String.format(SELECT_APIS_FOR_CHILD, accessorId);
                }
-               List<FileEvent> apiList = new ArrayList<FileEvent>();
-               for (List<Object> data : result) {
-                       apiList.add(new FileEvent(data));
-               }
-               return apiList;
+               return SqlConnectionManager.executeQueryRS(query);
        }
-
-       public FileEvent selectFileEventBySeq(long seq) {
+       
+       // to get chart row index
+       public ResultSet selectFileEventBySeq(long seq) {
                String query = String.format(SELECT_FILE_EVENT_BY_SEQ, seq);
-               List<List<Object>> result = SqlConnectionManager.executeQuery(query);
-               if (null == result || result.size() == 0 || result.get(0).size() == 0) {
-                       return null;
+
+               return SqlConnectionManager.executeQueryRS(query);
+       }
+       
+       public int getTotal() {
+               String query = SELECT_APIS_COUNT;
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               int totalCount = 0;
+               if (rs != null) {
+                       try {
+                               if (rs.next()) {
+                                       totalCount = rs.getInt(1);
+                               }
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
+                       }
                }
-               List<Object> data = result.get(0);
-               FileEvent fileEvent = new FileEvent(
-                               (Long) data.get(FileApiDB.COLUMN.SEQ.getValue()),
-                               (String) data.get(FileApiDB.COLUMN.FILE_PATH.getValue()),
-                               (Integer) data.get(FileApiDB.COLUMN.PID.getValue()),
-                               (Integer) data.get(FileApiDB.COLUMN.TID.getValue()));
-               return fileEvent;
+               return totalCount;
        }
        
        public List<FileEvent> select() {
                String query = String.format(SELECT_ALL);
-               
-               List<FileEvent> apiList = new ArrayList<FileEvent>();
-               
-               List<List<Object>> result = SqlConnectionManager.executeQuery(query);
-               if (null == result || result.size() == 0 || result.get(0).size() == 0) {
-                       return apiList;
-               }
-               
-               for (List<Object> data : result) {
-                       apiList.add(new FileEvent(data));
-               }
+               List<FileEvent> apiList = executeQueryRS(query);
+       
                return apiList;
        }
        
        public static String selectAllColumn() {
                StringBuffer selectAllColumn = new StringBuffer();
-               selectAllColumn.append(COLUMN.SEQ.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FILE_PATH.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.PID.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.TID.getName());
+               selectAllColumn.append(COLUMN.SEQUENCE_NUMBER.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FD.getName());
+               selectAllColumn.append(COLUMN.FILE_ID.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.API_TYPE.getName());
+               selectAllColumn.append(COLUMN.ACCESSOR_ID.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.EVENT_TIME.getName());
+               selectAllColumn.append(COLUMN.FD.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.API_ID.getName());
+               selectAllColumn.append(COLUMN.API_TYPE.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.ERRNO.getName());
+               selectAllColumn.append(COLUMN.EVENT_TIME.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.IO_SIZE.getName());
+               selectAllColumn.append(COLUMN.API_ID.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FILE_SIZE.getName());
+               selectAllColumn.append(COLUMN.ERRNO.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.SIZE.getName());
+               selectAllColumn.append(COLUMN.IO_SIZE.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.RETURN_VALUE.getName());
+               selectAllColumn.append(COLUMN.FILE_SIZE.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.ARGS.getName());
+               selectAllColumn.append(COLUMN.RETURN_VALUE.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.TARGET.getName());
+               selectAllColumn.append(COLUMN.ARGUMENTS_VALUE.name);
                return selectAllColumn.toString();
        }
        
@@ -288,21 +264,18 @@ public class FileApiDB extends DBTable {
                        isPrepared = false;
                } else {
                        try {
-                               prep.setLong(1, (Long)(rowData.get(COLUMN.SEQ.getValue())));
-                               prep.setString(2, (String)(rowData.get(COLUMN.FILE_PATH.getValue())));
-                               prep.setInt(3, (Integer)(rowData.get(COLUMN.PID.getValue())));
-                               prep.setInt(4, (Integer)(rowData.get(COLUMN.TID.getValue())));
-                               prep.setLong(5, (Long)(rowData.get(COLUMN.FD.getValue())));
-                               prep.setInt(6, (Integer)(rowData.get(COLUMN.API_TYPE.getValue())));
-                               prep.setLong(7, (Long)(rowData.get(COLUMN.EVENT_TIME.getValue())));
-                               prep.setInt(8, (Integer)(rowData.get(COLUMN.API_ID.getValue())));
-                               prep.setLong(9, (Long)(rowData.get(COLUMN.ERRNO.getValue())));
-                               prep.setLong(10, (Long)(rowData.get(COLUMN.IO_SIZE.getValue())));
-                               prep.setLong(11, (Long)(rowData.get(COLUMN.FILE_SIZE.getValue())));
-                               prep.setLong(12, (Long)(rowData.get(COLUMN.SIZE.getValue())));
-                               prep.setString(13, (String)(rowData.get(COLUMN.RETURN_VALUE.getValue())));
-                               prep.setString(14, (String)(rowData.get(COLUMN.ARGS.getValue())));
-                               prep.setBoolean(15, (Boolean)(rowData.get(COLUMN.TARGET.getValue())));
+                               prep.setLong(1, (Long)(rowData.get(0)));
+                               prep.setInt(2, (Integer)(rowData.get(1)));
+                               prep.setInt(3, (Integer)(rowData.get(2)));
+                               prep.setLong(4, (Long)(rowData.get(3)));
+                               prep.setInt(5, (Integer)(rowData.get(4)));
+                               prep.setLong(6, (Long)(rowData.get(5)));
+                               prep.setInt(7, (Integer)(rowData.get(6)));
+                               prep.setLong(8, (Long)(rowData.get(7)));
+                               prep.setLong(9, (Long)(rowData.get(8)));
+                               prep.setLong(10, (Long)(rowData.get(9)));
+                               prep.setString(11, (String)(rowData.get(10)));
+                               prep.setString(12, (String)(rowData.get(11)));
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
index a215358..1670c9b 100644 (file)
@@ -27,6 +27,7 @@
 package org.tizen.dynamicanalyzer.ui.file.data;
 
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
@@ -40,26 +41,22 @@ import org.tizen.dynamicanalyzer.ui.file.model.FileStatus;
 
 // open, close
 public class FileStatusDB extends DBTable {
-       private static final String TABLE_NAME = FilePageLabels.FILE_STATUS_DB;
+       private static final String STATUS_TABLE = FilePageLabels.FILE_STATUS_DB;
        
        public static enum COLUMN {
-               PID(0, "pid"),
-               TID(1, "tid"),
-               FILE_PATH(2, "filePath"),
-               FD(3, "FD"),
-               API_TYPE(4, "apiType"),
-               EVENT_TIME(5, "eventTime"),
-               ERRNO(6, "errNo");
+               FILE_ID(1, "FILE_ID"),
+               API_TYPE(2, "API_TYPE"),
+               EVENT_TIME(3, "EVENT_TIME");
                
-               private final int value;
+               private final int index;
                private final String name;
-               private COLUMN(int value, String name) {
-                       this.value = value;
+               private COLUMN(int index, String name) {
+                       this.index = index;
                        this.name = name;
                }
 
-               public int getValue() {
-                       return value;
+               public int getIndex() {
+                       return index;
                }
                
                public String getName() {
@@ -68,24 +65,55 @@ public class FileStatusDB extends DBTable {
        }
 
        public FileStatusDB() {
-               addColumn(new DBColumn(COLUMN.PID.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.TID.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.FILE_PATH.getName(), DBConstants.NOT_NULL, DBConstants.BIG_TEXT));
-               addColumn(new DBColumn(COLUMN.FD.getName(), DBConstants.EMPTY, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.API_TYPE.getName(), DBConstants.NOT_NULL, DBConstants.INTEGER));
-               addColumn(new DBColumn(COLUMN.EVENT_TIME.getName(), DBConstants.NOT_NULL, DBConstants.LONG));
-               addColumn(new DBColumn(COLUMN.ERRNO.getName(), DBConstants.NOT_NULL, DBConstants.LONG));
+               addColumn(new DBColumn(COLUMN.FILE_ID.name, DBConstants.NOT_NULL, DBConstants.INTEGER));
+               addColumn(new DBColumn(COLUMN.API_TYPE.name, DBConstants.NOT_NULL, DBConstants.INTEGER));
+               addColumn(new DBColumn(COLUMN.EVENT_TIME.name, DBConstants.NOT_NULL, DBConstants.LONG));
        }
        
        @Override
        public String getTableName() {
-               return TABLE_NAME;
+               return STATUS_TABLE;
        }
 
        private static final String selectAll = selectAll();
        private static final String SELECT_QUERY = "select "
                        + selectAll
-                       + " from " + TABLE_NAME; //$NON-NLS-1$
+                       + " from " + STATUS_TABLE; //$NON-NLS-1$
+       
+       public List<FileStatus> executeQueryRS(String query) {
+               List<FileStatus> resultData = new ArrayList<FileStatus>();
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               if (rs != null) {
+                       try {
+                               while (rs.next()) {
+                                       FileStatus status= getDataFromResultSet(rs);
+                                       if (status != null) {
+                                               resultData.add(status);
+                                       }
+                               }
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
+                       }
+               }
+               return resultData;
+       }
+       
+       public FileStatus getDataFromResultSet(ResultSet rs) {
+               FileStatus status = null;
+               try {
+                       status = new FileStatus(
+                                       rs.getInt(COLUMN.FILE_ID.index),
+                                       rs.getInt(COLUMN.API_TYPE.index),
+                                       rs.getLong(COLUMN.EVENT_TIME.index)
+                                       );
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               return status;
+       }
        
        public void insert(FileStatus insertData) {
                List<List<Object>> insertDataList = new ArrayList<List<Object>>();
@@ -97,33 +125,17 @@ public class FileStatusDB extends DBTable {
                String query = String.format(SELECT_QUERY);
                
                List<FileStatus> statusList = new ArrayList<FileStatus>();
-               
-               List<List<Object>> result = SqlConnectionManager.executeQuery(query);
-               if (null == result || result.size() == 0 || result.get(0).size() == 0) {
-                       return statusList;
-               }
-               
-               for (List<Object> data : result) {
-                       statusList.add(new FileStatus(data));
-               }
+               statusList = executeQueryRS(query);
                return statusList;
        }
 
        public static String selectAll() {
                StringBuffer selectAllColumn = new StringBuffer();
-               selectAllColumn.append(COLUMN.PID.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.TID.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FILE_PATH.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.FD.getName());
-               selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.API_TYPE.getName());
+               selectAllColumn.append(COLUMN.FILE_ID.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.EVENT_TIME.getName());
+               selectAllColumn.append(COLUMN.API_TYPE.name);
                selectAllColumn.append(",");
-               selectAllColumn.append(COLUMN.ERRNO.getName());
+               selectAllColumn.append(COLUMN.EVENT_TIME.name);
                return selectAllColumn.toString();
        }
        
@@ -136,13 +148,9 @@ public class FileStatusDB extends DBTable {
                        isPrepared = false;
                } else {
                        try {
-                               prep.setInt(1, (Integer)(rowData.get(COLUMN.PID.getValue())));
-                               prep.setInt(2, (Integer)(rowData.get(COLUMN.TID.getValue())));
-                               prep.setString(3, (String)(rowData.get(COLUMN.FILE_PATH.getValue())));
-                               prep.setLong(4, (Long)(rowData.get(COLUMN.FD.getValue())));
-                               prep.setInt(5, (Integer)(rowData.get(COLUMN.API_TYPE.getValue())));
-                               prep.setLong(6, (Long)(rowData.get(COLUMN.EVENT_TIME.getValue())));
-                               prep.setLong(7, (Long)(rowData.get(COLUMN.ERRNO.getValue())));
+                               prep.setInt(1, (Integer)(rowData.get(0)));
+                               prep.setInt(2, (Integer)(rowData.get(1)));
+                               prep.setLong(3, (Long)(rowData.get(2)));
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
index 29eb87a..c18a904 100644 (file)
 package org.tizen.dynamicanalyzer.ui.file.manager;
 
 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 java.util.Queue;
+import java.util.Set;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicInteger;
 
-import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DALimit;
 import org.tizen.dynamicanalyzer.common.Global;
@@ -48,6 +51,7 @@ import org.tizen.dynamicanalyzer.swap.model.data.FileData;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.swap.model.data.ProfileData;
 import org.tizen.dynamicanalyzer.ui.file.model.FileAccess;
+import org.tizen.dynamicanalyzer.ui.file.model.FileAccessor;
 import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
 import org.tizen.dynamicanalyzer.ui.file.model.FileStatus;
 import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
@@ -61,37 +65,29 @@ public class FileDataMaker {
        private List<FileStatus> fileStatusList = new ArrayList<FileStatus>();
        private List<FileAccess> fileAccessList = new ArrayList<FileAccess>();
        private List<FileEvent> fileApiList = new ArrayList<FileEvent>();
-
-
-       // to find file path, (key(PID, TID, FD), value (file_path))
-       private Map<String, String> fileAccessorMap = new HashMap<String, String>();
-       
-       // temporary, file log list for 1second
-       private Queue<List<FileEvent>> fileLogsQueue = new ConcurrentLinkedQueue<List<FileEvent>>();
-       
-       // (key(file path), value (read_count or write_count))
-       private Map<String, Integer> concurrentAccessNumMap = new HashMap<String, Integer>();
-       private Map<String, Integer> lockNumMap = new HashMap<String, Integer>();
+       private List<FileAccessor> fileAccessorList = new ArrayList<FileAccessor>();
        
-       // for filtering out non-target file from syscall messages
-       List<String> accessedFilePathList = new ArrayList<String>();
+       private Map<Long, FileEvent> entryMap =  new HashMap<Long, FileEvent>(); // to match entry and exit message
+       private Map<String,  List<Object>> fileAccessorMap= new HashMap<String, List<Object>>();
+       private Map<String,  List<Object>> filePathMap= new HashMap<String, List<Object>>(); // to find file path
+       private Queue<List<FileAccessor>> fileAccessorQueue = new ConcurrentLinkedQueue<List<FileAccessor>>();
+       private Map<List<Integer>, List<Integer>> accessorHasLockMap = new HashMap<List<Integer>, List<Integer>>(); //to auto release
+       private Map<String, Integer> concurrentAccessNumMap = new HashMap<String, Integer>(); // to check concurrent access
        
-       // temporary, to check if open event has been sent before the event has been sent
-       private Map<String, FileEvent> sysCallMap = new HashMap<String, FileEvent>();
-       // for searching entry message from exit message
-       Map<Long, FileEvent> entryMap =  new HashMap<Long, FileEvent>();
+       AtomicInteger idGenerator = new AtomicInteger();
        
        public FileDataMaker() {}
        
        public void clear(){
                fileStatusList.clear();
                fileAccessList.clear();
+               fileApiList.clear();
+               fileAccessorList.clear();
                fileAccessorMap.clear();
-               fileLogsQueue.clear();
+               fileAccessorQueue.clear();
+               filePathMap.clear();
+               accessorHasLockMap.clear();
                concurrentAccessNumMap.clear();
-               lockNumMap.clear();
-               sysCallMap.clear();
-               accessedFilePathList.clear();
                entryMap.clear();
        }
 
@@ -106,6 +102,7 @@ public class FileDataMaker {
                 */
                
                List<FileEvent>  fileEventList = new ArrayList<FileEvent>();
+               List<FileAccessor> fileAccessorList = new ArrayList<FileAccessor>();
                
                // 1. In case of target process that the user is interested to analyze
                ArrayList<List<Object>> fileApiList = new ArrayList<List<Object>>();
@@ -134,8 +131,6 @@ public class FileDataMaker {
                                }
                                
                                // filtering out print log and main func log
-                               // TODO: DISCUSSION: checkInvalidApiName: make the SWAP not send
-                               // TODO: DISCUSSION: isOpenMainLog: why osp main?
                                if (checkInvalidApiName(input) || isOpenMainLog(input)) {
                                        continue;
                                }
@@ -157,17 +152,6 @@ public class FileDataMaker {
                                                input.getArgs(), input.getReturn(), input.getErrno(),
                                                true);
                                
-                               switch(input.getFdApiType()) {
-                               case LogCenterConstants.FD_API_TYPE_OPEN:
-                                       accessedFilePathList.add(input.getFilePath());
-                                       break;
-                               case LogCenterConstants.FD_API_TYPE_LOCK_START:
-                               case LogCenterConstants.FD_API_TYPE_LOCK_END:
-                                       String args = input.getArgs();
-                                       String[] splitPath = args.split(",\\s+");
-                                       event.setLockType(Integer.parseInt(splitPath[1]));
-                                       break;
-                               }
                                addFileEvent(fileEventList, event, input);
                        }
                }
@@ -177,6 +161,7 @@ public class FileDataMaker {
                if (syscallLogs != null) {
                        ProfileData profileData = null;
                        FileEvent event = null;
+                       FileEvent fakeOpenEvent = null;
                        String filePath = null;
                        long fd = 0;
                        
@@ -197,11 +182,14 @@ public class FileDataMaker {
                                        String[] splitPath = args.split(",\\s+");
                                        filePath = splitPath[0];
                                        fd = Long.parseLong(splitPath[1]);
-                                       FileEvent openEvent = null;
+                                       
+                                       event = new FileEvent(seq, pid, tid, fd, filePath, eventType, time, 0,  false);
+                                       fakeOpenEvent = new FileEvent(0, pid, tid, fd, filePath,
+                                                       LogCenterConstants.FD_API_TYPE_OPEN, time, 0, false);
 
-                                       // filtering out non-target files that user in not interested
-                                       if(accessedFilePathList.contains(filePath)) {
-                                               // target file
+                                       //fileAccessorMap: to filter out non-target files that user in not interested
+                                       //filePathMap: to check if the open event is exist
+                                       if(fileAccessorMap.containsKey(filePath)) {
                                                Logger.debug(">> syscall:seq:" + seq + ", pid:" + pid
                                                                + ", tid:" + tid + ", type:" + eventType +  ", args:" + args);
                                                
@@ -209,53 +197,38 @@ public class FileDataMaker {
                                                if(fd == -1) {
                                                        event.setErrNo(-1);
                                                }
+                                               
+                                               String key = createKey(pid, tid, fd);
                                                switch(eventType) {
                                                case LogCenterConstants.FD_API_TYPE_OPEN:
-                                                       sysCallMap.put(filePath, event);
+                                                       addFilePathInfo(key, filePath, -1, -1);
                                                        addFileEvent(fileEventList, event, null);
                                                        break;
                                                case LogCenterConstants.FD_API_TYPE_CLOSE:
-                                                       openEvent = sysCallMap.get(filePath);
-                                                       if(openEvent != null) {
+                                                       if(filePathMap.containsKey(key)) {
                                                                addFileEvent(fileEventList, event, null);
+                                                               removeFilePathInfo(key);
                                                        }
                                                        break;
                                                case LogCenterConstants.FD_API_TYPE_LOCK_START:
-                                                       openEvent = sysCallMap.get(filePath);
-                                                       if(openEvent == null) {
-                                                               // make fake open event
-                                                               FileEvent fakeOpenEvent = new FileEvent(0, pid,
-                                                                               tid, fd, filePath,
-                                                                               LogCenterConstants.FD_API_TYPE_OPEN,
-                                                                               time, 0, false);
+                                                       if(!filePathMap.containsKey(key)){
                                                                addFileEvent(fileEventList, fakeOpenEvent, null);
+                                                               addFilePathInfo(key, filePath, -1, -1);
                                                        }
                                                        entryMap.put(seq, event);
-                                                       event.setLockType(Integer.parseInt(splitPath[2]));
                                                        addFileEvent(fileEventList, event, null);
                                                        break;
                                                case LogCenterConstants.FD_API_TYPE_UNLOCK:
-                                                       openEvent = sysCallMap.get(filePath);
-                                                       if(openEvent == null) {
-                                                               // make fake open event
-                                                               FileEvent fakeOpenEvent = new FileEvent(0, pid,
-                                                                               tid, fd, filePath,
-                                                                               LogCenterConstants.FD_API_TYPE_OPEN,
-                                                                               time, 0, false);
+                                                       if(!filePathMap.containsKey(key)){
                                                                addFileEvent(fileEventList, fakeOpenEvent, null);
+                                                               addFilePathInfo(key, filePath, -1, -1);
                                                        }
-                                                       entryMap.put(seq, event);
                                                        break;
                                                case  LogCenterConstants.FD_API_TYPE_READ_START:
                                                case  LogCenterConstants.FD_API_TYPE_WRITE_START:
-                                                       openEvent = sysCallMap.get(filePath);
-                                                       if(openEvent == null) {
-                                                               // make fake open event
-                                                               FileEvent fakeOpenEvent = new FileEvent(0, pid,
-                                                                               tid, fd, filePath,
-                                                                               LogCenterConstants.FD_API_TYPE_OPEN,
-                                                                               time, 0, false);
+                                                       if(!filePathMap.containsKey(key)){
                                                                addFileEvent(fileEventList, fakeOpenEvent, null);
+                                                               addFilePathInfo(key, filePath, -1, -1);
                                                        }
                                                        entryMap.put(seq, event);
                                                        addFileEvent(fileEventList, event, null);
@@ -266,11 +239,10 @@ public class FileDataMaker {
                                        }// else, non-target file
                                        break;
                                case DataChannelConstants.MSG_FUNCTION_EXIT:
-                                       // for creating read/write end event with MSG_FUNCTION_EXIT
+                                       // for creating read/write/lock end event with MSG_FUNCTION_EXIT
                                        long entrySeq = profileData.getEntrySeq();
+                                       String ret = profileData.getReturn();
                                        if(entryMap.containsKey(entrySeq)) {
-                                               Logger.debug(">> syscall entrySeq:" + + entrySeq + "endseq:" + seq + ", pid:" + pid
-                                                               + ", tid:" + tid + ", type:" + eventType);
                                                event = entryMap.get(entrySeq);
                                                if(Long.parseLong(profileData.getReturn()) == -1) {
                                                        event.setErrNo(-1);
@@ -278,20 +250,24 @@ public class FileDataMaker {
                                                switch(eventType) {
                                                case LogCenterConstants.FD_API_TYPE_READ_START:
                                                        event.setFdApiType(LogCenterConstants.FD_API_TYPE_READ_END);
+                                                       event.setTime(time);
                                                        addFileEvent(fileEventList, event, null);
                                                        break;
                                                case LogCenterConstants.FD_API_TYPE_WRITE_START:
                                                        event.setFdApiType(LogCenterConstants.FD_API_TYPE_WRITE_END);
+                                                       event.setTime(time);
                                                        addFileEvent(fileEventList, event, null);
                                                        break;
                                                case LogCenterConstants.FD_API_TYPE_LOCK_START:
                                                        event.setFdApiType(LogCenterConstants.FD_API_TYPE_LOCK_END);
+                                                       event.setTime(time);
                                                        addFileEvent(fileEventList, event, null);
                                                        break;
                                                case LogCenterConstants.FD_API_TYPE_UNLOCK:
                                                        event.setFdApiType(LogCenterConstants.FD_API_TYPE_UNLOCK);
                                                        event.setTime(time);
                                                        addFileEvent(fileEventList, event, null);
+                                                       break;
                                                default:
                                                        break;
                                                }
@@ -306,9 +282,18 @@ public class FileDataMaker {
                        for(FileEvent data : fileEventList) {
                                fileApiList.add(data.getDBData());
                        }
-                       fileLogsQueue.add(fileEventList);
                        FileDataManager.getInstance().getApiDB().insert((List<List<Object>>)fileApiList);
                }
+               
+               Set<String> kyeSet = fileAccessorMap.keySet();
+               for (Iterator<String> iterator = kyeSet.iterator(); iterator.hasNext();) {
+                       String key = (String) iterator.next();
+                       List<Object> values= fileAccessorMap.get(key);
+                       Object[] list = values.toArray();
+                       List<FileAccessor> accessor = (ArrayList<FileAccessor>)list[1];
+                       fileAccessorList.addAll(accessor);
+               }
+               fileAccessorQueue.add(fileAccessorList);
        }
        
        /**
@@ -335,45 +320,67 @@ public class FileDataMaker {
                String key = null;
                
                Logger.debug("pid:" + pid + " tid:" +tid + " apiType:" + apiType);
+
                
                if(isTarget) {
                        key = createKey(pid, tid, fd);
                        if(fd == -1) {
-                               // set the unknown file if the file open or close has been failed
-                               event.setFilePath(FilePageLabels.FILE_CHART_UNKNOWN_FILE);
-                       } else if(filePath == null || filePath.equals("")) {
-                               // set the file path to all normal file event that open and close was succeed
-                               filePath = getFilePath(key);
+                               filePath = FilePageLabels.FILE_CHART_UNKNOWN_FILE;
+                               int[] fileInfo = addFileAccessor(filePath, pid, tid, isTarget);
+                               event.setFileId(fileInfo[0]);
+                               event.setAccessorId(fileInfo[1]);
+                               event.setFilePath(filePath);
+                       }else if(filePath == null || filePath.equals("")) { 
+                               // get file path except open event
+                               Object[] fileInfo = getFilePathInfo(key);
+                               filePath = (String)fileInfo[0];
                                event.setFilePath(filePath);
+                               event.setFileId((Integer)fileInfo[1]);
+                               event.setAccessorId((Integer)fileInfo[2]);
                        }
+               }else{
+                       int[] fileInfo = addFileAccessor(filePath, pid, tid, isTarget);
+                       event.setFileId(fileInfo[0]);
+                       event.setAccessorId(fileInfo[1]);
                }
                
                switch (apiType) {
                case LogCenterConstants.FD_API_TYPE_OPEN:
-                       if(isTarget && errNo == 0) {
-                                       addFileAccessor(key, filePath);
+                       if (isTarget) {
+                               int[] fileInfo = addFileAccessor(filePath, pid, tid, isTarget);
+                               event.setFileId(fileInfo[0]);
+                               event.setAccessorId(fileInfo[1]);
+                               addFilePathInfo(key, filePath, fileInfo[0], fileInfo[1]);
+                       }
+                       if (errNo == 0) {
+                               addStatusData(new FileStatus(event.getFileId(), apiType, eventTime));
                        }
-                       addStatusData(new FileStatus(pid, tid, fd, filePath, 
-                                       apiType, eventTime, errNo));
                        break;
                case LogCenterConstants.FD_API_TYPE_CLOSE:
-                       if(isTarget && errNo == 0) {
-                                       removeFileAccessor(key);
-                       }
-                       addStatusData(new FileStatus(pid, tid, fd, filePath,
-                                               apiType, eventTime, errNo));
-                       // if it remains lock without lock release
-                       if(getCurrentLockNum(filePath) > 0) {
-                               removeLockNum(filePath);
-                               addEndAccessData(pid, tid, fd, filePath, eventTime, size,
-                                               LogCenterConstants.FD_API_TYPE_LOCK_START, errNo);
+                       if(errNo == 0) {
+                               if(isTarget) {
+                                       removeFilePathInfo(key);
+                               }
+                               addStatusData(new FileStatus(event.getFileId(), apiType, eventTime));
+                               List<Integer> accessorIds = getTidsHasLock(event.getFileId(), pid);
+                               if(accessorIds != null) {
+                                       // lock auto release
+                                       for(Integer accessor : accessorIds){
+                                               FileAccess access = new FileAccess(accessor, 
+                                                               LogCenterConstants.FD_API_TYPE_LOCK_AUTORELEASE, 
+                                                               eventTime, eventTime, FilePageLabels.FILE_CHART_TOOLTIP_LOCK_AUTORELEASE);
+                                               addAccessData(access);
+                                       }
+                                       removeTidsHasLock(event.getFileId(), pid);
+                               }
                        }
                        break;
                case LogCenterConstants.FD_API_TYPE_READ_START:
-                       FileAccess readAccess = new FileAccess(filePath, pid,
-                                       tid, fd, apiType, eventTime);
+                       FileAccess readAccess = new FileAccess(event.getAccessorId(), fd, apiType, 
+                                       eventTime, FilePageLabels.FILE_CHART_TOOLTIP_READ);
                        if(checkConcurrentAccess(filePath)) {
                                readAccess.setWarning();
+                               readAccess.setTooltip(FilePageLabels.FILE_CHART_TOOLTIP_CONCURRENT_READ);
                                if(logData != null) {
                                        SummaryDataManager.getInstance().getWarningDataMaker().add(
                                                        logData, 
@@ -385,15 +392,16 @@ public class FileDataMaker {
                        addStartAccessData(readAccess);
                        break;
                case LogCenterConstants.FD_API_TYPE_READ_END:
-                       addEndAccessData(pid, tid, fd, filePath, eventTime,
-                                       size, LogCenterConstants.FD_API_TYPE_READ_START, errNo);
+                       addEndAccessData(event.getAccessorId(), fd, eventTime,
+                                               size, LogCenterConstants.FD_API_TYPE_READ_START, errNo);
                        removeConcurrentAccess(filePath);
                        break;
                case LogCenterConstants.FD_API_TYPE_WRITE_START:
-                       FileAccess writeAccess = new FileAccess(filePath, pid,
-                                       tid, fd, apiType, eventTime);
+                       FileAccess writeAccess = new FileAccess(event.getAccessorId(), fd, apiType, 
+                                       eventTime,  FilePageLabels.FILE_CHART_TOOLTIP_WRITE);
                        if(checkConcurrentAccess(filePath)) {
                                writeAccess.setWarning();
+                               writeAccess.setTooltip(FilePageLabels.FILE_CHART_TOOLTIP_CONCURRENT_WRITE);
                                if(logData != null) {
                                        SummaryDataManager.getInstance().getWarningDataMaker().add(
                                                        logData, 
@@ -405,37 +413,40 @@ public class FileDataMaker {
                        addStartAccessData(writeAccess);
                        break;
                case LogCenterConstants.FD_API_TYPE_WRITE_END:
-                       addEndAccessData(pid, tid, fd,  filePath, eventTime,
+                       addEndAccessData(event.getAccessorId(), fd, eventTime,
                                        size, LogCenterConstants.FD_API_TYPE_WRITE_START, errNo);
                        removeConcurrentAccess(filePath);
                        break;
                case LogCenterConstants.FD_API_TYPE_LOCK_START:
-                       if(event.getLockType() == AnalyzerConstants.F_SETLKW) {// F_SETLKW
-                               addStartAccessData(new FileAccess(filePath, pid, tid, fd, 
-                                               LogCenterConstants.FD_API_TYPE_LOCK_WAIT_START, eventTime));
-                       }else{
-                               addStartAccessData(new FileAccess(filePath, pid, tid, fd, 
-                                               LogCenterConstants.FD_API_TYPE_LOCK_START, eventTime));
-                       }
-                       addCurrentLock(filePath);
+                       addStartAccessData(new FileAccess(event.getAccessorId(), fd, apiType, 
+                                       eventTime, FilePageLabels.FILE_CHART_TOOLTIP_LOCK));
                        break;
                case LogCenterConstants.FD_API_TYPE_LOCK_END:
-                       if(event.getLockType() == AnalyzerConstants.F_SETLKW) {// F_SETLKW
-                               addEndAccessData(pid, tid, fd, filePath, eventTime,
-                                               size, LogCenterConstants.FD_API_TYPE_LOCK_WAIT_START, errNo);
-                               addStartAccessData(new FileAccess(filePath, pid, tid, fd, 
-                                               LogCenterConstants.FD_API_TYPE_LOCK_START, eventTime));
-                       }
+                       addEndAccessData(event.getAccessorId(), fd, eventTime, size,
+                                       LogCenterConstants.FD_API_TYPE_LOCK_START, errNo);
+                       addFileLock(event.getFileId(), pid, event.getAccessorId());
                        break;
                case LogCenterConstants.FD_API_TYPE_UNLOCK:
-                       removeLockNum(filePath);
-                       addEndAccessData(pid, tid, fd, filePath, eventTime,
-                                       size, LogCenterConstants.FD_API_TYPE_LOCK_START, errNo);
+                       addAccessData(new FileAccess(event.getAccessorId(), apiType,
+                                       eventTime, eventTime, FilePageLabels.FILE_CHART_TOOLTIP_UNLOCK));
                        break;
                default:
                                break;
                }
-               fileEventList.add(event);
+
+               // file access fail
+               if (errNo != 0) {
+                       String tooltip = FilePageLabels.FILE_CHART_TOOLTIP_FAIL + " "
+                                       + Global.getFunctionName(event.getApiId());
+                       FileAccess accessFail = new FileAccess(event.getAccessorId(),
+                                       LogCenterConstants.FD_API_TYPE_FAIL, eventTime, eventTime,
+                                       tooltip);
+                       addAccessData(accessFail);
+               }
+               
+               if(event.isTarget()) {
+                       fileEventList.add(event);
+               }
        }
        
        public void addStatusData(FileStatus data) {
@@ -446,43 +457,38 @@ public class FileDataMaker {
        public void addStartAccessData(FileAccess data) {
                fileAccessList.add(data);
        }
-
+       
+       public void addAccessData(FileAccess data) {
+               fileAccessList.add(data);
+               FileDataManager.getInstance().getAccessDB().insert(data);
+       }
+       
        // in case of file read/write/lock probe/system call
-       public void addEndAccessData(int pid, int tid, long fd, String filePath
-                       long endTime, long fileSize, int apiType, long errNo) {
+       public void addEndAccessData(int accessorId, long fd, long endTime
+                       long ioSize, int apiType, long errNo) {
                for (int i = 0; i < fileAccessList.size(); i++) {
                        FileAccess data = fileAccessList.get(i);
-                       if (data.getPid() == pid
-                                       && data.getTid() == tid 
+                       if (data.getAccessorId() == accessorId
                                        && data.getFd() == fd
                                        && data.getApiType() == apiType
                                        && data.getEndTime() <= 0){
-                               data.setEndTime(endTime);
-                               data.setFileSize(fileSize);
-                               data.setErroNo(errNo);
-                               FileDataManager.getInstance().getAccessDB().insert(data);
+                               if(errNo!=0) {
+                                       fileAccessList.remove(i);
+                               }else{
+                                       data.setEndTime(endTime);
+                                       if(apiType == LogCenterConstants.FD_API_TYPE_WRITE_START
+                                                       || apiType == LogCenterConstants.FD_API_TYPE_READ_START){
+                                               String tooltip = data.getTooltip() + " , " + String.valueOf(ioSize);
+                                               data.setTooltip(tooltip);
+                                       }
+                                       FileDataManager.getInstance().getAccessDB().insert(data);
+                               }
                                break;
                        }
                }
                // when failed search start time, dump endEvent.
        }
 
-       public List<FileEvent> getFileEventList() {
-               return fileLogsQueue.poll();
-       }
-       
-       public List<FileAccess> getFileAccessList() {
-               return fileAccessList;
-       }
-       
-       public List<FileStatus> getFileStatusList() {
-               return fileStatusList;
-       }
-       
-       public List<FileEvent> getFileApiList() {
-               return fileApiList;
-       }
-       
        private String createKey(int pid, int tid, long fd) {
                StringBuffer key = new StringBuffer();
                key.append(pid);
@@ -495,34 +501,6 @@ public class FileDataMaker {
                return key.toString();
        }
        
-       // for the open log: probe only
-       private void addFileAccessor(String key, String filePath) {
-               if(!fileAccessorMap.containsKey(key)) {
-                       fileAccessorMap.put(key, filePath);
-               } else {
-                       Logger.error(" addFileAccessor:" + key + "is aleady exist" );
-               }
-       }
-       
-       // for the close log: probe only
-       private void removeFileAccessor(String key) {
-               if(fileAccessorMap.containsKey(key)) {
-                       fileAccessorMap.remove(key);
-               }else {
-                       Logger.error(" removeFileAccessor:" + key + "is not exist" );
-               }
-       }
-       
-       private String getFilePath(String key) {
-               String filePath = null;
-               if(fileAccessorMap.containsKey(key)) {
-                       filePath = fileAccessorMap.get(key);
-               }else{
-                       Logger.error("The key is not exist : " + key);
-               }
-               return filePath;
-       }
-       
        /**
         * Check if it is concurrent access
         * @param concurrentKey
@@ -532,8 +510,9 @@ public class FileDataMaker {
                int num = 0;
                if(concurrentAccessNumMap.containsKey(concurrentKey)) {
                        num = concurrentAccessNumMap.get(concurrentKey);
+               }else{
+                       concurrentAccessNumMap.put(concurrentKey, 1);
                }
-               concurrentAccessNumMap.put(concurrentKey, num+1);
                if(num > 0) {
                        return true;
                }else {
@@ -558,31 +537,136 @@ public class FileDataMaker {
                }
        }
        
-       private int addCurrentLock(String lockKey) {
-               int num = 0;
-               if(lockNumMap.containsKey(lockKey)) {
-                       num = lockNumMap.get(lockKey);
-                       lockNumMap.put(lockKey, num+1);
+       /**
+        * Add a new file accessor
+        * @param filePath
+        * @param pid
+        * @param tid
+        * @return fileId
+        */
+       private int[] addFileAccessor(String filePath, int pid, int tid, boolean isTarget) {
+               int fileId = -1;
+               int accessorId = -1;
+               if(fileAccessorMap.containsKey(filePath)) {
+                       List<Object> set = fileAccessorMap.get(filePath);
+                       Object[] list = set.toArray();
+                       fileId = (Integer) list[0];
+                       List<FileAccessor> accessorList = (ArrayList<FileAccessor>) list[1]; 
+                       boolean isExistAccessor = false;
+                       for(FileAccessor accessor : accessorList) {
+                               if(pid == accessor.getPid() && tid == accessor.getTid()) {
+                                       accessorId = accessor.getAccessorId();
+                                       isExistAccessor = true;
+                                       break;
+                               }
+                       }
+                       if(!isExistAccessor){
+                               // add a new file accessor
+                               accessorId = idGenerator.incrementAndGet();
+                               FileAccessor newAccessor = new FileAccessor(
+                                               accessorId, fileId, filePath, pid, tid, isTarget);
+                               accessorList.add(newAccessor);
+                               set.add(fileId);
+                               set.add(accessorList);
+                               fileAccessorMap.put(filePath, set);
+                               FileDataManager.getInstance().getAccessorDB().insert(newAccessor);
+                       }
+               }else{
+                       fileId = fileAccessorMap.size()+1;
+                       accessorId = idGenerator.incrementAndGet();
+                       List<FileAccessor> accessorList = new ArrayList<FileAccessor>();
+                       FileAccessor newAccessor = new FileAccessor(accessorId, 
+                                       fileId, filePath, pid, tid, isTarget);
+                       accessorList.add(newAccessor);
+                       List<Object> set = new ArrayList<Object>();
+                       set.add(fileId);
+                       set.add(accessorList);
+                       fileAccessorMap.put(filePath, set);
+                       FileDataManager.getInstance().getAccessorDB().insert(newAccessor);
                }
-               lockNumMap.put(lockKey, num+1);
-               return num;
+               return new int[]{fileId, accessorId};
        }
        
-       private int getCurrentLockNum(String lockKey) {
-               int num = 0;
-               if(lockNumMap.containsKey(lockKey)) {
-                       num = lockNumMap.get(lockKey);
+       
+       /**
+        * Get file path
+        * @param key
+        * @return Object[0]:filePath,Object[1]:fileId, Object[2]:accessorId 
+        */
+       private Object[] getFilePathInfo(String key) {
+               Object[] list = null;
+               if(filePathMap.containsKey(key)) {
+                       List<Object> set = filePathMap.get(key);
+                       list = set.toArray();
+               }else{
+                       Logger.error("The key is not exist : " + key);
                }
-               return num;
+               return list;
        }
-
-       private void removeLockNum(String lockKey) {
-               int num = 0;
-               if(lockNumMap.containsKey(lockKey)) {
-                       num = lockNumMap.get(lockKey);
-                       lockNumMap.put(lockKey, num-1);
-               } else {
-                       Logger.error("Couldn't get current lock num!, key :" + lockKey);
+       
+       /**
+        * Add file path information
+        * @param key
+        * @param filePath
+        * @param fileId
+        * @param accessorId
+        */
+       private void addFilePathInfo(String key, String filePath, int fileId, int accessorId){
+               if(!filePathMap.containsKey(key)) {
+                       List<Object> set = new ArrayList<Object>();
+                       set.add((String)filePath);
+                       set.add((Integer)fileId);
+                       set.add((Integer)accessorId);
+                       filePathMap.put(key, set);
+               }
+       }
+       
+       private void removeFilePathInfo(String key) {
+               if(filePathMap.containsKey(key)) {
+                       filePathMap.remove(key);
+               }
+       }
+       
+       /**
+        * Add file lock information
+        * @param fileId
+        * @param pid
+        * @param accessorId
+        */
+       private void addFileLock(int fileId, int pid, int accessorId) {
+               List<Integer> key = Arrays.asList(fileId, pid);
+               List<Integer> tids = new ArrayList<Integer>();
+               if(accessorHasLockMap.containsKey(key)){
+                       tids = accessorHasLockMap.get(key);
+                       if(!tids.contains(accessorId)) {
+                               tids.add(accessorId);
+                               accessorHasLockMap.put(key, tids);
+                       }
+               }else{
+                       tids.add(accessorId);
+                       accessorHasLockMap.put(key, tids);
+               }
+       }
+       
+       /**
+        * Get TIDs which has file locks
+        * @param fileId
+        * @param pid
+        * @return
+        */
+       private List<Integer> getTidsHasLock(int fileId, int pid) {
+               List<Integer> tids = null;
+               List<Integer> key = Arrays.asList(fileId, pid);
+               if(accessorHasLockMap.containsKey(key)) {
+                       tids = accessorHasLockMap.get(key);
+               }
+               return tids;
+       }
+       
+       private void removeTidsHasLock(int fileId, int pid) {
+               List<Integer> key = Arrays.asList(fileId, pid);
+               if(accessorHasLockMap.containsKey(key)) {
+                       accessorHasLockMap.remove(key);
                }
        }
        
@@ -593,7 +677,6 @@ public class FileDataMaker {
                }
        }
 
-       
        /**
         * filtering out STDIN/STDOUT ops
         * @param input
@@ -633,6 +716,26 @@ public class FileDataMaker {
                return false;
        }
        
+       public List<FileAccessor> getFileAccessor() {
+               return fileAccessorQueue.poll();
+       }
+
+       public List<FileAccess> getFileAccessList() {
+               return fileAccessList;
+       }
+       
+       public List<FileStatus> getFileStatusList() {
+               return fileStatusList;
+       }
+       
+       public List<FileEvent> getFileApiList() {
+               return fileApiList;
+       }
+       
+       public List<FileAccessor> getFileAccessorList() {
+               return fileAccessorList;
+       }
+       
        public void setFileAccessList(List<FileAccess> fileAccessList) {
                this.fileAccessList = fileAccessList;
        }
@@ -644,5 +747,9 @@ public class FileDataMaker {
        public void setFileApiList(List<FileEvent> fileApiList) {
                this.fileApiList = fileApiList;
        }
+       
+       public void setFileAccessorList(List<FileAccessor> fileAccessorList) {
+               this.fileAccessorList = fileAccessorList;
+       }
 
 }
index b835d88..b9fa88e 100644 (file)
 
 package org.tizen.dynamicanalyzer.ui.file.manager;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
 import org.tizen.dynamicanalyzer.swap.logparser.PageDataManager;
 import org.tizen.dynamicanalyzer.ui.file.data.FileAccessDB;
+import org.tizen.dynamicanalyzer.ui.file.data.FileAccessorDB;
 import org.tizen.dynamicanalyzer.ui.file.data.FileApiDB;
 import org.tizen.dynamicanalyzer.ui.file.data.FileStatusDB;
 import org.tizen.dynamicanalyzer.ui.file.model.FileAccess;
-import org.tizen.dynamicanalyzer.ui.file.model.FileEvent;
+import org.tizen.dynamicanalyzer.ui.file.model.FileSelectedData;
 
 
 public class FileDataManager extends PageDataManager {
@@ -46,8 +46,9 @@ public class FileDataManager extends PageDataManager {
        private FileAccessDB accessDB = null;
        private FileApiDB apiDB = null;
        private FileStatusDB statusDB = null;
+       private FileAccessorDB accessorDB = null;
        
-       private List<FileEvent> selectedTableAPIList = new ArrayList<FileEvent>();
+       private FileSelectedData selectedData = null;
 
        private FileDataManager() {
                dataMaker = new FileDataMaker();
@@ -66,13 +67,15 @@ public class FileDataManager extends PageDataManager {
                accessDB = new FileAccessDB();
                apiDB = new FileApiDB();
                statusDB = new FileStatusDB();
+               accessorDB = new FileAccessorDB();
        }
        
        public void clear() {
                accessDB = null;
                apiDB = null;
                statusDB = null;
-               selectedTableAPIList = new ArrayList<FileEvent>();
+               accessorDB = null;
+               selectedData = null;
        }
        
        public FileAccessDB getAccessDB(){
@@ -87,6 +90,10 @@ public class FileDataManager extends PageDataManager {
                return statusDB;
        }
        
+       public FileAccessorDB getAccessorDB() {
+               return accessorDB;
+       }
+       
        public void saveData(Map<String, String> dataMap) {
                List<FileAccess> accessList = dataMaker.getFileAccessList();
                if (accessList != null ) {
@@ -114,19 +121,22 @@ public class FileDataManager extends PageDataManager {
                if (dataMaker.getFileApiList().size() == 0) {
                        dataMaker.setFileApiList(apiDB.select());
                }
+               
+               if (dataMaker.getFileAccessorList().size() == 0) {
+                       dataMaker.setFileAccessorList(accessorDB.select());
+               }
        }
 
        public FileDataMaker getFileChartDataMaker() {
                return dataMaker;
        }
        
-       public List<FileEvent> getSelectedTableAPIList() {
-               return selectedTableAPIList;
+       public void setSelectedData(FileSelectedData selectedData) {
+               this.selectedData = selectedData;
        }
-
-       public void setSelectedTableAPIList(
-                       List<FileEvent> selectedTableAPIList) {
-               this.selectedTableAPIList = selectedTableAPIList;
+       
+       public FileSelectedData getSelectedData() {
+               return selectedData;
        }
        
        /**
index 55ff42c..3c26c20 100644 (file)
@@ -29,98 +29,45 @@ package org.tizen.dynamicanalyzer.ui.file.model;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.tizen.dynamicanalyzer.ui.file.data.FileAccessDB;
 
 public class FileAccess {
-       private String filePath = null;
-       private int pid = -1;
-       private int tid = -1;
+       private int accessorId = -1;
        private long fd = -1;
-       private int apiType = -1;       // only read, write, lock event
+       private int apiType = -1;       // r/w, concurrent r/w, lock, lock wait, unlock, auto release, fail
        private long startTime = -1;
        private long endTime = -1;
-       private long erroNo = 0;
-       private long fileSize = -1;
+       private String tooltip = null;
        
        private boolean isAlreadyReading = false;
        private boolean isAlreadyWriting = false;
        private boolean isAlreadyLocking = false;
        private boolean isWarning = false;
        
-       public FileAccess(String filePath, int pid, int tid, int apiType, long startTime) {
-               this.filePath = filePath;
-               this.pid = pid;
-               this.tid = tid;
+       public FileAccess(int accessorId, long fd,  int apiType, long startTime, String tooltip) {
+               this.fd = fd;
+               this.accessorId = accessorId;
                this.apiType = apiType;
                this.startTime = startTime;
+               this.tooltip = tooltip;
        }
-
-       public FileAccess(String filePath, int pid, int tid, long fd, int apiType, long startTime) {
-               this.filePath = filePath;
-               this.pid = pid;
-               this.tid = tid;
-               this.fd = fd;
+       
+       public FileAccess(int accessorId, int apiType, long startTime, long endTime, String tooltip) {
+               this.accessorId = accessorId;
                this.apiType = apiType;
                this.startTime = startTime;
+               this.endTime = endTime;
+               this.tooltip = tooltip;
        }
 
        public List<Object> getDBData() {
                List<Object> data = new ArrayList<Object>();
-               data.add(new Integer(this.pid));
-               data.add(new Integer(this.tid));
-               data.add(this.filePath);
-               data.add(new Long(this.fd));
-               data.add(new Integer(this.apiType));
-               data.add(new Long(this.startTime));
-               data.add(new Long(this.endTime));
-               data.add(new Long(this.erroNo));
-               data.add(new Long(this.fileSize));
+               data.add(this.accessorId);
+               data.add(this.apiType);
+               data.add(this.startTime);
+               data.add(this.endTime);
+               data.add(this.tooltip);
                return data;
        }
-       
-       public FileAccess(List<Object> data) {
-               this.pid = (Integer)data.get(FileAccessDB.COLUMN.PID.getValue());
-               this.tid = (Integer)data.get(FileAccessDB.COLUMN.TID.getValue());
-               this.filePath = (String)data.get(FileAccessDB.COLUMN.FILE_PATH.getValue());
-               this.fd = (Long)data.get(FileAccessDB.COLUMN.FD.getValue());
-               this.apiType = (Integer)data.get(FileAccessDB.COLUMN.API_TYPE.getValue());
-               this.startTime = (Long)data.get(FileAccessDB.COLUMN.START_TIME.getValue());
-               this.endTime = (Long)data.get(FileAccessDB.COLUMN.END_TIME.getValue());
-               this.erroNo = (Long)data.get(FileAccessDB.COLUMN.ERRNO.getValue());
-               this.fileSize = (Long)data.get(FileAccessDB.COLUMN.FILE_SIZE.getValue());
-       }
-       
-       public String getFilePath() {
-               return filePath;
-       }
-
-       public void setFilePath(String filePath) {
-               this.filePath = filePath;
-       }
-
-       public int getPid() {
-               return pid;
-       }
-
-       public void setPid(int pid) {
-               this.pid = pid;
-       }
-
-       public int getTid() {
-               return tid;
-       }
-
-       public void setTid(int tid) {
-               this.tid = tid;
-       }
-       
-       public long getFd() {
-               return fd;
-       }
-
-       public void setFd(long fd) {
-               this.fd = fd;
-       }
 
        public int getApiType() {
                return apiType;
@@ -170,20 +117,13 @@ public class FileAccess {
                this.isAlreadyLocking = isAlreadyLocking;
        }
 
-       public long getErroNo() {
-               return erroNo;
-       }
-
-       public void setErroNo(long erroNo) {
-               this.erroNo = erroNo;
-       }
 
-       public long getFileSize() {
-               return fileSize;
+       public String getTooltip() {
+               return tooltip;
        }
 
-       public void setFileSize(long fileSize) {
-               this.fileSize = fileSize;
+       public void setTooltip(String tooltip) {
+               this.tooltip = tooltip;
        }
        
        public void setWarning() {
@@ -193,4 +133,20 @@ public class FileAccess {
        public boolean isWarning() {
                return isWarning;
        }
+       
+       public void setFd(long fd) {
+               this.fd = fd;
+       }
+       
+       public long getFd() {
+               return fd;
+       }
+       
+       public int getAccessorId() {
+               return accessorId;
+       }
+       
+       public void setAccessorId(int accessorId) {
+               this.accessorId = accessorId;
+       }
 }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/model/FileAccessor.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/model/FileAccessor.java
new file mode 100644 (file)
index 0000000..e38ea1c
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyeran Kim <Hyeran74.kim@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.file.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class FileAccessor {
+       private int accessorId = -1;
+       private int fileId = -1;
+       private String filePath = null;
+       private int pid = -1;
+       private int tid = -1;
+       private boolean isTarget = true;
+       
+       public FileAccessor(int accessorId, int fileId, String filePath, int pid, int tid, boolean isTarget) {
+               this.accessorId = accessorId;
+               this.fileId = fileId;
+               this.filePath = filePath;
+               this.pid = pid;
+               this.tid = tid;
+               this.isTarget = isTarget;
+       }
+       
+       public List<Object> getDBData() {
+               List<Object> data = new ArrayList<Object>();
+               data.add(this.accessorId);
+               data.add(this.fileId);
+               data.add(this.filePath);
+               data.add(this.pid);
+               data.add(this.tid);
+               data.add(this.isTarget);
+               return data;
+       }
+       
+       public int getAccessorId() {
+               return accessorId;
+       }
+       public void setAccessorId(int accessorId) {
+               this.accessorId = accessorId;
+       }
+       public int getFileId() {
+               return fileId;
+       }
+       public void setFileId(int fileId) {
+               this.fileId = fileId;
+       }
+       public String getFilePath() {
+               return filePath;
+       }
+       public void setFilePath(String filePath) {
+               this.filePath = filePath;
+       }
+       public int getPid() {
+               return pid;
+       }
+       public void setPid(int pid) {
+               this.pid = pid;
+       }
+       public int getTid() {
+               return tid;
+       }
+       public void setTid(int tid) {
+               this.tid = tid;
+       }
+       public boolean isTarget() {
+               return isTarget;
+       }
+       public void setIsTarget(boolean isTarget) {
+               this.isTarget = isTarget;
+       }
+       
+       @Override
+    public boolean equals(Object o){
+        FileAccessor s = (FileAccessor) o;
+        if(this.fileId == s.getFileId()
+            && this.pid == s.getPid()
+            && this.tid == s.getTid()){
+            return true;
+        } else {
+            return false;
+        }
+    }
+}
index 9198953..9ab496e 100644 (file)
@@ -30,15 +30,15 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.tizen.dynamicanalyzer.swap.model.data.FileData;
-import org.tizen.dynamicanalyzer.ui.file.data.FileApiDB;
 
 public class FileEvent extends FileData{
-       // TODO considering apiId 
        private int apiId = -1;
-       private long ioSize =-1;
        private boolean target = false;
        private int lockType = -1;
-
+       
+       protected int fileId = -1;      
+       protected int accessorId = -1;
+       
        public FileEvent() { }
 
        // for non-target process
@@ -74,47 +74,56 @@ public class FileEvent extends FileData{
                this.target = target;
        }
        
-       public FileEvent(long seq, String filePath, int pid, int tid) {
+       public FileEvent(long seq, String filePath, int pid, int tid, 
+                       long fd, int apiType, int apiId, long eventTime, long fileSize, long size,
+                       String args, String returnVal, long errNo){
                this.seq = seq;
-               this.filePath = filePath;
                this.pid = pid;
                this.tid = tid;
+               this.filePath = filePath;
+               this.fdValue = fd;
+               this.fdApiType = apiType;
+               this.apiId = apiId;
+               this.time = eventTime;
+               this.fileSize = fileSize;
+               this.size = size;
+               this.args = args;
+               this.ret = returnVal;
+               this.errno = errNo;
        }
-       
-       public FileEvent(List<Object> data) {
-               this.seq = (Long) data.get(FileApiDB.COLUMN.SEQ.getValue());
-               this.filePath = (String) data.get(FileApiDB.COLUMN.FILE_PATH.getValue());
-               this.pid = (Integer) data.get(FileApiDB.COLUMN.PID.getValue());
-               this.tid = (Integer) data.get(FileApiDB.COLUMN.TID.getValue());
-               this.fdValue = (Long) data.get(FileApiDB.COLUMN.FD.getValue());
-               this.fdApiType = (Integer) data.get(FileApiDB.COLUMN.API_TYPE.getValue());
-               this.apiId = (Integer) data.get(FileApiDB.COLUMN.API_ID.getValue());
-               this.time = (Long) data.get(FileApiDB.COLUMN.EVENT_TIME.getValue());
-               this.fileSize = (Long) data.get(FileApiDB.COLUMN.FILE_SIZE.getValue());
-               this.size = (Long) data.get(FileApiDB.COLUMN.SIZE.getValue());
-               this.ret = (String) data.get(FileApiDB.COLUMN.RETURN_VALUE.getValue());
-               this.args = (String) data.get(FileApiDB.COLUMN.ARGS.getValue());
-               this.errno = (Long) data.get(FileApiDB.COLUMN.ERRNO.getValue());
-               this.target = (Boolean) data.get(FileApiDB.COLUMN.TARGET.getValue());
+
+       public FileEvent(long seq, int accessorId, int fileId,
+                       long fd, int apiType, int apiId, long eventTime, long fileSize, long size,
+                       String args, String returnVal, long errNo){
+               this.seq = seq;
+               this.fileId = fileId;
+               this.accessorId = accessorId;
+               this.fdValue = fd;
+               this.fdApiType = apiType;
+               this.apiId = apiId;
+               this.time = eventTime;
+               this.fileSize = fileSize;
+               this.size = size;
+               this.args = args;
+               this.ret = returnVal;
+               this.errno = errNo;
        }
        
        public List<Object> getDBData() {
                List<Object> data = new ArrayList<Object>();
                data.add(this.seq);
-               data.add(this.filePath);
-               data.add(this.pid);
-               data.add(this.tid);
+               data.add(this.fileId);
+               data.add(this.accessorId);
                data.add(this.fdValue);
                data.add(this.fdApiType);
                data.add(this.time);
                data.add(this.apiId);
                data.add(this.errno);
-               data.add(this.ioSize);
                data.add(this.fileSize);
                data.add(this.size);
                data.add(this.ret);
                data.add(this.args);
-               data.add(this.target);
+               
                return data;
        }
        
@@ -148,14 +157,6 @@ public class FileEvent extends FileData{
                this.seq = seqNo;
        }
 
-       public long getIoSize() {
-               return ioSize;
-       }
-
-       public void setIoSize(long ioSize) {
-               this.ioSize = ioSize;
-       }
-
        public long getFileSize() {
                return fileSize;
        }
@@ -187,4 +188,20 @@ public class FileEvent extends FileData{
        public int getLockType() {
                return lockType;
        }
+       
+       public void setFileId(int fileId) {
+               this.fileId = fileId;
+       }
+       
+       public int getFileId() {
+               return fileId;
+       }
+       
+       public int getAccessorId() {
+               return accessorId;
+       }
+       
+       public void setAccessorId(int accessorId) {
+               this.accessorId = accessorId;
+       }
 }
index dc89dc4..fefef98 100644 (file)
@@ -28,41 +28,26 @@ package org.tizen.dynamicanalyzer.ui.file.model;
 
 public class FileSelectedData extends FileEvent{
        private boolean isParentChart = false;
+       private FileAccessor accessor = null;
        
-       public FileSelectedData(String filePath, int pid, int tid,long fd, boolean isParentChart) {
-               this.filePath = filePath;
-               this.pid = pid;
-               this.tid = tid;
-               this.fdValue = fd;
-               this.isParentChart = isParentChart;
+       public FileSelectedData(FileAccessor accessor, boolean isParentChart) {
+               this.accessor = accessor;
+               this.accessorId = accessor.getAccessorId();
+               this.fileId = accessor.getFileId();
        }
        
-       public FileSelectedData(String filePath, int pid, int tid, long fd, 
-                       long fileSize, boolean isParentChart) {
-               this.pid = pid;
-               this.tid = tid;
-               this.fdValue = fd;
+       /*public FileSelectedData(int accessorId, int fileId, boolean isParentChart) {
+               this.fileId = fileId;
+               this.accessorId = accessorId;
+               this.isParentChart = isParentChart;
+       }*/
+       
+       public FileSelectedData(int fileId, boolean isParentChart) {
+               this.fileId = fileId;
                this.isParentChart = isParentChart;
-               this.filePath = filePath;
-               this.fileSize = fileSize;
-       }
-
-       public int getPid() {
-               return pid;
-       }
-
-       public void setPid(int pid) {
-               this.pid = pid;
-       }
-
-       public int getTid() {
-               return tid;
-       }
-
-       public void setTid(int tid) {
-               this.tid = tid;
        }
-
+                       
+                       
        public boolean isParentChart() {
                return isParentChart;
        }
@@ -71,8 +56,8 @@ public class FileSelectedData extends FileEvent{
                this.isParentChart = isParentChart;
        }
        
-       public String getFilePath(){
-               return filePath;
+       public FileAccessor getFileAccessor() {
+               return accessor;
        }
        
        public String getFileName() {
@@ -81,12 +66,4 @@ public class FileSelectedData extends FileEvent{
                return fileName;
        }
        
-       public long getFileSize() {
-               return fileSize;
-       }
-       
-       public void getFileSize(long fileSize) {
-               this.fileSize = fileSize;
-       }
-
 }
index 04af3c7..450a4d4 100644 (file)
@@ -29,82 +29,25 @@ package org.tizen.dynamicanalyzer.ui.file.model;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.tizen.dynamicanalyzer.ui.file.data.FileStatusDB;
-
 public class FileStatus {
-       private String filePath = null;
-       private int pid = -1;
-       private int tid = -1;
-       private long fd = -1;
+       private int fileId = -1;
        private int apiType = -1;       // only open, close event
        private long eventTime = -1;
-       private long errNo = 0;
-       
-       public FileStatus(int pid, int tid, long fd, String filePath,
-                       int apiType, long eventTime, long errNo) {
-               this.filePath = filePath;
-               this.pid = pid;
-               this.tid = tid;
-               this.fd = fd;
+
+       public FileStatus(int fileId, int apiType, long eventTime) {
+               this.fileId = fileId;
                this.apiType = apiType;
                this.eventTime = eventTime;
-               this.errNo = errNo;
        }
        
        public List<Object> getDBData() {
                List<Object> data = new ArrayList<Object>();
-               data.add(this.pid);
-               data.add(this.tid);
-               data.add(this.filePath);
-               data.add(this.fd);
+               data.add(this.fileId);
                data.add(this.apiType);
                data.add(this.eventTime);
-               data.add(this.errNo);
                return data;
        }
        
-       public FileStatus(List<Object> data) {
-               this.pid = (Integer)data.get(FileStatusDB.COLUMN.PID.getValue());
-               this.tid = (Integer)data.get(FileStatusDB.COLUMN.TID.getValue());
-               this.filePath = (String)data.get(FileStatusDB.COLUMN.FILE_PATH.getValue());
-               this.fd = (Long)data.get(FileStatusDB.COLUMN.FD.getValue());
-               this.apiType = (Integer)data.get(FileStatusDB.COLUMN.API_TYPE.getValue());
-               this.eventTime = (Long)data.get(FileStatusDB.COLUMN.EVENT_TIME.getValue());
-               this.errNo = (Long)data.get(FileStatusDB.COLUMN.ERRNO.getValue());
-       }
-
-       public String getFilePath() {
-               return filePath;
-       }
-
-       public void setFilePath(String filePath) {
-               this.filePath = filePath;
-       }
-
-       public int getPid() {
-               return pid;
-       }
-
-       public void setPid(int pid) {
-               this.pid = pid;
-       }
-
-       public int getTid() {
-               return tid;
-       }
-
-       public void setTid(int tid) {
-               this.tid = tid;
-       }
-       
-       public long getFd() {
-               return fd;
-       }
-
-       public void setFd(long fd) {
-               this.fd = fd;
-       }
-
        public int getApiType() {
                return apiType;
        }
@@ -120,13 +63,11 @@ public class FileStatus {
        public void setApiType(int apiType) {
                this.apiType = apiType;
        }
-       
-       public void setErrNo(long errNo) {
-               this.errNo = errNo;
-       }
-       
-       public long getErrNo() {
-               return errNo;
+       public void setFileId(int fileId) {
+               this.fileId = fileId;
        }
 
+       public int getFileId() {
+               return fileId;
+       }
 }
index c210b77..955df9c 100644 (file)
@@ -40,11 +40,10 @@ import org.tizen.dynamicanalyzer.database.IResultSet;
 public class CallStackDataDBTable extends DBTable {
        private static final String TABLENAME="CallStackData";
        private static final String queryto_withSeq = "where %s = %s";
-       //TODO: use Array type of DB
+
        public enum COLUMN {
                SEQ(0, "SEQNUMBER"),
-               ORDER(1, "CallStackOrder"),
-               PCADDR(2, "PcAddr");
+               ADDRESS_ARRAY(1, "ADDRESS_ARRAY");
                
                public final int index;
                public final String name;
@@ -62,8 +61,7 @@ public class CallStackDataDBTable extends DBTable {
        
        public CallStackDataDBTable() {
                addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.ORDER.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.PCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));             
+               addColumn(new DBColumn(COLUMN.ADDRESS_ARRAY.name, DBConstants.NOT_NULL, DBConstants.BIGINT_ARRAY));             
        }
 
        public List<List<Object>> getCallStackAddrsFromDB(long seq) {
@@ -71,19 +69,13 @@ public class CallStackDataDBTable extends DBTable {
                                COLUMN.SEQ.name, seq);
                
                List<String> selectColumn = new ArrayList<String>();
-               selectColumn.add(COLUMN.PCADDR.name);
+               selectColumn.add(COLUMN.ADDRESS_ARRAY.name);
                
                return selectData(selectColumn, where, new IResultSet() {
                        @Override
                        public List<Object> extractDataFromResultSet(ResultSet rs) {
                                List<Object> row = new ArrayList<Object>();
-                               try {
-                                       row.add(Long.valueOf(rs.getLong(1)));
-                               } catch (SQLException e) {
-                                       e.printStackTrace();
-                                       return null;
-                               }
-                               
+                               row.add(getArrayFromResultSet(rs, 1, Long.valueOf(0)));                         
                                return row;
                        }
                }); 
@@ -99,8 +91,8 @@ public class CallStackDataDBTable extends DBTable {
                } else {
                        try {
                                prep.setLong(COLUMN.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
-                               prep.setInt(COLUMN.ORDER.index + 1, (Integer) (rowData.get(COLUMN.ORDER.index)));
-                               prep.setLong(COLUMN.PCADDR.index + 1, (Long) (rowData.get(COLUMN.PCADDR.index)));
+                               setArrayToPreparedStatement(COLUMN.ADDRESS_ARRAY.index, DBConstants.LONG,
+                                               prep, rowData);
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
index 4db3cd8..5bab326 100644 (file)
 package org.tizen.dynamicanalyzer.ui.info.callstack;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.SortedMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;
+import org.tizen.dynamicanalyzer.common.DALimit;
 import org.tizen.dynamicanalyzer.common.Global;
+import org.tizen.dynamicanalyzer.nl.ConfigureLabels;
 import org.tizen.dynamicanalyzer.project.BinaryInfo;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
+import org.tizen.dynamicanalyzer.ui.toolbar.setting.SettingDataManager;
+import org.tizen.dynamicanalyzer.ui.toolbar.setting.TargetData;
 
 // inserter thread for callstackdata, callstackunit
 public class CallStackInserter implements Runnable {
@@ -42,6 +52,7 @@ public class CallStackInserter implements Runnable {
        private static volatile Thread inserterThread = null;
        private static final int FULL_COUNT = 100;
        private static boolean stopTrace = false;
+       private static long lastInsertSeq = -1;
        
        private CallStackDataDBTable callStackDataTable = null;
        private CallStackUnitDBTable callStackUnitTable = null;
@@ -122,19 +133,17 @@ public class CallStackInserter implements Runnable {
 
                while ((csd = callstackDataQueue.poll()) != null) {
                        List<Long> addrs = csd.getAddrs();
-                       int size = addrs.size();
-
-                       for(int i = 0; i < size; i++) {
-                               List<Object> insertRowData = new ArrayList<Object>();                           
-                               try {
-                                       insertRowData.add(new Long(csd.getSeq()));
-                                       insertRowData.add(new Integer(i));
-                                       insertRowData.add(new Long(addrs.get(i)));
-                               } catch (ArrayIndexOutOfBoundsException e) {
-                                       e.printStackTrace();
-                               }
-                               insertData.add(insertRowData);
+
+                       List<Object> insertRowData = new ArrayList<Object>();                           
+                       try {
+                               insertRowData.add(new Long(csd.getSeq()));
+                               insertRowData.add(addrs);
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
                        }
+                       insertData.add(insertRowData);
+                       
+                       lastInsertSeq = csd.getSeq();
                        if ((insertCount-- <= 0) && (stopTrace == false)) {
                                break;
                        }
@@ -142,6 +151,33 @@ public class CallStackInserter implements Runnable {
                if (insertData.size() > 0) {
                        callStackDataTable.insertData(insertData);
                }
+               // remove unnecessary callstackdata from memory
+               TargetData target = SettingDataManager.getInstance().getConnectedTarget();
+               if (target.isSelectedFeature(ConfigureLabels.FEATURE_FUNCTION_SAMPLING)) {              
+                       // sample feature is on
+                       long lastSampleSeq = FunctionUsageProfiler.getInstance().getLastSampleSeq();
+                       if (lastSampleSeq != -1) {
+                               if (lastSampleSeq <= lastInsertSeq) {
+                                       removeCallstackData(lastSampleSeq);
+                               } else { // lastSampleSeq > lastInsertSeq
+                                       removeCallstackData(lastInsertSeq);
+                               }
+                       }
+               } else { // sample feature is off
+                       // callstackdata is not needed in memory after insertion to DB
+                       removeCallstackData(lastInsertSeq);                     
+               }
+               // clear SeqTimeMap if number of entries over > 1M
+               List<Integer> tids = AnalyzerManager.getCallstackManager().getTidsOfSeqTimeMap();
+               int size = tids.size();
+               for (int i = 0; i < size; i++) {
+                       NavigableMap<Long, Long> seqByTimeMap = 
+                                       AnalyzerManager.getCallstackManager()
+                                       .getSeqTimeByTidMap(tids.get(i));                       
+                       if (seqByTimeMap.size() > DALimit.MAX_CALLSTACK_SEQTIMEMAP_SIZE) {
+                               seqByTimeMap.clear();
+                       }
+               }
        }
 
        public void offerCallstackUnit(CallStackUnit csu) {
@@ -155,6 +191,17 @@ public class CallStackInserter implements Runnable {
                        callstackDataQueue.offer(csd);
                }
        }
+       
+       private void removeCallstackData(long seq) {
+               NavigableMap<Long, CallStackData> callstackDataMap = AnalyzerManager
+                               .getCallstackManager().getCallStackDataBySeqMap();
+               SortedMap<Long, CallStackData> headMap = callstackDataMap.headMap(seq);
+               Iterator<Map.Entry<Long, CallStackData>> itr = headMap.entrySet().iterator();
+               while (itr.hasNext()) {
+                       itr.next();
+                       itr.remove();
+               }
+       }
 
        @Override
        public void run() {
index 6e5a9a2..d7e9b89 100644 (file)
@@ -27,7 +27,6 @@
 
 package org.tizen.dynamicanalyzer.ui.info.callstack;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -136,41 +135,25 @@ public class CallstackTable extends DATableComposite {
                                time = logData.getTime();
                        }
 
-                       Map<Long, CallStackData> cdMap = AnalyzerManager
-                                       .getCallstackManager().getCallStackDataBySeqMap();
                        Map<Long, CallStackUnit> addrMap = AnalyzerManager
                                        .getCallstackManager().getCallStackApiAddrByPidMap(pid);
-                       if (null == cdMap || null == addrMap) {
+                       if (null == addrMap) {
                                return;
                        }
-                       CallStackData csd = cdMap.get(seqNum);
-                       List<Long> addrs = null;
-                       if (null == csd) { // callstackdata is not in memory, find from DB
-                               List<List<Object>> callStackAddrs = 
-                                               CallStackInserter.getInstance().getCallStackDataTable()
-                                               .getCallStackAddrsFromDB(seqNum); 
-
-                               if (null == callStackAddrs || 0 == callStackAddrs.size() 
-                                               || null == callStackAddrs.get(0)) { // not found
-                                       return;
-                               }
 
-                               int size = callStackAddrs.size();
-                               addrs = new ArrayList<Long>(); 
-                               for (int i = 0; i < size; i++) {
-                                       addrs.add((Long) callStackAddrs.get(i).get(0));
-                               }
-                       } else { // callstackdata is in memory
-                               addrs = csd.getAddrs();
+                       List<Long> addrs = null;
+                       addrs = AnalyzerManager.getCallstackManager().getCallstackAddrListFromSeq(seqNum);
+                       if (null == addrs) {
+                               return;
                        }
-
+                       
                        int size = addrs.size();
                        for (int i = 0; i < size; i++) {
                                String hexAddr = Formatter.toHexString(addrs.get(i).toString());
                                CallStackUnit api = addrMap.get(addrs.get(i));
 
                                if (null == api) {
-                                       Logger.debug("callstackunit for addr : " + hexAddr + " not found");                                     
+                                       Logger.debug("callstackunit for addr : " + hexAddr + " not found");     
                                        return;
                                }
 
index 91da69d..706d896 100644 (file)
@@ -115,6 +115,7 @@ public class SummaryDataManager extends PageDataManager {
 
        public void clear() {
                leakDataMaker.clear();
+               warningDataMaker.clear();
        }
 
        @Override
index 86b9c2b..5f1f1c0 100644 (file)
@@ -29,11 +29,9 @@ package org.tizen.dynamicanalyzer.ui.summary.profiling;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
-import java.util.SortedMap;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.Global;
@@ -47,7 +45,6 @@ import org.tizen.dynamicanalyzer.swap.logparser.Logs;
 import org.tizen.dynamicanalyzer.swap.logparser.PageDataManager;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.swap.model.data.ProfileData;
-import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackData;
 import org.tizen.dynamicanalyzer.ui.toolbar.setting.SettingDataManager;
 import org.tizen.dynamicanalyzer.ui.toolbar.setting.TargetData;
 
@@ -59,7 +56,6 @@ public class FunctionUsageProfiler extends PageDataManager {
        public static final String APPLICATION_KEY = "profiling_app_bin_key";//$NON-NLS-1$
        public static final String DEPENDENT_LIB_KEY = "profiling_dependent_lib_key";//$NON-NLS-1$
        public static final String UNKNOWN = CommonConstants.EMPTY;
-       public static final int CALLSTACKDATA_MAX = 5000;
 
        private static FunctionUsageProfiler instance = null;
        private boolean isSetSamplePeriod = false;
@@ -69,6 +65,21 @@ public class FunctionUsageProfiler extends PageDataManager {
        private FunctionSampleDBTable functionSampleTable = null;
        
        private HashMap<Integer, ProfileDataMaker> profileDataMakerMap = null;
+       
+       private static long lastSampleSeq = -1;
+       private Object sampleSeqLock = new Object();
+       
+       public void setLastSampleSeq(long seq) {
+               synchronized(sampleSeqLock) {
+                       lastSampleSeq = seq;
+               }
+       }
+       
+       public long getLastSampleSeq() {
+               synchronized(sampleSeqLock) {
+                       return lastSampleSeq;
+               }
+       }
 
        private FunctionUsageProfiler() {
                profilingDataTable = new ProfilingDataDBTable();
@@ -205,16 +216,12 @@ public class FunctionUsageProfiler extends PageDataManager {
                        for (int j = 0; j < count; j++) {
                                ProfilingChildData data = pDataList.get(j);
                                List<Integer> childList = data.getChildren();
-                               int childCount = childList.size();
                                try {
-                                       for (int k = 0; k < childCount; k++)
-                                       {
-                                               List<Object> insertRowData = new ArrayList<Object>();                                           
-                                               insertRowData.add(Integer.valueOf(data.getProfilingDataID()));
-                                               insertRowData.add(new Integer(data.getPid()));
-                                               insertRowData.add(new Integer(childList.get(k)));
-                                               insertData.add(insertRowData);
-                                       }
+                                       List<Object> insertRowData = new ArrayList<Object>();                                           
+                                       insertRowData.add(Integer.valueOf(data.getProfilingDataID()));
+                                       insertRowData.add(new Integer(data.getPid()));
+                                       insertRowData.add(childList);
+                                       insertData.add(insertRowData);
                                } catch (ArrayIndexOutOfBoundsException e) {
                                        e.printStackTrace();
                                }
@@ -251,29 +258,18 @@ public class FunctionUsageProfiler extends PageDataManager {
                                        getInstance().getProfileDataMakerByPid(
                                                        sample.get(i).getPid())
                                                        .makeFunctionUsageProfileData(sampleLog);
-                                       Map<Long, CallStackData> callstackDataMap = AnalyzerManager.getCallstackManager()
-                                                       .getCallStackDataBySeqMap();
-                                       if (callstackDataMap.size() > CALLSTACKDATA_MAX) {
-                                               // remove unnecessary callstackdata from memory
-                                               NavigableMap<Long, Long> seqByTimeMap = 
-                                                               AnalyzerManager.getCallstackManager()
-                                                               .getSeqTimeByTidMap(sampleLog.getTid());
-                                               // find the time of callstackdata which was made 
-                                               // right before the current sample time
-                                               // callstackdatas made before that time is needless                                             
-                                               Long lastTime = seqByTimeMap
-                                                               .floorKey(sampleLog.getTime());
-                                               if (null != lastTime) {
-                                                       SortedMap<Long, Long> headMap = 
-                                                                       seqByTimeMap.headMap(lastTime);
-                                                       Iterator<Map.Entry<Long, Long>> itr = headMap
-                                                                       .entrySet().iterator();
-                                                       while (itr.hasNext()) {
-                                                               Map.Entry<Long, Long> entry = itr.next();
-                                                               callstackDataMap.remove(entry.getValue());
-                                                               itr.remove();
-                                                       }
-                                               }
+                                       // set LastSampleSeq
+                                       NavigableMap<Long, Long> seqByTimeMap = 
+                                                       AnalyzerManager.getCallstackManager()
+                                                       .getSeqTimeByTidMap(sampleLog.getTid());
+                                       // find the time of callstackdata which was made 
+                                       // right before the current sample time
+                                       // callstackdatas made before that time is needless                                             
+                                       Long lastTime = seqByTimeMap
+                                                       .floorKey(sampleLog.getTime());
+                                       if (lastTime != null) {
+                                               Long lastSeq = seqByTimeMap.get(lastTime);
+                                               setLastSampleSeq(lastSeq);
                                        }
                                        // save to DB
                                        try {
@@ -293,13 +289,6 @@ public class FunctionUsageProfiler extends PageDataManager {
                                        functionSampleTable.insertData(insertData);
                                }
                        }
-               } else { // sampling is off, callstackdata is not needed in memory
-                       // need to maintain callstackdata until insertion to DB is finished
-                       Map<Long, CallStackData> callstackDataMap = AnalyzerManager.getCallstackManager()
-                                       .getCallStackDataBySeqMap();
-                       if (callstackDataMap.size() > CALLSTACKDATA_MAX) {
-                               callstackDataMap.clear();
-                       }
                }
        }
 }
index bb2d9ab..935d47d 100644 (file)
@@ -33,7 +33,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.NavigableMap;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
@@ -268,13 +267,11 @@ public class ProfileDataMaker {
                int pid = sampleLog.getPid();
                
                if(DACommunicator.isSWAPVersion()) {
-                       long seq;
+                       long userCallstackSeq;
                        int tid = sampleLog.getTid();
                        long sampleTime = sampleLog.getTime();  
-                       long callstackTime;
-                       Long longTime = null;
+
                        CallStackData callstackData;
-                       NavigableMap<Long, Long> seqByTimeMap = callstackManager.getSeqTimeByTidMap(tid);
                        Map<Long, CallStackUnit> addrMap = callstackManager
                                        .getCallStackApiAddrByPidMap(pid);
 
@@ -286,18 +283,22 @@ public class ProfileDataMaker {
                                addrMap.put(selfAddr, newCallstackUnit);                                        
                        }
                        
-                       longTime = seqByTimeMap.floorKey(sampleTime);
-                       if(null != longTime) {
-                               callstackTime = longTime.longValue();
-                               seq = seqByTimeMap.get(callstackTime);
-                               callstackData = callstackManager.getCallStackDataBySeqMap().get(seq);
-                               addrs = new ArrayList<Long>(callstackData.getAddrs());
-                               for(int i = 0; i < addrs.size(); i++)   {
-                                       if(addrs.get(i) == 0) {
-                                               addrs.remove(i);
+                       userCallstackSeq = callstackManager.getSeqOfUserCallstackForTime(tid, sampleTime);
+                       if (-1 != userCallstackSeq) {
+                               callstackData = callstackManager.getCallStackDataBySeqMap().get(userCallstackSeq);
+                               if (null == callstackData) {
+                                       Logger.debug("CallStackData is not found for seq : " + userCallstackSeq);
+                                       addrs = new ArrayList<Long>();
+                                       addrs.add(selfAddr);
+                               } else {
+                                       addrs = new ArrayList<Long>(callstackData.getAddrs());
+                                       for(int i = 0; i < addrs.size(); i++)   {
+                                               if(addrs.get(i) == 0) {
+                                                       addrs.remove(i);
+                                               }
                                        }
+                                       addrs.add(0, selfAddr);
                                }
-                               addrs.add(0, selfAddr);
                        } else {
 //                             Logger.debug("makeFunctionUsageProfileData : cannot find seq by time");
                                addrs = new ArrayList<Long>();
index 96090c2..f222537 100644 (file)
@@ -38,11 +38,11 @@ import org.tizen.dynamicanalyzer.database.DBTable;
 
 public class ProfilingChildDataDBTable extends DBTable {
        private static final String TABLENAME="ProfilingChildData";
-       // TODO: use Array type of DB
+
        public enum COLUMN {
                PROFILINGDATAID(0, "ProfilingDataID"),          
                PID(1, "PID"),          
-               CHILDDATAID(2, "ChildDataID");          
+               CHILDSEQARRAY(2, "CHILD_SEQUENCE_ARRAY");       
                
                public final int index;
                public final String name;
@@ -61,8 +61,8 @@ public class ProfilingChildDataDBTable extends DBTable {
        public ProfilingChildDataDBTable() {
                addColumn(new DBColumn(COLUMN.PROFILINGDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));            
                addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.CHILDDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               }
+               addColumn(new DBColumn(COLUMN.CHILDSEQARRAY.name, DBConstants.NOT_NULL, DBConstants.INTEGER_ARRAY));
+       }
 
        public List<List<Object>> getProfilingChildDataFromDB() {
                return selectAllColumnData(null);
@@ -79,7 +79,7 @@ public class ProfilingChildDataDBTable extends DBTable {
                        try {
                                prep.setInt(COLUMN.PROFILINGDATAID.index + 1, (Integer) (rowData.get(COLUMN.PROFILINGDATAID.index)));                           
                                prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
-                               prep.setInt(COLUMN.CHILDDATAID.index + 1, (Integer) (rowData.get(COLUMN.CHILDDATAID.index)));
+                               setArrayToPreparedStatement(COLUMN.CHILDSEQARRAY.index, DBConstants.DBTYPE_INT4, prep, rowData);
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
@@ -95,7 +95,7 @@ public class ProfilingChildDataDBTable extends DBTable {
                try {
                        row.add(Integer.valueOf(rs.getInt(1)));
                        row.add(Integer.valueOf(rs.getInt(2)));
-                       row.add(Integer.valueOf(rs.getInt(3)));
+                       row.add(getArrayFromResultSet(rs, 3, Integer.valueOf(0)));
                } catch (SQLException e) {
                        e.printStackTrace();
                        return null;
index bb44904..419a8a3 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
@@ -29,6 +30,8 @@ package org.tizen.dynamicanalyzer.ui.thread;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import org.eclipse.nebula.widgets.grid.GridItem;
@@ -40,42 +43,34 @@ import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.error.ErrorCodeManager;
 import org.tizen.dynamicanalyzer.model.TableInput;
-import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncAPIDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.data.ThreadAPIDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
-import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadData;
-import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
-import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
+import org.tizen.dynamicanalyzer.swap.model.data.SyncData;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataManager;
+import org.tizen.dynamicanalyzer.ui.thread.db.SyncAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.db.ThreadAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncDataEvent;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DAApiListTableComposite;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
 import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.utils.Formatter;
 
 public class ThreadAPIListTable extends DAApiListTableComposite {
-       
+
        private enum API {
-               SEQ(1),
-               APICALLTIME(2),
-               APIID(3),
-               PID(4),
-               TID(5),
-               ARGUMENT(6),
-               RETURN(7),
-               ERRORNO(8);
-               
+               SEQ(1), APICALLTIME(2), APIID(3), PID(4), TID(5), ARGUMENT(6), RETURN(7), ERRORNO(8);
                public final int index;
-               
+
                API(int index) {
                        this.index = index;
                }
        }
-       
+
        public ThreadAPIListTable(Composite parent, int compStyle, int tableStyle) {
                super(parent, compStyle, tableStyle);
                table.addSelectionListener(new SelectionListener() {
-
                        @Override
                        public void widgetSelected(SelectionEvent e) {
                                GridItem[] items = table.getSelection();
@@ -84,7 +79,6 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
                                }
                                long startTime = 0;
                                long endTime = 0;
-
                                DATableDataFormat dataFormat;
                                for (int i = 0; i < items.length; i++) {
                                        dataFormat = (DATableDataFormat) items[i].getData();
@@ -99,9 +93,8 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
                                                endTime = itemTime;
                                        }
                                }
-
-                               DASelectionData selData = new DASelectionData(
-                                               ThreadPage.listViewID, startTime, endTime, items, table);
+                               DASelectionData selData = new DASelectionData(ThreadPage.listViewID, startTime,
+                                               endTime, items, table);
                                AnalyzerManager.getCurrentPage().updateView(selData);
                        }
 
@@ -114,97 +107,110 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
 
        @Override
        protected List<TableInput> makeTableInput() {
-               ThreadAPIListView view = (ThreadAPIListView) AnalyzerManager
-                               .getCurrentPage().getView(ThreadPage.listViewID);
-
+               List<TableInput> input = new ArrayList<TableInput>();
+               ThreadAPIListView view = (ThreadAPIListView) AnalyzerManager.getCurrentPage().getView(
+                               ThreadPage.listViewID);
+               if(null == view){
+                       return input;
+               }
                ThreadPageData data = view.getPageData();
-               long rangeStartTime = view.getAnalysisStartTime();
-               long rangeEndTime = view.getAnaysisEndTime();
-
                if (null == data) {
+                       return input;
+               }
+
+               int selectID = -1;
+               List<ProbeCommonData> syncAPIList = new ArrayList<ProbeCommonData>();
+               if (data instanceof ThreadPageThreadData) {
+                       ThreadPageThreadData tData = (ThreadPageThreadData) data;
+                       selectID = tData.getThreadDataID();
+               } else if (data instanceof ThreadPageSyncData) {
+                       ThreadPageSyncData sData = (ThreadPageSyncData) data;
+                       selectID = sData.getSyncDataID();
+                       syncAPIList.addAll(getSyncAPIOfNotInsert(selectID));
+               } else {
+                       Logger.debug("failed to selectionD data in Thread Page API table");
                        return null;
                }
 
-               List<TableInput> input = new ArrayList<TableInput>();
-               ResultSet rs = null;
+               syncAPIList.addAll(selectAPIListFromDB(data, selectID));
+               sortListByTime(syncAPIList);
+               for (ProbeCommonData apiData : syncAPIList) {
+                       List<String> contentText = new ArrayList<String>();
+                       List<String> contentData = new ArrayList<String>();
+
+                       contentText.add(0, String.valueOf(apiData.getSeq()));
+                       contentData.add(String.valueOf(apiData.getSeq()));
+
+                       contentText.add(Formatter.toTimeFormat(apiData.getTime()));
+                       contentData.add(Long.toString(apiData.getTime()));
+
+                       contentText.add(Integer.toString(apiData.getPid()));
+                       contentData.add(Integer.toString(apiData.getPid()));
+
+                       contentText.add(Long.toString(apiData.getTid()));
+                       contentData.add(Long.toString(apiData.getTid()));
 
+                       contentText.add(apiData.getApiName());
+                       contentData.add(apiData.getApiName());
+
+                       contentText.add(apiData.getArgs());
+                       contentData.add(apiData.getArgs());
+
+                       contentText.add(apiData.getReturn());
+                       contentData.add(apiData.getReturn());
+
+                       String errMsg = ErrorCodeManager.getInatance().getErrorCode(apiData.getErrno()).name();
+                       if (null == errMsg) {
+                               errMsg = "undefined error code";
+                       }
+                       contentText.add(errMsg);
+                       contentData.add(errMsg);
+
+                       DATableDataFormat tableData = new DATableDataFormat(apiData.getSeq());
+                       tableData.setLogData(apiData);
+                       tableData.getData().addAll(contentData);
+                       TableInput tableInput = new TableInput();
+                       tableInput.setText(contentText);
+                       tableInput.setData(tableData);
+                       if (!errMsg.contains("SUCCESS")) {//$NON-NLS-1$
+                               tableInput.setFailed(true);
+                       }
+                       input.add(tableInput);
+                       if (apiData.getTime() >= view.getAnalysisStartTime()
+                                       && apiData.getTime() <= view.getAnaysisEndTime()) {
+                               tableInput.setInRange(true);
+                       }
+               }
+               return input;
+       }
+
+       private List<ProbeCommonData> selectAPIListFromDB(ThreadPageData data, int selectID) {
+               List<ProbeCommonData> returnList = new ArrayList<ProbeCommonData>();
+               if(null == data){
+                       return returnList;
+               }
+               ResultSet rs = null;
                if (data instanceof ThreadPageThreadData) {
-                       ThreadPageThreadData tData = (ThreadPageThreadData) data;
-                       String query = String.format(ThreadAPIDBTable.SELECT_QUERY, tData.getThreadDataID()); 
+                       String query = String.format(ThreadAPIDBTable.SELECT_QUERY, selectID);
                        rs = SqlConnectionManager.executeQueryRS(query);
                        if (null == rs) {
                                Logger.debug("failed to query api data in thread API table");
-                               return null;
+                               return returnList;
                        }
                } else if (data instanceof ThreadPageSyncData) {
-                       ThreadPageSyncData sData = (ThreadPageSyncData) data;
-                       String query = String.format(SyncAPIDBTable.SELECT_QUERY, sData.getSyncDataID());
+                       String query = String.format(SyncAPIDBTable.SELECT_QUERY, selectID);
                        rs = SqlConnectionManager.executeQueryRS(query);
                        if (null == rs) {
                                Logger.debug("failed to query api data in sync API table");
-                               return null;
-                       }                       
+                               return returnList;
+                       }
                } else {
                        Logger.error("unknown thread page data type!!");
-                       return null;
+                       return returnList;
                }
-
                try {
-                       while(rs.next()) {
-                               ProbeCommonData apiData = makeProbeCommonData(rs);
-                               
-                               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
-                               if (selectedPid != 0) {
-                                       if (selectedPid != apiData.getPid()) {
-                                               continue;
-                                       }
-                               }
-                               List<String> contentText = new ArrayList<String>();
-                               List<String> contentData = new ArrayList<String>();
-       
-                               contentText.add(0, String.valueOf(apiData.getSeq()));
-                               contentData.add(String.valueOf(apiData.getSeq()));
-       
-                               contentText.add(Formatter.toTimeFormat(apiData.getTime()));
-                               contentData.add(Long.toString(apiData.getTime()));
-       
-                               contentText.add(Integer.toString(apiData.getPid()));
-                               contentData.add(Integer.toString(apiData.getPid()));
-       
-                               contentText.add(Long.toString(apiData.getTid()));
-                               contentData.add(Long.toString(apiData.getTid()));
-       
-                               contentText.add(apiData.getApiName());
-                               contentData.add(apiData.getApiName());
-       
-                               contentText.add(apiData.getArgs());
-                               contentData.add(apiData.getArgs());
-       
-                               contentText.add(apiData.getReturn());
-                               contentData.add(apiData.getReturn());
-       
-                               String errMsg = ErrorCodeManager.getInatance()
-                                               .getErrorCode(apiData.getErrno()).name();
-                               if (null == errMsg) {
-                                       errMsg = "undefined error code";
-                               }
-                               contentText.add(errMsg);
-                               contentData.add(errMsg);
-       
-                               DATableDataFormat tableData = new DATableDataFormat(apiData.getSeq());
-                               tableData.setLogData(apiData);
-                               tableData.getData().addAll(contentData);
-                               TableInput tableInput = new TableInput();
-                               tableInput.setText(contentText);
-                               tableInput.setData(tableData);
-                               if (!errMsg.contains("SUCCESS")) {//$NON-NLS-1$
-                                       tableInput.setFailed(true);
-                               }
-                               input.add(tableInput);
-       
-                               if (apiData.getTime() >= rangeStartTime && apiData.getTime() <= rangeEndTime) {
-                                       tableInput.setInRange(true);
-                               }
+                       while (rs.next()) {
+                               returnList.add(makeProbeCommonData(rs));
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
@@ -213,38 +219,38 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
                                SqlConnectionManager.releaseResultSet(rs);
                        }
                }
-
-               return input;
+               return returnList;
        }
 
-       protected void actionSetStartEnd(int type) {
-               GridItem item = table.getItem(mousePoint);
-               if (null != item) {
-                       LogData data = ((DATableDataFormat) item.getData()).getLogData();
-                       long inputTime = data.getTime();
-                       double startTime = -1;
-                       double endTime = -1;
-
-                       if (type == START_TIME) {
-                               rangeDataManager.setMarkerStartTime(inputTime);
-                               startTime = inputTime / TimelineConstants.MEGA_DOUBLE;
-                               endTime = rangeDataManager.getMarkerEndTime()
-                                               / TimelineConstants.MEGA_DOUBLE;
-
-                       } else if (type == END_TIME) {
-                               rangeDataManager.setMarkerEndTime(inputTime);
-                               endTime = inputTime / TimelineConstants.MEGA_DOUBLE;
-                               startTime = rangeDataManager.getMarkerStartTime()
-                                               / TimelineConstants.MEGA_DOUBLE;
+       private List<ProbeCommonData> getSyncAPIOfNotInsert(int selectID) {
+               List<ProbeCommonData> returnList = new ArrayList<ProbeCommonData>();
+               List<ThreadPageSyncDataEvent> notInsertList = ThreadDataManager.getInstance()
+                               .getSyncDataMaker().getNotInsertSyncEventList();
+               for (ThreadPageSyncDataEvent event : notInsertList) {
+                       if (event.getSyncDataID() != selectID) {
+                               continue;
                        }
-
-                       ThreadChartView chartview = (ThreadChartView) (AnalyzerManager
-                                       .getCurrentPage().getView(ThreadPage.chartViewID));
-
-                       chartview.setRangeMarker(startTime, endTime);
+                       returnList.add((SyncData) event.getContents());
                }
+               return returnList;
        }
-       
+
+       private void sortListByTime(List<ProbeCommonData> list) {
+               Comparator<ProbeCommonData> comparator = new Comparator<ProbeCommonData>() {
+                       @Override
+                       public int compare(ProbeCommonData arg0, ProbeCommonData arg1) {
+                               if (arg0.getTime() > arg1.getTime()) {
+                                       return 1;
+                               } else if (arg0.getTime() < arg1.getTime()) {
+                                       return -1;
+                               } else {
+                                       return 0;
+                               }
+                       }
+               };
+               Collections.sort(list, comparator);
+       }
+
        private ProbeCommonData makeProbeCommonData(ResultSet rs) {
                ProbeCommonData pData = null;
                try {
@@ -256,7 +262,7 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
                        String args = rs.getString(API.ARGUMENT.index);
                        String returnValue = rs.getString(API.RETURN.index);
                        int errorno = rs.getInt(API.ERRORNO.index);
-                       
+
                        pData = new ProbeCommonData(seq, time, apiID, pid, tid, args, returnValue, errorno);
                } catch (SQLException e) {
                        e.printStackTrace();
index a94fb02..134eb8c 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Jooyoul Lee <jy.exe.lee@samsung.com>
@@ -36,6 +37,8 @@ import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageData;
+import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener;
 import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite;
@@ -49,10 +52,8 @@ public class ThreadAPIListView extends DAViewComposite {
        private long selectionEndTime = 0;
        private int preSelectionPid = -1;
 
-       private String[] columnNames = {
-                       ThreadPageLabels.THREAD_API_LIST_VIEW_INDEX,
-                       ThreadPageLabels.THREAD_API_LIST_VIEW_TIME,
-                       ThreadPageLabels.THREAD_API_LIST_VIEW_PID,
+       private String[] columnNames = { ThreadPageLabels.THREAD_API_LIST_VIEW_INDEX,
+                       ThreadPageLabels.THREAD_API_LIST_VIEW_TIME, ThreadPageLabels.THREAD_API_LIST_VIEW_PID,
                        ThreadPageLabels.THREAD_API_LIST_VIEW_THREAD_ID,
                        ThreadPageLabels.THREAD_API_LIST_VIEW_NAME,
                        ThreadPageLabels.THREAD_API_LIST_VIEW_PARAMETER,
@@ -61,22 +62,13 @@ public class ThreadAPIListView extends DAViewComposite {
 
        private int[] columnSizes = { 35, 70, 45, 45, 180, 240, 75, 100 };
 
-       private int[] columnAlignment = { SWT.RIGHT, SWT.LEFT, SWT.LEFT, SWT.LEFT,
-                       SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT };
+       private int[] columnAlignment = { SWT.RIGHT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT,
+                       SWT.LEFT, SWT.LEFT };
 
-       int[] sortTypes = { AnalyzerConstants.SORT_TYPE_NUM,
+       int[] sortTypes = { AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_NUM,
                        AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_NUM,
-                       AnalyzerConstants.SORT_TYPE_NUM,
-                       AnalyzerConstants.SORT_TYPE_STRING,
-                       AnalyzerConstants.SORT_TYPE_STRING,
-                       AnalyzerConstants.SORT_TYPE_STRING,
-                       AnalyzerConstants.SORT_TYPE_STRING };
-
-       // int[] sourceColumns = { LogCenterConstants.SEQUENCE_NUMBER_INDEX,
-       // LogCenterConstants.TIME_INDEX, LogCenterConstants.APINAME_INDEX,
-       // LogCenterConstants.INPUTPARM_INDEX,
-       // LogCenterConstants.THREAD_ID_INDEX,
-       // LogCenterConstants.RETURN_INDEX, LogCenterConstants.ERROR_INDEX };
+                       AnalyzerConstants.SORT_TYPE_STRING, AnalyzerConstants.SORT_TYPE_STRING,
+                       AnalyzerConstants.SORT_TYPE_STRING, AnalyzerConstants.SORT_TYPE_STRING };
 
        ThreadAPIListTable tableComp = null;
 
@@ -89,17 +81,15 @@ public class ThreadAPIListView extends DAViewComposite {
                Composite contents = getContentArea();
                contents.setBackground(ColorResources.WINDOW_BG_COLOR);
                contents.setLayout(new FillLayout());
-               tableComp = new ThreadAPIListTable(contents, SWT.NONE, SWT.MULTI
-                               | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
+               tableComp = new ThreadAPIListTable(contents, SWT.NONE, SWT.MULTI | SWT.BORDER
+                               | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
                tableComp.setTableName("Thread API List");
                tableComp.setSortTypes(sortTypes);
-               // tableComp.setSourceColumns(sourceColumns);
                tableComp.setColumnAlignment(columnAlignment);
                tableComp.setColumns(columnNames);
                tableComp.setColumnSize(columnSizes);
 
-               contents.addControlListener(new TableColumnSizePackListener(tableComp,
-                               columnSizes));
+               contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes));
        }
 
        @Override
@@ -112,17 +102,14 @@ public class ThreadAPIListView extends DAViewComposite {
                long newAnalysisEndTime = 0;
 
                if (RangeDataManager.getInstance().isBeingAnalyzed()) {
-                       newAnalysisStartTime = RangeDataManager.getInstance()
-                                       .getAnalysisStartTime();
-                       newAnalysisEndTime = RangeDataManager.getInstance()
-                                       .getAnalysisEndTime();
+                       newAnalysisStartTime = RangeDataManager.getInstance().getAnalysisStartTime();
+                       newAnalysisEndTime = RangeDataManager.getInstance().getAnalysisEndTime();
                } else {
                        newAnalysisStartTime = 0;
                        newAnalysisEndTime = 0;
                }
 
-               if (newAnalysisStartTime != analysisStartTime
-                               || newAnalysisEndTime != analysisEndTime) {
+               if (newAnalysisStartTime != analysisStartTime || newAnalysisEndTime != analysisEndTime) {
                        analysisStartTime = newAnalysisStartTime;
                        analysisEndTime = newAnalysisEndTime;
                        tableComp.updateTable();
@@ -136,33 +123,34 @@ public class ThreadAPIListView extends DAViewComposite {
                }
                preSelectionPid = selectedPid;
 
-               if (tableComp.getTable().getItemCount() > 0
-                               && data.getContents().size() != tableComp.getTable()
-                                               .getItemCount()) {
-                       tableComp.updateTable();
-               }
+               tableComp.updateTable();
        }
 
        @Override
        public void updateView(DAViewData vdata) {
-               if (vdata instanceof DASelectionData) {
-                       DASelectionData data = (DASelectionData) vdata;
-                       ThreadPageData pageData;
-
-                       if (data.getData() instanceof ThreadPageData) {
-                               pageData = (ThreadPageData) data.getData();
-                               this.data = pageData;
-                       } else if (data.getData() instanceof Integer) {
-                               this.data = null;
-                       }
+               if(vdata.getViewID().equals(TimelinePage.timelineViewID)){
+                       return;
+               }
+               if (vdata instanceof DASelectionData == false) {
+                       return;
+               }
+               tableComp.clear();
+               DASelectionData data = (DASelectionData) vdata;
+               ThreadPageData pageData;
+
+               if (data.getData() instanceof ThreadPageData) {
+                       pageData = (ThreadPageData) data.getData();
+                       this.data = pageData;
+               } else if (data.getData() instanceof Integer) {
+                       this.data = null;
+               }
 
-                       selectionStartTime = data.getStartTime();
-                       selectionEndTime = data.getEndTime();
+               selectionStartTime = data.getStartTime();
+               selectionEndTime = data.getEndTime();
 
-                       tableComp.getTable().removeAll();
-                       tableComp.updateTable();
-                       tableComp.setSelectionByTime(selectionStartTime, selectionEndTime);
-               }
+               tableComp.getTable().removeAll();
+               tableComp.updateTable();
+               tableComp.setSelectionByTime(selectionStartTime, selectionEndTime);
        }
 
        @Override
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadChartManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadChartManager.java
deleted file mode 100644 (file)
index 8f28182..0000000
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * yeongtaik byeon <yeongtaik.byeon@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
-import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
-import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
-import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
-import org.tizen.dynamicanalyzer.swap.logparser.Logs;
-import org.tizen.dynamicanalyzer.swap.logparser.PageDataManager;
-import org.tizen.dynamicanalyzer.swap.model.data.LogData;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncAPIDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncDataDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncEventDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.data.ThreadAPIDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.data.ThreadEventDBTable;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataEvent;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataManager;
-import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadData;
-import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadDataEvent;
-import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadDataManager;
-import org.tizen.dynamicanalyzer.util.Logger;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
-
-public class ThreadChartManager extends PageDataManager {
-       private static ThreadChartManager instance = null;
-       
-       private ThreadDataDBTable threadDataTable = null;
-       private ThreadEventDBTable threadEventTable = null;
-       private ThreadAPIDBTable threadAPITable = null;
-       
-       private SyncDataDBTable syncDataTable = null;
-       private SyncEventDBTable syncEventTable = null;
-       private SyncAPIDBTable syncAPITable = null;
-
-       private ThreadPageThreadDataManager tManager;
-       private ThreadPageSyncDataManager sManager;
-
-       private enum THREADEVENT {
-               EVENTTIME(0),
-               TID(1),
-               APITYPE(2),
-               TOOLTIP(3),
-               ERRORNO(4),
-               EVENTTYPE(5),
-               THREADTYPE(6),
-               CALLERID(7);
-               
-               public final int index;
-               
-               THREADEVENT(int index) {
-                       this.index = index;
-               }
-       }
-       
-       private enum SYNCEVENT {
-               EVENTTIME(0),
-               APITYPE(1),
-               TOOLTIP(2),
-               ERRORNO(3),
-               SYNCVALUE(4);
-               
-               public final int index;
-               
-               SYNCEVENT(int index) {
-                       this.index = index;
-               }
-       }
-       
-       private ThreadChartManager() {
-               threadDataTable = new ThreadDataDBTable();
-               threadEventTable = new ThreadEventDBTable();
-               threadAPITable = new ThreadAPIDBTable();
-               
-               syncDataTable = new SyncDataDBTable();
-               syncEventTable = new SyncEventDBTable();
-               syncAPITable = new SyncAPIDBTable();
-               
-               tManager = new ThreadPageThreadDataManager(null);
-               sManager = new ThreadPageSyncDataManager(null);
-       }
-
-       public static ThreadChartManager getInstance() {
-               if (null == instance) {
-                       instance = new ThreadChartManager();
-               }
-               return instance;
-       }
-
-       public ThreadPageThreadDataManager getThreadDataManager() {
-               return tManager;
-       }
-       
-       public ThreadEventDBTable getThreadEventDBTable() {
-               return threadEventTable;
-       }
-       
-       public ThreadAPIDBTable getThreadAPIDBTable() {
-               return threadAPITable;
-       }
-       
-       public SyncDataDBTable getSyncDataDBTable() {
-               return syncDataTable;
-       }
-       
-       public SyncEventDBTable getSyncEventDBTable() {
-               return syncEventTable;
-       }
-       
-       public SyncAPIDBTable getSyncAPIDBTable() {
-               return syncAPITable;
-       }
-
-       private List<LogData> getLogsFromLogPackage(LogPackage logPack,
-                       int logCenterConstants) {
-               Logs logs = logPack.getLogs(logCenterConstants);
-               if (null == logs || logs.getRawLogs().size() == 0) {
-                       return null;
-               }
-               List<LogData> ret = logs.getLogs();
-
-               return ret;
-       }
-
-       public void update() {
-               tManager.checkUpdate();
-               sManager.checkUpdate();
-       }
-
-       public void clear() {
-               tManager.clear();
-               sManager.clear();
-       }
-       
-       @Override
-       protected void onThreadStop() {
-               saveRemainingThreadData();
-       }
-       
-       private void saveRemainingThreadData() {
-               // ThreadPageThreadData
-               List<ThreadPageThreadData> remainedThreadData = tManager.getRows();
-               int size = remainedThreadData.size();
-               for (int i = 0; i < size; i++) {
-                       ThreadPageThreadData threadData = remainedThreadData.get(i);
-                       if (threadData.getEndTime() < 0) {
-                               saveThreadPageThreadData(threadData);
-                       }
-               }
-       }
-
-       public void openData(Map<String, String> dataMap) {
-               openThreadData();
-       }       
-       
-       private void openThreadData() {
-               //TODO: use ResultSet
-               // load ThreadPageThreadData
-               List<List<Object>> threadDatas = threadDataTable.getThreadDataFromDB();
-               int size = threadDatas.size();
-               for (int i = 0; i < size; i++) {
-                       List<Object>rowData = threadDatas.get(i);
-                       int id = (Integer) rowData.get(ThreadDataDBTable.COLUMN.THREADDATAID.index);
-                       int pid = (Integer) rowData.get(ThreadDataDBTable.COLUMN.PID.index);                    
-                       int tid = (Integer) rowData.get(ThreadDataDBTable.COLUMN.TID.index);
-                       byte threadType = (Byte) rowData.get(ThreadDataDBTable.COLUMN.THREADTYPE.index);
-                       byte attrType = (Byte) rowData.get(ThreadDataDBTable.COLUMN.ATTRIBUTETYPE.index);
-                       String attributeType = ThreadPageThreadDataManager.getAttrTypeByTypeInt(attrType);
-                       long startTime = (Long) rowData.get(ThreadDataDBTable.COLUMN.STARTTIME.index);
-                       long endTime = (Long) rowData.get(ThreadDataDBTable.COLUMN.ENDTIME.index);
-                       int functionID = (Integer) rowData.get(ThreadDataDBTable.COLUMN.FUNCTIONID.index);
-                       String className = (String) rowData.get(ThreadDataDBTable.COLUMN.CLASSNAME.index);
-                       
-                       ThreadPageThreadData threadData = new ThreadPageThreadData(id, pid, tid, threadType,
-                                       attributeType, startTime, endTime, functionID, className);
-                       tManager.pushRow(threadData);
-                       
-                       // load ThreadPageThreadDataEvent for the ThreadPageThreadData
-                       String query = String.format(ThreadEventDBTable.SELECT_QUERY, id);
-                       List<List<Object>> threadEvents = SqlConnectionManager.executeQuery(query);
-                       int eventSize = threadEvents.size();
-                       for (int j = 0; j < eventSize; j++) {
-                               ThreadPageThreadDataEvent threadEvent = makeThreadEvent(threadEvents.get(j));
-                               threadData.pushEvent(threadEvent);
-                       }
-               }
-               
-               // load ThreadPageSyncData
-//             List<List<Object>> syncDatas = SqlConnectionManager.executeQuery(SyncDataDBTable.SELECT_QUERY);
-               List<List<Object>> syncDatas = syncDataTable.getSyncDataFromDB();
-               int syncSize = syncDatas.size();
-               for (int i = 0; i < syncSize; i++) {
-                       ThreadPageSyncData syncData = makeSyncData(syncDatas.get(i));
-                       // load ThreadPageSyncDataEvent for the ThreadPageSyncData
-                       String query = String.format(SyncEventDBTable.SELECT_QUERY, syncData.getSyncDataID());
-                       List<List<Object>> syncEvents = SqlConnectionManager.executeQuery(query);
-                       int eventSize = syncEvents.size();
-                       for (int j = 0; j < eventSize; j++) {
-                               ThreadPageSyncDataEvent syncEvent = makeSyncEvent(syncEvents.get(j));
-                               syncData.pushEvent(syncEvent);
-                       }
-                       
-                       switch (syncData.getSyncDataType()) {
-                       case ThreadPageSyncData.SYNC_PARENT:
-                       case ThreadPageSyncData.SYNC_CHILD:
-                               sManager.pushRow(syncData);
-                               break;
-                       case ThreadPageSyncData.THREAD_CHILD:
-                               tManager.pushSyncData(syncData);                                
-                               break;
-                       default:
-                               Logger.error("unknown sync data type");
-                       }                       
-               }
-       }
-       
-       private ThreadPageThreadDataEvent makeThreadEvent(List<Object> rowData) {
-               ThreadPageThreadDataEvent threadEvent = null;
-               long time = (Long) rowData.get(THREADEVENT.EVENTTIME.index);
-               int tid = (Integer) rowData.get(THREADEVENT.TID.index);
-               String tidStr = String.valueOf(tid);
-               byte apiType = (Byte) rowData.get(THREADEVENT.APITYPE.index);
-               String tooltip = (String) rowData.get(THREADEVENT.TOOLTIP.index);
-               long errorNum = (Long) rowData.get(THREADEVENT.ERRORNO.index);
-               byte eventType = (Byte) rowData.get(THREADEVENT.EVENTTYPE.index);
-               int threadType = (Integer) rowData.get(THREADEVENT.THREADTYPE.index);
-               int callerId = (Integer) rowData.get(THREADEVENT.CALLERID.index);
-               String callerIdStr = null;
-               if (callerId != -1) {
-                       callerIdStr = String.valueOf(callerId);
-               }
-               
-               threadEvent = new ThreadPageThreadDataEvent(eventType, threadType, apiType, time,
-                               tidStr, tooltip, errorNum, null);
-               threadEvent.setCallerTid(callerIdStr);
-               
-               return threadEvent;
-       }
-       
-       private ThreadPageSyncData makeSyncData(List<Object> rowData) {
-               ThreadPageSyncData syncData = null;
-               int id = (Integer) rowData.get(SyncDataDBTable.COLUMN.SYNCDATAID.index);
-               int pid = (Integer) rowData.get(SyncDataDBTable.COLUMN.PID.index);                      
-               int tid = (Integer) rowData.get(SyncDataDBTable.COLUMN.TID.index);
-               byte syncType = (Byte) rowData.get(SyncDataDBTable.COLUMN.SYNCTYPE.index);
-               long syncValue = (Long) rowData.get(SyncDataDBTable.COLUMN.SYNCVALUE.index);
-               byte attrType = (Byte) rowData.get(SyncDataDBTable.COLUMN.ATTRIBUTETYPE.index);
-               String attributeType = ThreadPageSyncDataManager.getAttrTypeByTypeInt(attrType);
-               byte syncDataType = (Byte) rowData.get(SyncDataDBTable.COLUMN.SYNCDATATYPE.index);
-               int parentID = (Integer) rowData.get(SyncDataDBTable.COLUMN.PARENTID.index);
-               
-               syncData = new ThreadPageSyncData(id, pid, tid, syncType, syncValue, attributeType, 
-                               syncDataType, parentID);
-               
-               return syncData;
-       }
-       
-       private ThreadPageSyncDataEvent makeSyncEvent(List<Object> rowData) {
-               ThreadPageSyncDataEvent syncEvent = null;
-               long time = (Long) rowData.get(SYNCEVENT.EVENTTIME.index);
-               byte apiType = (Byte) rowData.get(SYNCEVENT.APITYPE.index);
-               String tooltip = (String) rowData.get(SYNCEVENT.TOOLTIP.index);
-               long errorNum = (Long) rowData.get(SYNCEVENT.ERRORNO.index);
-               long syncValue = (Long) rowData.get(SYNCEVENT.SYNCVALUE.index);
-               String syncValueStr = String.valueOf(syncValue);
-               
-               syncEvent = new ThreadPageSyncDataEvent(time, apiType, tooltip, errorNum, syncValueStr);
-               
-               return syncEvent;
-       }
-       
-       public int getItemIndexByTid(String tid) {
-               return tManager.getItemIndexByTid(tid);
-       }
-
-       // FIXME
-       public void setBoard(DAChartBoard threadBoard, DAChartBoard syncBoard) {
-               tManager.setBoard(threadBoard);
-               sManager.setBoard(syncBoard);
-       }
-
-       @Override
-       protected void makeData(LogPackage pack) {
-               List<LogData> loadInputs = getLogsFromLogPackage(pack,
-                               DataChannelConstants.MSG_DATA_SYSTEM);
-               if (null != loadInputs) {
-                       int logSize = loadInputs.size();
-                       for (int i = 0; i < logSize; i++) {
-                               tManager.parseLoad(loadInputs.get(i));
-                       }
-               }
-
-               List<LogData> threadInputs = getLogsFromLogPackage(pack,
-                               DataChannelConstants.MSG_PROBE_THREAD);
-               if (null != threadInputs) {
-                       int logSize = threadInputs.size();
-                       for (int i = 0; i < logSize; i++) {
-                               tManager.parseAPI(threadInputs.get(i));
-                       }
-               }
-
-               List<LogData> syncInputs = getLogsFromLogPackage(pack,
-                               DataChannelConstants.MSG_PROBE_SYNC);
-               if (null != syncInputs) {
-                       int logSize = syncInputs.size();
-                       for (int i = 0; i < logSize; i++) {
-                               tManager.parseSync(syncInputs.get(i));
-                               sManager.parseSync(syncInputs.get(i));
-                       }
-               }
-       }
-       
-       public void saveThreadPageThreadData(ThreadPageData threadPageData) {
-               List<List<Object>> insertData = new ArrayList<List<Object>>();
-               List<Object> insertRowData = new ArrayList<Object>();           
-               
-               if (threadPageData instanceof ThreadPageThreadData) {
-                       ThreadPageThreadData threadData = (ThreadPageThreadData) threadPageData;
-                       try {
-                               insertRowData.add(new Integer(threadData.getThreadDataID()));
-                               insertRowData.add(new Integer(threadData.getPid()));
-                               insertRowData.add(new Integer(threadData.getTid()));
-                               Integer type = new Integer(threadData.getType());
-                               byte threadType = type.byteValue();
-                               insertRowData.add(new Byte(threadType));
-                               String attrTypeStr = threadData.getAttrType();
-                               byte attrType = -1;
-                               if (attrTypeStr.equals(ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE)) {
-                                       attrType = ThreadPageThreadDataManager.PTHREAD_CREATE_JOINABLE;
-                               } else if (attrTypeStr.equals(ThreadPageLabels.THREAD_ATTR_TYPE_DETACHED)) {
-                                       attrType = ThreadPageThreadDataManager.PTHREAD_CREATE_DETACHED;
-                               } else { // main thread has no attribute
-                                       attrType = -1;
-                               }
-                               insertRowData.add(new Byte(attrType));
-                               insertRowData.add(new Long(threadData.getStartTime()));                         
-                               insertRowData.add(new Long(threadData.getEndTime()));
-                               insertRowData.add(new Integer(threadData.getThreadFuncID()));
-                               insertRowData.add(new String(threadData.getThreadClassName()));
-                       } catch (ArrayIndexOutOfBoundsException e) {
-                               e.printStackTrace();
-                       } 
-                       insertData.add(insertRowData);                  
-               } else if (threadPageData instanceof ThreadPageSyncData) {
-                       
-               } else {
-                       Logger.error("Unknown ThreadPageData type!");
-               }
-               
-               if (insertData.size() > 0) {
-                       threadDataTable.insertData(insertData);
-               }
-       }
-}
\ No newline at end of file
index 225cafe..8fd4cfe 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Jooyoul Lee <jy.exe.lee@samsung.com>
@@ -43,8 +44,10 @@ import org.tizen.dynamicanalyzer.nl.AnalyzerLabels;
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
-import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
+import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage;
 import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite;
 import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData;
 
@@ -52,8 +55,7 @@ public class ThreadDetailInfoView extends DAViewComposite {
        private Composite contents = null;
        private Text detailText = null;
 
-       private final static String leftFormAttachment = CommonConstants.SPACE
-                       + CommonConstants.SPACE;
+       private final static String leftFormAttachment = CommonConstants.SPACE + CommonConstants.SPACE;
        private final static String heightFormAttachment = CommonConstants.NEW_LINE
                        + CommonConstants.NEW_LINE;
 
@@ -100,8 +102,7 @@ public class ThreadDetailInfoView extends DAViewComposite {
                contents.setBackground(ColorResources.VIEW_BG_COLOR);
                contents.setLayout(new FormLayout());
 
-               detailText = new Text(contents, SWT.BORDER | SWT.V_SCROLL
-                               | SWT.H_SCROLL);
+               detailText = new Text(contents, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
                detailText.setBackground(ColorResources.VIEW_BG_COLOR);
                detailText.setForeground(ColorResources.TABLE_CONTENTS_FONT_COLOR);
                detailText.setFont(FontResources.DETAIL_INFO_FONT);
@@ -122,7 +123,7 @@ public class ThreadDetailInfoView extends DAViewComposite {
 
                String str;
                if (item instanceof ThreadPageThreadData) {
-                       tid = item.getTid();
+                       tid = Integer.toString(item.getTid());
                        type = ((ThreadPageThreadData) item).getTypeString();
                        str = ((ThreadPageThreadData) item).getThreadFuncName();
                        if (null != str && !(str.equals(CommonConstants.EMPTY))) {
@@ -150,7 +151,7 @@ public class ThreadDetailInfoView extends DAViewComposite {
                        List<ThreadPageSyncData> children = syncItem.getChildren();
                        int childrenSize = children.size();
                        if (0 == childrenSize) {
-                               tid = item.getTid();
+                               tid = Integer.toString(item.getTid());
                        }
                        str = item.getAttrType();
                        if (null != str && !(str.equals(CommonConstants.EMPTY))) {
@@ -158,38 +159,31 @@ public class ThreadDetailInfoView extends DAViewComposite {
                        }
                }
 
-               StringBuffer strDetailView = new StringBuffer(heightFormAttachment);
-               addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_TYPE
-                               + type);
+               StringBuffer strDetailView = new StringBuffer(CommonConstants.NEW_LINE);
+               addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_TYPE + type);
                if (null != tid && !(tid.equals(CommonConstants.EMPTY))) {
-                       addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_TID
-                                       + tid);
+                       addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_TID + tid);
                }
                if (type.equals(ThreadPageLabels.THREAD_ITEM_TYPE_TIZEN)) {
                        if (null != className && !(className.equals(CommonConstants.EMPTY))) {
-                               addDetailInfo(strDetailView,
-                                               ThreadPageLabels.THREAD_DETAILS_CLASSNAME + className);
+                               addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_CLASSNAME + className);
                        }
                } else {
                        if (null != funcName && !(funcName.equals(CommonConstants.EMPTY))) {
-                               addDetailInfo(strDetailView,
-                                               ThreadPageLabels.THREAD_DETAILS_FUNCNAME + funcName);
+                               addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_FUNCNAME + funcName);
                        }
                }
 
                if (null != startTime && !(startTime.equals(CommonConstants.EMPTY))) {
-                       addDetailInfo(strDetailView,
-                                       ThreadPageLabels.THREAD_DETAILS_STARTTIME + startTime);
+                       addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_STARTTIME + startTime);
                }
 
                if (null != endTime && !(endTime.equals(CommonConstants.EMPTY))) {
-                       addDetailInfo(strDetailView,
-                                       ThreadPageLabels.THREAD_DETAILS_ENDTIME + endTime);
+                       addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_ENDTIME + endTime);
                }
 
                if (null != attrType && !(attrType.equals(CommonConstants.EMPTY))) {
-                       addDetailInfo(strDetailView,
-                                       ThreadPageLabels.THREAD_DETAILS_ATTRTYPE + attrType);
+                       addDetailInfo(strDetailView, ThreadPageLabels.THREAD_DETAILS_ATTRTYPE + attrType);
                }
                detailText.setText(strDetailView.toString());
                detailText.redraw();
@@ -201,33 +195,29 @@ public class ThreadDetailInfoView extends DAViewComposite {
 
        private boolean isChange() {
                if (item instanceof ThreadPageThreadData) {
-                       if (!tid.equals(item.getTid())) {
+                       if (!tid.equals(Integer.toString(item.getTid()))) {
                                return true;
                        }
                        if (!type.equals(((ThreadPageThreadData) item).getTypeString())) {
                                return true;
                        }
-                       if (!funcName.equals(((ThreadPageThreadData) item)
-                                       .getThreadFuncName())) {
+                       if (!funcName.equals(((ThreadPageThreadData) item).getThreadFuncName())) {
                                return true;
                        }
-                       if (!className.equals(((ThreadPageThreadData) item)
-                                       .getThreadClassName())) {
+                       if (!className.equals(((ThreadPageThreadData) item).getThreadClassName())) {
                                return true;
                        }
-                       if (!startTime.equals(((ThreadPageThreadData) item)
-                                       .getStartTimeString())) {
+                       if (!startTime.equals(((ThreadPageThreadData) item).getStartTimeString())) {
                                return true;
                        }
-                       if (!endTime.equals(((ThreadPageThreadData) item)
-                                       .getEndTimeString())) {
+                       if (!endTime.equals(((ThreadPageThreadData) item).getEndTimeString())) {
                                return true;
                        }
                        if (!attrType.equals(item.getAttrType())) {
                                return true;
                        }
                } else if (item instanceof ThreadPageSyncData) {
-                       if (!tid.equals(item.getTid())) {
+                       if (!tid.equals(Integer.toString(item.getTid()))) {
                                return true;
                        }
                        if (!attrType.equals(item.getAttrType())) {
@@ -246,20 +236,23 @@ public class ThreadDetailInfoView extends DAViewComposite {
 
        @Override
        public void updateView(DAViewData vdata) {
-               if (vdata instanceof DASelectionData) {
-                       DASelectionData data = (DASelectionData) vdata;
-                       String id = data.getViewID();
-                       if (!(id.equals(ThreadPage.chartViewID))) {
-                               return;
-                       }
-                       if (data.getData() instanceof ThreadPageData) {
-                               item = (ThreadPageData) data.getData();
-                       } else {
-                               item = null;
-                       }
-
-                       updateDetails();
+               if(vdata.getViewID().equals(TimelinePage.timelineViewID)){
+                       return;
+               }
+               if (vdata instanceof DASelectionData == false) {
+                       return;
+               }
+               DASelectionData data = (DASelectionData) vdata;
+               String id = data.getViewID();
+               if (!(id.equals(ThreadPage.chartViewID))) {
+                       return;
+               }
+               if (data.getData() instanceof ThreadPageData) {
+                       item = (ThreadPageData) data.getData();
+               } else {
+                       item = null;
                }
+               updateDetails();
        }
 
        @Override
index b3b7434..d147e4e 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Jooyoul Lee <jy.exe.lee@samsung.com>
@@ -36,6 +37,8 @@ import org.tizen.dynamicanalyzer.nl.AnalyzerLabels;
 import org.tizen.dynamicanalyzer.shortcut.ShortCutManager;
 import org.tizen.dynamicanalyzer.swap.logparser.DataManagerRegistry;
 import org.tizen.dynamicanalyzer.ui.page.ScreenshotTabComposite;
+import org.tizen.dynamicanalyzer.ui.thread.chart.ThreadChartView;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataManager;
 import org.tizen.dynamicanalyzer.widgets.da.view.DAPageComposite;
 
 public class ThreadPage extends DAPageComposite {
@@ -51,38 +54,32 @@ public class ThreadPage extends DAPageComposite {
        public ThreadPage(Composite parent, int style) {
                super(parent, style);
                setTitle(AnalyzerLabels.COOLBAR_AREA_THREAD);
-               this.setData(DAPageComposite.KEY_TOOLTIP,
-                               ShortCutManager.COOLBAR_AREA_THREAD_TOOLTIP);
+               this.setData(DAPageComposite.KEY_TOOLTIP, ShortCutManager.COOLBAR_AREA_THREAD_TOOLTIP);
                this.setLayout(new FillLayout());
 
                baseForm = new SashForm(this, SWT.HORIZONTAL);
                baseForm.setLayout(new FillLayout());
 
                leftForm = new SashForm(baseForm, SWT.VERTICAL);
-               ThreadChartView threadChartView = new ThreadChartView(leftForm,
-                               SWT.NONE);
+               ThreadChartView threadChartView = new ThreadChartView(leftForm, SWT.NONE);
                addView(threadChartView);
 
-               ThreadAPIListView threadAPIListView = new ThreadAPIListView(leftForm,
-                               SWT.NONE);
+               ThreadAPIListView threadAPIListView = new ThreadAPIListView(leftForm, SWT.NONE);
                addView(threadAPIListView);
 
                leftForm.setWeights(new int[] { 60, 40 });
 
                rightForm = new SashForm(baseForm, SWT.VERTICAL);
-               // INFO_VIEW_INDEX = 2;
-               
-               ScreenshotTabComposite tabView = new ScreenshotTabComposite(rightForm,
-                               SWT.NONE, ThreadPage.pageID);
+
+               ScreenshotTabComposite tabView = new ScreenshotTabComposite(rightForm, SWT.NONE,
+                               ThreadPage.pageID);
                tabView.setObservingViews(ScreenshotTabComposite.screenshotViewID,
                                new String[] { ThreadPage.listViewID });
                tabView.setObservingViews(ScreenshotTabComposite.callstackViewID,
                                new String[] { ThreadPage.listViewID });
                addView(tabView);
 
-               // FILE_DETAIL = 3;
-               ThreadDetailInfoView detailInfo = new ThreadDetailInfoView(rightForm,
-                               SWT.NONE);
+               ThreadDetailInfoView detailInfo = new ThreadDetailInfoView(rightForm, SWT.NONE);
                addView(detailInfo);
 
                rightForm.setWeights(new int[] { 50, 50 });
@@ -91,8 +88,8 @@ public class ThreadPage extends DAPageComposite {
                baseForm.setSashWidth(AnalyzerConstants.SASH_WIDTH);
                leftForm.setSashWidth(AnalyzerConstants.SASH_WIDTH);
                rightForm.setSashWidth(AnalyzerConstants.SASH_WIDTH);
-               
-               DataManagerRegistry.registerPageDataManager(ThreadChartManager.getInstance());
+
+               DataManagerRegistry.registerPageDataManager(ThreadDataManager.getInstance());
        }
 
        @Override
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadPageData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadPageData.java
deleted file mode 100644 (file)
index 1ed1ee7..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * yeongtaik byeon <yeongtaik.byeon@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
-import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
-
-public abstract class ThreadPageData {
-       private String pid;
-       private String tid;
-       private int type;
-       private String key;
-       private String attrType;
-       protected DAChartBoardItem item;
-       protected List<ThreadPageDataEvent> contents = new ArrayList<ThreadPageDataEvent>();
-       protected List<ThreadPageDataEvent> contentsQueue = new ArrayList<ThreadPageDataEvent>();
-       protected DAChart chart;
-       protected boolean hasUpdate = false;
-
-       public ThreadPageData(int type, String name, String pid, String tid, String attrType) {
-               setType(type);
-               setKey(name);
-               setPid(pid);
-               setTid(tid);
-               setAttrType(attrType);
-       }
-
-       public String getTid() {
-               return tid;
-       }
-
-       public void setTid(String tid) {
-               this.tid = tid;
-       }
-
-       public String getPid() {
-               return pid;
-       }
-
-       public void setPid(String pid) {
-               this.pid = pid;
-       }
-
-       public int getType() {
-               return type;
-       }
-
-       public void setType(int type) {
-               this.type = type;
-       }
-
-       public String getKey() {
-               return key;
-       }
-
-       public void setKey(String name) {
-               this.key = name;
-       }
-
-       public DAChartBoardItem getItem() {
-               return item;
-       }
-
-       public DAChart getChart() {
-               return chart;
-       }
-
-       public void setChart(DAChart chart) {
-               this.chart = chart;
-       }
-
-       public void pushEvent(ThreadPageDataEvent event) {
-               contentsQueue.add(event);
-               hasUpdate = true;
-       }
-
-       public void setHasUpdate() {
-               hasUpdate = true;
-       }
-
-       public List<ThreadPageDataEvent> getContents() {
-               return contents;
-       }
-
-       protected abstract void checkUpdate();
-
-       public abstract void setItem(DAChartBoardItem item);
-
-       protected abstract int createChartItem(ThreadPageDataEvent event);
-
-       public String getAttrType() {
-               return attrType;
-       }
-
-       public void setAttrType(String attrType) {
-               this.attrType = attrType;
-       }
-
-       protected DAChartSeriesItem createApiItem(
-                       ThreadPageDataEvent event, long errno) {
-               DAChartSeriesItem apiItem = null;
-               if (0 != errno) {
-                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
-                                       DAChartSeriesItem.SERIES_STATE_BAR,
-                                       ColorResources.RED, event.getTooltipContent()
-                                                       + ThreadPageLabels.SYNC_CHART_ITEM_FAILED);
-               } else {
-                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
-                                       DAChartSeriesItem.SERIES_STATE_BAR,
-                                       ColorResources.YELLOW, event.getTooltipContent());
-               }
-               return apiItem;
-       }
-}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/SyncChart.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/SyncChart.java
new file mode 100644 (file)
index 0000000..000c89d
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:
+ * Hyunjong Park <phjwithyou.park@samsung.com> 
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.chart;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageDataEvent;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncDataEvent;
+import org.tizen.dynamicanalyzer.utils.Formatter;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
+
+public class SyncChart {
+       public final static int SYNC_PARENT_CHART = 0;
+       public final static int SYNC_CHILD_CHART = 1;
+       public final static int THREAD_CHART = 2;
+       protected int chartType = -1;;
+       protected DAChartBoardItem item;
+       protected DAChart chart;
+       protected List<SyncChart> children = new ArrayList<SyncChart>();
+       protected DAChartSeries syncAPISeries;
+       protected DAChartSeries syncStateSeries;
+
+       protected String chartName = CommonConstants.EMPTY;
+       protected int chartID = -1;
+       protected int pId = -1;
+       protected int tId = -1;
+
+       public SyncChart(int chartId, DAChartBoardItem item, DAChart chart, int chartType) {
+               setChartType(chartType);
+               setChartID(chartId);
+               setItem(item);
+               setChart(chart);
+       }
+
+       public int getChartID() {
+               return chartID;
+       }
+
+       public void setChartID(int chartID) {
+               this.chartID = chartID;
+       }
+
+       public String getChartName() {
+               return chartName.trim();
+       }
+
+       public void setChartName(String chartName) {
+               this.chartName = chartName;
+       }
+
+       public int getpId() {
+               return pId;
+       }
+
+       public void setpId(int pId) {
+               this.pId = pId;
+       }
+
+       public int gettId() {
+               return tId;
+       }
+
+       public void settId(int tId) {
+               this.tId = tId;
+       }
+
+       public boolean isParentChartRow() {
+               if (children.size() > 0) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       public void pushChild(SyncChart data) {
+               children.add(data);
+       }
+
+       public void setItem(DAChartBoardItem item) {
+               this.item = item;
+               setChart(item.getChart());
+               if (chartType == THREAD_CHART) {
+                       return;
+               }
+               syncStateSeries = new DAChartSeries(ThreadPageLabels.THREAD_SYNC_CHART_SERIES_STATE,
+                               DAChartSeries.SERIES_STYLE_STATE, ColorResources.WHITE, false);
+
+               syncAPISeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_API,
+                               DAChartSeries.SERIES_STYLE_EVENT, ColorResources.YELLOW);
+               syncAPISeries.setSummarizeTooltipText(ThreadPageLabels.THREAD_TOOLTIP_APIS);
+
+               chart.addSeries(syncStateSeries);
+               chart.addSeries(syncAPISeries);
+       }
+
+       public DAChartBoardItem getItem() {
+               return item;
+       }
+
+       public DAChart getChart() {
+               return chart;
+       }
+
+       public void setChart(DAChart chart) {
+               this.chart = chart;
+       }
+
+       public void clearSeries() {
+               if (null != syncAPISeries) {
+                       syncAPISeries.clear();
+               }
+               if (null != syncStateSeries) {
+                       syncStateSeries.clear();
+               }
+       }
+
+       public void updateSyncSeries(List<ThreadPageSyncDataEvent> eventList) {
+               if (chartType == THREAD_CHART) {
+                       return;
+               }
+               for (ThreadPageSyncDataEvent syncEvent : eventList) {
+                       if (chartID != syncEvent.getSyncDataID()) {
+                               continue;
+                       }
+                       addSyncSeriesItem(syncEvent);
+               }
+               chart.redraw();
+       }
+
+       private void addSyncSeriesItem(ThreadPageSyncDataEvent syncEvent) {
+               double startTime = syncEvent.getDoubleTime();
+               double endTime = Formatter.longTimeToDoubleTime(syncEvent.getBlockEndTime());
+               long errorNum = syncEvent.getErrorNum();
+               switch (syncEvent.getApiType()) {
+               case LogCenterConstants.SYNC_API_TYPE_NEW:
+               case LogCenterConstants.SYNC_API_TYPE_NOTIFY:
+               case LogCenterConstants.SYNC_API_TYPE_NOTIFY_ALL:
+               case LogCenterConstants.SYNC_API_TYPE_OTHER:
+                       syncStateSeries.addSeriesItem(new DAChartSeriesItem(startTime,
+                                       DAChartSeriesItem.SERIES_STATE_BAR,
+                                       ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
+                                       ThreadPageLabels.SYNC_CHART_ITEM_UNUSED));
+                       syncAPISeries.addSeriesItem(createAPIItem(syncEvent, errorNum));
+                       break;
+               case LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START:
+               case LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START:
+                       syncStateSeries.addSeriesItem(new DAChartSeriesItem(startTime,
+                                       DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                       ColorResources.THREAD_GRAPH_LOCK_WAIT_COLOR,
+                                       ThreadPageLabels.SYNC_CHART_ITEM_WAITED));
+                       if (syncEvent.getBlockEndTime() != -1) {
+                               syncStateSeries.addSeriesItem(new DAChartSeriesItem(endTime,
+                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                               ColorResources.THREAD_GRAPH_LOCK_ACQUIRE_COLOR,
+                                               ThreadPageLabels.SYNC_CHART_ITEM_USED));
+                       }
+                       syncAPISeries.addSeriesItem(createAPIItem(syncEvent, errorNum));
+                       break;
+               case LogCenterConstants.SYNC_API_TYPE_RELEASE:
+                       if (syncEvent.getBlockEndTime() == -1) {
+                               syncStateSeries.addSeriesItem(new DAChartSeriesItem(startTime,
+                                               DAChartSeriesItem.SERIES_STATE_BAR,
+                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
+                                               ThreadPageLabels.SYNC_CHART_ITEM_UNUSED));
+                       } else {
+                               syncStateSeries.addSeriesItem(new DAChartSeriesItem(startTime,
+                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
+                                               ThreadPageLabels.SYNC_CHART_ITEM_UNUSED));
+                               syncStateSeries.addSeriesItem(new DAChartSeriesItem(endTime,
+                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                               ColorResources.THREAD_GRAPH_LOCK_WAIT_COLOR,
+                                               ThreadPageLabels.SYNC_CHART_ITEM_WAITED));
+                       }
+                       syncAPISeries.addSeriesItem(createAPIItem(syncEvent, errorNum));
+                       break;
+               case LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_END:
+               case LogCenterConstants.SYNC_API_TYPE_COND_WAIT_END:
+                       syncStateSeries.addSeriesItem(new DAChartSeriesItem(startTime,
+                                       DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                       ColorResources.THREAD_GRAPH_LOCK_ACQUIRE_COLOR,
+                                       ThreadPageLabels.SYNC_CHART_ITEM_USED));
+                       if (syncEvent.getBlockEndTime() != -1) {
+                               syncStateSeries.addSeriesItem(new DAChartSeriesItem(endTime,
+                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
+                                               ThreadPageLabels.SYNC_CHART_ITEM_UNUSED));
+                       }
+                       break;
+               case LogCenterConstants.SYNC_API_TYPE_TRY_ACQUIRE:
+                       syncStateSeries.addSeriesItem(new DAChartSeriesItem(startTime,
+                                       DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                       ColorResources.THREAD_GRAPH_LOCK_ACQUIRE_COLOR,
+                                       ThreadPageLabels.SYNC_CHART_ITEM_USED));
+                       if (syncEvent.getBlockEndTime() != -1) {
+                               syncStateSeries.addSeriesItem(new DAChartSeriesItem(endTime,
+                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
+                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
+                                               ThreadPageLabels.SYNC_CHART_ITEM_UNUSED));
+                       }
+                       syncAPISeries.addSeriesItem(createAPIItem(syncEvent, errorNum));
+                       break;
+               default:
+                       return;
+               }
+       }
+
+       protected DAChartSeriesItem createAPIItem(ThreadPageDataEvent event, long errno) {
+               DAChartSeriesItem apiItem = null;
+               if (0 != errno) {
+                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
+                                       DAChartSeriesItem.SERIES_STATE_BAR, ColorResources.RED,
+                                       event.getTooltipContent() + ThreadPageLabels.SYNC_CHART_ITEM_FAILED);
+               } else {
+                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
+                                       DAChartSeriesItem.SERIES_STATE_BAR, ColorResources.YELLOW,
+                                       event.getTooltipContent());
+               }
+               return apiItem;
+       }
+
+       public int getChartType() {
+               return chartType;
+       }
+
+       public void setChartType(int chartType) {
+               this.chartType = chartType;
+       }
+}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/SyncChartBoard.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/SyncChartBoard.java
new file mode 100644 (file)
index 0000000..d691f34
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.chart;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.widgets.Composite;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
+import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.resources.FontResources;
+import org.tizen.dynamicanalyzer.resources.ImageResources;
+import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupClearMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupEndMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
+import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataManager;
+import org.tizen.dynamicanalyzer.ui.thread.db.SyncEventDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncDataEvent;
+import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
+import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
+import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot.AutoRangeType;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotIntervalMarker;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
+import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu;
+import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
+
+public class SyncChartBoard extends DAChartBoard {
+       private List<SyncChart> syncChartItemList = new ArrayList<SyncChart>();
+       protected int syncListCount = -1;
+       private int preSelectionPId = -1;
+
+       public SyncChartBoard(Composite parent, String title) {
+               super(parent, title);
+               initIntervalMarkers();
+
+       }
+
+       public SyncChartBoard(Composite parent, String title, int[] scaleValues) {
+               super(parent, title, scaleValues);
+       }
+
+       public SyncChartBoard(Composite parent, String title, int boardStyle) {
+               super(parent, title, boardStyle);
+       }
+
+       @Override
+       protected void callBackScaleChanged() {
+               super.callBackScaleChanged();
+               updateChart();
+       }
+
+       @Override
+       protected void callBackScrollChanged() {
+               super.callBackScrollChanged();
+               updateChart();
+       }
+
+       @Override
+       protected void callBackSizeChanged() {
+               layout(true, true);
+               super.callBackSizeChanged();
+       }
+
+       public void updateChart() {
+               createChartItem();
+               clearSeries();
+               updateSeries();
+               chartFilteringByPId();
+       }
+
+       protected void chartFilteringByPId() {
+               if (null == getItemList()) {
+                       return;
+               }
+               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
+               if (preSelectionPId != -1 && preSelectionPId != selectedPid) {
+                       return;
+               }
+
+               int parentIndex = 0;
+               for (SyncChart chart : syncChartItemList) {
+                       if (!chart.isParentChartRow()) {
+                               continue;
+                       }
+                       if (selectedPid == 0) {
+                               showItem(parentIndex);
+                       } else if (selectedPid == chart.getpId()) {
+                               showItem(parentIndex);
+                       } else {
+                               hideItem(parentIndex);
+                       }
+                       parentIndex++;
+               }
+               preSelectionPId = selectedPid;
+       }
+
+       public void clear() {
+               super.clear();
+               syncChartItemList.clear();
+               syncListCount = -1;
+               preSelectionPId = -1;
+               initIntervalMarkers();
+       }
+
+       public void initIntervalMarkers() {
+               // selection marker
+               DAChartPlotIntervalMarker selectionMarker = new DAChartPlotIntervalMarker(-1, -1,
+                               DAChartPlotIntervalMarker.INTERVAL_MARKER_STYLE_AREA);
+               selectionMarker.setBackgroundColor(ColorResources.SELECTION_RANGE);
+               selectionMarker.setAlpha((int) (255 * 0.25));
+               addIntervalMarker(selectionMarker);
+
+               // range analysis marker
+               DAChartPlotIntervalMarker rangeAnalyzeMarker = new DAChartPlotIntervalMarker(-1, -1,
+                               DAChartPlotIntervalMarker.INTERVAL_MARKER_STYLE_AREA);
+               rangeAnalyzeMarker.setBackgroundColor(ColorResources.YELLOW);
+               rangeAnalyzeMarker.setAlpha((int) (255 * 0.25));
+               addIntervalMarker(rangeAnalyzeMarker);
+
+               // range marker
+               DAChartPlotIntervalMarker rangeMarker = new DAChartPlotIntervalMarker(-1, -1,
+                               DAChartPlotIntervalMarker.INTERVAL_MARKER_STYLE_LINE);
+               rangeMarker.setForegroundColor(ColorResources.RED);
+               rangeMarker.setAlpha((int) (255 * 0.25));
+               addIntervalMarker(rangeMarker);
+
+       }
+
+       protected void initChart(DAChart chart, boolean isParent) {
+               if (null == chart) {
+                       return;
+               }
+
+               DAChartPlot plot = chart.getPlot();
+               if (null == plot) {
+                       return;
+               }
+               if (true == isParent) {
+                       plot.setBackgroundImage(ImageResources.BG_GRADIENT);
+               } else {
+                       plot.setBackgroundImage(ImageResources.BG_CHILD_GRADIENT);
+               }
+               plot.setAutoHeightRange(AutoRangeType.MANUAL);
+               plot.setAxisFont(FontResources.CHART_AXIS_FONT);
+               plot.setAxisRangeY(0, 101);
+               plot.setAxisRangeX(getVisibleStartTime(), getVisibleEndTime());
+               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
+               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
+               plot.setTooltip(tooltip);
+
+               DAPopupMenu popupMenu = new DAPopupMenu(chart);
+               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
+               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu, DAPopupMenuItem.NONE);
+               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
+               startItem.addListener(new PopupStartMenuItemClickListener(startItem, this));
+
+               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu, DAPopupMenuItem.NONE);
+               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
+               endItem.addListener(new PopupEndMenuItemClickListener(endItem, this));
+
+               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu, DAPopupMenuItem.NONE);
+               fromSelectionItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
+               fromSelectionItem.addListener(new PopupFromSelectionMenuItemClickListener(
+                               fromSelectionItem, this));
+
+               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu, DAPopupMenuItem.NONE);
+               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
+               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
+
+               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu, DAPopupMenuItem.NONE);
+               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
+               clearItem.addListener(new PopupClearMenuItemClickListener());
+
+               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
+                               popupMenu, getTimeline());
+               chart.addMouseListener(timelineChartMouseEventListener);
+               chart.addMouseMoveListener(timelineChartMouseEventListener);
+               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(getTimeline()));
+               plot.setMarkers(getMarkers());
+       }
+
+       public boolean createChartItem() {
+               if (syncListCount != ThreadDataManager.getInstance().getSyncDataMaker().getChartRowData()
+                               .size()) {
+                       for (ThreadPageSyncData data : ThreadDataManager.getInstance().getSyncDataMaker()
+                                       .getChartRowData()) {
+                               if (isExistSyncChartRow(data)) {
+                                       continue;
+                               }
+                               if (data.getSyncDataType() == ThreadPageSyncData.SYNC_PARENT) {
+                                       addSyncParentChartItemList(data);
+                               } else if (data.getSyncDataType() == ThreadPageSyncData.SYNC_CHILD) {
+                                       addChartChildItemList(data);
+                               }
+                       }
+               }
+               syncListCount = ThreadDataManager.getInstance().getSyncDataMaker().getChartRowData().size();
+               return true;
+       }
+
+       protected boolean isExistSyncChartRow(ThreadPageSyncData data) {
+               for (SyncChart chart : syncChartItemList) {
+                       if (chart.getChartID() == data.getSyncDataID()) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       private void addChartChildItemList(ThreadPageSyncData data) {
+               SyncChart parent = getParentChartData(data);
+               if (null != parent) {
+                       addSyncChildChartItemList(parent, data);
+               }
+       }
+
+       private void addSyncParentChartItemList(ThreadPageSyncData sync) {
+               DAChartBoardItem parentItem = new DAChartBoardItem(this, sync.getTypeString()
+                               + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
+                               + ThreadPageLabels.THREAD_CHART_NAME_OBJ + AnalyzerUtil.toHexdecimal(sync.getKey())
+                               + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
+               parentItem.setData(sync);
+               DAChart parentDAChart = parentItem.getChart();
+               initChart(parentDAChart, true);
+               SyncChart parentChartData = new SyncChart(sync.getSyncDataID(), parentItem, parentDAChart,
+                               ThreadChart.SYNC_PARENT_CHART);
+               parentChartData.setpId(Integer.parseInt(sync.getPid()));
+               syncChartItemList.add(parentChartData);
+       }
+
+       protected void addSyncChildChartItemList(SyncChart parent, ThreadPageSyncData sync) {
+               DAChartBoardItem parentItem = parent.getItem();
+               DAChartBoardItem childItem = new DAChartBoardItem(parentItem, sync.getTypeString()
+                               + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
+                               + ThreadPageLabels.THREAD_CHART_NAME_OBJ + AnalyzerUtil.toHexdecimal(sync.getKey())
+                               + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
+               childItem.setData(sync);
+               DAChart childChart = childItem.getChart();
+               initChart(childChart, false);
+               SyncChart childChartData = new SyncChart(sync.getSyncDataID(), childItem, childChart,
+                               ThreadChart.SYNC_CHILD_CHART);
+               parent.pushChild(childChartData);
+               syncChartItemList.add(childChartData);
+       }
+
+       private SyncChart getParentChartData(ThreadPageSyncData syncData) {
+               if (syncData.getSyncDataType() != ThreadPageSyncData.SYNC_CHILD) {
+                       return null;
+               }
+               for (SyncChart chart : syncChartItemList) {
+                       if (chart.getChartID() == syncData.getParentID()) {
+                               return chart;
+                       }
+               }
+               return null;
+       }
+
+       public void clearSeries() {
+               clearSyncSeries();
+       }
+
+       private void clearSyncSeries() {
+               if (null == syncChartItemList) {
+                       return;
+               }
+               for (SyncChart chart : syncChartItemList) {
+                       chart.clearSeries();
+               }
+       }
+
+       private void updateSeries() {
+               updateSyncEventSeries();
+       }
+
+       protected void updateSyncEventSeries() {
+               if (null == syncChartItemList) {
+                       return;
+               }
+               List<ThreadPageSyncDataEvent> seriesList = getSyncEventList();
+               if (null == seriesList) {
+                       return;
+               }
+               for (SyncChart chart : syncChartItemList) {
+                       chart.updateSyncSeries(seriesList);
+               }
+       }
+
+       private List<ThreadPageSyncDataEvent> getSyncEventList() {
+               List<ThreadPageSyncDataEvent> returnList = new ArrayList<ThreadPageSyncDataEvent>();
+               returnList.addAll(selectSyncEventFromDB());
+               returnList.addAll(ThreadDataManager.getInstance().getSyncDataMaker()
+                               .getNotInsertSyncEventList());
+               return returnList;
+       }
+
+       private List<ThreadPageSyncDataEvent> selectSyncEventFromDB() {
+               List<ThreadPageSyncDataEvent> returnList = new ArrayList<ThreadPageSyncDataEvent>();
+               double chartStartTime = (getVisibleStartTime() - 2) * TimelineConstants.MEGA_LONG;
+               double chartEndTime = getVisibleEndTime() * TimelineConstants.MEGA_LONG;
+               String query = String.format(SyncEventDBTable.SELECT_QUERY, chartStartTime, chartEndTime,
+                               chartStartTime, chartEndTime);
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               if (rs == null) {
+                       SqlConnectionManager.releaseResultSet(rs);
+                       return returnList;
+               }
+               try {
+                       while (rs.next()) {
+                               int syncDataID = rs.getInt(SyncEventDBTable.COLUMN.SYNCDATAID.index + 1);
+                               long time = rs.getLong(SyncEventDBTable.COLUMN.EVENTTIME.index + 1);
+                               int apiType = rs.getByte(SyncEventDBTable.COLUMN.APITYPE.index + 1);
+                               String tooltip = rs.getString(SyncEventDBTable.COLUMN.TOOLTIP.index + 1);
+                               long errorNum = rs.getLong(SyncEventDBTable.COLUMN.ERRORNO.index + 1);
+                               long syncValue = rs.getLong(SyncEventDBTable.COLUMN.SYNCVALUE.index + 1);
+                               long releaseTime = rs.getLong(SyncEventDBTable.COLUMN.RELEASETIME.index + 1);
+                               ThreadPageSyncDataEvent syncData = new ThreadPageSyncDataEvent(time, apiType,
+                                               tooltip, errorNum, Long.toString(syncValue));
+                               syncData.setSyncDataID(syncDataID);
+                               syncData.setBlockEndTime(releaseTime);
+                               returnList.add(syncData);
+                       }
+                       SqlConnectionManager.releaseResultSet(rs);
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               }
+               return returnList;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/ThreadChart.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/ThreadChart.java
new file mode 100644 (file)
index 0000000..089a2e9
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:
+ * Hyunjong Park <phjwithyou.park@samsung.com> 
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.chart;
+
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.resources.FontResources;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadDataEvent;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
+
+public class ThreadChart extends SyncChart {
+       private DAChartSeries threadLoadSeries;
+       private DAChartSeries threadEventSeries;
+       private DAChartSeries threadAPISeries;
+
+       public ThreadChart(int chartId, DAChartBoardItem item, DAChart chart, int chartType) {
+               super(chartId, item, chart, chartType);
+       }
+
+       public void setItem(DAChartBoardItem item) {
+               super.setItem(item);
+               this.item = item;
+               setChart(item.getChart());
+               threadLoadSeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_LOAD,
+                               DAChartSeries.SERIES_STYLE_LOAD, ColorResources.THREAD_GRAPH_MIN_CPU_LOAD_COLOR,
+                               ColorResources.THREAD_GRAPH_MAX_CPU_LOAD_COLOR);
+               threadLoadSeries.setBarWidth(1);
+
+               threadAPISeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_API,
+                               DAChartSeries.SERIES_STYLE_EVENT, ColorResources.YELLOW);
+
+               threadEventSeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_EVENT,
+                               DAChartSeries.SERIES_STYLE_ARROW, ColorResources.THREAD_GRAPH_CALLEE_COLOR);
+
+               threadAPISeries.setSummarizeTooltipText(ThreadPageLabels.THREAD_TOOLTIP_APIS);
+               threadEventSeries.setFont(FontResources.CHART_ARROW_TID_FONT);
+
+               chart.addSeries(threadLoadSeries);
+               chart.addSeries(threadAPISeries);
+               chart.addSeries(threadEventSeries);
+       }
+
+       public void clearSeries() {
+               super.clearSeries();
+               if (null != threadLoadSeries) {
+                       threadLoadSeries.clear();
+               }
+               if (null != threadEventSeries) {
+                       threadEventSeries.clear();
+               }
+               if (null != threadAPISeries) {
+                       threadAPISeries.clear();
+               }
+       }
+
+       public void updateThreadSeries(List<ThreadPageThreadDataEvent> eventList) {
+               for (ThreadPageThreadDataEvent threadEvent : eventList) {
+                       if (getChartType() != THREAD_CHART || chartID != threadEvent.getThreadDataID()) {
+                               continue;
+                       }
+                       addThreadSeriesItem(threadEvent);
+               }
+               chart.redraw();
+       }
+
+       private void addThreadSeriesItem(ThreadPageThreadDataEvent threadEvent) {
+               switch (threadEvent.getEventType()) {
+               case ThreadPageThreadDataEvent.TYPE_LOAD:
+                       updateLoadSeries(threadEvent);
+                       break;
+               case ThreadPageThreadDataEvent.TYPE_EVENT:
+                       updateEventSeries(threadEvent);
+                       break;
+               case ThreadPageThreadDataEvent.TYPE_API:
+                       updateAPISeries(threadEvent);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       private void updateLoadSeries(ThreadPageThreadDataEvent threadEvent) {
+               DAChartSeriesItem seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
+                               (double) (threadEvent.getThreadType() * 2.55), threadEvent.getTooltipContent());
+               threadLoadSeries.addSeriesItem(seriesItem);
+       }
+
+       private void updateEventSeries(ThreadPageThreadDataEvent threadEvent) {
+               DAChartSeriesItem seriesItem;
+               int eventApiType = threadEvent.getApiType();
+               if (eventApiType == LogCenterConstants.THREAD_API_TYPE_INTERNAL_START) {
+                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
+                                       DAChartSeriesItem.SERIES_ARROW_LEFT, threadEvent.getTooltipContent());
+                       seriesItem.setBarWidth(threadEvent.getCallerTid());
+               } else if (eventApiType == LogCenterConstants.THREAD_API_TYPE_WAIT_END) {
+                       if (threadEvent.isJoinAPI()) {
+                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
+                                               DAChartSeriesItem.SERIES_ARROW_LEFT,
+                                               ThreadPageLabels.THREAD_CHART_ITEM_JOINED);
+                               seriesItem.setBarWidth(threadEvent.getCallerTid());
+                       } else {
+                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
+                                               DAChartSeriesItem.SERIES_ARROW_NONE, threadEvent.getTooltipContent());
+                       }
+               } else if (eventApiType == LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
+                       if (threadEvent.getCallerTid() != -1) {
+                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
+                                               DAChartSeriesItem.SERIES_ARROW_RIGHT, threadEvent.getTooltipContent());
+                               seriesItem.setBarWidth(threadEvent.getCallerTid());
+                       } else {
+                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
+                                               DAChartSeriesItem.SERIES_ARROW_NONE, threadEvent.getTooltipContent());
+                       }
+               } else {
+                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
+                                       DAChartSeriesItem.SERIES_ARROW_NONE, threadEvent.getTooltipContent());
+               }
+               threadEventSeries.addSeriesItem(seriesItem);
+       }
+
+       private void updateAPISeries(ThreadPageThreadDataEvent threadEvent) {
+               long errorNum = threadEvent.getErrorNum();
+               DAChartSeriesItem seriesItem = createAPIItem(threadEvent, errorNum);
+               threadAPISeries.addSeriesItem(seriesItem);
+       }
+
+       private DAChartSeriesItem createAPIItem(ThreadPageThreadDataEvent event, long errno) {
+               DAChartSeriesItem apiItem = null;
+               if (0 != errno) {
+                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
+                                       DAChartSeriesItem.SERIES_STATE_BAR, ColorResources.RED,
+                                       event.getTooltipContent() + ThreadPageLabels.SYNC_CHART_ITEM_FAILED);
+               } else {
+                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
+                                       DAChartSeriesItem.SERIES_STATE_BAR, ColorResources.YELLOW,
+                                       event.getTooltipContent());
+               }
+               return apiItem;
+       }
+}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/ThreadChartBoard.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/chart/ThreadChartBoard.java
new file mode 100644 (file)
index 0000000..524d217
--- /dev/null
@@ -0,0 +1,293 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.chart;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.swt.widgets.Composite;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataManager;
+import org.tizen.dynamicanalyzer.ui.thread.db.ThreadEventDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadDataEvent;
+import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
+import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
+
+public class ThreadChartBoard extends SyncChartBoard {
+
+       private List<ThreadChart> threadChartItemList = new ArrayList<ThreadChart>();
+
+       private int threadListCount = -1;
+       private int preSelectionPId = -1;
+
+       public ThreadChartBoard(Composite parent, String title) {
+               super(parent, title);
+               initIntervalMarkers();
+       }
+
+       public ThreadChartBoard(Composite parent, String title, int[] scaleValues) {
+               super(parent, title, scaleValues);
+       }
+
+       public ThreadChartBoard(Composite parent, String title, int boardStyle) {
+               super(parent, title, boardStyle);
+       }
+
+       @Override
+       protected void callBackScaleChanged() {
+               super.callBackScaleChanged();
+               updateChart();
+       }
+
+       @Override
+       protected void callBackScrollChanged() {
+               super.callBackScrollChanged();
+               updateChart();
+       }
+
+       @Override
+       protected void callBackSizeChanged() {
+               super.callBackSizeChanged();
+               layout(true, true);
+       }
+
+       public void updateChart() {
+               createChartItem();
+               clearSeries();
+               updateSeries();
+               chartFilteringByPId();
+       }
+
+       protected void chartFilteringByPId() {
+               super.chartFilteringByPId();
+               if (null == getItemList()) {
+                       return;
+               }
+               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
+               if (preSelectionPId != -1 && preSelectionPId != selectedPid) {
+                       return;
+               }
+
+               int parentIndex = 0;
+               for (ThreadChart chart : threadChartItemList) {
+                       if (!chart.isParentChartRow()) {
+                               continue;
+                       }
+                       if (selectedPid == 0) {
+                               showItem(parentIndex);
+                       } else if (selectedPid == chart.getpId()) {
+                               showItem(parentIndex);
+                       } else {
+                               hideItem(parentIndex);
+                       }
+                       parentIndex++;
+               }
+               preSelectionPId = selectedPid;
+       }
+
+       public void clear() {
+               super.clear();
+               threadChartItemList.clear();
+               threadListCount = -1;
+               preSelectionPId = -1;
+               initIntervalMarkers();
+       }
+
+       public boolean createChartItem() {
+               createThreadItem();
+               createSyncItem();
+               return true;
+       }
+
+       private void createThreadItem() {
+               if (threadListCount == ThreadDataManager.getInstance().getThreadDataMaker()
+                               .getChartRowData().size()) {
+                       return;
+               }
+
+               List<ThreadPageThreadData> sortList = sortThreadChartByTID(ThreadDataManager.getInstance()
+                               .getThreadDataMaker().getChartRowData());
+               for (ThreadPageThreadData data : sortList) {
+                       if (isExistThreadChartRow(data)) {
+                               continue;
+                       }
+                       addThreadParentChartItemList(data);
+               }
+               threadListCount = ThreadDataManager.getInstance().getThreadDataMaker().getChartRowData()
+                               .size();
+       }
+
+       private List<ThreadPageThreadData> sortThreadChartByTID(List<ThreadPageThreadData> list) {
+               Comparator<ThreadPageThreadData> comparator = new Comparator<ThreadPageThreadData>() {
+                       @Override
+                       public int compare(ThreadPageThreadData arg0, ThreadPageThreadData arg1) {
+                               if (arg0.getTid() > arg1.getTid()) {
+                                       return 1;
+                               } else if (arg0.getTid() < arg1.getTid()) {
+                                       return -1;
+                               } else {
+                                       return 0;
+                               }
+                       }
+               };
+               Collections.sort(list, comparator);
+               return list;
+       }
+
+       private void createSyncItem() {
+               if (syncListCount == ThreadDataManager.getInstance().getSyncDataMaker().getChartRowData()
+                               .size()) {
+                       return;
+               }
+               for (ThreadPageSyncData data : ThreadDataManager.getInstance().getSyncDataMaker()
+                               .getChartRowData()) {
+                       if (isExistSyncChartRow(data)) {
+                               continue;
+                       }
+                       addChartChildItemList(data);
+               }
+               syncListCount = ThreadDataManager.getInstance().getSyncDataMaker().getChartRowData().size();
+       }
+
+       private boolean isExistThreadChartRow(ThreadPageThreadData data) {
+               for (ThreadChart chart : threadChartItemList) {
+                       if (chart.getChartID() == data.getThreadDataID()) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       private void addChartChildItemList(ThreadPageSyncData data) {
+               ThreadChart parent = getParentChartData(data);
+               if (null != parent) {
+                       addSyncChildChartItemList(parent, data);
+               }
+       }
+
+       private ThreadChart getParentChartData(ThreadPageSyncData syncData) {
+               if (syncData.getSyncDataType() != ThreadPageSyncData.THREAD_CHILD) {
+                       return null;
+               }
+               for (ThreadChart chart : threadChartItemList) {
+                       if (chart.getChartID() == syncData.getParentID()) {
+                               return chart;
+                       }
+               }
+               return null;
+       }
+
+       private void addThreadParentChartItemList(ThreadPageThreadData data) {
+               DAChartBoardItem parentItem = new DAChartBoardItem(this, data.getTypeString()
+                               + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
+                               + ThreadPageLabels.THREAD_CHART_NAME_PID + data.getPid()
+                               + ThreadPageLabels.THREAD_CHART_NAME_COMMA + ThreadPageLabels.THREAD_CHART_NAME_TID
+                               + data.getKey() + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
+               parentItem.setData(data);
+               DAChart parentDAChart = parentItem.getChart();
+               initChart(parentDAChart, true);
+               ThreadChart parentChartData = new ThreadChart(data.getThreadDataID(), parentItem,
+                               parentDAChart, ThreadChart.THREAD_CHART);
+               parentChartData.setpId(Integer.parseInt(data.getPid()));
+               threadChartItemList.add(parentChartData);
+       }
+
+       public void clearSeries() {
+               super.clearSeries();
+               clearThreadSeries();
+       }
+
+       private void clearThreadSeries() {
+               if (null == threadChartItemList) {
+                       return;
+               }
+               for (ThreadChart chart : threadChartItemList) {
+                       chart.clearSeries();
+               }
+       }
+
+       private void updateSeries() {
+               updateThreadEventSeries();
+               updateSyncEventSeries();
+       }
+
+       private void updateThreadEventSeries() {
+               if (null == threadChartItemList) {
+                       return;
+               }
+               List<ThreadPageThreadDataEvent> seriesList = selectThreadEventSeriesListFromDB();
+               if (null == seriesList) {
+                       return;
+               }
+               for (ThreadChart chart : threadChartItemList) {
+                       chart.updateThreadSeries(seriesList);
+               }
+       }
+
+       private List<ThreadPageThreadDataEvent> selectThreadEventSeriesListFromDB() {
+               List<ThreadPageThreadDataEvent> returnValue = new ArrayList<ThreadPageThreadDataEvent>();
+               String query = String.format(ThreadEventDBTable.SELECT_QUERY, (getVisibleStartTime() - 2)
+                               * TimelineConstants.MEGA_LONG, getVisibleEndTime() * TimelineConstants.MEGA_LONG);
+
+               ResultSet rs = SqlConnectionManager.executeQueryRS(query);
+               if (rs == null) {
+                       SqlConnectionManager.releaseResultSet(rs);
+                       return null;
+               }
+               try {
+                       while (rs.next()) {
+                               int chartID = rs.getInt(ThreadEventDBTable.COLUMN.THREADDATAID.index + 1);
+                               long time = rs.getLong(ThreadEventDBTable.COLUMN.EVENTTIME.index + 1);
+                               int tID = rs.getInt(ThreadEventDBTable.COLUMN.TID.index + 1);
+                               int apiType = rs.getByte(ThreadEventDBTable.COLUMN.APITYPE.index + 1);
+                               String tooltip = rs.getString(ThreadEventDBTable.COLUMN.TOOLTIP.index + 1);
+                               long errorNum = rs.getLong(ThreadEventDBTable.COLUMN.ERRORNO.index + 1);
+                               int eventType = rs.getByte(ThreadEventDBTable.COLUMN.EVENTTYPE.index + 1);
+                               int threadType = rs.getInt(ThreadEventDBTable.COLUMN.THREADTYPE.index + 1);
+                               int callerID = rs.getInt(ThreadEventDBTable.COLUMN.CALLERID.index + 1);
+                               ThreadPageThreadDataEvent chartData = new ThreadPageThreadDataEvent(eventType,
+                                               threadType, apiType, time, tID, tooltip, errorNum, null);
+                               chartData.setThreadDataID(chartID);
+                               chartData.setCallerTid(callerID);
+                               returnValue.add(chartData);
+                       }
+                       SqlConnectionManager.releaseResultSet(rs);
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               }
+               return returnValue;
+       }
+}
@@ -4,8 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.ui.thread;
+
+package org.tizen.dynamicanalyzer.ui.thread.chart;
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StackLayout;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
+import org.tizen.dynamicanalyzer.swap.model.data.LogDataFactory;
 import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData;
 import org.tizen.dynamicanalyzer.ui.common.SetRangeMarkerMouseMoveListener;
 import org.tizen.dynamicanalyzer.ui.common.UICommonConstants;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
-import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadData;
+import org.tizen.dynamicanalyzer.ui.thread.ThreadPage;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataManager;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.ui.timeline.logparser.LifecycleLogParser;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
@@ -58,23 +60,18 @@ import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData;
 import org.tizen.dynamicanalyzer.widgets.timeline.DATimeline;
 
 public class ThreadChartView extends DAViewComposite {
+       public static final String ID = ThreadChartView.class.getName();
        public final static int THREAD_CHART_HEIGHT = 70;
-       public final static int THREAD_COMBO_ITEM_HEIGHT = 24;
-
        private final Composite contents;
-       private DAChartBoard threadChart;
-       private DAChartBoard syncChart;
+       private ThreadChartBoard threadChartBoard;
+       private SyncChartBoard syncChartBoard;
        private DACustomCombo threadCombo;
        private DACustomCombo syncCombo;
        private final StackLayout stackLayout;
 
-       ThreadChartManager manager;
-
-       private final RangeDataManager rangeDataManager = RangeDataManager.getInstance();
-
        public ThreadChartView(Composite parent, int style) {
                super(parent, style, false);
-               this.setLayout(new FillLayout());
+               setLayout(new FillLayout());
 
                setTitle(ThreadPageLabels.THREAD_CHART_TITLE);
 
@@ -83,92 +80,112 @@ public class ThreadChartView extends DAViewComposite {
 
                stackLayout = new StackLayout();
                contents.setLayout(stackLayout);
-               threadChart = new DAChartBoard(contents, ThreadPageLabels.THREAD_CHART_TITLE);
-               threadChart.setItemHeight(THREAD_CHART_HEIGHT);
-               threadChart.setNameFont(FontResources.CHART_NAME_FONT);
 
-               threadChart.addSelectionListener(new DAChartBoardSelectionListener() {
-                       @Override
-                       public void handleSelectionEvent(DAChartBoardItem item) {
-                               callUpdatePage(item);
-                       }
-               });
+               initThreadChart();
+               initSyncChart();
+
+               stackLayout.topControl = threadChartBoard;
 
-               initIntervalMarkers(threadChart);
-               syncChart = new DAChartBoard(contents, ThreadPageLabels.SYNC_CHART_TITLE);
-               syncChart.setItemHeight(THREAD_CHART_HEIGHT);
-               syncChart.setNameFont(FontResources.CHART_NAME_FONT);
+               syncChartBoard.setSelectable(true);
+               threadChartBoard.setSelectable(true);
 
-               syncChart.addSelectionListener(new DAChartBoardSelectionListener() {
+               initializeCharts();
+       }
+
+       private void initSyncChart() {
+               syncChartBoard = new SyncChartBoard(contents, ThreadPageLabels.THREAD_CHART_SYNC,
+                               DAChartBoard.BOARD_STYLE_TIME);
+               syncChartBoard.setItemHeight(THREAD_CHART_HEIGHT);
+               syncChartBoard.setNameFont(FontResources.CHART_NAME_FONT);
+               syncChartBoard.addSelectionListener(new DAChartBoardSelectionListener() {
                        @Override
                        public void handleSelectionEvent(DAChartBoardItem item) {
                                callUpdatePage(item);
-
                        }
                });
-               initIntervalMarkers(syncChart);
-
-               stackLayout.topControl = threadChart;
-               threadCombo = makeDACustomCombo(threadChart.getTitleComp());
-               threadCombo.initCombo();
-               threadCombo.add("Thread");
-               threadCombo.add("Sync");
-               threadCombo.select(0);
-               threadCombo.setEnabled(true);
-               threadCombo.addSelectionListener(new DACustomComboSelectionListener() {
+               syncCombo = makeDACustomCombo(syncChartBoard.getTitleComp());
+               syncCombo.initCombo();
+               syncCombo.add(ThreadPageLabels.THREAD_CHART_THREAD);
+               syncCombo.add(ThreadPageLabels.THREAD_CHART_SYNC);
+               syncCombo.select(1);
+               syncCombo.setEnabled(true);
+               syncCombo.addSelectionListener(new DACustomComboSelectionListener() {
                        @Override
                        public void selectionEvent(DACustomCombo combo) {
                                String selected = combo.getText();
                                if (null == selected || selected.isEmpty()) {
                                        return;
                                }
-                               if (selected.equals("Sync")) {
-                                       changeComboThreadToSync();
+                               if (selected.equals(ThreadPageLabels.THREAD_CHART_THREAD)) {
+                                       changeComboSyncToThread();
                                } else {
                                        return;
                                }
                        }
                });
+       }
 
-               syncCombo = makeDACustomCombo(syncChart.getTitleComp());
-               syncCombo.initCombo();
-               syncCombo.add("Thread");
-               syncCombo.add("Sync");
-               syncCombo.select(1);
-               syncCombo.setEnabled(true);
-               syncCombo.addSelectionListener(new DACustomComboSelectionListener() {
+       private void initThreadChart() {
+               threadChartBoard = new ThreadChartBoard(contents, ThreadPageLabels.THREAD_CHART_THREAD,
+                               DAChartBoard.BOARD_STYLE_TIME);
+               threadChartBoard.setItemHeight(THREAD_CHART_HEIGHT);
+               threadChartBoard.setNameFont(FontResources.CHART_NAME_FONT);
+               threadChartBoard.addSelectionListener(new DAChartBoardSelectionListener() {
+                       @Override
+                       public void handleSelectionEvent(DAChartBoardItem item) {
+                               callUpdatePage(item);
+                       }
+               });
+               threadCombo = makeDACustomCombo(threadChartBoard.getTitleComp());
+               threadCombo.initCombo();
+               threadCombo.add(ThreadPageLabels.THREAD_CHART_THREAD);
+               threadCombo.add(ThreadPageLabels.THREAD_CHART_SYNC);
+               threadCombo.select(0);
+               threadCombo.setEnabled(true);
+               threadCombo.addSelectionListener(new DACustomComboSelectionListener() {
                        @Override
                        public void selectionEvent(DACustomCombo combo) {
                                String selected = combo.getText();
                                if (null == selected || selected.isEmpty()) {
                                        return;
                                }
-                               if (selected.equals("Thread")) {
-                                       changeComboSyncToThread();
+                               if (selected.equals(ThreadPageLabels.THREAD_CHART_SYNC)) {
+                                       changeComboThreadToSync();
                                } else {
                                        return;
                                }
                        }
                });
+       }
 
-               DATimeline threadTimeline = threadChart.getTimeline();
-               DATimeline syncTimeline = syncChart.getTimeline();
-
-               threadTimeline.setTimeTickFont(FontResources.TIMELINE_TICK_FONT);
-               threadTimeline.setTimeBalloonFont(FontResources.TIMELINE_BALLOON_FONT);
-               syncTimeline.setTimeTickFont(FontResources.TIMELINE_TICK_FONT);
-               syncTimeline.setTimeBalloonFont(FontResources.TIMELINE_BALLOON_FONT);
-
-               LifecycleLogParser.getInstance().registerLifecycleBar(threadChart.getLifecycleBar());
-               LifecycleLogParser.getInstance().registerTimeline(threadTimeline);
-               LifecycleLogParser.getInstance().registerLifecycleBar(syncChart.getLifecycleBar());
-               LifecycleLogParser.getInstance().registerTimeline(syncTimeline);
-
-               setTimelineMouseListener(threadTimeline, threadChart);
-               setTimelineMouseListener(syncTimeline, syncChart);
-
-               manager = ThreadChartManager.getInstance();
-               manager.setBoard(threadChart, syncChart);
+       private void callUpdatePage(DAChartBoardItem selectItem) {
+               if (null == selectItem) {
+                       AnalyzerManager.getCurrentPage()
+                                       .updateView(
+                                                       new DASelectionData(ThreadPage.chartViewID,
+                                                                       (long) (((DAChartPlotIntervalMarker) threadChartBoard
+                                                                                       .getMarkers().get(
+                                                                                                       UICommonConstants.SELECTION_MARKER_INDEX))
+                                                                                       .getStartVal() * TimelineConstants.MEGA_DOUBLE),
+                                                                       (long) (((DAChartPlotIntervalMarker) threadChartBoard
+                                                                                       .getMarkers().get(
+                                                                                                       UICommonConstants.SELECTION_MARKER_INDEX))
+                                                                                       .getEndVal() * TimelineConstants.MEGA_DOUBLE),
+                                                                       new Integer(0), null));
+               } else {
+                       AnalyzerManager.getCurrentPage()
+                                       .updateView(
+                                                       new DASelectionData(ThreadPage.chartViewID,
+                                                                       (long) (((DAChartPlotIntervalMarker) threadChartBoard
+                                                                                       .getMarkers().get(
+                                                                                                       UICommonConstants.SELECTION_MARKER_INDEX))
+                                                                                       .getStartVal() * TimelineConstants.MEGA_DOUBLE),
+                                                                       (long) (((DAChartPlotIntervalMarker) threadChartBoard
+                                                                                       .getMarkers().get(
+                                                                                                       UICommonConstants.SELECTION_MARKER_INDEX))
+                                                                                       .getEndVal() * TimelineConstants.MEGA_DOUBLE),
+                                                                       selectItem.getData(), null));
+               }
        }
 
        private DACustomCombo makeDACustomCombo(Composite parent) {
@@ -184,7 +201,7 @@ public class ThreadChartView extends DAViewComposite {
                returnCombo.setComboImages(ImageResources.TAB_COMBO_BUTTON_DOWN,
                                ImageResources.TAB_COMBO_BUTTON_DOWN, ImageResources.TAB_COMBO_BUTTON_DOWN,
                                ImageResources.TAB_COMBO_BUTTON_DOWN);
-               returnCombo.setComboImagePoint(new Point(65, 9));
+               returnCombo.setComboImagePoint(new Point(71, 10));
                returnCombo.setButtonImages(ImageResources.TAB_COMBO_BUTTON_DOWN,
                                ImageResources.TAB_COMBO_BUTTON_DOWN);
                returnCombo.setFontPoint(new Point(7, 5));
@@ -198,188 +215,140 @@ public class ThreadChartView extends DAViewComposite {
                return returnCombo;
        }
 
-       private void callUpdatePage(DAChartBoardItem selectItem) {
-               if (null == selectItem) {
-                       AnalyzerManager.getCurrentPage()
-                                       .updateView(
-                                                       new DASelectionData(ThreadPage.chartViewID,
-                                                                       (long) (((DAChartPlotIntervalMarker) threadChart.getMarkers()
-                                                                                       .get(UICommonConstants.SELECTION_MARKER_INDEX))
-                                                                                       .getStartVal() * TimelineConstants.MEGA_DOUBLE),
-                                                                       (long) (((DAChartPlotIntervalMarker) threadChart.getMarkers()
-                                                                                       .get(UICommonConstants.SELECTION_MARKER_INDEX))
-                                                                                       .getEndVal() * TimelineConstants.MEGA_DOUBLE),
-                                                                       new Integer(0), null));
-               } else {
-                       AnalyzerManager.getCurrentPage()
-                                       .updateView(
-                                                       new DASelectionData(ThreadPage.chartViewID,
-                                                                       (long) (((DAChartPlotIntervalMarker) threadChart.getMarkers()
-                                                                                       .get(UICommonConstants.SELECTION_MARKER_INDEX))
-                                                                                       .getStartVal() * TimelineConstants.MEGA_DOUBLE),
-                                                                       (long) (((DAChartPlotIntervalMarker) threadChart.getMarkers()
-                                                                                       .get(UICommonConstants.SELECTION_MARKER_INDEX))
-                                                                                       .getEndVal() * TimelineConstants.MEGA_DOUBLE),
-                                                                       selectItem.getData(), null));
-               }
-       }
-
-       private void changeComboSyncToThread() {
-               stackLayout.topControl = threadChart;
+       private void changeComboThreadToSync() {
+               stackLayout.topControl = syncChartBoard;
+               threadCombo.setText(ThreadPageLabels.THREAD_CHART_SYNC);
+               syncChartBoard.setScaleVal(threadChartBoard.getScaleVal());
+               syncChartBoard.setVisibleStart(threadChartBoard.getVisibleStart());
+               syncChartBoard.setItemsHeightMode(threadChartBoard.isItemMinimized());
                contents.layout();
-               threadCombo.setText("Thread");
-               threadChart.setScaleVal(syncChart.getScaleVal());
-               threadChart.setVisibleStart(syncChart.getVisibleStart());
-               threadChart.setItemsHeightMode(syncChart.isItemMinimized());
-               callUpdatePage(threadChart.getSelectItem());
                updateView();
        }
 
-       private void changeComboThreadToSync() {
-               stackLayout.topControl = syncChart;
+       private void changeComboSyncToThread() {
+               stackLayout.topControl = threadChartBoard;
+               threadCombo.setText(ThreadPageLabels.THREAD_CHART_THREAD);
+               threadChartBoard.setScaleVal(syncChartBoard.getScaleVal());
+               threadChartBoard.setVisibleStart(syncChartBoard.getVisibleStart());
+               threadChartBoard.setItemsHeightMode(syncChartBoard.isItemMinimized());
                contents.layout();
-               syncCombo.setText("Sync");
-               syncChart.setScaleVal(threadChart.getScaleVal());
-               syncChart.setVisibleStart(threadChart.getVisibleStart());
-               syncChart.setItemsHeightMode(threadChart.isItemMinimized());
-               callUpdatePage(syncChart.getSelectItem());
                updateView();
        }
 
-       private void setTimelineMouseListener(final DATimeline timeline, DAChartBoard chartBoard) {
-               timeline.addMouseMoveListener(new SetRangeMarkerMouseMoveListener(rangeDataManager,
-                               chartBoard, timeline));
-       }
-
        @Override
        public void updateView() {
-               threadChart.setTotalEndTime(ToolbarArea.getInstance().getTime());
-               syncChart.setTotalEndTime(ToolbarArea.getInstance().getTime());
-               manager.update();
+               if (stackLayout.topControl == syncChartBoard) {
+                       updateTimeLine(syncChartBoard);
+                       updateRange(syncChartBoard);
+                       syncChartBoard.updateChart();
+               } else {
+                       updateTimeLine(threadChartBoard);
+                       updateRange(threadChartBoard);
+                       threadChartBoard.updateChart();
+               }
+       }
 
-               threadChart.setTimelineMarkerStartTime(rangeDataManager.getMarkerStartTime()
-                               / TimelineConstants.MEGA_DOUBLE);
-               threadChart.setTimelineMarkerEndTime(rangeDataManager.getMarkerEndTime()
-                               / TimelineConstants.MEGA_DOUBLE);
-               syncChart.setTimelineMarkerStartTime(rangeDataManager.getMarkerStartTime()
+       private void updateRange(DAChartBoard chartBoard) {
+               chartBoard.setTimelineMarkerStartTime(RangeDataManager.getInstance().getMarkerStartTime()
                                / TimelineConstants.MEGA_DOUBLE);
-               syncChart.setTimelineMarkerEndTime(rangeDataManager.getMarkerEndTime()
+               chartBoard.setTimelineMarkerEndTime(RangeDataManager.getInstance().getMarkerEndTime()
                                / TimelineConstants.MEGA_DOUBLE);
-
                if (RangeDataManager.getInstance().isBeingAnalyzed()) {
-                       ((DAChartPlotIntervalMarker) threadChart.getMarkers().get(
-                                       UICommonConstants.RANGE_ANALYSIS_MARKER_INDEX)).setInterval(
-                                       rangeDataManager.getAnalysisStartTime() / TimelineConstants.MEGA_DOUBLE,
-                                       rangeDataManager.getAnalysisEndTime() / TimelineConstants.MEGA_DOUBLE);
-
-                       ((DAChartPlotIntervalMarker) syncChart.getMarkers().get(
-                                       UICommonConstants.RANGE_ANALYSIS_MARKER_INDEX)).setInterval(
-                                       rangeDataManager.getAnalysisStartTime() / TimelineConstants.MEGA_DOUBLE,
-                                       rangeDataManager.getAnalysisEndTime() / TimelineConstants.MEGA_DOUBLE);
+                       ((DAChartPlotIntervalMarker) chartBoard.getMarkers().get(
+                                       UICommonConstants.RANGE_ANALYSIS_MARKER_INDEX)).setInterval(RangeDataManager
+                                       .getInstance().getAnalysisStartTime() / TimelineConstants.MEGA_DOUBLE,
+                                       RangeDataManager.getInstance().getAnalysisEndTime()
+                                                       / TimelineConstants.MEGA_DOUBLE);
                } else {
-                       ((DAChartPlotIntervalMarker) threadChart.getMarkers().get(
-                                       UICommonConstants.RANGE_ANALYSIS_MARKER_INDEX)).setInterval(-1, -1);
-
-                       ((DAChartPlotIntervalMarker) syncChart.getMarkers().get(
+                       ((DAChartPlotIntervalMarker) chartBoard.getMarkers().get(
                                        UICommonConstants.RANGE_ANALYSIS_MARKER_INDEX)).setInterval(-1, -1);
                }
+               ((DAChartPlotIntervalMarker) chartBoard.getMarkers().get(
+                               UICommonConstants.RANGE_MARKER_INDEX)).setInterval(RangeDataManager.getInstance()
+                               .getMarkerStartTime() / TimelineConstants.MEGA_DOUBLE, RangeDataManager
+                               .getInstance().getMarkerEndTime() / TimelineConstants.MEGA_DOUBLE);
+       }
 
-               ((DAChartPlotIntervalMarker) threadChart.getMarkers().get(
-                               UICommonConstants.RANGE_MARKER_INDEX)).setInterval(
-                               rangeDataManager.getMarkerStartTime() / TimelineConstants.MEGA_DOUBLE,
-                               rangeDataManager.getMarkerEndTime() / TimelineConstants.MEGA_DOUBLE);
-
-               ((DAChartPlotIntervalMarker) syncChart.getMarkers().get(
-                               UICommonConstants.RANGE_MARKER_INDEX)).setInterval(
-                               rangeDataManager.getMarkerStartTime() / TimelineConstants.MEGA_DOUBLE,
-                               rangeDataManager.getMarkerEndTime() / TimelineConstants.MEGA_DOUBLE);
-
+       private void updateTimeLine(DAChartBoard chartBoard) {
+               chartBoard.setTotalEndTime(ToolbarArea.getInstance().getTime());
        }
 
        @Override
        public void updateView(DAViewData data) {
-               if (data instanceof DASelectionData) {
-                       DASelectionData selData = (DASelectionData) data;
+               if (data instanceof DASelectionData == false) {
+                       return;
+               }
+               DASelectionData selData = (DASelectionData) data;
+               if (selData.isLogData()) {
+                       selectionFromSummary(selData);
+               } else {
+                       selectionFromAPITable(selData);
+               }
+       }
 
-                       if (selData.isLogData()) {
-                               Object odata = selData.getData();
-                               if (stackLayout.topControl.equals(syncChart)) {
-                                       changeComboSyncToThread();
-                               }
-                               String selectTid = Integer.toString(((ProbeCommonData) odata).getTid());
-                               threadChart.selectItem(getChartIndexOfSelected(selectTid));
-                       } else {
-                               long start = selData.getStartTime();
-                               long end = selData.getEndTime();
-
-                               double startTime = (double) start / TimelineConstants.MEGA_DOUBLE;
-                               double endTime = (double) end / TimelineConstants.MEGA_DOUBLE;
-                               // double middleTime = (startTime + endTime) / 2.0;
-                               // if (start == end) {
-                               // middleTime = startTime;
-                               // }
-
-                               DAChartBoard chartBoard = (DAChartBoard) stackLayout.topControl;
-
-                               // chartBoard.setVisibleMiddleTime(middleTime);
-                               DAChartPlotIntervalMarker intervalMarker = (DAChartPlotIntervalMarker) chartBoard
-                                               .getMarkers().get(UICommonConstants.SELECTION_MARKER_INDEX);
-                               intervalMarker.setInterval(startTime, endTime);
-                       }
+       private void selectionFromSummary(DASelectionData selData) {
+               Object odata = selData.getData();
+               String category = LogDataFactory.getLogFormatName(((ProbeCommonData) odata).getId());
+               if(null == category){
+                       return;
                }
+               String selectTid = Integer.toString(((ProbeCommonData) odata).getTid());
+               if (category.equals(ThreadPageLabels.THREAD_CHART_THREAD)) {
+                       changeComboSyncToThread();
+                       threadChartBoard.selectItem(getThreadChartIndexOfSelected(selectTid));
+               } else {
+                       changeComboThreadToSync();
+                       syncChartBoard.selectItem(getSyncChartIndexOfSelected(selectTid));
+               }
+               DAChartBoard chartBoard = (DAChartBoard) stackLayout.topControl;
+               DAChartPlotIntervalMarker intervalMarker = (DAChartPlotIntervalMarker) chartBoard
+                               .getMarkers().get(UICommonConstants.SELECTION_MARKER_INDEX);
+               long start = ((ProbeCommonData) odata).getTime();
+               long end = ((ProbeCommonData) odata).getTime();
+               double startTime = (double) start / TimelineConstants.MEGA_DOUBLE;
+               double endTime = (double) end / TimelineConstants.MEGA_DOUBLE;
+               intervalMarker.setInterval(startTime, endTime);
        }
 
-       private int getChartIndexOfSelected(String tID) {
-               int itemSize = threadChart.getItemList().getItemSize();
-               if (0 == itemSize) {
+       private void selectionFromAPITable(DASelectionData selData) {
+               DAChartBoard chartBoard = (DAChartBoard) stackLayout.topControl;
+               DAChartPlotIntervalMarker intervalMarker = (DAChartPlotIntervalMarker) chartBoard
+                               .getMarkers().get(UICommonConstants.SELECTION_MARKER_INDEX);
+               long start = selData.getStartTime();
+               long end = selData.getEndTime();
+               double startTime = (double) start / TimelineConstants.MEGA_DOUBLE;
+               double endTime = (double) end / TimelineConstants.MEGA_DOUBLE;
+               intervalMarker.setInterval(startTime, endTime);
+       }
+
+       private int getThreadChartIndexOfSelected(String tID) {
+               int itemSize = threadChartBoard.getItemList().getItemSize();
+               if (null == tID || 0 == itemSize) {
                        return 0;
                }
                for (int i = 0; i < itemSize; i++) {
-                       DAChartBoardItem item = threadChart.getItemList().get(i);
+                       DAChartBoardItem item = threadChartBoard.getItemList().get(i);
                        ThreadPageThreadData pageData = (ThreadPageThreadData) item.getData();
-                       if (pageData.getTid().equals(tID)) {
+                       if (pageData.getTid() == Integer.parseInt(tID)) {
                                return i;
                        }
                }
                return 0;
        }
-
-       @Override
-       public void clear() {
-               threadChart.clear();
-               syncChart.clear();
-               initIntervalMarkers(threadChart);
-               initIntervalMarkers(syncChart);
-               manager.clear();
-               manager.setBoard(threadChart, syncChart);
-       }
-
-       @Override
-       public Control getControl() {
-               return stackLayout.topControl;
-       }
-
-       private void initIntervalMarkers(DAChartBoard board) {
-               // selection marker
-               DAChartPlotIntervalMarker selectionMarker = new DAChartPlotIntervalMarker(-1, -1,
-                               DAChartPlotIntervalMarker.INTERVAL_MARKER_STYLE_AREA);
-               selectionMarker.setBackgroundColor(ColorResources.SELECTION_RANGE);
-               selectionMarker.setAlpha((int) (255 * 0.25));
-               board.addIntervalMarker(selectionMarker);
-
-               // range analysis marker
-               DAChartPlotIntervalMarker rangeAnalyzeMarker = new DAChartPlotIntervalMarker(-1, -1,
-                               DAChartPlotIntervalMarker.INTERVAL_MARKER_STYLE_AREA);
-               rangeAnalyzeMarker.setBackgroundColor(ColorResources.YELLOW);
-               rangeAnalyzeMarker.setAlpha((int) (255 * 0.25));
-               board.addIntervalMarker(rangeAnalyzeMarker);
-
-               // range marker
-               DAChartPlotIntervalMarker rangeMarker = new DAChartPlotIntervalMarker(-1, -1,
-                               DAChartPlotIntervalMarker.INTERVAL_MARKER_STYLE_LINE);
-               rangeMarker.setForegroundColor(ColorResources.RED);
-               rangeMarker.setAlpha((int) (255 * 0.25));
-               board.addIntervalMarker(rangeMarker);
+       
+       private int getSyncChartIndexOfSelected(String tID) {
+               int itemSize = syncChartBoard.getItemList().getItemSize();
+               if (null == tID || 0 == itemSize) {
+                       return 0;
+               }
+               for (int i = 0; i < itemSize; i++) {
+                       DAChartBoardItem item = syncChartBoard.getItemList().get(i);
+                       ThreadPageThreadData pageData = (ThreadPageThreadData) item.getData();
+                       if (pageData.getTid() == Integer.parseInt(tID)) {
+                               return i;
+                       }
+               }
+               return 0;
        }
 
        public void setRangeMarker(double starttime, double endtime) {
@@ -391,4 +360,39 @@ public class ThreadChartView extends DAViewComposite {
                                UICommonConstants.RANGE_MARKER_INDEX)).setInterval(starttime, endtime);
        }
 
+       @Override
+       public void clear() {
+               ThreadDataManager.getInstance().clear();
+               syncChartBoard.contentsClear();
+               syncChartBoard.clear();
+               threadChartBoard.contentsClear();
+               threadChartBoard.clear();
+               initializeCharts();
+       }
+
+       private void initializeCharts() {
+               threadChartBoard.initIntervalMarkers();
+               syncChartBoard.initIntervalMarkers();
+               initTimeline();
+       }
+
+       private void initTimeline() {
+               DATimeline threadTimeline = threadChartBoard.getTimeline();
+               DATimeline syncTimeline = syncChartBoard.getTimeline();
+
+               threadTimeline.setTimeTickFont(FontResources.TIMELINE_TICK_FONT);
+               threadTimeline.setTimeBalloonFont(FontResources.TIMELINE_BALLOON_FONT);
+               syncTimeline.setTimeTickFont(FontResources.TIMELINE_TICK_FONT);
+               syncTimeline.setTimeBalloonFont(FontResources.TIMELINE_BALLOON_FONT);
+
+               LifecycleLogParser.getInstance().registerLifecycleBar(threadChartBoard.getLifecycleBar());
+               LifecycleLogParser.getInstance().registerTimeline(threadTimeline);
+               LifecycleLogParser.getInstance().registerLifecycleBar(syncChartBoard.getLifecycleBar());
+               LifecycleLogParser.getInstance().registerTimeline(syncTimeline);
+
+               threadTimeline.addMouseMoveListener(new SetRangeMarkerMouseMoveListener(RangeDataManager
+                               .getInstance(), threadChartBoard, threadTimeline));
+               syncTimeline.addMouseMoveListener(new SetRangeMarkerMouseMoveListener(RangeDataManager
+                               .getInstance(), syncChartBoard, syncTimeline));
+       }
 }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIInserter.java
deleted file mode 100644 (file)
index 948e37d..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*\r
- *  Dynamic Analyzer\r
- *\r
- * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: \r
- * WooJin Jung <woojin2.jung@samsung.com>\r
- * Juyoung Kim <j0.kim@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * \r
- * Contributors:\r
- * - S-Core Co., Ltd\r
- * \r
- */\r
-\r
-package org.tizen.dynamicanalyzer.ui.thread.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.concurrent.LinkedBlockingQueue;\r
-\r
-import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
-import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
-import org.tizen.dynamicanalyzer.swap.model.data.SyncData;\r
-import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
-//TODO: use DBInserter\r
-public class SyncAPIInserter implements Runnable {\r
-       private static LinkedBlockingQueue<SyncData> syncAPIQueue = new LinkedBlockingQueue<SyncData>();\r
-\r
-       private static volatile Thread inserterThread = null;\r
-\r
-       public static void startThread() {\r
-               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                       synchronized (SyncAPIInserter.class) {\r
-                               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                                       inserterThread = new Thread(null,\r
-                                                       new SyncAPIInserter());\r
-                                       inserterThread.start();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void stopThread() {\r
-               if (inserterThread != null && inserterThread.isAlive()) {\r
-                       try {\r
-                               sendNotify();\r
-                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
-                       } catch (InterruptedException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void pushSyncEvent(SyncData syncAPI) {\r
-               syncAPIQueue.offer(syncAPI);\r
-       }\r
-\r
-       public static void clear() {\r
-               stopThread();\r
-       }\r
-\r
-       @Override\r
-       public void run() {\r
-               while (!AnalyzerManager.isExit()) {\r
-                       SyncData syncAPI = syncAPIQueue.poll();\r
-\r
-                       if (syncAPI != null) {\r
-                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
-                               List<Object> insertRowData = new ArrayList<Object>();\r
-                               try {\r
-                                       insertRowData.add(new Long(syncAPI.getSeq()));\r
-                                       insertRowData.add(new Long(syncAPI.getTime()));\r
-                                       insertRowData.add(new Integer(syncAPI.getApiId()));\r
-                                       insertRowData.add(new Integer(syncAPI.getPid()));\r
-                                       insertRowData.add(new Integer(syncAPI.getTid()));\r
-                                       insertRowData.add(new String(syncAPI.getArgs()));\r
-                                       insertRowData.add(new String(syncAPI.getReturn()));\r
-                                       insertRowData.add(new Long(syncAPI.getErrno()));\r
-                                       insertRowData.add(new Long(syncAPI.getSyncValue()));\r
-                               } catch (ArrayIndexOutOfBoundsException e) {\r
-                                       e.printStackTrace();\r
-                               }\r
-                               insertData.add(insertRowData);\r
-                               if (insertData.size() > 0) {\r
-                                       ThreadChartManager.getInstance().getSyncAPIDBTable().insertData(insertData);\r
-                               }       \r
-                       }\r
-               }                       \r
-       }\r
-\r
-       public static void sendNotify() {\r
-//             syncAPIQueue.wake();\r
-       }\r
-}\r
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataDBTable.java
deleted file mode 100644 (file)
index 32d359d..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.data;
-
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.database.DBColumn;
-import org.tizen.dynamicanalyzer.database.DBConstants;
-import org.tizen.dynamicanalyzer.database.DBTable;
-import org.tizen.dynamicanalyzer.database.IResultSet;
-
-public class SyncDataDBTable extends DBTable implements IResultSet {
-       public static final String TABLENAME="SyncData";
-       
-       public static final String QUERY_OPTION = "order by " + COLUMN.SYNCDATAID.name;
-       
-       private static final String SELECT_COLUMN = 
-                       COLUMN.SYNCDATAID.name + CommonConstants.COMMA +
-                       COLUMN.PID.name + CommonConstants.COMMA +
-                       COLUMN.TID.name + CommonConstants.COMMA +
-                       COLUMN.SYNCTYPE.name + CommonConstants.COMMA +
-                       COLUMN.SYNCVALUE.name + CommonConstants.COMMA +
-                       COLUMN.ATTRIBUTETYPE.name + CommonConstants.COMMA +
-                       COLUMN.SYNCDATATYPE.name + CommonConstants.COMMA +
-                       COLUMN.PARENTID.name;
-       public static final String SELECT_QUERY =
-                       "select " + SELECT_COLUMN + " from " + TABLENAME +
-                       "  order by " + COLUMN.SYNCDATAID.name; 
-       
-       public enum COLUMN {
-               SYNCDATAID(0, "SyncDataID"),
-               PID(1, "PID"),
-               TID(2, "TID"),
-               SYNCTYPE(3, "SyncType"),
-               SYNCVALUE(4, "SyncValue"),
-               ATTRIBUTETYPE(5, "AttributeType"),
-               SYNCDATATYPE(6, "SyncDataType"),
-               PARENTID(7, "ParentId");
-               
-               public final int index;
-               public final String name;
-               
-               COLUMN(int index, String name) {
-                       this.index = index;
-                       this.name = name;
-               }
-       }
-       
-       @Override
-       public String getTableName() {
-               return TABLENAME;
-       }
-       
-       public SyncDataDBTable() {
-               addColumn(new DBColumn(COLUMN.SYNCDATAID.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.SYNCTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
-               addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.ATTRIBUTETYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));              
-               addColumn(new DBColumn(COLUMN.SYNCDATATYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
-               addColumn(new DBColumn(COLUMN.PARENTID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
-       }
-
-       public List<List<Object>> getSyncDataFromDB() {
-               return selectAllColumnData(QUERY_OPTION);
-       }
-       
-       @Override
-       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
-               boolean isPrepared = true;
-               
-               int columnsize = getColumnSize();
-               if (columnsize != rowData.size()) {
-                       isPrepared = false;
-               } else {
-                       try {
-                               prep.setInt(COLUMN.SYNCDATAID.index + 1, (Integer) (rowData.get(COLUMN.SYNCDATAID.index)));
-                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
-                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));                           
-                               prep.setByte(COLUMN.SYNCTYPE.index + 1, (Byte) (rowData.get(COLUMN.SYNCTYPE.index)));
-                               prep.setLong(COLUMN.SYNCVALUE.index + 1, (Long) (rowData.get(COLUMN.SYNCVALUE.index)));
-                               prep.setByte(COLUMN.ATTRIBUTETYPE.index + 1, (Byte) (rowData.get(COLUMN.ATTRIBUTETYPE.index)));
-                               prep.setByte(COLUMN.SYNCDATATYPE.index + 1, (Byte) (rowData.get(COLUMN.SYNCDATATYPE.index)));
-                               prep.setInt(COLUMN.PARENTID.index + 1, (Integer) (rowData.get(COLUMN.PARENTID.index)));
-
-                       } catch (SQLException e) {
-                               e.printStackTrace();
-                               isPrepared = false;
-                       }
-               }
-               
-               return isPrepared;
-       }
-       
-       @Override
-       public List<Object> extractDataFromResultSet(ResultSet rs) {
-               List<Object> row = new ArrayList<Object>();
-               try {
-                       row.add(Integer.valueOf(rs.getInt(COLUMN.SYNCDATAID.index + 1)));
-                       row.add(Integer.valueOf(rs.getInt(COLUMN.PID.index + 1)));
-                       row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
-                       row.add(Byte.valueOf(rs.getByte(COLUMN.SYNCTYPE.index + 1)));
-                       row.add(Long.valueOf(rs.getLong(COLUMN.SYNCVALUE.index + 1)));
-                       row.add(Byte.valueOf(rs.getByte(COLUMN.ATTRIBUTETYPE.index + 1)));
-                       row.add(Byte.valueOf(rs.getByte(COLUMN.SYNCDATATYPE.index + 1)));
-                       row.add(Integer.valueOf(rs.getInt(COLUMN.PARENTID.index + 1)));
-               } catch (SQLException e) {
-                       e.printStackTrace();
-                       return null;
-               }
-               
-               return row;
-       }
-}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataInserter.java
deleted file mode 100644 (file)
index 7872def..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*\r
- *  Dynamic Analyzer\r
- *\r
- * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: \r
- * WooJin Jung <woojin2.jung@samsung.com>\r
- * Juyoung Kim <j0.kim@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * \r
- * Contributors:\r
- * - S-Core Co., Ltd\r
- * \r
- */\r
-\r
-package org.tizen.dynamicanalyzer.ui.thread.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.concurrent.LinkedBlockingQueue;\r
-\r
-import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
-import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
-import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;\r
-import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;\r
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataManager;\r
-//TODO: use DBInserter\r
-public class SyncDataInserter implements Runnable {\r
-       private static LinkedBlockingQueue<ThreadPageSyncData> syncDataQueue = new LinkedBlockingQueue<ThreadPageSyncData>();\r
-\r
-       private static volatile Thread inserterThread = null;\r
-\r
-       public static void startThread() {\r
-               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                       synchronized (SyncDataInserter.class) {\r
-                               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                                       inserterThread = new Thread(null,\r
-                                                       new SyncDataInserter());\r
-                                       inserterThread.start();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void stopThread() {\r
-               if (inserterThread != null && inserterThread.isAlive()) {\r
-                       try {\r
-                               sendNotify();\r
-                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
-                       } catch (InterruptedException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void pushSyncData(ThreadPageSyncData syncData) {\r
-               syncDataQueue.offer(syncData);\r
-       }\r
-\r
-       public static void clear() {\r
-               stopThread();\r
-       }\r
-\r
-       @Override\r
-       public void run() {\r
-               while (!AnalyzerManager.isExit()) {\r
-                       ThreadPageSyncData syncData = syncDataQueue.poll();\r
-\r
-                       if (syncData != null) {\r
-                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
-                               List<Object> insertRowData = new ArrayList<Object>();\r
-                               try {\r
-                                       insertRowData.add(new Integer(syncData.getSyncDataID()));\r
-                                       insertRowData.add(new Integer(syncData.getPid()));\r
-                                       insertRowData.add(new Integer(syncData.getTid()));\r
-                                       Integer type = new Integer(syncData.getType());\r
-                                       byte syncType = type.byteValue();\r
-                                       insertRowData.add(new Byte(syncType));\r
-                                       insertRowData.add(new Long(syncData.getKey()));\r
-                                       String attrTypeStr = syncData.getAttrType();\r
-                                       byte attrType = -1;\r
-                                       if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_NORMAL)) {\r
-                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_NORMAL;\r
-                                       } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE)) {\r
-                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_RECURSIVE;\r
-                                       } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_ERRORCHECK)) {\r
-                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_ERRORCHECK;          \r
-                                       } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT)) {\r
-                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_DEFAULT;\r
-                                       } else {\r
-                                               attrType = -1;\r
-                                       }\r
-                                       insertRowData.add(new Byte(attrType));\r
-                                       insertRowData.add(new Byte(syncData.getSyncDataType()));\r
-                                       insertRowData.add(new Integer(syncData.getParentID()));\r
-                               } catch (ArrayIndexOutOfBoundsException e) {\r
-                                       e.printStackTrace();\r
-                               }\r
-                               insertData.add(insertRowData);\r
-                               if (insertData.size() > 0) {\r
-                                       ThreadChartManager.getInstance().getSyncDataDBTable().insertData(insertData);\r
-                               }\r
-                       }\r
-               }                       \r
-       }\r
-\r
-       public static void sendNotify() {\r
-//             syncDataQueue.wake();\r
-       }\r
-}\r
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventDBTable.java
deleted file mode 100644 (file)
index e79de6a..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.data;
-
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.tizen.dynamicanalyzer.common.DALimit;
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.database.DBColumn;
-import org.tizen.dynamicanalyzer.database.DBConstants;
-import org.tizen.dynamicanalyzer.database.DBTable;
-import org.tizen.dynamicanalyzer.database.IResultSet;
-
-public class SyncEventDBTable extends DBTable implements IResultSet {
-       public static final String TABLENAME="SyncEvent";
-       
-       private static final String SELECT_COLUMN = 
-                       COLUMN.EVENTTIME.name + CommonConstants.COMMA +
-                       COLUMN.APITYPE.name + CommonConstants.COMMA +
-                       COLUMN.TOOLTIP.name + CommonConstants.COMMA +
-                       COLUMN.ERRORNO.name + CommonConstants.COMMA +
-                       COLUMN.SYNCVALUE.name;
-       public static final String SELECT_QUERY = 
-                       "select " + SELECT_COLUMN + " from " + TABLENAME + 
-                       "  where " + COLUMN.SYNCDATAID.name + " = %s ";
-       
-       public enum COLUMN {
-               API_SEQNUMBER(0, "APISEQNUMBER"),
-               SYNCDATAID(1, "SyncDataID"),
-               EVENTTIME(2, "EventTime"),
-               APITYPE(3, "APIType"),
-               TOOLTIP(4, "Tooltip"),
-               ERRORNO(5, DBConstants.DBCOLUMN_ERROR_NUMBER),
-               SYNCVALUE(6, "SyncValue");
-
-               public final int index;
-               public final String name;
-               
-               COLUMN(int index, String name) {
-                       this.index = index;
-                       this.name = name;
-               }
-       }
-       
-       @Override
-       public String getTableName() {
-               return TABLENAME;
-       }
-       
-       public SyncEventDBTable() {
-               addColumn(new DBColumn(COLUMN.API_SEQNUMBER.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.SYNCDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.EVENTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.APITYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
-               addColumn(new DBColumn(COLUMN.TOOLTIP.name, DBConstants.EMPTY, 
-                               DBConstants.VARCHAR, DALimit.TOOLTIP_LENGTH));          
-               addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               setIndexColumn(COLUMN.SYNCDATAID.index);
-       }
-
-       public List<List<Object>> getSyncEventFromDB() {
-               return selectAllColumnData(null);
-       }
-       
-       @Override
-       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
-               boolean isPrepared = true;
-               
-               int columnsize = getColumnSize();
-               if (columnsize != rowData.size()) {
-                       isPrepared = false;
-               } else {
-                       try {
-                               prep.setLong(COLUMN.API_SEQNUMBER.index + 1, (Long) (rowData.get(COLUMN.API_SEQNUMBER.index)));
-                               prep.setInt(COLUMN.SYNCDATAID.index + 1, (Integer) (rowData.get(COLUMN.SYNCDATAID.index)));                             
-                               prep.setLong(COLUMN.EVENTTIME.index + 1, (Long) (rowData.get(COLUMN.EVENTTIME.index)));
-                               prep.setByte(COLUMN.APITYPE.index + 1, (Byte) (rowData.get(COLUMN.APITYPE.index)));
-                               String tooltipStr = clipString((String) (rowData.get(COLUMN.TOOLTIP.index)),
-                                               DALimit.TOOLTIP_LENGTH, rowData.get(COLUMN.EVENTTIME.index).toString());
-                               prep.setString(COLUMN.TOOLTIP.index + 1, tooltipStr);                                                           
-                               prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
-                               prep.setLong(COLUMN.SYNCVALUE.index + 1, (Long) (rowData.get(COLUMN.SYNCVALUE.index)));         
-                       } catch (SQLException e) {
-                               e.printStackTrace();
-                               isPrepared = false;
-                       }
-               }
-               
-               return isPrepared;
-       }
-       
-       @Override
-       public List<Object> extractDataFromResultSet(ResultSet rs) {
-               List<Object> row = new ArrayList<Object>();
-               try {
-                       row.add(Long.valueOf(rs.getLong(COLUMN.API_SEQNUMBER.index + 1)));
-                       row.add(Integer.valueOf(rs.getInt(COLUMN.SYNCDATAID.index + 1)));
-                       row.add(Long.valueOf(rs.getLong(COLUMN.EVENTTIME.index + 1)));
-                       row.add(Byte.valueOf(rs.getByte(COLUMN.APITYPE.index + 1)));
-                       row.add(rs.getString(COLUMN.TOOLTIP.index + 1));
-                       row.add(Long.valueOf(rs.getLong(COLUMN.ERRORNO.index + 1)));
-                       row.add(Long.valueOf(rs.getLong(COLUMN.SYNCVALUE.index + 1)));
-               } catch (SQLException e) {
-                       e.printStackTrace();
-                       return null;
-               }
-               
-               return row;
-       }
-}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventInserter.java
deleted file mode 100644 (file)
index 233a247..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*\r
- *  Dynamic Analyzer\r
- *\r
- * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: \r
- * WooJin Jung <woojin2.jung@samsung.com>\r
- * Juyoung Kim <j0.kim@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * \r
- * Contributors:\r
- * - S-Core Co., Ltd\r
- * \r
- */\r
-\r
-package org.tizen.dynamicanalyzer.ui.thread.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.concurrent.LinkedBlockingQueue;\r
-\r
-import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
-import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
-import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataEvent;\r
-//TODO: use DBInserter\r
-public class SyncEventInserter implements Runnable {\r
-       private static LinkedBlockingQueue<ThreadPageSyncDataEvent> syncEventQueue = new LinkedBlockingQueue<ThreadPageSyncDataEvent>();\r
-\r
-       private static volatile Thread inserterThread = null;\r
-\r
-       public static void startThread() {\r
-               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                       synchronized (SyncEventInserter.class) {\r
-                               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                                       inserterThread = new Thread(null,\r
-                                                       new SyncEventInserter());\r
-                                       inserterThread.start();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void stopThread() {\r
-               if (inserterThread != null && inserterThread.isAlive()) {\r
-                       try {\r
-                               sendNotify();\r
-                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
-                       } catch (InterruptedException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void pushSyncEvent(ThreadPageSyncDataEvent syncEvent) {\r
-               syncEventQueue.offer(syncEvent);\r
-       }\r
-\r
-       public static void clear() {\r
-               stopThread();\r
-       }\r
-\r
-       @Override\r
-       public void run() {\r
-               while (!AnalyzerManager.isExit()) {\r
-                       ThreadPageSyncDataEvent syncEvent = syncEventQueue.poll();\r
-\r
-                       if (syncEvent != null) {\r
-                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
-                               List<Object> insertRowData = new ArrayList<Object>();\r
-                               try {\r
-                                       insertRowData.add(new Long(syncEvent.getContents().getSeq()));\r
-                                       insertRowData.add(new Integer(syncEvent.getSyncDataID()));\r
-                                       insertRowData.add(new Long(syncEvent.getTime()));\r
-                                       Integer apiType = new Integer(syncEvent.getApiType());\r
-                                       insertRowData.add(new Byte(apiType.byteValue()));\r
-                                       insertRowData.add(new String(syncEvent.getTooltipContent()));\r
-                                       insertRowData.add(new Long(syncEvent.getErrorNum()));\r
-                                       insertRowData.add(new Long(syncEvent.getSyncVal()));\r
-                               } catch (ArrayIndexOutOfBoundsException e) {\r
-                                       e.printStackTrace();\r
-                               }\r
-                               insertData.add(insertRowData);\r
-                               if (insertData.size() > 0) {\r
-                                       ThreadChartManager.getInstance().getSyncEventDBTable().insertData(insertData);\r
-                               }\r
-                       }\r
-               }                       \r
-       }\r
-\r
-       public static void sendNotify() {\r
-//             syncEventQueue.wake();\r
-       }\r
-}\r
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadDataManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadDataManager.java
new file mode 100644 (file)
index 0000000..a86b1a6
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.data;
+
+import java.util.List;
+import java.util.Map;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
+import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
+import org.tizen.dynamicanalyzer.swap.logparser.Logs;
+import org.tizen.dynamicanalyzer.swap.logparser.PageDataManager;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.ui.thread.db.SyncAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.db.SyncDataDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.db.SyncEventDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.db.ThreadAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.db.ThreadDataDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.db.ThreadEventDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
+
+public class ThreadDataManager extends PageDataManager {
+       private static ThreadDataManager instance = null;
+       public final static double THREAD_DATA_MEMORY_KB = 0.3;
+       public final static double SYNC_DATA_MEMORY_KB = 0.3;
+       public final static double CHART_TYPE_HEAP_MEMORY_KB = 4.6 * 5;
+       public final static double MAX_THREAD_HEAP_MEMORY_KB = 10000; // possible to
+                                                                                                                                       // make
+                                                                                                                                       // approximately
+                                                                                                                                       // 400 chart
+
+       private ThreadDataDBTable threadDataTable = null;
+       private ThreadEventDBTable threadEventTable = null;
+       private ThreadAPIDBTable threadAPITable = null;
+
+       private SyncDataDBTable syncDataTable = null;
+       private SyncEventDBTable syncEventTable = null;
+       private SyncAPIDBTable syncAPITable = null;
+
+       private ThreadLoadDataMaker loadManager;
+       private ThreadThreadDataMaker tManager;
+       private ThreadSyncDataMaker sManager;
+
+       private ThreadDataManager() {
+               threadDataTable = new ThreadDataDBTable();
+               threadEventTable = new ThreadEventDBTable();
+               threadAPITable = new ThreadAPIDBTable();
+
+               syncDataTable = new SyncDataDBTable();
+               syncEventTable = new SyncEventDBTable();
+               syncAPITable = new SyncAPIDBTable();
+
+               loadManager = new ThreadLoadDataMaker();
+               tManager = new ThreadThreadDataMaker();
+               sManager = new ThreadSyncDataMaker();
+       }
+
+       public static ThreadDataManager getInstance() {
+               if (null == instance) {
+                       instance = new ThreadDataManager();
+               }
+               return instance;
+       }
+
+       public ThreadLoadDataMaker getThreadLoadDataMamker() {
+               return loadManager;
+       }
+
+       public ThreadThreadDataMaker getThreadDataMaker() {
+               return tManager;
+       }
+
+       public ThreadSyncDataMaker getSyncDataMaker() {
+               return sManager;
+       }
+
+       public ThreadEventDBTable getThreadEventDBTable() {
+               return threadEventTable;
+       }
+
+       public ThreadAPIDBTable getThreadAPIDBTable() {
+               return threadAPITable;
+       }
+
+       public SyncDataDBTable getSyncDataDBTable() {
+               return syncDataTable;
+       }
+
+       public SyncEventDBTable getSyncEventDBTable() {
+               return syncEventTable;
+       }
+
+       public SyncAPIDBTable getSyncAPIDBTable() {
+               return syncAPITable;
+       }
+
+       public void clear() {
+               tManager.clear();
+               sManager.clear();
+       }
+
+       public void saveData(Map<String, String> dataMap) {
+               threadDataTable.inserthreadPageThreadData(tManager.getChartRowData());
+               sManager.insertNoBlockEndTimeSyncEvent();
+               sManager.getNotInsertSyncEventList().clear();
+       }
+
+       public void openData(Map<String, String> dataMap) {
+               selectThreadDataWhenOpen();
+               selectSyncDataWhenOpen();
+       }
+
+       @Override
+       protected void onThreadStop() {
+               tManager.insertRemainingCallEvent();
+       }
+
+       private void checkHeapMemory() {
+               double useHeapMemory = 0;
+               useHeapMemory += tManager.getChartRowData().size() * THREAD_DATA_MEMORY_KB;
+               useHeapMemory += sManager.getChartRowData().size() * SYNC_DATA_MEMORY_KB;
+               int chartItemCount = tManager.getChartRowData().size() + sManager.getChartRowData().size();
+               useHeapMemory += CHART_TYPE_HEAP_MEMORY_KB * chartItemCount;
+               if ((MAX_THREAD_HEAP_MEMORY_KB < useHeapMemory)) {
+                       DALimit.stopTraceAndOpenWarningDialog();
+               }
+       }
+
+       private void selectThreadDataWhenOpen() {
+               List<List<Object>> threadDatas = threadDataTable.getThreadDataFromDB();
+               int size = threadDatas.size();
+               for (int i = 0; i < size; i++) {
+                       List<Object> rowData = threadDatas.get(i);
+                       int id = (Integer) rowData.get(ThreadDataDBTable.COLUMN.THREADDATAID.index);
+                       int pid = (Integer) rowData.get(ThreadDataDBTable.COLUMN.PID.index);
+                       int tid = (Integer) rowData.get(ThreadDataDBTable.COLUMN.TID.index);
+                       byte threadType = (Byte) rowData.get(ThreadDataDBTable.COLUMN.THREADTYPE.index);
+                       byte attrType = (Byte) rowData.get(ThreadDataDBTable.COLUMN.ATTRIBUTETYPE.index);
+                       String attributeType = ThreadThreadDataMaker.getAttrTypeByTypeInt(attrType);
+                       long startTime = (Long) rowData.get(ThreadDataDBTable.COLUMN.STARTTIME.index);
+                       long endTime = (Long) rowData.get(ThreadDataDBTable.COLUMN.ENDTIME.index);
+                       int functionID = (Integer) rowData.get(ThreadDataDBTable.COLUMN.FUNCTIONID.index);
+                       String className = (String) rowData.get(ThreadDataDBTable.COLUMN.CLASSNAME.index);
+
+                       ThreadPageThreadData threadData = new ThreadPageThreadData(id, pid, tid, threadType,
+                                       attributeType, startTime, endTime, functionID, className);
+                       tManager.setChartRowData(threadData);
+               }
+       }
+
+       private void selectSyncDataWhenOpen() {
+               List<List<Object>> syncDatas = syncDataTable.getSyncDataFromDB();
+               int syncSize = syncDatas.size();
+               for (int i = 0; i < syncSize; i++) {
+                       ThreadPageSyncData syncData = makeSyncData(syncDatas.get(i));
+                       sManager.setChartRowData(syncData);
+               }
+       }
+
+       private ThreadPageSyncData makeSyncData(List<Object> rowData) {
+               ThreadPageSyncData syncData = null;
+               int id = (Integer) rowData.get(SyncDataDBTable.COLUMN.SYNCDATAID.index);
+               int pid = (Integer) rowData.get(SyncDataDBTable.COLUMN.PID.index);
+               int tid = (Integer) rowData.get(SyncDataDBTable.COLUMN.TID.index);
+               byte syncType = (Byte) rowData.get(SyncDataDBTable.COLUMN.SYNCTYPE.index);
+               long syncValue = (Long) rowData.get(SyncDataDBTable.COLUMN.SYNCVALUE.index);
+               byte attrType = (Byte) rowData.get(SyncDataDBTable.COLUMN.ATTRIBUTETYPE.index);
+               String attributeType = ThreadSyncDataMaker.getAttrTypeByTypeInt(attrType);
+               byte syncDataType = (Byte) rowData.get(SyncDataDBTable.COLUMN.SYNCDATATYPE.index);
+               int parentID = (Integer) rowData.get(SyncDataDBTable.COLUMN.PARENTID.index);
+               syncData = new ThreadPageSyncData(id, pid, tid, syncType, syncValue, attributeType,
+                               syncDataType, parentID);
+               return syncData;
+       }
+
+       @Override
+       protected void makeData(LogPackage pack) {
+               List<LogData> loadInputs = getLogsFromLogPackage(pack, DataChannelConstants.MSG_DATA_SYSTEM);
+               if (null != loadInputs) {
+                       loadManager.makeLoadData(loadInputs);
+               }
+               List<LogData> threadInputs = getLogsFromLogPackage(pack,
+                               DataChannelConstants.MSG_PROBE_THREAD);
+               if (null != threadInputs) {
+                       tManager.makeThreadData(threadInputs);
+                       checkHeapMemory();
+               }
+               List<LogData> syncInputs = getLogsFromLogPackage(pack, DataChannelConstants.MSG_PROBE_SYNC);
+               if (null != syncInputs) {
+                       sManager.makeSyncData(syncInputs);
+                       checkHeapMemory();
+               }
+       }
+
+       private List<LogData> getLogsFromLogPackage(LogPackage logPack, int logCenterConstants) {
+               Logs logs = logPack.getLogs(logCenterConstants);
+               if (null == logs || logs.getRawLogs().size() == 0) {
+                       return null;
+               }
+               List<LogData> ret = logs.getLogs();
+               return ret;
+       }
+}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventInserter.java
deleted file mode 100644 (file)
index 33b0e7c..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*\r
- *  Dynamic Analyzer\r
- *\r
- * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: \r
- * WooJin Jung <woojin2.jung@samsung.com>\r
- * Juyoung Kim <j0.kim@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * \r
- * Contributors:\r
- * - S-Core Co., Ltd\r
- * \r
- */\r
-\r
-package org.tizen.dynamicanalyzer.ui.thread.data;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.concurrent.LinkedBlockingQueue;\r
-\r
-import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
-import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
-import org.tizen.dynamicanalyzer.swap.model.data.ThreadData;\r
-import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
-import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadDataEvent;\r
-// TODO: use DBInserter\r
-public class ThreadEventInserter implements Runnable {\r
-       private static LinkedBlockingQueue<ThreadPageThreadDataEvent> threadEventQueue = new LinkedBlockingQueue<ThreadPageThreadDataEvent>();\r
-\r
-       private static volatile Thread inserterThread = null;\r
-\r
-       public static void startThread() {\r
-               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                       synchronized (ThreadEventInserter.class) {\r
-                               if (inserterThread == null || !inserterThread.isAlive()) {\r
-                                       inserterThread = new Thread(null,\r
-                                                       new ThreadEventInserter());\r
-                                       inserterThread.start();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void stopThread() {\r
-               if (inserterThread != null && inserterThread.isAlive()) {\r
-                       try {\r
-                               sendNotify();\r
-                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
-                       } catch (InterruptedException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-               }\r
-       }\r
-\r
-       public static void pushThreadEvent(ThreadPageThreadDataEvent threadEvent) {\r
-               threadEventQueue.offer(threadEvent);\r
-       }\r
-\r
-       public static void clear() {\r
-               stopThread();\r
-       }\r
-\r
-       @Override\r
-       public void run() {\r
-               while (!AnalyzerManager.isExit()) {\r
-                       ThreadPageThreadDataEvent threadEvent = threadEventQueue.poll();\r
-\r
-                       if (threadEvent != null) {\r
-                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
-                               List<Object> insertRowData = new ArrayList<Object>();\r
-                               try {\r
-                                       insertRowData.add(new Integer(threadEvent.getThreadDataID()));\r
-                                       insertRowData.add(new Long(threadEvent.getTime()));\r
-                                       insertRowData.add(new Integer(threadEvent.getTid()));\r
-                                       Integer apiType = new Integer(threadEvent.getApiType());\r
-                                       insertRowData.add(new Byte(apiType.byteValue()));\r
-                                       insertRowData.add(new String(threadEvent.getTooltipContent()));\r
-                                       insertRowData.add(new Long(threadEvent.getErrorNum()));\r
-                                       Integer eventType = new Integer(threadEvent.getEventType());\r
-                                       insertRowData.add(new Byte(eventType.byteValue()));\r
-                                       insertRowData.add(new Integer(threadEvent.getThreadType()));\r
-                                       Integer callerTid = -1;\r
-                                       if (threadEvent.getCallerTid() != null) {\r
-                                               callerTid = new Integer(threadEvent.getCallerTid());                                            \r
-                                       }\r
-                                       insertRowData.add(callerTid);\r
-                               } catch (ArrayIndexOutOfBoundsException e) {\r
-                                       e.printStackTrace();\r
-                               }\r
-                               insertData.add(insertRowData);\r
-                               if (insertData.size() > 0) {\r
-                                       ThreadChartManager.getInstance().getThreadEventDBTable().insertData(insertData);\r
-                               }\r
-                               // save ThreadAPI\r
-                               if (threadEvent.getEventType() == ThreadPageThreadDataEvent.TYPE_API) {\r
-                                       ArrayList<List<Object>> apiData = new ArrayList<List<Object>>();                \r
-                                       List<Object> apiRowData = new ArrayList<Object>();\r
-                                       ThreadData tData = (ThreadData) threadEvent.getContents();\r
-                                       try {\r
-                                               apiRowData.add(new Long(tData.getSeq()));\r
-                                               apiRowData.add(new Integer(threadEvent.getThreadDataID()));\r
-                                               apiRowData.add(new Long(tData.getTime()));\r
-                                               apiRowData.add(new Integer(tData.getApiId()));\r
-                                               apiRowData.add(new Integer(tData.getPid()));\r
-                                               apiRowData.add(new Integer(tData.getTid()));\r
-                                               apiRowData.add(new String(tData.getArgs()));\r
-                                               apiRowData.add(new String(tData.getReturn()));\r
-                                               apiRowData.add(new Long(tData.getErrno()));\r
-                                       } catch (ArrayIndexOutOfBoundsException e) {\r
-                                               e.printStackTrace();\r
-                                       }\r
-                                       apiData.add(apiRowData);\r
-                                       if (apiData.size() > 0) {\r
-                                               ThreadChartManager.getInstance().getThreadAPIDBTable().insertData(apiData);\r
-                                       }       \r
-                               }\r
-                       }\r
-               }                       \r
-       }\r
-\r
-       public static void sendNotify() {\r
-//             threadEventQueue.wake();\r
-       }\r
-}\r
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadLoadDataMaker.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadLoadDataMaker.java
new file mode 100644 (file)
index 0000000..61ca23c
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * WooJin Jung <woojin2.jung@samsung.com> 
+ * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.swap.model.data.ProcessProfileData;
+import org.tizen.dynamicanalyzer.swap.model.data.SystemData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadDataEvent;
+import org.tizen.dynamicanalyzer.util.Logger;
+
+public class ThreadLoadDataMaker {
+
+       public void makeLoadData(List<LogData> loadInputs) {
+               int logSize = loadInputs.size();
+               for (int i = 0; i < logSize; i++) {
+                       parseLoad(loadInputs.get(i));
+               }
+       }
+
+       public void parseLoad(LogData input) {
+               if (null == input) {
+                       return;
+               }
+
+               if (!(input instanceof SystemData)) {
+                       return;
+               }
+
+               ProcessProfileData[] processDataList = ((SystemData) input).getProcessProfileDataList();
+               List<ThreadPageThreadDataEvent> insertThreadEventList = new ArrayList<ThreadPageThreadDataEvent>();
+               for (int i = 0; i < processDataList.length; i++) {
+                       String loads = processDataList[i].getThreadLoad();
+                       String[] temp = loads.split(",");
+                       String tid;
+                       for (int j = 0; j + 1 < temp.length; j += 2) {
+                               try {
+                                       tid = temp[j];
+                               } catch (NumberFormatException nfe) {
+                                       Logger.error("parseLoad - tid parsing");
+                                       break;
+                               }
+                               int load = (int) (Double.parseDouble(temp[j + 1]));
+                               long time = input.getTime();
+                               ThreadPageThreadDataEvent event = new ThreadPageThreadDataEvent(
+                                               ThreadPageThreadDataEvent.TYPE_LOAD, load, -1, time, Integer.parseInt(tid),
+                                               String.valueOf(load) + ThreadPageLabels.THREAD_CHART_ITEM_PERCENT, -1, null);
+                               event.setThreadDataID(ThreadDataManager.getInstance().getThreadDataMaker()
+                                               .getThreadDataID(event.getTid()));
+                               insertThreadEventList.add(event);
+                       }
+               }
+               ThreadDataManager.getInstance().getThreadEventDBTable()
+                               .insertThreadEventData(insertThreadEventList);
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadSyncDataMaker.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadSyncDataMaker.java
new file mode 100644 (file)
index 0000000..2df1243
--- /dev/null
@@ -0,0 +1,471 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact:
+ * Hyunjong Park <phjwithyou.park@samsung.com> 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.swap.model.data.SyncData;
+import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncDataEvent;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
+import org.tizen.dynamicanalyzer.util.Logger;
+
+public class ThreadSyncDataMaker {
+       private List<ThreadPageSyncData> chartRowData = new ArrayList<ThreadPageSyncData>();
+       private List<ThreadPageSyncDataEvent> noBlockEndTimeSyncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
+       private List<ThreadPageSyncDataEvent> syncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
+       private List<ThreadPageSyncDataEvent> syncEventQueueOfThread = new ArrayList<ThreadPageSyncDataEvent>();
+       private HashMap<String, Integer> syncAttrMap = new HashMap<String, Integer>();
+
+       public static final int PTHREAD_MUTEX_NORMAL = 0;
+       public static final int PTHREAD_MUTEX_RECURSIVE = 1;
+       public static final int PTHREAD_MUTEX_ERRORCHECK = 2;
+       public static final int PTHREAD_MUTEX_DEFAULT = 3;
+
+       public ThreadSyncDataMaker() {
+       }
+
+       public void makeSyncData(List<LogData> syncInputs) {
+               int logSize = syncInputs.size();
+               for (int i = 0; i < logSize; i++) {
+                       parseSync(syncInputs.get(i));
+               }
+               insertSyncData();
+       }
+
+       public void parseSync(LogData input) {
+               if (null == input || !(input instanceof SyncData)) {
+                       return;
+               }
+               SyncData syncData = (SyncData) input;
+               long time = syncData.getTime();
+               int tID = syncData.getTid();
+               int type = syncData.getSyncType();
+               int apiType = syncData.getApiType();
+               String apiName = syncData.getApiName();
+               String name = Long.toString(syncData.getSyncValue());
+               long errorNum = syncData.getErrno();
+               if (errorNum != 0) {
+                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(syncData);
+               }
+               ThreadPageSyncDataEvent event;
+               switch (type) {
+               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
+               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
+               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
+                       event = new ThreadPageSyncDataEvent(name, type, apiType, time, tID, apiName, errorNum,
+                                       input);
+                       syncEventQueue.add(event);
+                       syncEventQueueOfThread.add(event);
+                       break;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
+                       if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
+                               syncAttrMap.put(syncData.getArgs(), PTHREAD_MUTEX_NORMAL);
+                       } else if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
+                               checkMutexAttrType(syncData.getArgs());
+                       } else {
+                               if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEX_INIT)) {
+                                       checkMutexType(syncData.getArgs());
+                               }
+                               event = new ThreadPageSyncDataEvent(name, type, apiType, time, tID, apiName,
+                                               errorNum, input);
+                               syncEventQueue.add(event);
+                               syncEventQueueOfThread.add(event);
+                       }
+                       break;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
+                       event = new ThreadPageSyncDataEvent(name, type, apiType, time, tID, apiName, errorNum,
+                                       input);
+                       syncEventQueue.add(event);
+                       syncEventQueueOfThread.add(event);
+                       Logger.error("sync parse - type = " + type);
+                       break;
+               default:
+                       Logger.error("sync parse unknown - type = " + type);
+               }
+       }
+
+       public void insertSyncData() {
+               makeSyncDataOfThread();
+               makeSyncData();
+       }
+
+       private void makeSyncData() {
+               int size = syncEventQueue.size();
+               if (size == 0) {
+                       return;
+               }
+               List<ThreadPageSyncDataEvent> insertSyncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
+               List<ThreadPageSyncData> insertSyncDataQueue = new ArrayList<ThreadPageSyncData>();
+               ThreadPageSyncData parent;
+               ThreadPageSyncData data;
+               ThreadPageSyncDataEvent event;
+               for (int i = 0; i < size; i++) {
+                       event = syncEventQueue.get(0);
+                       String syncVal = event.getSyncVal();
+                       String pid = Integer.toString(event.getContents().getPid());
+                       parent = findParentData(syncVal);
+                       if (null == parent) {
+                               Integer syncAttrTypeInt = syncAttrMap.get(syncVal);
+                               String syncAttrType;
+
+                               if (null != syncAttrTypeInt) {
+                                       syncAttrType = getAttrTypeByTypeInt(syncAttrTypeInt);
+                               } else {
+                                       syncAttrType = getAttrTypeString(event);
+                               }
+                               parent = new ThreadPageSyncData(event.getType(), syncVal, pid, event.getTid(),
+                                               syncAttrType, ThreadPageSyncData.SYNC_PARENT);
+                               chartRowData.add(parent);
+                               insertSyncDataQueue.add(parent);
+                       }
+                       event.setSyncDataID(parent.getSyncDataID());
+                       data = parent.findChildData(event.getTid());
+                       insertSyncEventQueue.add(event);
+                       if (null == data) {
+                               String attrType = parent.getAttrType();
+                               data = new ThreadPageSyncData(event.getType(), syncVal, pid, event.getTid(),
+                                               attrType, ThreadPageSyncData.SYNC_CHILD);
+                               data.setParentID(parent.getSyncDataID());
+                               parent.pushSync(data);
+                               chartRowData.add(data);
+                               insertSyncDataQueue.add(data);
+                       }
+                       try {
+                               ThreadPageSyncDataEvent cloneEvent = (ThreadPageSyncDataEvent) event.clone();
+                               cloneEvent.setSyncDataID(data.getSyncDataID());
+                               insertSyncEventQueue.add(cloneEvent);
+                       } catch (CloneNotSupportedException e) {
+                               e.printStackTrace();
+                               continue;
+                       } finally {
+                               syncEventQueue.remove(0);
+                       }
+               }
+               insertSyncEvent(insertSyncEventQueue);
+               ThreadDataManager.getInstance().getSyncDataDBTable().insertSyncData(insertSyncDataQueue);
+       }
+
+       public void makeSyncDataOfThread() {
+               int size = syncEventQueueOfThread.size();
+               if (size == 0) {
+                       return;
+               }
+               List<ThreadPageSyncDataEvent> insertSyncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
+               List<ThreadPageSyncData> insertSyncDataQueue = new ArrayList<ThreadPageSyncData>();
+               List<SyncData> insertSyncAPIQueue = new ArrayList<SyncData>();
+               ThreadPageThreadData data;
+               ThreadPageSyncDataEvent event;
+               ThreadPageSyncData sync;
+               for (int i = 0; i < size; i++) {
+                       event = syncEventQueueOfThread.get(0);
+                       String pid = Integer.toString(event.getContents().getPid());
+                       data = ThreadDataManager.getInstance().getThreadDataMaker()
+                                       .findParentDataOfThread(event.getTid());
+                       if (null != data) {
+                               String syncVal = event.getSyncVal();
+                               sync = data.findSyncData(syncVal);
+                               if (null == sync) {
+                                       Integer syncAttrTypeInt = syncAttrMap.get(syncVal);
+                                       String syncAttrType;
+                                       if (null != syncAttrTypeInt) {
+                                               syncAttrType = ThreadSyncDataMaker.getAttrTypeByTypeInt(syncAttrTypeInt);
+                                       } else {
+                                               syncAttrType = ThreadSyncDataMaker.getAttrTypeString(event);
+                                       }
+                                       sync = new ThreadPageSyncData(event.getType(), syncVal, pid, event.getTid(),
+                                                       syncAttrType, ThreadPageSyncData.THREAD_CHILD);
+                                       sync.setParentID(data.getThreadDataID());
+                                       chartRowData.add(sync);
+                                       data.pushSync(sync);
+                                       insertSyncDataQueue.add(sync);
+                               }
+                               event.setSyncDataID(sync.getSyncDataID());
+                               insertSyncEventQueue.add(event);
+                               if (ThreadPageSyncData.isSyncApi(event.getApiType())) {
+                                       insertSyncAPIQueue.add((SyncData) event.getContents());
+                               }
+                       }
+                       syncEventQueueOfThread.remove(0);
+               }
+               insertSyncEvent(insertSyncEventQueue);
+               ThreadDataManager.getInstance().getSyncDataDBTable().insertSyncData(insertSyncDataQueue);
+               ThreadDataManager.getInstance().getSyncAPIDBTable().insertSyncAPIData(insertSyncAPIQueue);
+       }
+
+       private ThreadPageSyncData findParentData(String name) {
+               int size = chartRowData.size();
+               ThreadPageSyncData ret;
+               for (int i = 0; i < size; i++) {
+                       ret = chartRowData.get(i);
+                       if (ret.getKey().equals(name)
+                                       && ret.getSyncDataType() == ThreadPageSyncData.SYNC_PARENT) {
+                               return ret;
+                       }
+               }
+               return null;
+       }
+
+       public static String getAttrTypeByTypeInt(int typeInt) {
+               if (typeInt == PTHREAD_MUTEX_NORMAL) {
+                       return ThreadPageLabels.SYNC_ATTR_TYPE_NORMAL;
+               } else if (typeInt == PTHREAD_MUTEX_RECURSIVE) {
+                       return ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE;
+               } else if (typeInt == PTHREAD_MUTEX_ERRORCHECK) {
+                       return ThreadPageLabels.SYNC_ATTR_TYPE_ERRORCHECK;
+               } else if (typeInt == PTHREAD_MUTEX_DEFAULT) { // for open trace
+                       return ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT;
+               } else {
+                       return CommonConstants.EMPTY;
+               }
+       }
+
+       public static String getAttrTypeString(ThreadPageSyncDataEvent event) {
+               int type = event.getType();
+               if (type == LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX) {
+                       return ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE;
+               } else if (type == LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX) {
+                       return ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT;
+               }
+               return CommonConstants.EMPTY;
+       }
+
+       private void checkMutexAttrType(String input) {
+               String[] temp = input.split(",");
+               if (temp.length != 2) {
+                       return;
+               }
+               String obj = temp[0];
+               String type = temp[1].trim();
+               if (null != syncAttrMap.get(obj)) {
+                       syncAttrMap.put(obj, Integer.valueOf(type));
+               }
+       }
+
+       private void checkMutexType(String input) {
+               String[] temp = input.split(",");
+               if (temp.length != 2) {
+                       return;
+               }
+               String obj = temp[0];
+               String attrObj = temp[1].trim();
+               Integer attrType = syncAttrMap.get(attrObj);
+               if (attrType != null) {
+                       syncAttrMap.put(obj, attrType);
+               }
+       }
+
+       public void insertNoBlockEndTimeSyncEvent() {
+               ThreadDataManager.getInstance().getSyncEventDBTable()
+                               .insertSyncEventData(noBlockEndTimeSyncEventQueue);
+       }
+
+       private void insertSyncEvent(List<ThreadPageSyncDataEvent> insertSyncEventQueue) {
+               makeBlockEndTime(insertSyncEventQueue);
+               ThreadDataManager.getInstance().getSyncEventDBTable()
+                               .insertSyncEventData(insertSyncEventQueue);
+       }
+
+       private void makeBlockEndTime(List<ThreadPageSyncDataEvent> insertSyncEventQueue) {
+               setBlockEndTimeOfInsertList(insertSyncEventQueue);
+               updateNoBlockEndTimeList(insertSyncEventQueue);
+               addInsertListFromNoBlockEndTimeList(insertSyncEventQueue);
+       }
+
+       private void setBlockEndTimeOfInsertList(List<ThreadPageSyncDataEvent> list) {
+               setBlockEndTime(list, list);
+               setBlockEndTime(noBlockEndTimeSyncEventQueue, list);
+       }
+
+       private void setBlockEndTimeOfNoBlockEndTimeList(List<ThreadPageSyncDataEvent> insertSyncEventQueue) {
+               for (ThreadPageSyncDataEvent event : insertSyncEventQueue) {
+                       updateBlockEndTimeOfNotReleaseSyncEventQueue(event);
+               }
+       }
+
+       private void setBlockEndTime(List<ThreadPageSyncDataEvent> targetList,
+                       List<ThreadPageSyncDataEvent> refList) {
+               sortListByTime(targetList);
+               for (ThreadPageSyncDataEvent targerEvent : targetList) {
+                       setBlockEndTime(targerEvent, refList);
+               }
+       }
+
+       private void updateBlockEndTimeOfNotReleaseSyncEventQueue(ThreadPageSyncDataEvent event) {
+               setBlockEndTime(event, noBlockEndTimeSyncEventQueue);
+       }
+
+       private void setBlockEndTime(ThreadPageSyncDataEvent targetEvent,
+                       List<ThreadPageSyncDataEvent> refList) {
+               for (ThreadPageSyncDataEvent refEvent : refList) {
+                       if (targetEvent.equals(refEvent)
+                                       || targetEvent.getSyncDataID() != refEvent.getSyncDataID()
+                                       || targetEvent.getBlockEndTime() != -1
+                                       || targetEvent.getTime() >= refEvent.getTime()
+                                       || !isMappingBlockTimeLog(targetEvent.getApiType(), refEvent.getApiType())
+                                       || targetEvent.getErrorNum() != 0) {
+                               continue;
+                       }
+                       targetEvent.setBlockEndTime(refEvent.getTime());
+                       return;
+               }
+       }
+
+       private void sortListByTime(List<ThreadPageSyncDataEvent> list) {
+               Comparator<ThreadPageSyncDataEvent> comparator = new Comparator<ThreadPageSyncDataEvent>() {
+                       @Override
+                       public int compare(ThreadPageSyncDataEvent arg0, ThreadPageSyncDataEvent arg1) {
+                               if (arg0.getTime() > arg1.getTime()) {
+                                       return 1;
+                               } else if (arg0.getTime() < arg1.getTime()) {
+                                       return -1;
+                               } else {
+                                       return 0;
+                               }
+                       }
+               };
+               Collections.sort(list, comparator);
+       }
+
+       private void updateNoBlockEndTimeList(List<ThreadPageSyncDataEvent> insertSyncEventQueue) {
+               List<ThreadPageSyncDataEvent> removeEveneList = new ArrayList<ThreadPageSyncDataEvent>();
+               int size = insertSyncEventQueue.size();
+               for (int i = 0; i < size; i++) {
+                       ThreadPageSyncDataEvent event = insertSyncEventQueue.get(i);
+                       if (event.getBlockEndTime() == -1) {
+                               try {
+                                       removeEveneList.add(event);
+                                       noBlockEndTimeSyncEventQueue.add(event.clone());
+                               } catch (CloneNotSupportedException e) {
+                                       e.printStackTrace();
+                               }
+                       }
+               }
+               insertSyncEventQueue.removeAll(removeEveneList);
+               setBlockEndTimeOfNoBlockEndTimeList(insertSyncEventQueue);
+       }
+
+       private void addInsertListFromNoBlockEndTimeList(
+                       List<ThreadPageSyncDataEvent> insertSyncEventQueue) {
+               List<ThreadPageSyncDataEvent> removeEveneList = new ArrayList<ThreadPageSyncDataEvent>();
+               int size = noBlockEndTimeSyncEventQueue.size();
+               for (int i = 0; i < size; i++) {
+                       ThreadPageSyncDataEvent event = noBlockEndTimeSyncEventQueue.get(i);
+                       if (event.getBlockEndTime() != -1 || isRequireOnlyEventTimeLog(event.getApiType())) {
+                               try {
+                                       removeEveneList.add(event);
+                                       insertSyncEventQueue.add(event.clone());
+                               } catch (CloneNotSupportedException e) {
+                                       e.printStackTrace();
+                               }
+                       }
+               }
+               noBlockEndTimeSyncEventQueue.removeAll(removeEveneList);
+       }
+
+       private boolean isRequireOnlyEventTimeLog(int apiType) {
+               if (apiType == LogCenterConstants.SYNC_API_TYPE_NEW
+                               || apiType == LogCenterConstants.SYNC_API_TYPE_NOTIFY
+                               || apiType == LogCenterConstants.SYNC_API_TYPE_NOTIFY_ALL
+                               || apiType == LogCenterConstants.SYNC_API_TYPE_OTHER) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       private boolean isMappingBlockTimeLog(int targetType, int refAPIType) {
+               if (targetType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START
+                               && refAPIType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_END) {
+                       return true;
+               }
+               if (targetType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_END
+                               && refAPIType == LogCenterConstants.SYNC_API_TYPE_RELEASE) {
+                       return true;
+               }
+               if (targetType == LogCenterConstants.SYNC_API_TYPE_RELEASE
+                               && refAPIType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START) {
+                       return true;
+               }
+               if (targetType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START
+                               && refAPIType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_END) {
+                       return true;
+               }
+               if (targetType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_END
+                               && refAPIType == LogCenterConstants.SYNC_API_TYPE_RELEASE) {
+                       return true;
+               }
+               if (targetType == LogCenterConstants.SYNC_API_TYPE_RELEASE
+                               && refAPIType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START) {
+                       return true;
+               }
+               if (targetType == LogCenterConstants.SYNC_API_TYPE_TRY_ACQUIRE
+                               && refAPIType == LogCenterConstants.SYNC_API_TYPE_RELEASE) {
+                       return true;
+               }
+               return false;
+       }
+
+       public void setChartRowData(ThreadPageSyncData data) {
+               chartRowData.add(data);
+       }
+
+       public List<ThreadPageSyncData> getChartRowData() {
+               List<ThreadPageSyncData> returnList = new ArrayList<ThreadPageSyncData>();
+               for(ThreadPageSyncData data : chartRowData){
+                       returnList.add(data);
+               }
+               return returnList;
+       }
+
+       public List<ThreadPageSyncDataEvent> getNotInsertSyncEventList() {
+               return noBlockEndTimeSyncEventQueue;
+       }
+
+       public void clear() {
+               noBlockEndTimeSyncEventQueue.clear();
+               chartRowData.clear();
+               syncEventQueue.clear();
+               syncEventQueueOfThread.clear();
+               syncAttrMap.clear();
+               ThreadPageSyncData.clear(); // reset internal seq number
+       }
+
+}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadThreadDataMaker.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadThreadDataMaker.java
new file mode 100644 (file)
index 0000000..018d5b2
--- /dev/null
@@ -0,0 +1,554 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * WooJin Jung <woojin2.jung@samsung.com> 
+ * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.Global;
+import org.tizen.dynamicanalyzer.common.SymbolManager;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.swap.model.data.ThreadData;
+import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
+import org.tizen.dynamicanalyzer.ui.summary.warning.WarningCase;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadDataEvent;
+import org.tizen.dynamicanalyzer.util.Logger;
+
+public class ThreadThreadDataMaker {
+       private List<ThreadPageThreadDataEvent> eventQueue = new ArrayList<ThreadPageThreadDataEvent>();
+       private HashMap<String, Integer> joinableThreadMap = new HashMap<String, Integer>();
+       private List<ThreadPageThreadData> chartRowData = new ArrayList<ThreadPageThreadData>();
+       private HashMap<String, Long> threadFuncMap = new HashMap<String, Long>();
+       private HashMap<String, Integer> threadAttrMap = new HashMap<String, Integer>();
+       private List<ThreadPageThreadDataEvent> callEventQueue = new ArrayList<ThreadPageThreadDataEvent>();
+
+       public static final int PTHREAD_CREATE_JOINABLE = 0;
+       public static final int PTHREAD_CREATE_DETACHED = 1;
+
+       public void makeThreadData(List<LogData> threadInputs) {
+               int logSize = threadInputs.size();
+               for (int i = 0; i < logSize; i++) {
+                       parseAPI(threadInputs.get(i));
+               }
+               int size = eventQueue.size();
+               if (size == 0) {
+                       return;
+               }
+
+               List<ThreadPageThreadDataEvent> insertThreadEvent = new ArrayList<ThreadPageThreadDataEvent>();
+               for (ThreadPageThreadDataEvent event : eventQueue) {
+                       if (true == checkPairEvent(event)) {
+                               event.setThreadDataID(getThreadDataID(event.getTid()));
+                               insertThreadEvent.add(event);
+                       }
+               }
+
+               eventQueue.removeAll(insertThreadEvent);
+               ThreadDataManager.getInstance().getThreadEventDBTable()
+                               .insertThreadEventData(insertThreadEvent);
+               ThreadDataManager.getInstance().getThreadAPIDBTable()
+                               .insertThreadAPIData(insertThreadEvent);
+       }
+
+       public void parseAPI(LogData input) {
+               if (null == input) {
+                       return;
+               }
+               if (!(input instanceof ThreadData)) {
+                       return;
+               }
+               ThreadData log = (ThreadData) input;
+               int threadType = log.getThreadType();
+               switch (threadType) {
+               case LogCenterConstants.THREAD_TYPE_PTHREAD:
+                       parsePthread(log);
+                       break;
+               case LogCenterConstants.THREAD_TYPE_TIZEN:
+                       // parseOSP(log);
+                       break;
+               default:
+                       Logger.error("thread page err: unknown thread type");
+               }
+       }
+
+       private void parsePthread(ThreadData input) {
+               long time = input.getTime();
+               String pid = Integer.toString(input.getPid());
+               int apiType = input.getApiType();
+               String apiName = input.getApiName();
+               long errorNum = input.getErrno();
+               ThreadPageThreadDataEvent event;
+               int tID = input.getTid();
+               String pthreadId = Long.toString(input.getPThreadId());
+               if (errorNum != 0) {
+                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(input);
+               }
+               switch (apiType) {
+               case LogCenterConstants.THREAD_API_TYPE_NEW:
+               case LogCenterConstants.THREAD_API_TYPE_STOP:
+               case LogCenterConstants.THREAD_API_TYPE_EXIT:
+               case LogCenterConstants.THREAD_API_TYPE_WAIT_START:
+               case LogCenterConstants.THREAD_API_TYPE_OTHER:
+                       if (apiName.equals(ThreadPageLabels.THREAD_API_PTHREAD_ATTR_INIT)) {
+                               threadAttrMap.put(input.getArgs(), PTHREAD_CREATE_JOINABLE);
+                       } else if (apiName.equals(ThreadPageLabels.THREAD_API_PTHREAD_ATTR_SETDETACHSTATE)) {
+                               checkThreadAttrType(input.getArgs());
+                       }
+                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
+                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tID, apiName, errorNum,
+                                       input);
+                       eventQueue.add(event);
+                       break;
+               case LogCenterConstants.THREAD_API_TYPE_START:
+                       if (apiName.equals(ThreadPageLabels.THREAD_API_PTHREAD_CREATE)) {
+                               checkThreadType(input.getArgs(), pthreadId);
+                               checkThreadFunc(input.getArgs(), pthreadId);
+                       }
+                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
+                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tID, apiName, errorNum,
+                                       input);
+                       event.setCallID(pthreadId);
+                       callEventQueue.add(event);
+                       break;
+               case LogCenterConstants.THREAD_API_TYPE_WAIT_END: {
+                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
+                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tID, apiName, errorNum,
+                                       input);
+                       eventQueue.add(event);
+                       Integer joninTID = joinableThreadMap.get(pthreadId);
+                       if (null != joninTID
+                                       && input.getApiName().equals(ThreadPageLabels.THREAD_API_PTHREAD_JOIN)) {
+                               SummaryDataManager
+                                               .getInstance()
+                                               .getWarningDataMaker()
+                                               .removeData(event.getContents(),
+                                                               ThreadPageLabels.THREAD_CHART_NAME_TID + findCallerTid(pthreadId),
+                                                               WarningCase.JOINABLE_LEAK.getType());
+                               joinableThreadMap.remove(pthreadId);
+                       }
+               }
+                       break;
+               case LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP: {
+                       threadAttrMap.remove(pthreadId);
+                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
+                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tID,
+                                       ThreadPageLabels.THREAD_CHART_ITEM_EXITED, errorNum, input);
+                       event.setCallID(pthreadId);
+                       Integer joninTID = joinableThreadMap.get(pthreadId);
+                       if (null != joninTID && joninTID == tID) {
+                               SummaryDataManager
+                                               .getInstance()
+                                               .getWarningDataMaker()
+                                               .add(input, ThreadPageLabels.THREAD_CHART_NAME_TID + tID,
+                                                               WarningCase.JOINABLE_LEAK.getType());
+                       }
+                       callEventQueue.add(event);
+                       setEndTime(tID, time);
+               }
+                       break;
+               case LogCenterConstants.THREAD_API_TYPE_INTERNAL_START:
+                       Integer threadAttrTypeInt = threadAttrMap.get(pthreadId);
+                       String threadAttrType;
+                       int funcID;
+                       if (null != threadAttrTypeInt) {
+                               threadAttrType = getAttrTypeByTypeInt(threadAttrTypeInt);
+                       } else {
+                               threadAttrType = ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE;
+                       }
+                       if (threadAttrType == ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE) {
+                               joinableThreadMap.put(pthreadId, tID);
+                       }
+
+                       funcID = SymbolManager.getFuncId(null, threadFuncMap.get(pthreadId), input.getPid(),
+                                       input.getTime());
+                       ThreadPageThreadData data = new ThreadPageThreadData(ThreadPageThreadData.TYPE_PTHREAD,
+                                       pid, tID, threadAttrType, funcID);
+                       data.setStartTime(time);
+                       chartRowData.add(data);
+                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
+                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tID,
+                                       ThreadPageLabels.THREAD_CHART_ITEM_CREATED, errorNum, input);
+                       eventQueue.add(event);
+
+                       List<ThreadPageThreadDataEvent> insertThreadEvent = new ArrayList<ThreadPageThreadDataEvent>();
+                       for (int i = 0; i < callEventQueue.size(); i++) {
+                               ThreadPageThreadDataEvent callEvent = callEventQueue.get(i);
+                               if (callEvent.getCallID().equals(pthreadId)
+                                               && callEvent.getApiType() == LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
+                                       callEvent.setThreadDataID(getThreadDataID(callEvent.getTid()));
+                                       insertThreadEvent.add(callEvent);
+                               }
+                       }
+                       callEventQueue.removeAll(insertThreadEvent);
+                       ThreadDataManager.getInstance().getThreadEventDBTable()
+                                       .insertThreadEventData(insertThreadEvent);
+                       ThreadDataManager.getInstance().getThreadAPIDBTable()
+                                       .insertThreadAPIData(insertThreadEvent);
+
+                       break;
+               default:
+                       Logger.error("thread page err: unknown thread api type");
+               }
+       }
+
+       public void insertRemainingCallEvent() {
+               List<ThreadPageThreadDataEvent> insertThreadEvent = new ArrayList<ThreadPageThreadDataEvent>();
+               for (int i = 0; i < callEventQueue.size(); i++) {
+                       ThreadPageThreadDataEvent callEvent = callEventQueue.get(i);
+                       callEvent.setThreadDataID(getThreadDataID(callEvent.getTid()));
+                       insertThreadEvent.add(callEvent);
+               }
+               ThreadDataManager.getInstance().getThreadEventDBTable()
+                               .insertThreadEventData(insertThreadEvent);
+               ThreadDataManager.getInstance().getThreadAPIDBTable()
+                               .insertThreadAPIData(insertThreadEvent);
+               callEventQueue.clear();
+       }
+
+       private boolean checkPairEvent(ThreadPageThreadDataEvent event) {
+               if (event.getEventType() != ThreadPageThreadDataEvent.TYPE_EVENT) {
+                       return true;
+               }
+
+               int apiType = event.getApiType();
+               int threadType = event.getThreadType();
+               ThreadData tData = (ThreadData) event.getContents();
+               if (LogCenterConstants.THREAD_API_TYPE_INTERNAL_START == apiType) {
+                       int callEventQueueSize = callEventQueue.size();
+                       ThreadPageThreadDataEvent callEvent;
+                       for (int i = 0; i < callEventQueueSize; i++) {
+                               callEvent = callEventQueue.get(i);
+                               if (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_START) {
+                                       continue;
+                               } else if (callEvent.getThreadType() != threadType) {
+                                       continue;
+                               } else {
+                                       if (threadType == LogCenterConstants.THREAD_TYPE_TIZEN) {
+                                               String callerTizenID = callEvent.getCallID();
+                                               String eventTizenID = Long.toString(tData.getOspThreadId());
+                                               if (eventTizenID.equals(callerTizenID)) {
+                                                       event.setCallerTid(callEvent.getTid());
+                                                       callEventQueue.remove(i);
+                                                       return true;
+                                               }
+                                       } else {
+                                               String callerPthreadID = callEvent.getCallID();
+                                               String eventPthreadID = Long.toString(tData.getPThreadId());
+                                               if (eventPthreadID.equals(callerPthreadID)) {
+                                                       event.setCallerTid(callEvent.getTid());
+                                                       callEventQueue.remove(i);
+
+                                                       callEvent.setThreadDataID(getThreadDataID(callEvent.getTid()));
+
+                                                       List<ThreadPageThreadDataEvent> insertThreadEvent = new ArrayList<ThreadPageThreadDataEvent>();
+                                                       insertThreadEvent.add(callEvent);
+                                                       ThreadDataManager.getInstance().getThreadEventDBTable()
+                                                                       .insertThreadEventData(insertThreadEvent);
+                                                       ThreadDataManager.getInstance().getThreadAPIDBTable()
+                                                                       .insertThreadAPIData(insertThreadEvent);
+
+                                                       return true;
+                                               }
+                                       }
+                               }
+                       }
+                       return false;
+               } else if (LogCenterConstants.THREAD_API_TYPE_WAIT_END == apiType) {
+                       if (!event.isJoinAPI()) {
+                               return true;
+                       }
+
+                       int callEventQueueSize = callEventQueue.size();
+                       ThreadPageThreadDataEvent callEvent;
+                       for (int i = 0; i < callEventQueueSize; i++) {
+                               callEvent = callEventQueue.get(i);
+                               if (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
+                                       continue;
+                               } else if (callEvent.getThreadType() != threadType) {
+                                       continue;
+                               } else {
+                                       if (threadType == LogCenterConstants.THREAD_TYPE_TIZEN) {
+                                               String callerTizenID = callEvent.getCallID();
+                                               String eventTizenID = Long.toString(tData.getOspThreadId());
+                                               if (eventTizenID.equals(callerTizenID)) {
+                                                       event.setCallerTid(callEvent.getTid());
+                                                       callEvent.setCallerTid(event.getTid());
+                                                       // join, delete warning
+                                                       SummaryDataManager
+                                                                       .getInstance()
+                                                                       .getWarningDataMaker()
+                                                                       .removeData(
+                                                                                       event.getContents(),
+                                                                                       ThreadPageLabels.THREAD_CHART_NAME_TID
+                                                                                                       + callEvent.getTid(),
+                                                                                       WarningCase.JOINABLE_LEAK.getType());
+                                                       callEventQueue.remove(i);
+                                                       return true;
+                                               }
+                                       } else {
+                                               String callerPthreadID = callEvent.getCallID();
+                                               String eventPthreadID = Long.toString(tData.getPThreadId());
+                                               if (eventPthreadID.equals(callerPthreadID)) {
+                                                       event.setCallerTid(callEvent.getTid());
+                                                       callEvent.setCallerTid(event.getTid());
+                                                       callEventQueue.remove(i);
+                                                       callEvent.setThreadDataID(getThreadDataID(callEvent.getTid()));
+
+                                                       List<ThreadPageThreadDataEvent> insertThreadEvent = new ArrayList<ThreadPageThreadDataEvent>();
+                                                       insertThreadEvent.add(callEvent);
+                                                       ThreadDataManager.getInstance().getThreadEventDBTable()
+                                                                       .insertThreadEventData(insertThreadEvent);
+                                                       ThreadDataManager.getInstance().getThreadAPIDBTable()
+                                                                       .insertThreadAPIData(insertThreadEvent);
+                                                       return true;
+                                               }
+                                       }
+                               }
+                       }
+                       return false;
+               } else {
+                       return true;
+               }
+       }
+
+       private int findCallerTid(String id) {
+               int callEventQueueSize = callEventQueue.size();
+               ThreadPageThreadDataEvent callEvent;
+               for (int i = 0; i < callEventQueueSize; i++) {
+                       callEvent = callEventQueue.get(i);
+                       if (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
+                               continue;
+                       }
+                       String callerTID = callEvent.getCallID();
+
+                       if (callerTID != null && callerTID.equals(id)) {
+                               return callEvent.getTid();
+                       }
+               }
+               return -1;
+       }
+
+       public void setChartRowData(ThreadPageThreadData data) {
+               chartRowData.add(data);
+       }
+
+       public List<ThreadPageThreadData> getChartRowData() {
+               List<ThreadPageThreadData> returnList = new ArrayList<ThreadPageThreadData>();
+               for (ThreadPageThreadData data : chartRowData) {
+                       returnList.add(data);
+               }
+               return returnList;
+       }
+
+       private void setEndTime(int tID, long endTime) {
+               for (ThreadPageThreadData threadData : chartRowData) {
+                       if (threadData.getTid() == tID) {
+                               threadData.setEndTime(endTime);
+                       }
+               }
+       }
+
+       public int getThreadDataID(int tID) {
+               for (ThreadPageThreadData threadData : chartRowData) {
+                       if (threadData.getTid() == tID) {
+                               return threadData.getThreadDataID();
+                       }
+               }
+               return 0;
+       }
+
+       public void createMainThreadItem(int tid) {
+               int funcID = Global.getFunctionID("main");
+               ThreadPageThreadData mainData = new ThreadPageThreadData(ThreadPageThreadData.TYPE_MAIN,
+                               Integer.toString(tid), tid, CommonConstants.EMPTY, funcID);
+               chartRowData.add(mainData);
+       }
+
+       public static String getAttrTypeByTypeInt(int typeInt) {
+               if (typeInt == PTHREAD_CREATE_JOINABLE) {
+                       return ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE;
+               } else if (typeInt == PTHREAD_CREATE_DETACHED) {
+                       return ThreadPageLabels.THREAD_ATTR_TYPE_DETACHED;
+               } else {
+                       return CommonConstants.EMPTY;
+               }
+       }
+
+       private void checkThreadAttrType(String input) {
+               String[] temp = input.split(",");
+               if (temp.length != 2) {
+                       return;
+               }
+               String obj = temp[0];
+               String type = temp[1].trim();
+               if (null != threadAttrMap.get(obj)) {
+                       threadAttrMap.put(obj, Integer.valueOf(type));
+               }
+       }
+
+       private void checkThreadType(String args, String pthreadId) {
+               String[] temp = args.split(",");
+               if (temp.length != 4) {
+                       return;
+               }
+               String attrObj = temp[1].trim();
+
+               Integer attrType = threadAttrMap.get(attrObj);
+               if (attrType != null) {
+                       threadAttrMap.put(pthreadId, attrType);
+               }
+       }
+
+       private void checkThreadFunc(String args, String pthreadId) {
+               String[] temp = args.split(",");
+               if (temp.length != 4) {
+                       return;
+               }
+               // 3rd argument is function address
+               String strFuncAddr = temp[2].trim();
+               Long funcAddr = Long.decode(strFuncAddr);
+               threadFuncMap.put(pthreadId, funcAddr);
+       }
+
+       public ThreadPageThreadData findParentDataOfThread(int tID) {
+               for (ThreadPageThreadData threadData : chartRowData) {
+                       if (threadData.getTid() == tID) {
+                               return threadData;
+                       }
+               }
+               return null;
+       }
+
+       public void clear() {
+               callEventQueue.clear();
+               eventQueue.clear();
+               joinableThreadMap.clear();
+               chartRowData.clear();
+               threadFuncMap.clear();
+               threadAttrMap.clear();
+               ThreadPageThreadData.clear(); // reset internal seq number
+       }
+
+       /*
+        * private void parseOSP(ThreadData input) { long time = input.getTime();
+        * String pid = Integer.toString(input.getPid()); int tID = input.getTid();
+        * String tid = Integer.toString(input.getTid()); int apiType =
+        * input.getApiType(); String apiName = input.getApiName(); String callID =
+        * Long.toString(input.getOspThreadId()); String className = null;
+        * ThreadPageThreadData data; ThreadPageThreadDataEvent event; long errorNum
+        * = input.getErrno();
+        * 
+        * if (errorNum != 0) {
+        * SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(input);
+        * }
+        * 
+        * switch (apiType) { case LogCenterConstants.THREAD_API_TYPE_NEW: case
+        * LogCenterConstants.THREAD_API_TYPE_STOP: case
+        * LogCenterConstants.THREAD_API_TYPE_EXIT: case
+        * LogCenterConstants.THREAD_API_TYPE_WAIT_START: case
+        * LogCenterConstants.THREAD_API_TYPE_OTHER: event = new
+        * ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
+        * LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tID, apiName,
+        * errorNum, input); pushEvent(event); break; case
+        * LogCenterConstants.THREAD_API_TYPE_START: event = new
+        * ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
+        * LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tID, apiName,
+        * errorNum, input);
+        * 
+        * event.setCallID(callID); data = findCallQueue(callID); if (null != data)
+        * { data.setThreadClassName(input.getClassName()); chartRowData.add(data);
+        * } pushEvent(event); pushCallEvent(event); break; case
+        * LogCenterConstants.THREAD_API_TYPE_WAIT_END: if
+        * (input.getApiName().equals(ThreadPageLabels.THREAD_API_TIZEN_JOIN)) {
+        * event = new
+        * ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
+        * LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tID, apiName,
+        * errorNum, input); pushEvent(event); // join, delete warning //
+        * AnalyzerManager.getWarningChecker().removeData( //
+        * ThreadPageLabels.THREAD_CHART_NAME_TID // +
+        * findCallerTid(Long.toString(input // .getOspThreadId())), //
+        * WarningCase.JOINABLE_LEAK.getType()); SummaryDataManager .getInstance()
+        * .getWarningDataMaker() .removeData(event.getContents(),
+        * ThreadPageLabels.THREAD_CHART_NAME_TID + findCallerTid(callID),
+        * WarningCase.JOINABLE_LEAK.getType()); } // FIXME : do not shows sleep's
+        * wait end
+        * 
+        * break; case LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP: event = new
+        * ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
+        * LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tID,
+        * ThreadPageLabels.THREAD_CHART_ITEM_EXITED, errorNum, input);
+        * event.setCallID(Long.toString(input.getOspThreadId())); pushEvent(event);
+        * pushCallEvent(event); String joinableThread = joinableThreadMap.get(tID);
+        * if (null != joinableThread &&
+        * joinableThread.equals(ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE)) { //
+        * warningData // WarningData wData = new WarningData( //
+        * WarningCase.JOINABLE_LEAK.getType(), // event.getContents(), //
+        * ThreadPageLabels.THREAD_CHART_NAME_TID + tid); //
+        * AnalyzerManager.getWarningChecker().getWarningData().add(wData);
+        * SummaryDataManager .getInstance() .getWarningDataMaker()
+        * .add(event.getContents(), ThreadPageLabels.THREAD_CHART_NAME_TID + tid,
+        * WarningCase.JOINABLE_LEAK.getType()); } break; case
+        * LogCenterConstants.THREAD_API_TYPE_INTERNAL_START: Integer
+        * threadAttrTypeInt = threadAttrMap.get(tID); String threadAttrType; if
+        * (null != threadAttrTypeInt) { threadAttrType =
+        * getAttrTypeByTypeInt(threadAttrTypeInt); } else { threadAttrType =
+        * ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE; } joinableThreadMap.put(tID,
+        * threadAttrType);
+        * 
+        * data = new ThreadPageThreadData(ThreadPageThreadData.TYPE_TIZEN, pid,
+        * tID, ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE, -1); // TIZEN thread
+        * includes the internal thread if ((className = checkCalledThread(callID))
+        * != null) { data.setThreadClassName(className); } chartRowData.add(data);
+        * event = new
+        * ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
+        * LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tID,
+        * ThreadPageLabels.THREAD_CHART_ITEM_CREATED, errorNum, input);
+        * pushEvent(event); break; default:
+        * Logger.error("thread page err: unknown thread api type"); } }
+        * 
+        * private ThreadPageThreadData findCallQueue(String callID) { int tid =
+        * findCallerTid(callID); int size; size = chartRowData.size();
+        * ThreadPageThreadData ret; for (int i = 0; i < size; i++) { ret =
+        * chartRowData.get(i); if (ret.getTid() == tid) { chartRowData.remove(i);
+        * return ret; } } return null; }
+        * 
+        * private String checkCalledThread(String callId) { if (null == callId) {
+        * return null; } int callEventQueueSize = callEventQueue.size();
+        * ThreadPageThreadDataEvent callEvent; for (int i = 0; i <
+        * callEventQueueSize; i++) { callEvent = callEventQueue.get(i); if
+        * (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_START) {
+        * continue; } if (callId.equals(callEvent.getCallID())) { ThreadData
+        * threadData = (ThreadData) callEvent.getContents(); return
+        * threadData.getClassName(); } } return null; }
+        */
+}
@@ -3,7 +3,8 @@
  *
  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
  *
- * Contact: 
+ * Contact:
+ * Hyunjong Park <phjwithyou.park@samsung.com> 
  * WooJin Jung <woojin2.jung@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -24,7 +25,7 @@
  * 
  */
 
-package org.tizen.dynamicanalyzer.ui.thread.data;
+package org.tizen.dynamicanalyzer.ui.thread.db;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -36,101 +37,125 @@ import org.tizen.dynamicanalyzer.common.DALimit;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.database.DBColumn;
 import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBInsertManager;
+import org.tizen.dynamicanalyzer.database.DBInserter;
 import org.tizen.dynamicanalyzer.database.DBTable;
-import org.tizen.dynamicanalyzer.database.IResultSet;
+import org.tizen.dynamicanalyzer.swap.model.data.SyncData;
+
+public class SyncAPIDBTable extends DBTable {
+       public static final String TABLENAME = "SYNCAPI";
+       private DBInserter dbInserter = null;
+
+       private static final String SELECT_COLUMN = COLUMN.SEQ.name + CommonConstants.COMMA
+                       + COLUMN.APICALLTIME.name + CommonConstants.COMMA + COLUMN.APIID.name
+                       + CommonConstants.COMMA + COLUMN.PID.name + CommonConstants.COMMA + COLUMN.TID.name
+                       + CommonConstants.COMMA + COLUMN.ARGUMENT.name + CommonConstants.COMMA
+                       + COLUMN.RETURN.name + CommonConstants.COMMA + COLUMN.ERRORNO.name;
+       public static final String SELECT_QUERY = "select " + SELECT_COLUMN + " from "
+                       + SyncEventDBTable.TABLENAME + CommonConstants.COMMA + TABLENAME + "  where "
+                       + SyncEventDBTable.COLUMN.SYNCDATAID.name + " = %s and "
+                       + SyncEventDBTable.COLUMN.API_SEQNUMBER.name + " = " + COLUMN.SEQ.name;
 
-public class SyncAPIDBTable extends DBTable implements IResultSet {
-       public static final String TABLENAME="SyncAPI";
-       
-       private static final String SELECT_COLUMN = 
-                       COLUMN.SEQ.name + CommonConstants.COMMA +
-                       COLUMN.APICALLTIME.name + CommonConstants.COMMA +
-                       COLUMN.APIID.name + CommonConstants.COMMA +
-                       COLUMN.PID.name + CommonConstants.COMMA +
-                       COLUMN.TID.name + CommonConstants.COMMA +
-                       COLUMN.ARGUMENT.name + CommonConstants.COMMA +
-                       COLUMN.RETURN.name + CommonConstants.COMMA +
-                       COLUMN.ERRORNO.name;
-       public static final String SELECT_QUERY = 
-                       "select " + SELECT_COLUMN + " from " + SyncEventDBTable.TABLENAME + 
-                       CommonConstants.COMMA + TABLENAME + 
-                       "  where " + SyncEventDBTable.COLUMN.SYNCDATAID.name + " = %s and " +
-                       SyncEventDBTable.COLUMN.API_SEQNUMBER.name + " = " + COLUMN.SEQ.name;
-       
        public enum COLUMN {
-               SEQ(0, "SEQNUMBER"),
-               APICALLTIME(1, "APICallTime"),
-               APIID(2, "APIID"),
-               PID(3, "PID"),
-               TID(4, "TID"),
-               ARGUMENT(5, DBConstants.DBCOLUMN_ARGUMENT),
-               RETURN(6, DBConstants.DBCOLUMN_RETURN_VALUE),
-               ERRORNO(7, DBConstants.DBCOLUMN_ERROR_NUMBER),
-               SYNCVALUE(8, "SyncValue");
-               
+               SEQ(0, "SEQNUMBER"), APICALLTIME(1, "APICallTime"), APIID(2, "APIID"), PID(3, "PID"), TID(
+                               4, "TID"), ARGUMENT(5, DBConstants.DBCOLUMN_ARGUMENT), RETURN(6,
+                               DBConstants.DBCOLUMN_RETURN_VALUE), ERRORNO(7, DBConstants.DBCOLUMN_ERROR_NUMBER), SYNCVALUE(
+                               8, "SyncValue");
+
                public final int index;
                public final String name;
-               
+
                COLUMN(int index, String name) {
                        this.index = index;
                        this.name = name;
                }
        }
-       
+
        @Override
        public String getTableName() {
                return TABLENAME;
        }
-       
+
        public SyncAPIDBTable() {
                addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.APICALLTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.APIID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));              
+               addColumn(new DBColumn(COLUMN.APICALLTIME.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.APIID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY,
-                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
-               addColumn(new DBColumn(COLUMN.RETURN.name, DBConstants.EMPTY,
-                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_RETURN_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY, DBConstants.DBTYPE_VARCHAR,
+                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.RETURN.name, DBConstants.EMPTY, DBConstants.DBTYPE_VARCHAR,
+                               DALimit.FUNCTION_RETURN_VALUE_LENGTH));
                addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
                addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               dbInserter = DBInsertManager.makeInserter(this);
+       }
+
+       public void insertSyncAPIData(List<SyncData> insertSyncAPIList) {
+               if (insertSyncAPIList.size() == 0) {
+                       return;
+               }
+               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();
+               for (SyncData syncAPI : insertSyncAPIList) {
+                       List<Object> insertRowData = new ArrayList<Object>();
+                       try {
+                               insertRowData.add(new Long(syncAPI.getSeq()));
+                               insertRowData.add(new Long(syncAPI.getTime()));
+                               insertRowData.add(new Integer(syncAPI.getApiId()));
+                               insertRowData.add(new Integer(syncAPI.getPid()));
+                               insertRowData.add(new Integer(syncAPI.getTid()));
+                               insertRowData.add(new String(syncAPI.getArgs()));
+                               insertRowData.add(new String(syncAPI.getReturn()));
+                               insertRowData.add(new Long(syncAPI.getErrno()));
+                               insertRowData.add(new Long(syncAPI.getSyncValue()));
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
+                       }
+                       insertData.add(insertRowData);
+               }
+               if (insertData.size() > 0) {
+                       dbInserter.pushData(insertData);
+               }
        }
 
        public List<List<Object>> getSyncAPIFromDB() {
                return selectAllColumnData(null);
        }
-       
+
        @Override
        public boolean prepare(PreparedStatement prep, List<Object> rowData) {
                boolean isPrepared = true;
-               
                int columnsize = getColumnSize();
                if (columnsize != rowData.size()) {
                        isPrepared = false;
                } else {
                        try {
                                prep.setLong(COLUMN.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
-                               prep.setLong(COLUMN.APICALLTIME.index + 1, (Long) (rowData.get(COLUMN.APICALLTIME.index)));
+                               prep.setLong(COLUMN.APICALLTIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.APICALLTIME.index)));
                                prep.setInt(COLUMN.APIID.index + 1, (Integer) (rowData.get(COLUMN.APIID.index)));
                                prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
                                prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
                                String argumentStr = clipString((String) (rowData.get(COLUMN.ARGUMENT.index)),
-                                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index)
+                                                               .toString());
                                prep.setString(COLUMN.ARGUMENT.index + 1, argumentStr);
                                String retStr = clipString((String) (rowData.get(COLUMN.RETURN.index)),
-                                               DALimit.FUNCTION_RETURN_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                                               DALimit.FUNCTION_RETURN_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index)
+                                                               .toString());
                                prep.setString(COLUMN.RETURN.index + 1, retStr);
                                prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
-                               prep.setLong(COLUMN.SYNCVALUE.index + 1, (Long) (rowData.get(COLUMN.SYNCVALUE.index)));
+                               prep.setLong(COLUMN.SYNCVALUE.index + 1,
+                                               (Long) (rowData.get(COLUMN.SYNCVALUE.index)));
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
                        }
                }
-               
                return isPrepared;
        }
-       
+
        @Override
        public List<Object> extractDataFromResultSet(ResultSet rs) {
                List<Object> row = new ArrayList<Object>();
@@ -148,7 +173,7 @@ public class SyncAPIDBTable extends DBTable implements IResultSet {
                        e.printStackTrace();
                        return null;
                }
-               
+
                return row;
        }
 }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/SyncDataDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/SyncDataDBTable.java
new file mode 100644 (file)
index 0000000..bcba12f
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.db;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBInsertManager;
+import org.tizen.dynamicanalyzer.database.DBInserter;
+import org.tizen.dynamicanalyzer.database.DBTable;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadSyncDataMaker;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncData;
+
+public class SyncDataDBTable extends DBTable {
+       public static final String TABLENAME = "SYNCDATA";
+
+       public static final String QUERY_OPTION = "order by " + COLUMN.SYNCDATAID.name;
+
+       private DBInserter dbInserter = null;
+
+       private static final String SELECT_COLUMN = COLUMN.SYNCDATAID.name + CommonConstants.COMMA
+                       + COLUMN.PID.name + CommonConstants.COMMA + COLUMN.TID.name + CommonConstants.COMMA
+                       + COLUMN.SYNCTYPE.name + CommonConstants.COMMA + COLUMN.SYNCVALUE.name
+                       + CommonConstants.COMMA + COLUMN.ATTRIBUTETYPE.name + CommonConstants.COMMA
+                       + COLUMN.SYNCDATATYPE.name + CommonConstants.COMMA + COLUMN.PARENTID.name;
+       public static final String SELECT_QUERY = "select " + SELECT_COLUMN + " from " + TABLENAME
+                       + "  order by " + COLUMN.SYNCDATAID.name;
+
+       public enum COLUMN {
+               SYNCDATAID(0, "SyncDataID"), PID(1, "PID"), TID(2, "TID"), SYNCTYPE(3, "SyncType"), SYNCVALUE(
+                               4, "SyncValue"), ATTRIBUTETYPE(5, "AttributeType"), SYNCDATATYPE(6, "SyncDataType"), PARENTID(
+                               7, "ParentId");
+
+               public final int index;
+               public final String name;
+
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+
+       public SyncDataDBTable() {
+               addColumn(new DBColumn(COLUMN.SYNCDATAID.name, DBConstants.PRIMARY_KEY,
+                               DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.SYNCTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.ATTRIBUTETYPE.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.SYNCDATATYPE.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.PARENTID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
+               dbInserter = DBInsertManager.makeInserter(this);
+       }
+
+       public List<List<Object>> getSyncDataFromDB() {
+               return selectAllColumnData(QUERY_OPTION);
+       }
+
+       public void insertSyncData(List<ThreadPageSyncData> insertSyncDataQueue) {
+               if (insertSyncDataQueue.size() == 0) {
+                       return;
+               }
+               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();
+               for (ThreadPageSyncData syncData : insertSyncDataQueue) {
+                       List<Object> insertRowData = new ArrayList<Object>();
+                       try {
+                               insertRowData.add(new Integer(syncData.getSyncDataID()));
+                               insertRowData.add(new Integer(syncData.getPid()));
+                               insertRowData.add(new Integer(syncData.getTid()));
+                               Integer type = new Integer(syncData.getType());
+                               byte syncType = type.byteValue();
+                               insertRowData.add(new Byte(syncType));
+                               insertRowData.add(new Long(syncData.getKey()));
+                               String attrTypeStr = syncData.getAttrType();
+                               byte attrType = -1;
+                               if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_NORMAL)) {
+                                       attrType = ThreadSyncDataMaker.PTHREAD_MUTEX_NORMAL;
+                               } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE)) {
+                                       attrType = ThreadSyncDataMaker.PTHREAD_MUTEX_RECURSIVE;
+                               } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_ERRORCHECK)) {
+                                       attrType = ThreadSyncDataMaker.PTHREAD_MUTEX_ERRORCHECK;
+                               } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT)) {
+                                       attrType = ThreadSyncDataMaker.PTHREAD_MUTEX_DEFAULT;
+                               } else {
+                                       attrType = -1;
+                               }
+                               insertRowData.add(new Byte(attrType));
+                               insertRowData.add(new Byte(syncData.getSyncDataType()));
+                               insertRowData.add(new Integer(syncData.getParentID()));
+                               insertData.add(insertRowData);
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
+                       }
+               }
+               if (insertData.size() > 0) {
+                       dbInserter.pushData(insertData);
+               }
+       }
+
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(COLUMN.SYNCDATAID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.SYNCDATAID.index)));
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
+                               prep.setByte(COLUMN.SYNCTYPE.index + 1, (Byte) (rowData.get(COLUMN.SYNCTYPE.index)));
+                               prep.setLong(COLUMN.SYNCVALUE.index + 1,
+                                               (Long) (rowData.get(COLUMN.SYNCVALUE.index)));
+                               prep.setByte(COLUMN.ATTRIBUTETYPE.index + 1,
+                                               (Byte) (rowData.get(COLUMN.ATTRIBUTETYPE.index)));
+                               prep.setByte(COLUMN.SYNCDATATYPE.index + 1,
+                                               (Byte) (rowData.get(COLUMN.SYNCDATATYPE.index)));
+                               prep.setInt(COLUMN.PARENTID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.PARENTID.index)));
+
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               return isPrepared;
+       }
+
+       @Override
+       public List<Object> extractDataFromResultSet(ResultSet rs) {
+               List<Object> row = new ArrayList<Object>();
+               try {
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.SYNCDATAID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.SYNCTYPE.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.SYNCVALUE.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.ATTRIBUTETYPE.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.SYNCDATATYPE.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PARENTID.index + 1)));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+
+               return row;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/SyncEventDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/db/SyncEventDBTable.java
new file mode 100644 (file)
index 0000000..5a4bc2f
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.db;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.communicator.DACommunicator;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBInsertManager;
+import org.tizen.dynamicanalyzer.database.DBInserter;
+import org.tizen.dynamicanalyzer.database.DBTable;
+import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageSyncDataEvent;
+
+public class SyncEventDBTable extends DBTable {
+       public static final String TABLENAME = "SYNCEVENT";
+       private DBInserter dbInserter = null;
+
+       private static final String SELECT_COLUMN = COLUMN.API_SEQNUMBER.name + CommonConstants.COMMA
+                       + COLUMN.SYNCDATAID.name + CommonConstants.COMMA + COLUMN.EVENTTIME.name
+                       + CommonConstants.COMMA + COLUMN.APITYPE.name + CommonConstants.COMMA
+                       + COLUMN.TOOLTIP.name + CommonConstants.COMMA + COLUMN.ERRORNO.name
+                       + CommonConstants.COMMA + COLUMN.SYNCVALUE.name + CommonConstants.COMMA
+                       + COLUMN.RELEASETIME.name;
+
+       public static final String SELECT_QUERY = "select " + SELECT_COLUMN + 
+                       " from " + TABLENAME
+                       + " where ((" + COLUMN.APITYPE.name + " =  " + LogCenterConstants.SYNC_API_TYPE_NEW
+                       + " OR " + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_NOTIFY
+                       + " OR " + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_NOTIFY_ALL
+                       + " OR " + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_OTHER
+                       + " ) and " + COLUMN.EVENTTIME.name + " between %s and %s)" + 
+                       " OR " + " (("
+                       + COLUMN.APITYPE.name + " =  " + LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START + " OR "
+                       + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_END + " OR "
+                       + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_RELEASE + " OR "
+                       + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_TRY_ACQUIRE + " OR "
+                       + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START + " OR "
+                       + COLUMN.APITYPE.name + " = " + LogCenterConstants.SYNC_API_TYPE_COND_WAIT_END + ") AND ("
+                       + COLUMN.EVENTTIME.name + " >= %s AND " + COLUMN.EVENTTIME.name + " <= %s))";
+
+       public enum COLUMN {
+               API_SEQNUMBER(0, "APISEQNUMBER"), SYNCDATAID(1, "SyncDataID"), EVENTTIME(2, "EventTime"), APITYPE(
+                               3, "APIType"), TOOLTIP(4, "Tooltip"), ERRORNO(5, DBConstants.DBCOLUMN_ERROR_NUMBER), SYNCVALUE(
+                               6, "SyncValue"), RELEASETIME(7, "ReleaseTime");
+
+               public final int index;
+               public final String name;
+
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }
+
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+
+       public SyncEventDBTable() {
+               addColumn(new DBColumn(COLUMN.API_SEQNUMBER.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.SYNCDATAID.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.EVENTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.APITYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.TOOLTIP.name, DBConstants.EMPTY, DBConstants.VARCHAR,
+                               DALimit.TOOLTIP_LENGTH));
+               addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.RELEASETIME.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_LONG));
+               setIndexColumn(COLUMN.SYNCDATAID.index);
+
+               dbInserter = DBInsertManager.makeInserter(this);
+       }
+
+       public List<List<Object>> getSyncEventFromDB() {
+               return selectAllColumnData(null);
+       }
+
+       public List<List<Object>> getInsertDBData(ThreadPageSyncDataEvent syncEvent) {
+               List<List<Object>> insertData = new ArrayList<List<Object>>();
+               List<Object> insertRowData = new ArrayList<Object>();
+               try {
+                       insertRowData.add(new Long(syncEvent.getContents().getSeq()));
+                       insertRowData.add(new Integer(syncEvent.getSyncDataID()));
+                       insertRowData.add(new Long(syncEvent.getTime()));
+                       Integer apiType = new Integer(syncEvent.getApiType());
+                       insertRowData.add(new Byte(apiType.byteValue()));
+                       insertRowData.add(new String(syncEvent.getTooltipContent()));
+                       insertRowData.add(new Long(syncEvent.getErrorNum()));
+                       insertRowData.add(new Long(syncEvent.getSyncVal()));
+                       insertRowData.add(new Long(syncEvent.getBlockEndTime()));
+               } catch (ArrayIndexOutOfBoundsException e) {
+                       e.printStackTrace();
+               }
+               return insertData;
+       }
+
+       public void insertSyncEventData(List<ThreadPageSyncDataEvent> syncEventQueue) {
+               if (syncEventQueue.size() == 0) {
+                       return;
+               }
+               List<List<Object>> insertData = new ArrayList<List<Object>>();
+               for (ThreadPageSyncDataEvent syncEvent : syncEventQueue) {
+                       List<Object> insertRowData = new ArrayList<Object>();
+                       try {
+                               insertRowData.add(new Long(syncEvent.getContents().getSeq()));
+                               insertRowData.add(new Integer(syncEvent.getSyncDataID()));
+                               insertRowData.add(new Long(syncEvent.getTime()));
+                               Integer apiType = new Integer(syncEvent.getApiType());
+                               insertRowData.add(new Byte(apiType.byteValue()));
+                               insertRowData.add(new String(syncEvent.getTooltipContent()));
+                               insertRowData.add(new Long(syncEvent.getErrorNum()));
+                               insertRowData.add(new Long(syncEvent.getSyncVal()));
+                               insertRowData.add(new Long(syncEvent.getBlockEndTime()));
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
+                       }
+                       insertData.add(insertRowData);
+               }
+               if (DACommunicator.isRunning()) {
+                       dbInserter.pushData(insertData);
+               } else {
+                       insertData(insertData);
+               }
+       }
+
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setLong(COLUMN.API_SEQNUMBER.index + 1,
+                                               (Long) (rowData.get(COLUMN.API_SEQNUMBER.index)));
+                               prep.setInt(COLUMN.SYNCDATAID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.SYNCDATAID.index)));
+                               prep.setLong(COLUMN.EVENTTIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.EVENTTIME.index)));
+                               prep.setByte(COLUMN.APITYPE.index + 1, (Byte) (rowData.get(COLUMN.APITYPE.index)));
+                               String tooltipStr = clipString((String) (rowData.get(COLUMN.TOOLTIP.index)),
+                                               DALimit.TOOLTIP_LENGTH, rowData.get(COLUMN.EVENTTIME.index).toString());
+                               prep.setString(COLUMN.TOOLTIP.index + 1, tooltipStr);
+                               prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
+                               prep.setLong(COLUMN.SYNCVALUE.index + 1,
+                                               (Long) (rowData.get(COLUMN.SYNCVALUE.index)));
+                               prep.setLong(COLUMN.RELEASETIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.RELEASETIME.index)));
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+
+               return isPrepared;
+       }
+
+       @Override
+       public List<Object> extractDataFromResultSet(ResultSet rs) {
+               List<Object> row = new ArrayList<Object>();
+               try {
+                       row.add(Long.valueOf(rs.getLong(COLUMN.API_SEQNUMBER.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.SYNCDATAID.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.EVENTTIME.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.APITYPE.index + 1)));
+                       row.add(rs.getString(COLUMN.TOOLTIP.index + 1));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ERRORNO.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.SYNCVALUE.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.RELEASETIME.index + 1)));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+
+               return row;
+       }
+}
@@ -4,6 +4,7 @@
  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -24,7 +25,7 @@
  * 
  */
 
-package org.tizen.dynamicanalyzer.ui.thread.data;
+package org.tizen.dynamicanalyzer.ui.thread.db;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -33,104 +34,136 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.communicator.DACommunicator;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.database.DBColumn;
 import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBInsertManager;
+import org.tizen.dynamicanalyzer.database.DBInserter;
 import org.tizen.dynamicanalyzer.database.DBTable;
-import org.tizen.dynamicanalyzer.database.IResultSet;
+import org.tizen.dynamicanalyzer.swap.model.data.ThreadData;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadDataEvent;
+
+public class ThreadAPIDBTable extends DBTable {
+       public static final String TABLENAME = "THREADAPI";
+       private DBInserter dbInserter = null;
+       private static final String SELECT_COLUMN = COLUMN.SEQ.name + CommonConstants.COMMA
+                       + COLUMN.APICALLTIME.name + CommonConstants.COMMA + COLUMN.APIID.name
+                       + CommonConstants.COMMA + COLUMN.PID.name + CommonConstants.COMMA + COLUMN.TID.name
+                       + CommonConstants.COMMA + COLUMN.ARGUMENT.name + CommonConstants.COMMA
+                       + COLUMN.RETURN.name + CommonConstants.COMMA + COLUMN.ERRORNO.name;
+       public static final String SELECT_QUERY = "select " + SELECT_COLUMN + " from " + TABLENAME
+                       + "  where " + COLUMN.THREADDATAID.name + " = %s";
 
-public class ThreadAPIDBTable extends DBTable implements IResultSet {
-       public static final String TABLENAME="ThreadAPI";
-       
-       private static final String SELECT_COLUMN = 
-                       COLUMN.SEQ.name + CommonConstants.COMMA +
-                       COLUMN.APICALLTIME.name + CommonConstants.COMMA +
-                       COLUMN.APIID.name + CommonConstants.COMMA +
-                       COLUMN.PID.name + CommonConstants.COMMA +
-                       COLUMN.TID.name + CommonConstants.COMMA +
-                       COLUMN.ARGUMENT.name + CommonConstants.COMMA +
-                       COLUMN.RETURN.name + CommonConstants.COMMA +
-                       COLUMN.ERRORNO.name;
-       public static final String SELECT_QUERY = 
-                       "select " + SELECT_COLUMN + " from " + TABLENAME + 
-                       "  where " + COLUMN.THREADDATAID.name + " = %s";
-       
        public enum COLUMN {
-               SEQ(0, "SEQNUMBER"),
-               THREADDATAID(1, "ThreadDataID"),
-               APICALLTIME(2, "APICallTime"),
-               APIID(3, "APIID"),
-               PID(4, "PID"),
-               TID(5, "TID"),
-               ARGUMENT(6, DBConstants.DBCOLUMN_ARGUMENT),
-               RETURN(7, DBConstants.DBCOLUMN_RETURN_VALUE),
-               ERRORNO(8, DBConstants.DBCOLUMN_ERROR_NUMBER);
-               
+               SEQ(0, "SEQNUMBER"), THREADDATAID(1, "ThreadDataID"), APICALLTIME(2, "APICallTime"), APIID(
+                               3, "APIID"), PID(4, "PID"), TID(5, "TID"), ARGUMENT(6,
+                               DBConstants.DBCOLUMN_ARGUMENT), RETURN(7, DBConstants.DBCOLUMN_RETURN_VALUE), ERRORNO(
+                               8, DBConstants.DBCOLUMN_ERROR_NUMBER);
+
                public final int index;
                public final String name;
-               
+
                COLUMN(int index, String name) {
                        this.index = index;
                        this.name = name;
                }
        }
-       
+
        @Override
        public String getTableName() {
                return TABLENAME;
        }
-       
+
        public ThreadAPIDBTable() {
                addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.APICALLTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
-               addColumn(new DBColumn(COLUMN.APIID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));              
+               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.APICALLTIME.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.APIID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY,
-                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
-               addColumn(new DBColumn(COLUMN.RETURN.name, DBConstants.EMPTY,
-                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_RETURN_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY, DBConstants.DBTYPE_VARCHAR,
+                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.RETURN.name, DBConstants.EMPTY, DBConstants.DBTYPE_VARCHAR,
+                               DALimit.FUNCTION_RETURN_VALUE_LENGTH));
                addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
                setIndexColumn(COLUMN.THREADDATAID.index);
+               dbInserter = DBInsertManager.makeInserter(this);
        }
 
        public List<List<Object>> getThreadAPIFromDB() {
                return selectAllColumnData(null);
        }
-       
+
+       public void insertThreadAPIData(List<ThreadPageThreadDataEvent> insertThreadEventList) {
+               ArrayList<List<Object>> apiData = new ArrayList<List<Object>>();
+               for (ThreadPageThreadDataEvent threadEvent : insertThreadEventList) {
+                       if (threadEvent.getEventType() != ThreadPageThreadDataEvent.TYPE_API) {
+                               continue;
+                       }
+                       List<Object> apiRowData = new ArrayList<Object>();
+                       ThreadData tData = (ThreadData) threadEvent.getContents();
+                       try {
+                               apiRowData.add(new Long(tData.getSeq()));
+                               apiRowData.add(new Integer(threadEvent.getThreadDataID()));
+                               apiRowData.add(new Long(tData.getTime()));
+                               apiRowData.add(new Integer(tData.getApiId()));
+                               apiRowData.add(new Integer(tData.getPid()));
+                               apiRowData.add(new Integer(tData.getTid()));
+                               apiRowData.add(new String(tData.getArgs()));
+                               apiRowData.add(new String(tData.getReturn()));
+                               apiRowData.add(new Long(tData.getErrno()));
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
+                       }
+                       apiData.add(apiRowData);
+               }
+               if (apiData.size() == 0) {
+                       return;
+               }
+               if (DACommunicator.isRunning()) {
+                       dbInserter.pushData(apiData);
+               } else {
+                       insertData(apiData);
+               }
+       }
+
        @Override
        public boolean prepare(PreparedStatement prep, List<Object> rowData) {
                boolean isPrepared = true;
-               
                int columnsize = getColumnSize();
                if (columnsize != rowData.size()) {
                        isPrepared = false;
                } else {
                        try {
                                prep.setLong(COLUMN.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
-                               prep.setInt(COLUMN.THREADDATAID.index + 1, (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
-                               prep.setLong(COLUMN.APICALLTIME.index + 1, (Long) (rowData.get(COLUMN.APICALLTIME.index)));
+                               prep.setInt(COLUMN.THREADDATAID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
+                               prep.setLong(COLUMN.APICALLTIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.APICALLTIME.index)));
                                prep.setInt(COLUMN.APIID.index + 1, (Integer) (rowData.get(COLUMN.APIID.index)));
                                prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
                                prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
                                String argumentStr = clipString((String) (rowData.get(COLUMN.ARGUMENT.index)),
-                                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index)
+                                                               .toString());
                                prep.setString(COLUMN.ARGUMENT.index + 1, argumentStr);
                                String retStr = clipString((String) (rowData.get(COLUMN.RETURN.index)),
-                                               DALimit.FUNCTION_RETURN_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                                               DALimit.FUNCTION_RETURN_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index)
+                                                               .toString());
                                prep.setString(COLUMN.RETURN.index + 1, retStr);
                                prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
-                               
+
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
                        }
                }
-               
                return isPrepared;
        }
-       
+
        @Override
        public List<Object> extractDataFromResultSet(ResultSet rs) {
                List<Object> row = new ArrayList<Object>();
@@ -148,7 +181,7 @@ public class ThreadAPIDBTable extends DBTable implements IResultSet {
                        e.printStackTrace();
                        return null;
                }
-               
+
                return row;
        }
 }
@@ -4,6 +4,7 @@
  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -24,7 +25,7 @@
  * 
  */
 
-package org.tizen.dynamicanalyzer.ui.thread.data;
+package org.tizen.dynamicanalyzer.ui.thread.db;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -36,84 +37,128 @@ import org.tizen.dynamicanalyzer.common.DALimit;
 import org.tizen.dynamicanalyzer.database.DBColumn;
 import org.tizen.dynamicanalyzer.database.DBConstants;
 import org.tizen.dynamicanalyzer.database.DBTable;
-import org.tizen.dynamicanalyzer.database.IResultSet;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadThreadDataMaker;
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadData;
+
+public class ThreadDataDBTable extends DBTable {
+       public static final String TABLENAME = "THREADDATA";
 
-public class ThreadDataDBTable extends DBTable implements IResultSet {
-       public static final String TABLENAME="ThreadData";
-       
        public enum COLUMN {
-               THREADDATAID(0, "ThreadDataID"),
-               PID(1, "PID"),
-               TID(2, "TID"),
-               THREADTYPE(3, "ThreadType"),
-               ATTRIBUTETYPE(4, "AttributeType"),
-               STARTTIME(5, "StartTime"),
-               ENDTIME(6, "EndTime"),
-               FUNCTIONID(7, "FunctionId"),
-               CLASSNAME(8, "ClassName");
-               
+               THREADDATAID(0, "ThreadDataID"), PID(1, "PID"), TID(2, "TID"), THREADTYPE(3, "ThreadType"), ATTRIBUTETYPE(
+                               4, "AttributeType"), STARTTIME(5, "StartTime"), ENDTIME(6, "EndTime"), FUNCTIONID(
+                               7, "FunctionId"), CLASSNAME(8, "ClassName");
+
                public final int index;
                public final String name;
-               
+
                COLUMN(int index, String name) {
                        this.index = index;
                        this.name = name;
                }
        }
-       
+
        @Override
        public String getTableName() {
                return TABLENAME;
        }
-       
+
        public ThreadDataDBTable() {
-               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.PRIMARY_KEY,
+                               DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.THREADTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
-               addColumn(new DBColumn(COLUMN.ATTRIBUTETYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
-               addColumn(new DBColumn(COLUMN.STARTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));          
+               addColumn(new DBColumn(COLUMN.THREADTYPE.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.ATTRIBUTETYPE.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.STARTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
                addColumn(new DBColumn(COLUMN.ENDTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
                addColumn(new DBColumn(COLUMN.FUNCTIONID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.CLASSNAME.name, DBConstants.EMPTY, 
-                               DBConstants.VARCHAR, DALimit.CLASS_NAME_LENGTH));               
+               addColumn(new DBColumn(COLUMN.CLASSNAME.name, DBConstants.EMPTY, DBConstants.VARCHAR,
+                               DALimit.CLASS_NAME_LENGTH));
        }
 
        public List<List<Object>> getThreadDataFromDB() {
                return selectAllColumnData(null);
        }
-       
+
+       public void inserthreadPageThreadData(List<ThreadPageThreadData> remainedThreadData) {
+               List<List<Object>> insertData = new ArrayList<List<Object>>();
+               for (ThreadPageThreadData threadPageData : remainedThreadData) {
+                       if (threadPageData instanceof ThreadPageThreadData == false) {
+                               continue;
+                       }
+                       List<Object> insertRowData = new ArrayList<Object>();
+                       ThreadPageThreadData threadData = (ThreadPageThreadData) threadPageData;
+                       try {
+                               insertRowData.add(new Integer(threadData.getThreadDataID()));
+                               insertRowData.add(new Integer(threadData.getPid()));
+                               insertRowData.add(new Integer(threadData.getTid()));
+                               Integer type = new Integer(threadData.getType());
+                               byte threadType = type.byteValue();
+                               insertRowData.add(new Byte(threadType));
+                               String attrTypeStr = threadData.getAttrType();
+                               byte attrType = -1;
+                               if (attrTypeStr.equals(ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE)) {
+                                       attrType = ThreadThreadDataMaker.PTHREAD_CREATE_JOINABLE;
+                               } else if (attrTypeStr.equals(ThreadPageLabels.THREAD_ATTR_TYPE_DETACHED)) {
+                                       attrType = ThreadThreadDataMaker.PTHREAD_CREATE_DETACHED;
+                               } else { // main thread has no attribute
+                                       attrType = -1;
+                               }
+                               insertRowData.add(new Byte(attrType));
+                               insertRowData.add(new Long(threadData.getStartTime()));
+                               insertRowData.add(new Long(threadData.getEndTime()));
+                               insertRowData.add(new Integer(threadData.getThreadFuncID()));
+                               insertRowData.add(new String(threadData.getThreadClassName()));
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
+                       }
+                       insertData.add(insertRowData);
+               }
+               if (insertData.size() > 0) {
+                       insertData(insertData);
+               }
+       }
+
        @Override
        public boolean prepare(PreparedStatement prep, List<Object> rowData) {
                boolean isPrepared = true;
-               
+
                int columnsize = getColumnSize();
                if (columnsize != rowData.size()) {
                        isPrepared = false;
                } else {
                        try {
-                               prep.setInt(COLUMN.THREADDATAID.index + 1, (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
+                               prep.setInt(COLUMN.THREADDATAID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
                                prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
-                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));                           
-                               prep.setByte(COLUMN.THREADTYPE.index + 1, (Byte) (rowData.get(COLUMN.THREADTYPE.index)));
-                               prep.setByte(COLUMN.ATTRIBUTETYPE.index + 1, (Byte) (rowData.get(COLUMN.ATTRIBUTETYPE.index)));
-                               prep.setLong(COLUMN.STARTTIME.index + 1, (Long) (rowData.get(COLUMN.STARTTIME.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
+                               prep.setByte(COLUMN.THREADTYPE.index + 1,
+                                               (Byte) (rowData.get(COLUMN.THREADTYPE.index)));
+                               prep.setByte(COLUMN.ATTRIBUTETYPE.index + 1,
+                                               (Byte) (rowData.get(COLUMN.ATTRIBUTETYPE.index)));
+                               prep.setLong(COLUMN.STARTTIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.STARTTIME.index)));
                                prep.setLong(COLUMN.ENDTIME.index + 1, (Long) (rowData.get(COLUMN.ENDTIME.index)));
-                               prep.setInt(COLUMN.FUNCTIONID.index + 1, (Integer) (rowData.get(COLUMN.FUNCTIONID.index)));
+                               prep.setInt(COLUMN.FUNCTIONID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.FUNCTIONID.index)));
 
                                String classNameStr = clipString((String) (rowData.get(COLUMN.CLASSNAME.index)),
-                                               DALimit.CLASS_NAME_LENGTH, rowData.get(COLUMN.THREADDATAID.index).toString());
-                               prep.setString(COLUMN.CLASSNAME.index + 1, classNameStr);                               
-                               
+                                               DALimit.CLASS_NAME_LENGTH, rowData.get(COLUMN.THREADDATAID.index)
+                                                               .toString());
+                               prep.setString(COLUMN.CLASSNAME.index + 1, classNameStr);
+
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
                        }
                }
-               
+
                return isPrepared;
        }
-       
+
        @Override
        public List<Object> extractDataFromResultSet(ResultSet rs) {
                List<Object> row = new ArrayList<Object>();
@@ -122,7 +167,7 @@ public class ThreadDataDBTable extends DBTable implements IResultSet {
                        row.add(Integer.valueOf(rs.getInt(COLUMN.PID.index + 1)));
                        row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
                        row.add(Byte.valueOf(rs.getByte(COLUMN.THREADTYPE.index + 1)));
-                       row.add(Byte.valueOf(rs.getByte(COLUMN.ATTRIBUTETYPE.index + 1)));      
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.ATTRIBUTETYPE.index + 1)));
                        row.add(Long.valueOf(rs.getLong(COLUMN.STARTTIME.index + 1)));
                        row.add(Long.valueOf(rs.getLong(COLUMN.ENDTIME.index + 1)));
                        row.add(Integer.valueOf(rs.getInt(COLUMN.FUNCTIONID.index + 1)));
@@ -131,7 +176,7 @@ public class ThreadDataDBTable extends DBTable implements IResultSet {
                        e.printStackTrace();
                        return null;
                }
-               
+
                return row;
        }
 }
@@ -4,6 +4,7 @@
  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -24,7 +25,7 @@
  * 
  */
 
-package org.tizen.dynamicanalyzer.ui.thread.data;
+package org.tizen.dynamicanalyzer.ui.thread.db;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -33,100 +34,132 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.communicator.DACommunicator;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.database.DBColumn;
 import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBInsertManager;
+import org.tizen.dynamicanalyzer.database.DBInserter;
 import org.tizen.dynamicanalyzer.database.DBTable;
-import org.tizen.dynamicanalyzer.database.IResultSet;
-
-public class ThreadEventDBTable extends DBTable implements IResultSet {
-       public static final String TABLENAME="ThreadEvent";
-       
-       private static final String SELECT_COLUMN = 
-                       COLUMN.EVENTTIME.name + CommonConstants.COMMA +
-                       COLUMN.TID.name + CommonConstants.COMMA +
-                       COLUMN.APITYPE.name + CommonConstants.COMMA +
-                       COLUMN.TOOLTIP.name + CommonConstants.COMMA +
-                       COLUMN.ERRORNO.name + CommonConstants.COMMA +
-                       COLUMN.EVENTTYPE.name + CommonConstants.COMMA +
-                       COLUMN.THREADTYPE.name + CommonConstants.COMMA +
-                       COLUMN.CALLERID.name;
-       public static final String SELECT_QUERY = 
-                       "select " + SELECT_COLUMN + " from " + TABLENAME + 
-                       "  where " + COLUMN.THREADDATAID.name + " = %s ";
-       
+import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageThreadDataEvent;
+
+public class ThreadEventDBTable extends DBTable {
+       public static final String TABLENAME = "THREADEVENT";
+       private DBInserter dbInserter = null;
+
+       private static final String SELECT_COLUMN = COLUMN.THREADDATAID.name + CommonConstants.COMMA
+                       + COLUMN.EVENTTIME.name + CommonConstants.COMMA + COLUMN.TID.name
+                       + CommonConstants.COMMA + COLUMN.APITYPE.name + CommonConstants.COMMA
+                       + COLUMN.TOOLTIP.name + CommonConstants.COMMA + COLUMN.ERRORNO.name
+                       + CommonConstants.COMMA + COLUMN.EVENTTYPE.name + CommonConstants.COMMA
+                       + COLUMN.THREADTYPE.name + CommonConstants.COMMA + COLUMN.CALLERID.name;
+
+       public static final String SELECT_QUERY = "select " + SELECT_COLUMN + " from " + TABLENAME
+                       + "  where " + COLUMN.EVENTTIME.name + " BETWEEN %s and %s";
+
        public enum COLUMN {
-               THREADDATAID(0, "ThreadDataID"),
-               EVENTTIME(1, "EventTime"),
-               TID(2, "TID"),
-               APITYPE(3, "APIType"),
-               TOOLTIP(4, "Tooltip"),
-               ERRORNO(5, DBConstants.DBCOLUMN_ERROR_NUMBER),
-               EVENTTYPE(6, "EventType"),
-               THREADTYPE(7, "ThreadType"),
-               CALLERID(8, "CallerID");
-               
+               THREADDATAID(0, "ThreadDataID"), EVENTTIME(1, "EventTime"), TID(2, "TID"), APITYPE(3,
+                               "APIType"), TOOLTIP(4, "Tooltip"), ERRORNO(5, DBConstants.DBCOLUMN_ERROR_NUMBER), EVENTTYPE(
+                               6, "EventType"), THREADTYPE(7, "ThreadType"), CALLERID(8, "CallerID");
+
                public final int index;
                public final String name;
-               
+
                COLUMN(int index, String name) {
                        this.index = index;
                        this.name = name;
                }
        }
-       
+
        @Override
        public String getTableName() {
                return TABLENAME;
        }
-       
+
        public ThreadEventDBTable() {
-               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.EVENTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
                addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.APITYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
-               addColumn(new DBColumn(COLUMN.TOOLTIP.name, DBConstants.EMPTY, 
-                               DBConstants.VARCHAR, DALimit.TOOLTIP_LENGTH));          
+               addColumn(new DBColumn(COLUMN.TOOLTIP.name, DBConstants.EMPTY, DBConstants.VARCHAR,
+                               DALimit.TOOLTIP_LENGTH));
                addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
                addColumn(new DBColumn(COLUMN.EVENTTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
-               addColumn(new DBColumn(COLUMN.THREADTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.CALLERID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));              
+               addColumn(new DBColumn(COLUMN.THREADTYPE.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.CALLERID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
                setIndexColumn(COLUMN.THREADDATAID.index);
+               dbInserter = DBInsertManager.makeInserter(this);
        }
 
        public List<List<Object>> getThreadEventFromDB() {
                return selectAllColumnData(null);
        }
-       
+
+       public void insertThreadEventData(List<ThreadPageThreadDataEvent> insertThreadEventList) {
+               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();
+               for (ThreadPageThreadDataEvent threadEvent : insertThreadEventList) {
+                       List<Object> insertRowData = new ArrayList<Object>();
+                       try {
+                               insertRowData.add(new Integer(threadEvent.getThreadDataID()));
+                               insertRowData.add(new Long(threadEvent.getTime()));
+                               insertRowData.add(new Integer(threadEvent.getTid()));
+                               Integer apiType = new Integer(threadEvent.getApiType());
+                               insertRowData.add(new Byte(apiType.byteValue()));
+                               insertRowData.add(new String(threadEvent.getTooltipContent()));
+                               insertRowData.add(new Long(threadEvent.getErrorNum()));
+                               Integer eventType = new Integer(threadEvent.getEventType());
+                               insertRowData.add(new Byte(eventType.byteValue()));
+                               insertRowData.add(new Integer(threadEvent.getThreadType()));
+                               insertRowData.add(new Integer(threadEvent.getCallerTid()));
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
+                       }
+                       insertData.add(insertRowData);
+               }
+               if (insertData.size() == 0) {
+                       return;
+               }
+               if (DACommunicator.isRunning()) {
+                       dbInserter.pushData(insertData);
+               } else {
+                       insertData(insertData);
+               }
+       }
+
        @Override
        public boolean prepare(PreparedStatement prep, List<Object> rowData) {
                boolean isPrepared = true;
-               
                int columnsize = getColumnSize();
                if (columnsize != rowData.size()) {
                        isPrepared = false;
                } else {
                        try {
-                               prep.setInt(COLUMN.THREADDATAID.index + 1, (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
-                               prep.setLong(COLUMN.EVENTTIME.index + 1, (Long) (rowData.get(COLUMN.EVENTTIME.index)));                         
+                               prep.setInt(COLUMN.THREADDATAID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
+                               prep.setLong(COLUMN.EVENTTIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.EVENTTIME.index)));
                                prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
                                prep.setByte(COLUMN.APITYPE.index + 1, (Byte) (rowData.get(COLUMN.APITYPE.index)));
                                String tooltipStr = clipString((String) (rowData.get(COLUMN.TOOLTIP.index)),
                                                DALimit.TOOLTIP_LENGTH, rowData.get(COLUMN.EVENTTIME.index).toString());
-                               prep.setString(COLUMN.TOOLTIP.index + 1, tooltipStr);                                                           
+                               prep.setString(COLUMN.TOOLTIP.index + 1, tooltipStr);
                                prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
-                               prep.setByte(COLUMN.EVENTTYPE.index + 1, (Byte) (rowData.get(COLUMN.EVENTTYPE.index)));
-                               prep.setInt(COLUMN.THREADTYPE.index + 1, (Integer) (rowData.get(COLUMN.THREADTYPE.index)));
-                               prep.setInt(COLUMN.CALLERID.index + 1, (Integer) (rowData.get(COLUMN.CALLERID.index)));                         
+                               prep.setByte(COLUMN.EVENTTYPE.index + 1,
+                                               (Byte) (rowData.get(COLUMN.EVENTTYPE.index)));
+                               prep.setInt(COLUMN.THREADTYPE.index + 1,
+                                               (Integer) (rowData.get(COLUMN.THREADTYPE.index)));
+                               prep.setInt(COLUMN.CALLERID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.CALLERID.index)));
                        } catch (SQLException e) {
                                e.printStackTrace();
                                isPrepared = false;
                        }
                }
-               
                return isPrepared;
        }
-       
+
        public List<Object> extractDataFromResultSet(ResultSet rs) {
                List<Object> row = new ArrayList<Object>();
                try {
@@ -143,7 +176,7 @@ public class ThreadEventDBTable extends DBTable implements IResultSet {
                        e.printStackTrace();
                        return null;
                }
-               
+
                return row;
        }
 }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncData.java
deleted file mode 100644 (file)
index 9a4599e..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * yeongtaik byeon <yeongtaik.byeon@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.sync;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
-import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
-import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageDataEvent;
-import org.tizen.dynamicanalyzer.util.Logger;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
-
-public class ThreadPageSyncData extends ThreadPageData {
-       private List<ThreadPageSyncData> children = new ArrayList<ThreadPageSyncData>();
-       private DAChartSeries apiSeries;
-       private DAChartSeries stateSeries;
-       
-       public static final byte SYNC_PARENT = 0;
-       public static final byte SYNC_CHILD = 1;
-       public static final byte THREAD_CHILD = 2;
-       
-       private static int internalSeq = 0;
-       private int syncDataID = -1;
-       private byte syncDataType = -1;
-       private int parentID = -1;
-
-       public ThreadPageSyncData(int type, String name, String pid, String tid,
-                       String attrType, byte syncDataType) {
-               super(type, name, pid, tid, attrType);
-               this.syncDataType = syncDataType;
-               syncDataID = internalSeq++;
-       }
-       
-       // using open trace
-       public ThreadPageSyncData(int id, int pid, int tid, int type, long syncValue, 
-                       String attrType, byte syncDataType, int parentID) {
-               super(type, String.valueOf(syncValue), String.valueOf(pid), String.valueOf(tid), attrType);
-               this.syncDataID = id;
-               this.syncDataType = syncDataType;
-               this.parentID = parentID;
-       }
-
-       protected void pushSync(ThreadPageSyncData sync) {
-               children.add(sync);
-               hasUpdate = true;
-       }
-
-       protected ThreadPageSyncData findChildData(String tId) {
-               int size = children.size();
-               ThreadPageSyncData ret;
-               for (int i = 0; i < size; i++) {
-                       ret = children.get(i);
-                       if (ret.getTid().equals(tId)) {
-                               return ret;
-                       }
-               }
-               return null;
-       }
-
-       public List<ThreadPageSyncData> getChildren() {
-               return children;
-       }
-
-       public void setItem(DAChartBoardItem item) {
-               this.item = item;
-               setChart(item.getChart());
-               stateSeries = chart
-                               .getSeries(ThreadPageLabels.THREAD_SYNC_CHART_SERIES_STATE);
-               apiSeries = chart.getSeries(ThreadPageLabels.THREAD_CHART_SERIES_API);
-       }
-
-       public static boolean isSyncApi(int apiType) {
-               if (apiType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START) {
-                       return false;
-               }
-               if (apiType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START) {
-                       return false;
-               }
-               return true;
-       }
-
-       public void checkUpdate() {
-               if (false == hasUpdate) {
-                       return;
-               } else {
-                       hasUpdate = false;
-               }
-               int size = contentsQueue.size();
-               if (size > 0) {
-                       ThreadPageDataEvent event;
-                       for (int i = 0; i < size; i++) {
-                               event = contentsQueue.get(0);
-                               if (true == (isSyncApi(createChartItem(event)))) {
-                                       contents.add(event);
-                               }
-
-                               contentsQueue.remove(0);
-                       }
-                       chart.redraw();
-               }
-
-               size = children.size();
-               if (size > 0) {
-                       ThreadPageSyncData sync;
-                       for (int i = 0; i < size; i++) {
-                               sync = children.get(i);
-                               sync.checkUpdate();
-                       }
-               }
-       }
-
-       protected int createChartItem(ThreadPageDataEvent event) {
-               DAChartSeriesItem stateItem = null;
-               DAChartSeriesItem apiItem = null;
-               if (!(event instanceof ThreadPageSyncDataEvent)) {
-                       Logger.error("createChartItem");
-                       return -1;
-               }
-               ThreadPageSyncDataEvent syncEvent = (ThreadPageSyncDataEvent) event;
-
-               int apiType = syncEvent.getApiType();
-               long errorNum = syncEvent.getErrorNum();
-               switch (apiType) {
-               case LogCenterConstants.SYNC_API_TYPE_NEW:
-               case LogCenterConstants.SYNC_API_TYPE_NOTIFY:
-               case LogCenterConstants.SYNC_API_TYPE_NOTIFY_ALL:
-               case LogCenterConstants.SYNC_API_TYPE_OTHER:
-                       if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
-                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
-                                               "");
-                       } else {
-                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                       DAChartSeriesItem.SERIES_STATE_CONNECTION,
-                                       ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
-                                       ThreadPageLabels.SYNC_CHART_ITEM_UNUSED);
-                       }
-                       apiItem = createApiItem(syncEvent, errorNum);
-                       stateSeries.addSeriesItem(stateItem);
-                       apiSeries.addSeriesItem(apiItem);
-                       break;
-               case LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START:
-               case LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START:
-                       if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
-                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
-                                               "");
-                       } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                       DAChartSeriesItem.SERIES_STATE_CONTINUE,
-                                       ColorResources.THREAD_GRAPH_LOCK_WAIT_COLOR,
-                                       ThreadPageLabels.SYNC_CHART_ITEM_WAITED);
-                       }
-                       apiItem = createApiItem(syncEvent, errorNum);
-                       stateSeries.addSeriesItem(stateItem);
-                       apiSeries.addSeriesItem(apiItem);
-                       break;
-               case LogCenterConstants.SYNC_API_TYPE_RELEASE:
-                       if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
-                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
-                                               "");
-                       } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                       DAChartSeriesItem.SERIES_STATE_CONNECTION,
-                                       ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
-                                       ThreadPageLabels.SYNC_CHART_ITEM_UNUSED);
-                       }
-                       apiItem = createApiItem(syncEvent, errorNum);
-                       stateSeries.addSeriesItem(stateItem);
-                       apiSeries.addSeriesItem(apiItem);
-                       break;
-               case LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_END:
-               case LogCenterConstants.SYNC_API_TYPE_COND_WAIT_END:
-                       if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
-                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
-                                               "");
-                       } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                       DAChartSeriesItem.SERIES_STATE_CONTINUE,
-                                       ColorResources.THREAD_GRAPH_LOCK_ACQUIRE_COLOR,
-                                       ThreadPageLabels.SYNC_CHART_ITEM_USED);
-                       }
-                       stateSeries.addSeriesItem(stateItem);
-                       break;
-               case LogCenterConstants.SYNC_API_TYPE_TRY_ACQUIRE:
-                       if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                               DAChartSeriesItem.SERIES_STATE_CONNECTION,
-                                               ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
-                                               "");
-                       } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
-                                       DAChartSeriesItem.SERIES_STATE_CONTINUE,
-                                       ColorResources.THREAD_GRAPH_LOCK_ACQUIRE_COLOR,
-                                       ThreadPageLabels.SYNC_CHART_ITEM_USED);
-                       }
-                       apiItem = createApiItem(syncEvent, errorNum);
-                       stateSeries.addSeriesItem(stateItem);
-                       apiSeries.addSeriesItem(apiItem);
-                       break;
-               default:
-                       return -1;
-               }
-
-               return apiType;
-       }
-       
-       public String getTypeString() {
-               switch (getType()) {
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MUTEX;
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MONITOR;
-               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_SEMAPHORE;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_MUTEX;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_COND_VARIABLE;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_RWLOCK;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_SPINLOCK;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_BARRIER;
-               default:
-                       Logger.error("unknown sync type!!");
-                       return CommonConstants.EMPTY;
-               }
-       }
-       
-       public int getSyncDataID() {
-               return syncDataID;
-       }
-       
-       public byte getSyncDataType() {
-               return syncDataType;
-       }
-       
-       public int getParentID() {
-               return parentID;
-       }
-       
-       public void setParentID(int parentID) {
-               this.parentID = parentID;
-       }
-       
-       public static void clear() {
-               internalSeq = 0;
-       }
-}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java
deleted file mode 100644 (file)
index 03d3a36..0000000
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * yeongtaik byeon <yeongtaik.byeon@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.sync;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Comparator;
-
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
-import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
-import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
-import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.resources.FontResources;
-import org.tizen.dynamicanalyzer.resources.ImageResources;
-import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
-import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
-import org.tizen.dynamicanalyzer.swap.logparser.Logs;
-import org.tizen.dynamicanalyzer.swap.model.data.LogData;
-import org.tizen.dynamicanalyzer.swap.model.data.SyncData;
-import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupClearMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupEndMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
-import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncDataInserter;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncEventInserter;
-import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
-import org.tizen.dynamicanalyzer.util.Logger;
-import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot.AutoRangeType;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
-
-public class ThreadPageSyncDataManager {
-       private DAChartBoard board;
-       private List<ThreadPageSyncData> rows = new ArrayList<ThreadPageSyncData>();
-       private List<ThreadPageSyncData> rowsQueue = new ArrayList<ThreadPageSyncData>();
-       private List<ThreadPageSyncDataEvent> syncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
-       private HashMap<String, Integer> syncAttrMap = new HashMap<String, Integer>();
-       public static final int PTHREAD_MUTEX_NORMAL = 0;
-       public static final int PTHREAD_MUTEX_RECURSIVE = 1;
-       public static final int PTHREAD_MUTEX_ERRORCHECK = 2;
-       public static final int PTHREAD_MUTEX_DEFAULT = 3;
-       private int preSelectionPid = -1;
-
-       public ThreadPageSyncDataManager(DAChartBoard board) {
-               this.setBoard(board);
-       }
-
-       protected DAChartBoard getBoard() {
-               return board;
-       }
-
-       public void setBoard(DAChartBoard board) {
-               this.board = board;
-       }
-
-       public void pushRow(ThreadPageSyncData data) {
-               rowsQueue.add(data);
-       }
-       
-       private void pushEvent(ThreadPageSyncDataEvent event) {
-               syncEventQueue.add(event);
-       }
-
-       private ThreadPageSyncData findParentData(String name) {
-               int size = rows.size();
-               ThreadPageSyncData ret;
-               for (int i = 0; i < size; i++) {
-                       ret = rows.get(i);
-                       if (ret.getKey().equals(name)) {
-                               return ret;
-                       }
-               }
-               return null;
-       }
-
-       public static String getAttrTypeByTypeInt(int typeInt) {
-               if (typeInt == PTHREAD_MUTEX_NORMAL) {
-                       return ThreadPageLabels.SYNC_ATTR_TYPE_NORMAL;
-               } else if (typeInt == PTHREAD_MUTEX_RECURSIVE) {
-                       return ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE;
-               } else if (typeInt == PTHREAD_MUTEX_ERRORCHECK) {
-                       return ThreadPageLabels.SYNC_ATTR_TYPE_ERRORCHECK;
-               } else if (typeInt == PTHREAD_MUTEX_DEFAULT) { // for open trace
-                       return ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT;         
-               } else {
-                       return CommonConstants.EMPTY;
-               }
-       }
-
-       public static String getAttrTypeString(ThreadPageSyncDataEvent event) {
-               int type = event.getType();
-
-               if (type == LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX) {
-                       return ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE;
-               } else if (type == LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX) {
-                       return ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT;
-               }
-               return CommonConstants.EMPTY;
-       }
-
-       public void parseSync(LogData input) {
-
-               if (null == input || !(input instanceof SyncData)) {
-                       return;
-               }
-               SyncData syncData = (SyncData) input;
-               // System.out.println("input : " + input);
-               long time = syncData.getTime();
-               String tid = Integer.toString(syncData.getTid());
-
-               int type = syncData.getSyncType();
-               int apiType = syncData.getApiType();
-               String apiName = syncData.getApiName();
-
-               String name = Long.toString(syncData.getSyncValue());
-
-               long errorNum = syncData.getErrno();
-               if (errorNum != 0) {
-                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(syncData);
-               }
-
-               ThreadPageSyncDataEvent event;
-               switch (type) {
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
-               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
-                       event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid,
-                                       apiName, errorNum, input);
-                       pushEvent(event);
-                       // parseTIZENSync(input, type);
-                       break;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
-                       if (apiName
-                                       .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                               syncAttrMap.put(syncData.getArgs(), PTHREAD_MUTEX_NORMAL);
-                       } else if (apiName
-                                       .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
-                               checkMutexAttrType(syncData.getArgs());
-                       } else {
-                               if (apiName
-                                               .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEX_INIT)) {
-                                       checkMutexType(syncData.getArgs());
-                               }
-                               event = new ThreadPageSyncDataEvent(name, type, apiType, time,
-                                               tid, apiName, errorNum, input);
-                               pushEvent(event);
-                       }
-                       break;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
-                       event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid,
-                                       apiName, errorNum, input);
-                       pushEvent(event);
-                       Logger.error("sync parse - type = " + type);
-                       break;
-               default:
-                       Logger.error("sync parse unknown - type = " + type);
-
-               }
-       }
-
-       private void parseSyncs(List<LogData> inputs) {
-               if (null == inputs || inputs.isEmpty()) {
-                       return;
-               }
-
-               int size = inputs.size();
-               SyncData input;
-
-               for (int i = 0; i < size; i++) {
-                       input = (SyncData) inputs.get(i);
-                       // System.out.println("input : " + input);
-                       long time = input.getTime();
-                       String tid = Integer.toString(input.getTid());
-
-                       int type = input.getSyncType();
-                       int apiType = input.getApiType();
-                       String apiName = input.getApiName();
-
-                       String name = Long.toString(input.getSyncValue());
-
-                       long errorNum = input.getErrno();
-
-                       ThreadPageSyncDataEvent event;
-                       switch (type) {
-                       case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
-                       case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
-                       case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
-                               event = new ThreadPageSyncDataEvent(name, type, apiType, time,
-                                               tid, apiName, errorNum, input);
-                               pushEvent(event);
-                               // parseTIZENSync(input, type);
-                               break;
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
-                               if (apiName
-                                               .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                                       syncAttrMap.put(input.getArgs(), PTHREAD_MUTEX_NORMAL);
-                               } else if (apiName
-                                               .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
-                                       checkMutexAttrType(input.getArgs());
-                               } else {
-                                       if (apiName
-                                                       .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEX_INIT)) {
-                                               checkMutexType(input.getArgs());
-                                       }
-                                       event = new ThreadPageSyncDataEvent(name, type, apiType,
-                                                       time, tid, apiName, errorNum, input);
-                                       pushEvent(event);
-                               }
-                               break;
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
-                               event = new ThreadPageSyncDataEvent(name, type, apiType, time,
-                                               tid, apiName, errorNum, input);
-                               pushEvent(event);
-                               Logger.error("sync parse - type = " + type);
-                               break;
-                       default:
-                               Logger.error("sync parse unknown - type = "
-                                               + type);
-                       }
-               }
-       }
-
-       private void checkMutexAttrType(String input) {
-               String[] temp = input.split(",");
-               if (temp.length != 2) {
-                       return;
-               }
-               String obj = temp[0];
-               String type = temp[1].trim();
-
-               if (null != syncAttrMap.get(obj)) {
-                       syncAttrMap.put(obj, Integer.valueOf(type));
-               }
-       }
-
-       private void checkMutexType(String input) {
-               String[] temp = input.split(",");
-               if (temp.length != 2) {
-                       return;
-               }
-               String obj = temp[0];
-               String attrObj = temp[1].trim();
-
-               Integer attrType = syncAttrMap.get(attrObj);
-               if (attrType != null) {
-                       syncAttrMap.put(obj, attrType);
-               }
-       }
-
-       public List<LogData> getLogsFromLogPackage(LogPackage logPack,
-                       int logCenterConstants) {
-               Logs logs = logPack.getLogs(logCenterConstants);
-               if (null == logs || null == logs.getRawLogs() || logs.getRawLogs().isEmpty()) {
-                       return null;
-               }
-               List<LogData> ret = logs.getRawLogs();
-               return ret;
-       }
-
-       public void parsePageData(LogPackage logPack) {
-               List<LogData> inputs = getLogsFromLogPackage(logPack,
-                               DataChannelConstants.MSG_PROBE_SYNC);
-               parseSyncs(inputs);
-       }
-
-       private void initSyncChart(DAChart chart, boolean isParent) {
-               if (null == chart) {
-                       return;
-               }
-
-               DAChartSeries apiSeries = new DAChartSeries(
-                               ThreadPageLabels.THREAD_CHART_SERIES_API,
-                               DAChartSeries.SERIES_STYLE_EVENT, ColorResources.YELLOW);
-
-               DAChartSeries stateSeries = new DAChartSeries(
-                               ThreadPageLabels.THREAD_SYNC_CHART_SERIES_STATE,
-                               DAChartSeries.SERIES_STYLE_STATE, ColorResources.WHITE,
-                               isParent);
-
-               apiSeries.setSummarizeTooltipText(ThreadPageLabels.THREAD_TOOLTIP_APIS);
-
-               chart.addSeries(stateSeries);
-               chart.addSeries(apiSeries);
-
-               DAChartPlot plot = chart.getPlot();
-               if (null == plot) {
-                       return;
-               }
-               if (true == isParent) {
-                       plot.setBackgroundImage(ImageResources.BG_GRADIENT);
-               } else {
-                       plot.setBackgroundImage(ImageResources.BG_CHILD_GRADIENT);
-               }
-               plot.setAutoHeightRange(AutoRangeType.MANUAL);
-               plot.setAxisFont(FontResources.CHART_AXIS_FONT);
-               plot.setAxisRangeY(0, 101);
-               plot.setAxisRangeX(board.getVisibleStartTime(),
-                               board.getVisibleEndTime());
-               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
-               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
-               plot.setTooltip(tooltip);
-
-               DAPopupMenu popupMenu = new DAPopupMenu(chart);
-               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
-               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu);
-               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
-               startItem.addListener(new PopupStartMenuItemClickListener(startItem,
-                               board));
-
-               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu);
-               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
-               endItem.addListener(new PopupEndMenuItemClickListener(endItem, board));
-
-               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu);
-               fromSelectionItem
-                               .setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
-               fromSelectionItem
-                               .addListener(new PopupFromSelectionMenuItemClickListener(
-                                               fromSelectionItem, board));
-
-               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu);
-               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
-               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
-
-               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu);
-               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
-               clearItem.addListener(new PopupClearMenuItemClickListener());
-
-               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
-                               popupMenu, board.getTimeline());
-               chart.addMouseListener(timelineChartMouseEventListener);
-               chart.addMouseMoveListener(timelineChartMouseEventListener);
-               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(board
-                               .getTimeline()));
-               plot.setMarkers(board.getMarkers());
-       }
-
-       private boolean createSyncBoardItem(ThreadPageSyncData parent,
-                       ThreadPageSyncData sync) {
-               DAChartBoardItem item;
-               DAChart chart;
-
-               if (null == parent) {
-                       item = new DAChartBoardItem(board, sync.getTypeString()
-                                       + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
-                                       + ThreadPageLabels.THREAD_CHART_NAME_OBJ + AnalyzerUtil.toHexdecimal(sync.getKey())
-                                       + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
-                       item.useExpand(true);
-                       chart = item.getChart();
-                       initSyncChart(chart, true);
-               } else {
-                       DAChartBoardItem parentItem = parent.getItem();
-                       item = new DAChartBoardItem(parentItem,
-                                       ThreadPageLabels.THREAD_CHART_NAME_TID + sync.getTid());
-                       item.useExpand(true);
-                       chart = item.getChart();
-                       initSyncChart(chart, false);
-               }
-
-               sync.setItem(item);
-               item.setData(sync);
-               chart.setData(sync);
-               chart.redraw();
-               return true;
-       }
-       // for sorting of child item of sync chart
-       private boolean createSyncBoardItem(ThreadPageSyncData parent,
-                       ThreadPageSyncData sync, Comparator<DAChartBoardItem> c) {
-               DAChartBoardItem item;
-               DAChart chart;
-               Integer tid = Integer.valueOf(sync.getTid());
-
-               if (null == parent) {
-                       item = new DAChartBoardItem(board, sync.getTypeString()
-                                       + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
-                                       + ThreadPageLabels.THREAD_CHART_NAME_OBJ + sync.getKey()
-                                       + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
-                       item.useExpand(true);
-                       chart = item.getChart();
-                       initSyncChart(chart, true);
-               } else {
-                       DAChartBoardItem parentItem = parent.getItem();
-                       item = new DAChartBoardItem(parentItem,
-                                       ThreadPageLabels.THREAD_CHART_NAME_TID
-                                       + sync.getTid(), tid, c);
-                       item.useExpand(true);
-                       chart = item.getChart();
-                       initSyncChart(chart, false);
-               }
-
-               sync.setItem(item);
-               item.setData(sync);
-               chart.setData(sync);
-               chart.redraw();
-               return true;
-       }
-
-       private void chartFilteringByPid() {
-               if(null == board || null == board.getItemList()){
-                       return;
-               }
-               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
-               boolean isCheck = false;
-
-               if (syncEventQueue.size() > 0) {
-                       isCheck = true;
-               }
-
-               if (preSelectionPid != -1 && preSelectionPid != selectedPid) {
-                       isCheck = true;
-               }
-
-               if (isCheck) {
-                       int parentSize = board.getItemList().getItemSize();
-                       for (int i = 0; i < parentSize; i++) {
-                               DAChartBoardItem parentItem = board.getItemList().get(i);
-/*
-                               int childSize = parentItem.getChildItemList().getItemSize();
-                               int hidedCount = 0;
-                               for (int j = 0; j < childSize; j++) {
-                                       DAChartBoardItem childItem = parentItem.getChildItemList()
-                                                       .get(j);
-                                       int itemPid = getItemPid(childItem);
-                                       if (itemPid == selectedPid) {
-                                               parentItem.getChildItemList().showItem(j);
-                                               board.showItem(i);
-                                       } else if (selectedPid == 0) {
-                                               parentItem.getChildItemList().showItem(j);
-                                               board.showItem(i);
-                                       } else if (itemPid == -1) {
-                                               board.showItem(i);
-                                       } else {
-                                               parentItem.getChildItemList().hideItem(j);
-                                               hidedCount++;
-                                       }
-                               }
-                               if (childSize == 0) {
-                                       int itemPid = getItemPid(parentItem);
-                                       if (itemPid == selectedPid) {
-                                               board.showItem(i);
-                                       } else if (selectedPid == 0) {
-                                               board.showItem(i);
-                                       } else if (itemPid == -1) {
-                                               board.showItem(i);
-                                       } else {
-                                               board.hideItem(i);
-                                               hidedCount++;
-                                       }
-                               } else {
-                                       if (childSize == hidedCount) {
-                                               board.hideItem(i);
-                                       }
-                               }
-*/                             
-                               int itemPid = getItemPid(parentItem);
-                               if (itemPid == selectedPid) {
-                                       board.showItem(i);
-//                                     for(int j = 0; j < parentItem.getChildItemList().getItemSize(); j++) {
-//                                             parentItem.getChildItemList().showItem(j);
-//                                     }
-                               } else if (selectedPid == 0) {
-                                       board.showItem(i);
-                               } else if (itemPid == -1) {
-                                       board.showItem(i);
-                               } else {
-                                       board.hideItem(i);
-                               }                               
-                       }
-               }
-               preSelectionPid = selectedPid;
-       }
-
-       private int getItemPid(DAChartBoardItem item) {
-               int pid = -1;
-               if (item.getData() instanceof ThreadPageData) {
-                       ThreadPageData threadPageData = (ThreadPageData) item.getData();
-                       pid = Integer.parseInt(threadPageData.getPid());
-               }
-               return pid;
-       }
-
-       private int getSortObject(DAChartBoardItem item) {
-               Object sortObj = item.getSortObject();
-               if (sortObj instanceof Integer) {
-                       return (Integer) sortObj;
-               } else { // should never go here
-                       return -1;                      
-               }
-       }
-       
-       public void checkUpdate() {
-               chartFilteringByPid();
-               
-               /* load ThreadPgeSyncData when open trace */
-               int size = rowsQueue.size();
-               if (size > 0) {
-                       ThreadPageSyncData sync;
-                       ThreadPageSyncData parent;
-                       for (int i = 0; i < size; i++) {
-                               sync = rowsQueue.get(0);
-                               if (sync.getSyncDataType() == ThreadPageSyncData.SYNC_PARENT) {
-                                       rows.add(sync);
-                                       createSyncBoardItem(null, sync);                                        
-                               } else if (sync.getSyncDataType() == ThreadPageSyncData.SYNC_CHILD) {
-                                       parent = findParentData(sync.getKey());
-                                       if (null != parent) {
-                                               parent.pushSync(sync);
-                                               createSyncBoardItem(parent, sync,
-                                                               new Comparator<DAChartBoardItem>() {
-                                                                       public int compare(DAChartBoardItem item1,
-                                                                                       DAChartBoardItem item2) {
-                                                                               return getSortObject(item1) - getSortObject(item2);
-                                                                       }
-                                               });
-                                       } else {
-                                               Logger.error("cannot find parent sync data");
-                                       }
-                               } else {
-                                       Logger.error("unknown sync data type");
-                               }
-                               rowsQueue.remove(0);
-                       }
-               }
-               
-               size = syncEventQueue.size();
-               if (size > 0) {
-                       ThreadPageSyncData parent;
-                       ThreadPageSyncData data;
-                       ThreadPageSyncDataEvent event;
-                       for (int i = 0; i < size; i++) {
-                               event = syncEventQueue.get(0);
-                               String syncVal = event.getSyncVal();
-                               String pid = Integer.toString(event.getContents().getPid());
-                               parent = findParentData(syncVal);
-                               // parent
-                               if (null == parent) {
-                                       Integer syncAttrTypeInt = syncAttrMap.get(syncVal);
-                                       String syncAttrType;
-
-                                       if (null != syncAttrTypeInt) {
-                                               syncAttrType = getAttrTypeByTypeInt(syncAttrTypeInt);
-                                       } else {
-                                               syncAttrType = getAttrTypeString(event);
-                                       }
-
-                                       parent = new ThreadPageSyncData(event.getType(), syncVal, pid, 
-                                                       event.getTid(), syncAttrType, ThreadPageSyncData.SYNC_PARENT);
-                                       // save to DB
-                                       SyncDataInserter.pushSyncData(parent);
-                                       SyncDataInserter.startThread();
-                                       rows.add(parent);
-                                       createSyncBoardItem(null, parent);
-                               }
-                               parent.pushEvent(event);
-                               event.setSyncDataID(parent.getSyncDataID());
-                               // save to DB
-                               SyncEventInserter.pushSyncEvent(event);
-                               SyncEventInserter.startThread();
-                               // child
-                               data = parent.findChildData(event.getTid());
-
-                               if (null == data) {
-                                       String attrType = parent.getAttrType();
-                                       data = new ThreadPageSyncData(event.getType(), syncVal, pid, 
-                                                       event.getTid(), attrType, ThreadPageSyncData.SYNC_CHILD);
-                                       data.setParentID(parent.getSyncDataID());
-                                       // save to DB
-                                       SyncDataInserter.pushSyncData(data);
-                                       SyncDataInserter.startThread();
-                                       parent.pushSync(data);
-                                       createSyncBoardItem(parent, data,
-                                                       new Comparator<DAChartBoardItem>() {
-                                                               public int compare(DAChartBoardItem item1,
-                                                                               DAChartBoardItem item2) {
-                                                                       return getSortObject(item1) - getSortObject(item2);
-                                                               }
-                                       });
-                               }
-                               data.pushEvent(event);
-                               try {
-                                       ThreadPageSyncDataEvent cloneEvent = (ThreadPageSyncDataEvent) event.clone();
-                                       cloneEvent.setSyncDataID(data.getSyncDataID());
-                                       // save to DB
-                                       SyncEventInserter.pushSyncEvent(cloneEvent);
-                               } catch (CloneNotSupportedException e) {
-                                       e.printStackTrace();
-                                       continue;
-                               } finally {
-                                       syncEventQueue.remove(0);
-                               }
-                       }
-               }
-               size = rows.size();
-               if (size > 0) {
-                       ThreadPageSyncData data;
-                       for (int i = 0; i < size; i++) {
-                               data = rows.get(i);
-                               data.checkUpdate();
-                       }
-               }
-       }
-
-       public void clear() {
-               rows.clear(); // FIXME : clear chart
-               syncEventQueue.clear();
-               syncAttrMap.clear();
-               ThreadPageSyncData.clear(); // reset internal seq number
-       }
-}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadData.java
deleted file mode 100644 (file)
index 61009a4..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com>
- * yeongtaik byeon <yeongtaik.byeon@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.thread;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.tizen.dynamicanalyzer.common.AnalyzerManager;
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
-import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
-import org.tizen.dynamicanalyzer.common.Global;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageDataEvent;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
-import org.tizen.dynamicanalyzer.util.Logger;
-import org.tizen.dynamicanalyzer.utils.Formatter;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
-
-public class ThreadPageThreadData extends ThreadPageData {
-       private List<ThreadPageSyncData> syncs = new ArrayList<ThreadPageSyncData>();
-       private long StartTime = -1;
-       private long EndTime = -1;
-       private int threadFuncID;
-       private String threadClassName = CommonConstants.EMPTY;
-       private DAChartSeries loadSeries;
-       private DAChartSeries eventSeries;
-       private DAChartSeries apiSeries;
-
-       public static final byte TYPE_MAIN = 0;
-       public static final byte TYPE_PTHREAD = 1;
-       public static final byte TYPE_TIZEN = 2;
-
-       private static int internalSeq = 0;
-       private int threadDataID = -1;
-
-       public ThreadPageThreadData(int type, String pid, String tid,
-                       String attrType, int funcID) {
-               super(type, String.valueOf(tid), pid, tid, attrType);
-               this.threadFuncID = funcID;
-               threadDataID = internalSeq++;
-       }
-
-       // using open trace
-       public ThreadPageThreadData(int id, int pid, int tid, int threadType,
-                       String attrType, long startTime, long endTime, int functionID,
-                       String className) {
-               super(threadType, String.valueOf(tid), String.valueOf(pid), String
-                               .valueOf(tid), attrType);
-               this.threadDataID = id;
-               this.threadFuncID = functionID;
-               this.StartTime = startTime;
-               this.EndTime = endTime;
-               this.threadClassName = className;
-       }
-
-       public void addDataEvent(ThreadPageThreadDataEvent dataEvent) {
-               contentsQueue.add(dataEvent);
-       }
-
-       public int getThreadFuncID() {
-               return threadFuncID;
-       }
-
-       public String getThreadFuncName() {
-               if (threadFuncID == -1) {
-                       return CommonConstants.EMPTY;
-               } else {
-                       return Global.getFunctionName(threadFuncID);
-               }
-       }
-
-       public String getThreadClassName() {
-               return threadClassName;
-       }
-
-       public void setThreadClassName(String className) {
-               threadClassName = className;
-       }
-
-       public void setItem(DAChartBoardItem item) {
-               this.item = item;
-               chart = item.getChart();
-               loadSeries = chart.getSeries(ThreadPageLabels.THREAD_CHART_SERIES_LOAD);
-               eventSeries = chart
-                               .getSeries(ThreadPageLabels.THREAD_CHART_SERIES_EVENT);
-               apiSeries = chart.getSeries(ThreadPageLabels.THREAD_CHART_SERIES_API);
-       }
-
-       protected int createChartItem(ThreadPageDataEvent event) {
-               int ret = -1;
-               if (!(event instanceof ThreadPageThreadDataEvent)) {
-                       Logger.error("createChartItem");
-                       return ret;
-               }
-
-               ThreadPageThreadDataEvent threadEvent = (ThreadPageThreadDataEvent) event;
-               DAChartSeriesItem seriesItem;
-
-               switch (threadEvent.getEventType()) {
-               case ThreadPageThreadDataEvent.TYPE_LOAD:
-                       ret = ThreadPageThreadDataEvent.TYPE_LOAD;
-                       if (null == loadSeries) {
-                               return ret;
-                       }
-
-                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
-                                       (double) (threadEvent.getThreadType() * 2.55),
-                                       threadEvent.getTooltipContent());
-
-                       loadSeries.addSeriesItem(seriesItem);
-                       break;
-               case ThreadPageThreadDataEvent.TYPE_EVENT:
-                       ret = ThreadPageThreadDataEvent.TYPE_EVENT;
-                       if (null == eventSeries) {
-                               return ret;
-                       }
-
-                       int eventApiType = threadEvent.getApiType();
-                       if (eventApiType == LogCenterConstants.THREAD_API_TYPE_INTERNAL_START) {
-                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
-                                               DAChartSeriesItem.SERIES_ARROW_LEFT,
-                                               threadEvent.getTooltipContent());
-                               seriesItem.setBarWidth(Double.parseDouble(threadEvent
-                                               .getCallerTid()));
-                               setStartTime(threadEvent.getTime());
-                       } else if (eventApiType == LogCenterConstants.THREAD_API_TYPE_WAIT_END) {
-                               if (threadEvent.isJoinAPI()) {
-                                       seriesItem = new DAChartSeriesItem(
-                                                       threadEvent.getDoubleTime(),
-                                                       DAChartSeriesItem.SERIES_ARROW_LEFT,
-                                                       ThreadPageLabels.THREAD_CHART_ITEM_JOINED);
-                                       seriesItem.setBarWidth(Double.parseDouble(threadEvent
-                                                       .getCallerTid()));
-                               } else {
-                                       seriesItem = new DAChartSeriesItem(
-                                                       threadEvent.getDoubleTime(),
-                                                       DAChartSeriesItem.SERIES_ARROW_NONE,
-                                                       threadEvent.getTooltipContent());
-                               }
-                       } else if (eventApiType == LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
-                               if (null != threadEvent.getCallerTid()) {
-                                       seriesItem = new DAChartSeriesItem(
-                                                       threadEvent.getDoubleTime(),
-                                                       DAChartSeriesItem.SERIES_ARROW_LEFT,
-                                                       threadEvent.getTooltipContent());
-                                       seriesItem.setBarWidth(Double.parseDouble(threadEvent
-                                                       .getCallerTid()));
-                               } else {
-                                       seriesItem = new DAChartSeriesItem(
-                                                       threadEvent.getDoubleTime(),
-                                                       DAChartSeriesItem.SERIES_ARROW_NONE,
-                                                       threadEvent.getTooltipContent());
-                               }
-                               setEndTime(threadEvent.getTime());
-                               // save ThreadData when endtime is set
-                               if (AnalyzerManager.isRunning()) {
-                                       ThreadChartManager.getInstance().saveThreadPageThreadData(
-                                                       this);
-                               }
-                       } else {
-                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
-                                               DAChartSeriesItem.SERIES_ARROW_NONE,
-                                               threadEvent.getTooltipContent());
-                       }
-
-                       eventSeries.addSeriesItem(seriesItem);
-                       break;
-               case ThreadPageThreadDataEvent.TYPE_API:
-                       ret = ThreadPageThreadDataEvent.TYPE_API;
-                       if (null == apiSeries) {
-                               return ret;
-                       }
-
-                       long errorNum = threadEvent.getErrorNum();
-                       seriesItem = createApiItem(threadEvent, errorNum);
-
-                       apiSeries.addSeriesItem(seriesItem);
-                       break;
-               default:
-                       return ret;
-               }
-               threadEvent.setChartItem(seriesItem);
-               return ret;
-       }
-
-       protected void checkUpdate() {
-               if (false == hasUpdate) {
-                       return;
-               } else {
-                       hasUpdate = false;
-               }
-
-               int size = contentsQueue.size();
-               if (size > 0) {
-                       ThreadPageDataEvent temp;
-                       ThreadPageThreadDataEvent event;
-                       for (int i = 0; i < size; i++) {
-                               temp = contentsQueue.get(0);
-                               if ((temp instanceof ThreadPageThreadDataEvent)) {
-                                       event = (ThreadPageThreadDataEvent) temp;
-                                       if (ThreadPageThreadDataEvent.TYPE_API == createChartItem(event)) {
-                                               contents.add(event);
-                                       }
-                               }
-                               contentsQueue.remove(0);
-                       }
-                       chart.redraw();
-               }
-
-               size = syncs.size();
-               if (size > 0) {
-                       ThreadPageSyncData sync;
-                       for (int i = 0; i < size; i++) {
-                               sync = syncs.get(i);
-                               sync.checkUpdate();
-                       }
-               }
-       }
-
-       public void pushSync(ThreadPageSyncData sync) {
-               syncs.add(sync);
-               hasUpdate = true;
-       }
-
-       protected ThreadPageSyncData findSyncData(String syncVal) {
-               int size = syncs.size();
-               ThreadPageSyncData sync;
-               for (int i = 0; i < size; i++) {
-                       sync = syncs.get(i);
-                       if (sync.getKey().equals(syncVal)) {
-                               return sync;
-                       }
-               }
-               return null;
-       }
-
-       public String getTypeString() {
-               switch (getType()) {
-               case TYPE_MAIN:
-                       return ThreadPageLabels.THREAD_ITEM_TYPE_MAIN;
-               case TYPE_PTHREAD:
-                       return ThreadPageLabels.THREAD_ITEM_TYPE_PTHREAD;
-               case TYPE_TIZEN:
-                       return ThreadPageLabels.THREAD_ITEM_TYPE_TIZEN;
-               default:
-                       Logger.error("unknown thread type!!");
-                       return CommonConstants.EMPTY;
-               }
-       }
-
-       public long getStartTime() {
-               return StartTime;
-       }
-
-       public void setStartTime(long startTime) {
-               StartTime = startTime;
-       }
-
-       public String getStartTimeString() { // to show in details view
-               if (StartTime == -1) {
-                       return null;
-               } else {
-                       double startTime = Formatter.longTimeToDoubleTime(StartTime);
-                       return String.valueOf(startTime);
-               }
-       }
-
-       public long getEndTime() {
-               return EndTime;
-       }
-
-       public void setEndTime(long endTime) {
-               EndTime = endTime;
-       }
-
-       public String getEndTimeString() { // to show in details view
-               if (EndTime == -1) {
-                       return null;
-               } else {
-                       double endTime = Formatter.longTimeToDoubleTime(EndTime);
-                       return String.valueOf(endTime);
-               }
-       }
-
-       public int getThreadDataID() {
-               return threadDataID;
-       }
-
-       public static void clear() {
-               internalSeq = 0;
-       }
-}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java
deleted file mode 100644 (file)
index 024a3b6..0000000
+++ /dev/null
@@ -1,1392 +0,0 @@
-/*
- *  Dynamic Analyzer
- *
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: 
- * WooJin Jung <woojin2.jung@samsung.com> 
- * yeongtaik byeon <yeongtaik.byeon@samsung.com>
- * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.thread;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-
-import org.tizen.dynamicanalyzer.common.Global;
-import org.tizen.dynamicanalyzer.common.SymbolManager;
-import org.tizen.dynamicanalyzer.constant.CommonConstants;
-import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
-import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
-import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
-import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.resources.FontResources;
-import org.tizen.dynamicanalyzer.resources.ImageResources;
-import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
-import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
-import org.tizen.dynamicanalyzer.swap.logparser.Logs;
-import org.tizen.dynamicanalyzer.swap.model.data.LogData;
-import org.tizen.dynamicanalyzer.swap.model.data.ProcessProfileData;
-import org.tizen.dynamicanalyzer.swap.model.data.SyncData;
-import org.tizen.dynamicanalyzer.swap.model.data.SystemData;
-import org.tizen.dynamicanalyzer.swap.model.data.ThreadData;
-import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupClearMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupEndMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
-import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
-import org.tizen.dynamicanalyzer.ui.summary.warning.WarningCase;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncAPIInserter;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncDataInserter;
-import org.tizen.dynamicanalyzer.ui.thread.data.SyncEventInserter;
-import org.tizen.dynamicanalyzer.ui.thread.data.ThreadEventInserter;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataEvent;
-import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataManager;
-import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
-import org.tizen.dynamicanalyzer.util.Logger;
-import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot.AutoRangeType;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
-
-public class ThreadPageThreadDataManager {
-       private DAChartBoard board;
-       // ThreadChartView view;
-       private boolean hasUpdate = false;
-       private List<ThreadPageThreadData> rows = new ArrayList<ThreadPageThreadData>();
-       private List<ThreadPageThreadData> rowsQueue = new ArrayList<ThreadPageThreadData>();
-       private List<ThreadPageThreadData> callRowsQueue = new ArrayList<ThreadPageThreadData>();
-       private List<ThreadPageSyncDataEvent> syncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
-       private List<ThreadPageThreadDataEvent> eventQueue = new ArrayList<ThreadPageThreadDataEvent>();
-       private List<ThreadPageThreadDataEvent> callEventQueue = new ArrayList<ThreadPageThreadDataEvent>();
-       // load from database
-       private List<ThreadPageSyncData> syncQueue = new ArrayList<ThreadPageSyncData>();
-
-       private HashMap<String, Integer> threadAttrMap = new HashMap<String, Integer>();
-       private HashMap<String, Integer> syncAttrMap = new HashMap<String, Integer>();
-       // threadFuncMap : (pthreadId, function address)
-       private HashMap<String, Long> threadFuncMap = new HashMap<String, Long>();
-       private int preSelectionPid = -1;
-
-       public static final int PTHREAD_CREATE_JOINABLE = 0;
-       public static final int PTHREAD_CREATE_DETACHED = 1;
-
-       public ThreadPageThreadDataManager(DAChartBoard board) {
-               this.setBoard(board);
-       }
-
-       public List<ThreadPageThreadData> getRows() {
-               return rows;
-       }
-
-       public void pushRow(ThreadPageThreadData data) {
-               rowsQueue.add(data);
-               hasUpdate = true;
-       }
-
-       private void pushCallRow(ThreadPageThreadData data) { // FIXME
-               callRowsQueue.add(data);
-       }
-
-       private void pushEvent(ThreadPageThreadDataEvent event) {
-               eventQueue.add(event);
-               hasUpdate = true;
-       }
-
-       private void pushCallEvent(ThreadPageThreadDataEvent event) {
-               callEventQueue.add(event);
-       }
-
-       private void pushSyncEvent(ThreadPageSyncDataEvent syncEvent) {
-               syncEventQueue.add(syncEvent);
-               hasUpdate = true;
-       }
-
-       public void pushSyncData(ThreadPageSyncData syncData) {
-               syncQueue.add(syncData);
-       }
-
-       private void createBoardItem(ThreadPageThreadData data) {
-               // DACustomChartBoardItem item = new DACustomChartBoardItem(board,
-               // data.getName());
-
-               DAChartBoardItem item = new DAChartBoardItem(board, data.getTypeString()
-                               + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
-                               + ThreadPageLabels.THREAD_CHART_NAME_PID + data.getPid()
-                               + ThreadPageLabels.THREAD_CHART_NAME_COMMA + ThreadPageLabels.THREAD_CHART_NAME_TID
-                               + data.getKey() + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
-
-               item.useExpand(true);
-               DAChart chart = item.getChart();
-               setChartSeries(chart);
-
-               setChartStyle(chart);
-
-               data.setItem(item);
-               item.setData(data);
-               chart.setData(data);
-               chart.redraw();
-       }
-
-       // for sorting of thread chart item
-       private void createBoardItem(ThreadPageThreadData data, Comparator<DAChartBoardItem> c) {
-               // DACustomChartBoardItem item = new DACustomChartBoardItem(board,
-               // data.getName());
-               Integer tid = Integer.valueOf(data.getTid());
-
-               DAChartBoardItem item = new DAChartBoardItem(board, data.getTypeString()
-                               + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
-                               + ThreadPageLabels.THREAD_CHART_NAME_PID + data.getPid()
-                               + ThreadPageLabels.THREAD_CHART_NAME_COMMA + ThreadPageLabels.THREAD_CHART_NAME_TID
-                               + data.getKey() + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX, tid, c);
-
-               item.useExpand(true);
-               DAChart chart = item.getChart();
-               setChartSeries(chart);
-
-               setChartStyle(chart);
-
-               data.setItem(item);
-               item.setData(data);
-               chart.setData(data);
-               chart.redraw();
-       }
-
-       private void initSyncChart(DAChart chart) {
-               if (null == chart) {
-                       return;
-               }
-
-               DAChartSeries apiSeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_API,
-                               DAChartSeries.SERIES_STYLE_STATE, ColorResources.YELLOW);
-               DAChartSeries stateSeries = new DAChartSeries(
-                               ThreadPageLabels.THREAD_SYNC_CHART_SERIES_STATE, DAChartSeries.SERIES_STYLE_STATE,
-                               ColorResources.WHITE);
-
-               chart.addSeries(stateSeries);
-               chart.addSeries(apiSeries);
-
-               DAChartPlot plot = chart.getPlot();
-               if (null == plot) {
-                       return;
-               }
-               plot.setBackgroundImage(ImageResources.BG_CHILD_GRADIENT);
-               plot.setAutoHeightRange(AutoRangeType.MANUAL);
-               plot.setAxisFont(FontResources.CHART_AXIS_FONT);
-               plot.setAxisRangeY(0, 101);
-               plot.setAxisRangeX(board.getVisibleStartTime(), board.getVisibleEndTime());
-               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
-               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
-               plot.setTooltip(tooltip);
-
-               DAPopupMenu popupMenu = new DAPopupMenu(chart);
-               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
-               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu);
-               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
-               startItem.addListener(new PopupStartMenuItemClickListener(startItem, board));
-
-               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu);
-               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
-               endItem.addListener(new PopupEndMenuItemClickListener(endItem, board));
-
-               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu);
-               fromSelectionItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
-               fromSelectionItem.addListener(new PopupFromSelectionMenuItemClickListener(
-                               fromSelectionItem, board));
-
-               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu);
-               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
-               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
-
-               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu);
-               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
-               clearItem.addListener(new PopupClearMenuItemClickListener());
-
-               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
-                               popupMenu, board.getTimeline());
-               chart.addMouseListener(timelineChartMouseEventListener);
-               chart.addMouseMoveListener(timelineChartMouseEventListener);
-               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(board.getTimeline()));
-
-               plot.setMarkers(board.getMarkers());
-       }
-
-       private boolean createSyncBoardItem(ThreadPageThreadData data, ThreadPageSyncData sync) {
-               DAChartBoardItem parent = data.getItem();
-               if (null == parent) {
-                       return false;
-               }
-
-               DAChartBoardItem item = new DAChartBoardItem(parent, sync.getTypeString()
-                               + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
-                               + ThreadPageLabels.THREAD_CHART_NAME_OBJ + AnalyzerUtil.toHexdecimal(sync.getKey())
-                               + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
-
-               item.useExpand(true);
-               DAChart chart = item.getChart();
-               initSyncChart(chart);
-
-               sync.setItem(item);
-               item.setData(sync);
-               chart.setData(sync);
-               chart.redraw();
-               return true;
-       }
-
-       protected void setChartStyle(DAChart chart) {
-               if (null == chart) {
-                       return;
-               }
-
-               DAChartPlot plot = chart.getPlot();
-               if (null == plot) {
-                       return;
-               }
-               plot.setBackgroundImage(ImageResources.BG_GRADIENT);
-               plot.setAutoHeightRange(AutoRangeType.MANUAL);
-               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
-               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
-               plot.setTooltip(tooltip);
-               plot.setAxisFont(FontResources.CHART_AXIS_FONT);
-               plot.setAxisRangeY(0, 101);
-               plot.setAxisRangeX(board.getVisibleStartTime(), board.getVisibleEndTime());
-
-               DAPopupMenu popupMenu = new DAPopupMenu(chart);
-
-               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
-               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu);
-               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
-               startItem.addListener(new PopupStartMenuItemClickListener(startItem, board));
-
-               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu);
-               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
-               endItem.addListener(new PopupEndMenuItemClickListener(endItem, board));
-
-               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu);
-               fromSelectionItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
-               fromSelectionItem.addListener(new PopupFromSelectionMenuItemClickListener(
-                               fromSelectionItem, board));
-
-               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu);
-               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
-               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
-
-               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu);
-               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
-               clearItem.addListener(new PopupClearMenuItemClickListener());
-
-               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
-                               popupMenu, board.getTimeline());
-               chart.addMouseListener(timelineChartMouseEventListener);
-               chart.addMouseMoveListener(timelineChartMouseEventListener);
-               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(board.getTimeline()));
-               plot.setMarkers(board.getMarkers());
-       }
-
-       private void setChartSeries(DAChart chart) {
-               DAChartSeries loadSeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_LOAD,
-                               DAChartSeries.SERIES_STYLE_LOAD, ColorResources.THREAD_GRAPH_MIN_CPU_LOAD_COLOR,
-                               ColorResources.THREAD_GRAPH_MAX_CPU_LOAD_COLOR);
-               loadSeries.setBarWidth(1);
-
-               DAChartSeries apiSeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_API,
-                               DAChartSeries.SERIES_STYLE_EVENT, ColorResources.YELLOW);
-
-               DAChartSeries eventSeries = new DAChartSeries(ThreadPageLabels.THREAD_CHART_SERIES_EVENT,
-                               DAChartSeries.SERIES_STYLE_ARROW, ColorResources.THREAD_GRAPH_CALLEE_COLOR);
-
-               apiSeries.setSummarizeTooltipText(ThreadPageLabels.THREAD_TOOLTIP_APIS);
-               eventSeries.setFont(FontResources.CHART_ARROW_TID_FONT);
-
-               chart.addSeries(loadSeries);
-               chart.addSeries(apiSeries);
-               chart.addSeries(eventSeries);
-
-               chart.redraw();
-       }
-
-       public void createMainThreadItem(int tid) {
-               int funcID = Global.getFunctionID("main");
-               ThreadPageThreadData mainData = new ThreadPageThreadData(ThreadPageThreadData.TYPE_MAIN,
-                               String.valueOf(tid), String.valueOf(tid), CommonConstants.EMPTY, funcID);
-               pushRow(mainData);
-       }
-
-       public static String getAttrTypeByTypeInt(int typeInt) {
-               if (typeInt == PTHREAD_CREATE_JOINABLE) {
-                       return ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE;
-               } else if (typeInt == PTHREAD_CREATE_DETACHED) {
-                       return ThreadPageLabels.THREAD_ATTR_TYPE_DETACHED;
-               } else {
-                       return CommonConstants.EMPTY;
-               }
-       }
-
-       public List<LogData> getLogsFromLogPackage(LogPackage logPack, int logCenterConstants) {
-               Logs logs = logPack.getLogs(logCenterConstants);
-               if (null == logs || logs.getRawLogs().size() == 0) {
-                       return null;
-               }
-               List<LogData> ret = logs.getRawLogs();
-               return ret;
-       }
-
-       public void parseLoad(LogData input) {
-               if (null == input) {
-                       return;
-               }
-
-               if (!(input instanceof SystemData)) {
-                       return;
-               }
-               SystemData sysLog = (SystemData) input;
-
-               String loads;
-               String tid;
-               int load;
-
-               ProcessProfileData[] processDataList = sysLog.getProcessProfileDataList();
-
-               for (int i = 0; i < processDataList.length; i++) {
-                       loads = processDataList[i].getThreadLoad();
-                       String[] temp = loads.split(",");
-                       int tempSize = temp.length;
-                       long time;
-                       for (int j = 0; j + 1 < tempSize; j += 2) {
-                               try {
-                                       tid = temp[j];
-                               } catch (NumberFormatException nfe) {
-                                       Logger.error("parseLoad - tid parsing");
-                                       break;
-                               }
-                               // if (null == findParentData(tid)) {
-                               // continue;
-                               // }
-                               load = (int) (Double.parseDouble(temp[j + 1]));
-                               time = input.getTime();
-                               ThreadPageThreadDataEvent event = new ThreadPageThreadDataEvent(
-                                               ThreadPageThreadDataEvent.TYPE_LOAD, load, -1, time, tid,
-                                               String.valueOf(load) + ThreadPageLabels.THREAD_CHART_ITEM_PERCENT, -1, null);
-                               pushEvent(event);
-
-                       }
-               }
-               hasUpdate = true;
-               // loads = sysLog.getThreadLoad(); // TODO SystemData interface changed.
-               // // loads = input.get(LogCenterConstants.DEVICE_THREAD_LOAD_INDEX);
-               // String[] temp = loads.split(",");
-               // int tempSize = temp.length;
-               // double time;
-               // for (int j = 0; j + 1 < tempSize; j += 2) {
-               // try {
-               // tid = temp[j];
-               // } catch (NumberFormatException nfe) {
-               // Logger.error("parseLoad - tid parsing");
-               // break;
-               // }
-               // // if (null == findParentData(tid)) {
-               // // continue;
-               // // }
-               // load = (int) (Double.parseDouble(temp[j + 1]));
-               // time = Double.parseDouble(Long.toString(input.getTime()))
-               // / TimelineConstants.MEGA_DOUBLE;
-               // ThreadPageThreadDataEvent event = new ThreadPageThreadDataEvent(
-               // ThreadPageThreadDataEvent.TYPE_LOAD, load, -1, time, tid,
-               // String.valueOf(load)
-               // + ThreadPageLabels.THREAD_CHART_ITEM_PERCENT, -1,
-               // null);
-               // pushEvent(event);
-               //
-               // }
-               // hasUpdate = true;
-       }
-
-       private void parseLoad(LogPackage logPack) {
-               List<LogData> inputs = getLogsFromLogPackage(logPack, DataChannelConstants.MSG_DATA_SYSTEM);
-               int size;
-               if (null == inputs || 0 == (size = inputs.size())) {
-                       return;
-               }
-               SystemData input;
-
-               String loads;
-               String tid;
-               int load;
-               for (int i = 0; i < size; i++) {
-                       input = (SystemData) inputs.get(i);
-                       ProcessProfileData[] processDataList = input.getProcessProfileDataList();
-
-                       for (int j = 0; j < processDataList.length; j++) {
-                               loads = processDataList[j].getThreadLoad();
-                               String[] temp = loads.split(",");
-                               int tempSize = temp.length;
-                               long time;
-                               for (int k = 0; k + 1 < tempSize; k += 2) {
-                                       try {
-                                               tid = temp[k];
-                                       } catch (NumberFormatException nfe) {
-                                               Logger.error("parseLoad - tid parsing");
-                                               break;
-                                       }
-                                       // if (null == findParentData(tid)) {
-                                       // continue;
-                                       // }
-                                       load = (int) (Double.parseDouble(temp[k + 1]));
-                                       time = input.getTime();
-                                       ThreadPageThreadDataEvent event = new ThreadPageThreadDataEvent(
-                                                       ThreadPageThreadDataEvent.TYPE_LOAD, load, -1, time, tid,
-                                                       String.valueOf(load) + ThreadPageLabels.THREAD_CHART_ITEM_PERCENT, -1,
-                                                       null);
-                                       pushEvent(event);
-
-                               }
-                       }
-                       // loads = input.getThreadLoad(); // TODO SystemData interface
-                       // changed.
-                       // String[] temp = loads.split(",");
-                       // int tempSize = temp.length;
-                       // double time;
-                       // for (int j = 0; j + 1 < tempSize; j += 2) {
-                       // try {
-                       // tid = temp[j];
-                       // } catch (NumberFormatException nfe) {
-                       // Logger.error("parseLoad - tid parsing");
-                       // break;
-                       // }
-                       // // if (null == findParentData(tid)) {
-                       // // continue;
-                       // // }
-                       //
-                       // load = (int) (Double.parseDouble(temp[j + 1]));
-                       // time = Double.parseDouble(Long.toString(input.getTime()))
-                       // / TimelineConstants.MEGA_DOUBLE;
-                       // ThreadPageThreadDataEvent event = new ThreadPageThreadDataEvent(
-                       // ThreadPageThreadDataEvent.TYPE_LOAD, load, -1, time,
-                       // tid, String.valueOf(load)
-                       // + ThreadPageLabels.THREAD_CHART_ITEM_PERCENT,
-                       // -1, null);
-                       // pushEvent(event);
-                       // }
-               }
-       }
-
-       private void parsePthread(ThreadData input) {
-               long time = input.getTime();
-               String pid = Integer.toString(input.getPid());
-               String tid = Integer.toString(input.getTid());
-               int apiType = input.getApiType();
-               String apiName = input.getApiName();
-               long errorNum = input.getErrno();
-               ThreadPageThreadDataEvent event;
-               String pthreadId = Long.toString(input.getPThreadId());
-
-               if (errorNum != 0) {
-                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(input);
-               }
-
-               switch (apiType) {
-               case LogCenterConstants.THREAD_API_TYPE_NEW:
-               case LogCenterConstants.THREAD_API_TYPE_STOP:
-               case LogCenterConstants.THREAD_API_TYPE_EXIT:
-               case LogCenterConstants.THREAD_API_TYPE_WAIT_START:
-               case LogCenterConstants.THREAD_API_TYPE_OTHER:
-                       if (apiName.equals(ThreadPageLabels.THREAD_API_PTHREAD_ATTR_INIT)) {
-                               threadAttrMap.put(input.getArgs(), PTHREAD_CREATE_JOINABLE);
-                       } else if (apiName.equals(ThreadPageLabels.THREAD_API_PTHREAD_ATTR_SETDETACHSTATE)) {
-                               checkThreadAttrType(input.getArgs());
-                       }
-
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
-                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid, apiName, errorNum,
-                                       input);
-                       pushEvent(event);
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_START:
-                       if (apiName.equals(ThreadPageLabels.THREAD_API_PTHREAD_CREATE)) {
-                               checkThreadType(input.getArgs(), pthreadId);
-                               checkThreadFunc(input.getArgs(), pthreadId);
-                       }
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
-                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid, apiName, errorNum,
-                                       input);
-                       event.setCallID(pthreadId);
-
-                       pushEvent(event);
-                       pushCallEvent(event);
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_WAIT_END:
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
-                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid, apiName, errorNum,
-                                       input);
-                       pushEvent(event);
-                       if (input.getApiName().equals(ThreadPageLabels.THREAD_API_PTHREAD_JOIN)) {
-                               // join, delete warning
-                               SummaryDataManager.getInstance().getWarningDataMaker()
-                                               .removeData(event.getContents(),
-                                                               ThreadPageLabels.THREAD_CHART_NAME_TID + findCallerTid(pthreadId),
-                                                               WarningCase.JOINABLE_LEAK.getType());
-                               // AnalyzerManager.getWarningChecker().removeData(
-                               // ThreadPageLabels.THREAD_CHART_NAME_TID
-                               // + (Long.toString(input
-                               // .getOspThreadId())),
-                               // WarningCase.JOINABLE_LEAK.getType());
-                       }
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP:
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
-                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid,
-                                       ThreadPageLabels.THREAD_CHART_ITEM_EXITED, errorNum, input);
-                       event.setCallID(pthreadId);
-                       pushEvent(event);
-                       pushCallEvent(event);
-
-                       if (true == isJoinableThread(tid)) {
-                               // warningData
-                               // WarningData wData = new WarningData(
-                               // WarningCase.JOINABLE_LEAK.getType(), input,
-                               // ThreadPageLabels.THREAD_CHART_NAME_TID + tid);
-                               // AnalyzerManager.getWarningChecker().getWarningData().add(wData);
-                               SummaryDataManager
-                                               .getInstance()
-                                               .getWarningDataMaker()
-                                               .add(input, ThreadPageLabels.THREAD_CHART_NAME_TID + tid,
-                                                               WarningCase.JOINABLE_LEAK.getType());
-                       }
-                       // FIXME add code for remove waning case
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_INTERNAL_START:
-                       Integer threadAttrTypeInt = threadAttrMap.get(pthreadId);
-                       String threadAttrType;
-                       int funcID;
-
-                       if (null != threadAttrTypeInt) {
-                               threadAttrType = getAttrTypeByTypeInt(threadAttrTypeInt);
-                       } else {
-                               threadAttrType = ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE;
-                       }
-                       // get thread function id for this pthread
-                       funcID = SymbolManager.getFuncId(null, threadFuncMap.get(pthreadId), input.getPid(),
-                                       input.getTime());
-
-                       ThreadPageThreadData data = new ThreadPageThreadData(ThreadPageThreadData.TYPE_PTHREAD,
-                                       pid, tid, threadAttrType, funcID);
-                       pushRow(data);
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
-                                       LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid,
-                                       ThreadPageLabels.THREAD_CHART_ITEM_CREATED, errorNum, input);
-                       pushEvent(event);
-                       break;
-               default:
-                       Logger.error("thread page err: unknown thread api type");
-               }
-       }
-
-       private void parseTIZEN(ThreadData input) {
-               long time = input.getTime();
-               String pid = Integer.toString(input.getPid());
-               String tid = Integer.toString(input.getTid());
-               int apiType = input.getApiType();
-               String apiName = input.getApiName();
-               String callID = Long.toString(input.getOspThreadId());
-               String className = null;
-               ThreadPageThreadData data;
-               ThreadPageThreadDataEvent event;
-               long errorNum = input.getErrno();
-
-               if (errorNum != 0) {
-                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(input);
-               }
-
-               switch (apiType) {
-               case LogCenterConstants.THREAD_API_TYPE_NEW:
-               case LogCenterConstants.THREAD_API_TYPE_STOP:
-               case LogCenterConstants.THREAD_API_TYPE_EXIT:
-               case LogCenterConstants.THREAD_API_TYPE_WAIT_START:
-               case LogCenterConstants.THREAD_API_TYPE_OTHER:
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
-                                       LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tid, apiName, errorNum,
-                                       input);
-                       pushEvent(event);
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_START:
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_API,
-                                       LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tid, apiName, errorNum,
-                                       input);
-
-                       event.setCallID(callID);
-                       data = findCallQueue(callID);
-                       if (null != data) {
-                               data.setThreadClassName(input.getClassName());
-                               pushRow(data);
-                       }
-                       pushEvent(event);
-                       pushCallEvent(event);
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_WAIT_END:
-                       if (input.getApiName().equals(ThreadPageLabels.THREAD_API_TIZEN_JOIN)) {
-                               event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
-                                               LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tid, apiName,
-                                               errorNum, input);
-                               pushEvent(event);
-                               // join, delete warning
-                               // AnalyzerManager.getWarningChecker().removeData(
-                               // ThreadPageLabels.THREAD_CHART_NAME_TID
-                               // + findCallerTid(Long.toString(input
-                               // .getOspThreadId())),
-                               // WarningCase.JOINABLE_LEAK.getType());
-                               SummaryDataManager
-                                               .getInstance()
-                                               .getWarningDataMaker()
-                                               .removeData(event.getContents(),
-                                                               ThreadPageLabels.THREAD_CHART_NAME_TID + findCallerTid(callID),
-                                                               WarningCase.JOINABLE_LEAK.getType());
-                       } // FIXME : do not shows sleep's wait end
-
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP:
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
-                                       LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tid,
-                                       ThreadPageLabels.THREAD_CHART_ITEM_EXITED, errorNum, input);
-                       event.setCallID(Long.toString(input.getOspThreadId()));
-                       pushEvent(event);
-                       pushCallEvent(event);
-                       if (true == isJoinableThread(tid)) {
-                               // warningData
-                               // WarningData wData = new WarningData(
-                               // WarningCase.JOINABLE_LEAK.getType(),
-                               // event.getContents(),
-                               // ThreadPageLabels.THREAD_CHART_NAME_TID + tid);
-                               // AnalyzerManager.getWarningChecker().getWarningData().add(wData);
-                               SummaryDataManager
-                                               .getInstance()
-                                               .getWarningDataMaker()
-                                               .add(event.getContents(), ThreadPageLabels.THREAD_CHART_NAME_TID + tid,
-                                                               WarningCase.JOINABLE_LEAK.getType());
-                       }
-                       break;
-               case LogCenterConstants.THREAD_API_TYPE_INTERNAL_START:
-                       data = new ThreadPageThreadData(ThreadPageThreadData.TYPE_TIZEN, pid, tid,
-                                       ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE, -1);
-                       // TIZEN thread includes the internal thread
-                       if ((className = checkCalledThread(callID)) != null) {
-                               data.setThreadClassName(className);
-                               pushRow(data);
-                       } else {
-                               pushCallRow(data);
-                       }
-                       event = new ThreadPageThreadDataEvent(ThreadPageThreadDataEvent.TYPE_EVENT,
-                                       LogCenterConstants.THREAD_TYPE_TIZEN, apiType, time, tid,
-                                       ThreadPageLabels.THREAD_CHART_ITEM_CREATED, errorNum, input);
-                       pushEvent(event);
-                       break;
-               default:
-                       Logger.error("thread page err: unknown thread api type");
-               }
-       }
-
-       public void parseAPI(LogData input) {
-               if (null == input) {
-                       return;
-               }
-
-               if (!(input instanceof ThreadData)) {
-                       return;
-               }
-               ThreadData log = (ThreadData) input;
-               // System.out.println("input : " + input);
-               int threadType = log.getThreadType();
-
-               switch (threadType) {
-               case LogCenterConstants.THREAD_TYPE_PTHREAD:
-                       parsePthread(log);
-                       break;
-               case LogCenterConstants.THREAD_TYPE_TIZEN:
-                       parseTIZEN(log);
-                       break;
-               default:
-                       Logger.error("thread page err: unknown thread type");
-
-               }
-               hasUpdate = true;
-       }
-
-       private void parseAPI(LogPackage logPack) {
-               List<LogData> inputs = getLogsFromLogPackage(logPack, DataChannelConstants.MSG_PROBE_THREAD);
-               int size;
-               if (null == inputs || 0 == (size = inputs.size())) {
-                       return;
-               }
-               ThreadData input;
-               for (int i = 0; i < size; i++) {
-                       input = (ThreadData) inputs.get(i);
-                       // System.out.println("input : " + input);
-                       int threadType = input.getThreadType();
-
-                       switch (threadType) {
-                       case LogCenterConstants.THREAD_TYPE_PTHREAD:
-                               parsePthread(input);
-                               break;
-                       case LogCenterConstants.THREAD_TYPE_TIZEN:
-                               parseTIZEN(input);
-                               break;
-                       default:
-                               Logger.error("thread page err: unknown thread type");
-                       }
-               }
-       }
-
-       public void parseSync(LogData input) {
-               if (null == input || !(input instanceof SyncData)) {
-                       return;
-               }
-               SyncData syncData = (SyncData) input;
-               long time = input.getTime();
-               String tid = Integer.toString(syncData.getTid());
-
-               // FIXME
-               int type = syncData.getSyncType();
-               int apiType = syncData.getApiType();
-               String apiName = syncData.getApiName();
-
-               String name = Long.toString(syncData.getSyncValue());
-               long errorNum = syncData.getErrno();
-               ThreadPageSyncDataEvent event;
-               switch (type) {
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
-               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
-                       event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid, apiName, errorNum,
-                                       input);
-                       pushSyncEvent(event);
-                       // parseTIZENSync(input, type);
-                       break;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
-                       if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                               syncAttrMap.put(syncData.getArgs(), ThreadPageSyncDataManager.PTHREAD_MUTEX_NORMAL);
-                       } else if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
-                               checkMutexAttrType(syncData.getArgs());
-                       } else {
-                               if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEX_INIT)) {
-                                       checkMutexType(syncData.getArgs());
-                               }
-                               event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid, apiName,
-                                               errorNum, input);
-                               pushSyncEvent(event);
-                       }
-                       break;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
-                       event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid, apiName, errorNum,
-                                       input);
-                       pushSyncEvent(event);
-                       Logger.error("error : sync parse - type = " + type);
-                       break;
-               default:
-                       Logger.error("error : sync parse unknown - type = " + type);
-               }
-               hasUpdate = true;
-       }
-
-       private void parseSync(LogPackage logPack) {
-               List<LogData> inputs = getLogsFromLogPackage(logPack, DataChannelConstants.MSG_PROBE_SYNC);
-               int size;
-               if (null == inputs || 0 == (size = inputs.size())) {
-                       return;
-               }
-               SyncData input;
-               for (int i = 0; i < size; i++) {
-                       input = (SyncData) inputs.get(i);
-                       long time = input.getTime();
-                       String tid = Integer.toString(input.getTid());
-
-                       // FIXME
-                       int type = input.getSyncType();
-                       int apiType = input.getApiType();
-                       String apiName = input.getApiName();
-
-                       String name = Long.toString(input.getSyncValue());
-                       long errorNum = input.getErrno();
-                       ThreadPageSyncDataEvent event;
-                       switch (type) {
-                       case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
-                       case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
-                       case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
-                               event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid, apiName,
-                                               errorNum, input);
-                               pushSyncEvent(event);
-                               // parseTIZENSync(input, type);
-                               break;
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
-                               if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                                       syncAttrMap
-                                                       .put(input.getArgs(), ThreadPageSyncDataManager.PTHREAD_MUTEX_NORMAL);
-                               } else if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
-                                       checkMutexAttrType(input.getArgs());
-                               } else {
-                                       if (apiName.equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEX_INIT)) {
-                                               checkMutexType(input.getArgs());
-                                       }
-                                       event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid, apiName,
-                                                       errorNum, input);
-                                       pushSyncEvent(event);
-                               }
-                               break;
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
-                       case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
-                               event = new ThreadPageSyncDataEvent(name, type, apiType, time, tid, apiName,
-                                               errorNum, input);
-                               pushSyncEvent(event);
-                               Logger.debug("sync parse - type = " + type);
-                               break;
-                       default:
-                               Logger.error("sync parse unknown - type = " + type);
-                       }
-               }
-       }
-
-       public void parsePageData(LogPackage logPack) {
-               parseLoad(logPack);
-               parseAPI(logPack);
-               parseSync(logPack);
-               hasUpdate = true;
-       }
-
-       // when INTERNAL_START log comes after START log,
-       // this method finds matching START log (for TIZEN thread only)
-       // return class name from the START log
-       private String checkCalledThread(String callId) {
-               if (null == callId) {
-                       return null;
-               }
-               int callEventQueueSize = callEventQueue.size();
-               ThreadPageThreadDataEvent callEvent;
-               for (int i = 0; i < callEventQueueSize; i++) {
-                       callEvent = callEventQueue.get(i);
-                       if (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_START) {
-                               continue;
-                       }
-                       if (callId.equals(callEvent.getCallID())) {
-                               ThreadData threadData = (ThreadData) callEvent.getContents();
-                               return threadData.getClassName();
-                       }
-               }
-               return null;
-       }
-
-       private String getCallEventID(String callID) {
-               if (null == callID) {
-                       return null;
-               }
-               int eventQueueSize = eventQueue.size();
-               ThreadPageThreadDataEvent event;
-               for (int i = 0; i < eventQueueSize; i++) {
-                       event = eventQueue.get(i);
-                       if (event.getApiType() != LogCenterConstants.THREAD_API_TYPE_INTERNAL_START) {
-                               continue;
-                       }
-                       if (callID.equals(event.getCallID())) {
-                               return event.getTid();
-                       }
-               }
-               return null;
-       }
-
-       private ThreadPageThreadData findCallQueue(String callID) {
-               String tid = getCallEventID(callID);
-
-               int size;
-               size = callRowsQueue.size();
-               ThreadPageThreadData ret;
-               for (int i = 0; i < size; i++) {
-                       ret = callRowsQueue.get(i);
-
-                       if (ret.getTid().equals(tid)) {
-                               callRowsQueue.remove(i);
-                               return ret;
-                       }
-               }
-               return null;
-       }
-
-       private boolean isJoinableThreadFromQueue(List<ThreadPageThreadData> queue, String tid) {
-               int size;
-               size = queue.size();
-               for (int i = 0; i < size; i++) {
-                       if (true == queue.get(i).getTid().equals(tid)) {
-                               if (true == queue.get(i).getAttrType()
-                                               .equals(ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE)) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
-
-       private boolean isJoinableThread(String tid) {
-               boolean ret;
-
-               ret = isJoinableThreadFromQueue(rows, tid);
-               if (ret == false) {
-                       ret = isJoinableThreadFromQueue(rowsQueue, tid);
-               }
-               return ret;
-       }
-
-       private void checkThreadAttrType(String input) {
-               String[] temp = input.split(",");
-               if (temp.length != 2) {
-                       return;
-               }
-               String obj = temp[0];
-               String type = temp[1].trim();
-
-               if (null != threadAttrMap.get(obj)) {
-                       threadAttrMap.put(obj, Integer.valueOf(type));
-               }
-       }
-
-       private void checkThreadType(String args, String pthreadId) {
-               String[] temp = args.split(",");
-               if (temp.length != 4) {
-                       return;
-               }
-               String attrObj = temp[1].trim();
-
-               Integer attrType = threadAttrMap.get(attrObj);
-               if (attrType != null) {
-                       threadAttrMap.put(pthreadId, attrType);
-               }
-       }
-
-       // extract function address from arguments of thread create function,
-       // (e.g. int pthread_create(pthread_t *, const pthread_attr_t *, void
-       // *(*)(void *), void *); )
-       // put (pthreadId, function address) in the map
-       private void checkThreadFunc(String args, String pthreadId) {
-               String[] temp = args.split(",");
-               if (temp.length != 4) {
-                       return;
-               }
-               // 3rd argument is function address
-               String strFuncAddr = temp[2].trim();
-               Long funcAddr = Long.decode(strFuncAddr);
-
-               threadFuncMap.put(pthreadId, funcAddr);
-       }
-
-       private void checkMutexAttrType(String input) {
-               String[] temp = input.split(",");
-               if (temp.length != 2) {
-                       return;
-               }
-               String obj = temp[0];
-               String type = temp[1].trim();
-
-               if (null != syncAttrMap.get(obj)) {
-                       syncAttrMap.put(obj, Integer.valueOf(type));
-               }
-       }
-
-       private void checkMutexType(String input) {
-               String[] temp = input.split(",");
-               if (temp.length != 2) {
-                       return;
-               }
-               String obj = temp[0];
-               String attrObj = temp[1].trim();
-
-               Integer attrType = syncAttrMap.get(attrObj);
-               if (attrType != null) {
-                       syncAttrMap.put(obj, attrType);
-               }
-       }
-
-       protected DAChartBoard getBoard() {
-               return board;
-       }
-
-       public void setBoard(DAChartBoard board) {
-               this.board = board;
-       }
-
-       private String findCallerTid(String id) {
-               int callEventQueueSize = callEventQueue.size();
-               ThreadPageThreadDataEvent callEvent;
-               for (int i = 0; i < callEventQueueSize; i++) {
-                       callEvent = callEventQueue.get(i);
-                       if (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
-                               continue;
-                       }
-                       String callerTID = callEvent.getCallID();
-
-                       if (callerTID != null && callerTID.equals(id)) {
-                               return callEvent.getTid();
-                       }
-               }
-               return null;
-       }
-
-       private boolean checkPairEvent(ThreadPageThreadDataEvent event) {
-               if (event.getEventType() != ThreadPageThreadDataEvent.TYPE_EVENT) {
-                       return true;
-               }
-               int apiType = event.getApiType();
-               int threadType = event.getThreadType();
-               ThreadData tData = (ThreadData) event.getContents();
-               if (LogCenterConstants.THREAD_API_TYPE_INTERNAL_START == apiType) {
-                       int callEventQueueSize = callEventQueue.size();
-                       ThreadPageThreadDataEvent callEvent;
-                       for (int i = 0; i < callEventQueueSize; i++) {
-                               callEvent = callEventQueue.get(i);
-                               if (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_START) {
-                                       continue;
-                               } else if (callEvent.getThreadType() != threadType) {
-                                       continue;
-                               } else {
-                                       if (threadType == LogCenterConstants.THREAD_TYPE_TIZEN) {
-                                               String callerTizenID = callEvent.getCallID();
-                                               String eventTizenID = Long.toString(tData.getOspThreadId());
-                                               if (eventTizenID.equals(callerTizenID)) {
-                                                       event.setCallerTid(callEvent.getTid());
-                                                       callEventQueue.remove(i);
-                                                       return true;
-                                               }
-                                       } else {
-                                               String callerPthreadID = callEvent.getCallID();
-                                               String eventPthreadID = Long.toString(tData.getPThreadId());
-                                               if (eventPthreadID.equals(callerPthreadID)) {
-                                                       event.setCallerTid(callEvent.getTid());
-                                                       callEventQueue.remove(i);
-                                                       return true;
-                                               }
-                                       }
-                               }
-                       }
-                       return false;
-               } else if (LogCenterConstants.THREAD_API_TYPE_WAIT_END == apiType) {
-                       if (!event.isJoinAPI()) {
-                               return true;
-                       }
-
-                       int callEventQueueSize = callEventQueue.size();
-                       ThreadPageThreadDataEvent callEvent;
-                       for (int i = 0; i < callEventQueueSize; i++) {
-                               callEvent = callEventQueue.get(i);
-                               if (callEvent.getApiType() != LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
-                                       continue;
-                               } else if (callEvent.getThreadType() != threadType) {
-                                       continue;
-                               } else {
-                                       if (threadType == LogCenterConstants.THREAD_TYPE_TIZEN) {
-                                               String callerTizenID = callEvent.getCallID();
-                                               String eventTizenID = Long.toString(tData.getOspThreadId());
-                                               if (eventTizenID.equals(callerTizenID)) {
-                                                       event.setCallerTid(callEvent.getTid());
-                                                       if (null == callEvent.getChartItem()) {
-                                                               callEvent.setCallerTid(event.getTid());
-                                                       } else {
-                                                               // join, delete warning
-                                                               SummaryDataManager
-                                                                               .getInstance()
-                                                                               .getWarningDataMaker()
-                                                                               .removeData(
-                                                                                               event.getContents(),
-                                                                                               ThreadPageLabels.THREAD_CHART_NAME_TID
-                                                                                                               + callEvent.getTid(),
-                                                                                               WarningCase.JOINABLE_LEAK.getType());
-                                                               // AnalyzerManager.getWarningChecker().removeData(
-                                                               // ThreadPageLabels.THREAD_CHART_NAME_TID
-                                                               // + callEvent.getTid(),
-                                                               // WarningCase.JOINABLE_LEAK.getType());
-                                                               callEvent.getChartItem().setY(DAChartSeriesItem.SERIES_ARROW_RIGHT);
-                                                               callEvent.getChartItem().setBarWidth(
-                                                                               Double.parseDouble(event.getTid()));
-                                                       }
-                                                       callEventQueue.remove(i);
-                                                       return true;
-                                               }
-                                       } else {
-                                               String callerPthreadID = callEvent.getCallID();
-                                               String eventPthreadID = Long.toString(tData.getPThreadId());
-                                               if (eventPthreadID.equals(callerPthreadID)) {
-                                                       event.setCallerTid(callEvent.getTid());
-                                                       if (null == callEvent.getChartItem()) {
-                                                               callEvent.setCallerTid(event.getTid());
-                                                       } else {
-                                                               callEvent.getChartItem().setY(DAChartSeriesItem.SERIES_ARROW_RIGHT);
-                                                               callEvent.getChartItem().setBarWidth(
-                                                                               Double.parseDouble(event.getTid()));
-                                                       }
-                                                       callEventQueue.remove(i);
-                                                       return true;
-                                               }
-                                       }
-                               }
-                       }
-                       return false;
-               } else {
-                       return true;
-               }
-       }
-
-       private ThreadPageThreadData findParentData(String tid) {
-               int size = rows.size();
-               ThreadPageThreadData ret;
-               for (int i = 0; i < size; i++) {
-                       ret = rows.get(i);
-                       if (ret.getTid().equals(tid)) {
-                               return ret;
-                       }
-               }
-               return null;
-       }
-
-       private void chartFilteringByPid() {
-               if (null == board || null == board.getItemList()) {
-                       return;
-               }
-               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
-               boolean isCheck = false;
-
-               if (eventQueue.size() > 0) {
-                       isCheck = true;
-               }
-
-               if (preSelectionPid != -1 && preSelectionPid != selectedPid) {
-                       isCheck = true;
-               }
-
-               if (isCheck) {
-                       int parentSize = board.getItemList().getItemSize();
-                       for (int i = 0; i < parentSize; i++) {
-                               DAChartBoardItem parentItem = board.getItemList().get(i);
-                               /*
-                                * int childSize = parentItem.getChildItemList().getItemSize(); int hidedCount = 0;
-                                * for (int j = 0; j < childSize; j++) { DAChartBoardItem childItem =
-                                * parentItem.getChildItemList() .get(j); int itemPid = getItemPid(childItem); if
-                                * (itemPid == selectedPid) { parentItem.getChildItemList().showItem(j);
-                                * board.showItem(i); } else if (selectedPid == 0) {
-                                * parentItem.getChildItemList().showItem(j); board.showItem(i); } else if (itemPid
-                                * == -1) { board.showItem(i); } else { parentItem.getChildItemList().hideItem(j);
-                                * hidedCount++; } } if (childSize == 0) { int itemPid = getItemPid(parentItem); if
-                                * (itemPid == selectedPid) { board.showItem(i); } else if (selectedPid == 0) {
-                                * board.showItem(i); } else if (itemPid == -1) { board.showItem(i); } else {
-                                * board.hideItem(i); hidedCount++; } } else { if (childSize == hidedCount) {
-                                * board.hideItem(i); } }
-                                */
-                               int itemPid = getItemPid(parentItem);
-                               if (itemPid == selectedPid) {
-                                       board.showItem(i);
-                               } else if (selectedPid == 0) {
-                                       board.showItem(i);
-                               } else if (itemPid == -1) {
-                                       board.showItem(i);
-                               } else {
-                                       board.hideItem(i);
-                               }
-                       }
-               }
-               preSelectionPid = selectedPid;
-       }
-
-       private int getItemPid(DAChartBoardItem item) {
-               int pid = -1;
-               if (item.getData() instanceof ThreadPageData) {
-                       ThreadPageData threadPageData = (ThreadPageData) item.getData();
-                       pid = Integer.parseInt(threadPageData.getPid());
-               }
-               return pid;
-       }
-
-       // TODO: syncDataManager has same method : move this method to proper class
-       private int getSortObject(DAChartBoardItem item) {
-               Object sortObj = item.getSortObject();
-               if (sortObj instanceof Integer) {
-                       return (Integer) sortObj;
-               } else { // should never go here
-                       return -1;
-               }
-       }
-
-       public void checkUpdate() {
-               if (false == hasUpdate && preSelectionPid == ToolbarArea.getInstance().getSelectedPid()) {
-                       return;
-               } else {
-                       hasUpdate = false;
-               }
-
-               int size = rowsQueue.size();
-               if (size > 0) {
-                       ThreadPageThreadData data;
-                       for (int i = 0; i < size; i++) {
-                               data = rowsQueue.get(0);
-                               // sort chart items at each insertion
-                               createBoardItem(data, new Comparator<DAChartBoardItem>() {
-                                       public int compare(DAChartBoardItem item1, DAChartBoardItem item2) {
-                                               return getSortObject(item1) - getSortObject(item2);
-                                       }
-                               });
-                               rows.add(data);
-                               rowsQueue.remove(0);
-                       }
-               }
-
-               chartFilteringByPid();
-
-               size = eventQueue.size();
-               if (size > 0) {
-                       ThreadPageThreadData data;
-                       ThreadPageThreadDataEvent event;
-                       int remainCalleeEventCount = 0;
-                       for (int i = 0; i < size; i++) {
-                               event = eventQueue.get(remainCalleeEventCount);
-                               if (false == checkPairEvent(event)) {
-                                       remainCalleeEventCount++;
-                               } else {
-                                       data = findParentData(event.getTid());
-                                       if (null != data) {
-                                               data.pushEvent(event);
-                                               event.setThreadDataID(data.getThreadDataID());
-                                               // save to DB
-                                               ThreadEventInserter.pushThreadEvent(event);
-                                               ThreadEventInserter.startThread();
-                                               eventQueue.remove(remainCalleeEventCount);
-                                       } else {
-                                               remainCalleeEventCount++;
-                                       }
-                               }
-                       }
-               }
-
-               /* load ThreadPageSyncData when open trace */
-               size = syncQueue.size();
-               if (size > 0) {
-                       ThreadPageThreadData data;
-                       ThreadPageSyncData sync;
-                       for (int i = 0; i < size; i++) {
-                               sync = syncQueue.get(0);
-                               data = findParentData(sync.getTid());
-                               if (null != data) {
-                                       createSyncBoardItem(data, sync);
-                                       data.pushSync(sync);
-                                       data.setHasUpdate();
-                               }
-                               syncQueue.remove(0);
-                       }
-               }
-
-               size = syncEventQueue.size();
-               if (size > 0) {
-                       ThreadPageThreadData data;
-                       ThreadPageSyncDataEvent event;
-                       ThreadPageSyncData sync;
-                       for (int i = 0; i < size; i++) {
-                               event = syncEventQueue.get(0);
-                               String pid = Integer.toString(event.getContents().getPid());
-                               data = findParentData(event.getTid());
-                               if (null != data) {
-                                       String syncVal = event.getSyncVal();
-                                       sync = data.findSyncData(syncVal);
-                                       if (null == sync) {
-                                               Integer syncAttrTypeInt = syncAttrMap.get(syncVal);
-                                               String syncAttrType;
-                                               if (null != syncAttrTypeInt) {
-                                                       syncAttrType = ThreadPageSyncDataManager
-                                                                       .getAttrTypeByTypeInt(syncAttrTypeInt);
-                                               } else {
-                                                       syncAttrType = ThreadPageSyncDataManager.getAttrTypeString(event);
-                                               }
-
-                                               sync = new ThreadPageSyncData(event.getType(), syncVal, pid,
-                                                               event.getTid(), syncAttrType, ThreadPageSyncData.THREAD_CHILD);
-                                               sync.setParentID(data.getThreadDataID());
-                                               // save to DB
-                                               SyncDataInserter.pushSyncData(sync);
-                                               SyncDataInserter.startThread();
-                                               createSyncBoardItem(data, sync);
-                                               data.pushSync(sync);
-                                       }
-                                       sync.pushEvent(event);
-                                       event.setSyncDataID(sync.getSyncDataID());
-                                       // save to DB
-                                       SyncEventInserter.pushSyncEvent(event);
-                                       SyncEventInserter.startThread();
-                                       // save syncAPI to DB
-                                       if (ThreadPageSyncData.isSyncApi(event.getApiType())) {
-                                               SyncAPIInserter.pushSyncEvent((SyncData) event.getContents());
-                                               SyncAPIInserter.startThread();
-                                       }
-                                       data.setHasUpdate();
-                               }
-                               syncEventQueue.remove(0);
-                       }
-               }
-
-               size = rows.size();
-               if (size > 0) {
-                       ThreadPageThreadData data;
-                       for (int i = 0; i < size; i++) {
-                               data = rows.get(i);
-                               data.checkUpdate();
-                       }
-               }
-       }
-
-       public int getItemIndexByTid(String tid) {
-               int itemSize = rows.size();
-               for (int i = 0; i < itemSize; i++) {
-                       if (rows.get(i).getTid().equals(tid)) {
-                               return i;
-                       }
-               }
-               return -1;
-       }
-
-       public void clear() {
-               rows.clear(); // FIXME : clear chart
-               rowsQueue.clear();
-               eventQueue.clear();
-               callEventQueue.clear();
-               threadAttrMap.clear();
-               syncAttrMap.clear();
-               callRowsQueue.clear();
-               syncEventQueue.clear();
-               threadFuncMap.clear();
-               hasUpdate = false;
-               ThreadPageThreadData.clear(); // reset internal seq number
-       }
-}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageData.java
new file mode 100644 (file)
index 0000000..d6da578
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.type;
+
+public abstract class ThreadPageData {
+       private String pid;
+       private int tid;
+       private int type;
+       private String key;
+       private String attrType;
+
+       public ThreadPageData(int type, String name, String pid, int tid, String attrType) {
+               setType(type);
+               setKey(name);
+               setPid(pid);
+               setTid(tid);
+               setAttrType(attrType);
+       }
+
+       public int getTid() {
+               return tid;
+       }
+
+       public void setTid(int tid) {
+               this.tid = tid;
+       }
+
+       public String getPid() {
+               return pid;
+       }
+
+       public void setPid(String pid) {
+               this.pid = pid;
+       }
+
+       public int getType() {
+               return type;
+       }
+
+       public void setType(int type) {
+               this.type = type;
+       }
+
+       public String getKey() {
+               return key;
+       }
+
+       public void setKey(String name) {
+               this.key = name;
+       }
+
+       public String getAttrType() {
+               return attrType;
+       }
+
+       public void setAttrType(String attrType) {
+               this.attrType = attrType;
+       }
+
+}
\ No newline at end of file
@@ -24,7 +24,7 @@
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.ui.thread;
+package org.tizen.dynamicanalyzer.ui.thread.type;
 
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.utils.Formatter;
@@ -32,13 +32,13 @@ import org.tizen.dynamicanalyzer.utils.Formatter;
 public abstract class ThreadPageDataEvent implements Cloneable {
        private LogData contents;
        private long time = -1;
-       private String tid = null;
+       private int tid = -1;
        private int apiType = -1;
        private String tooltip = null;
        private long errorNum = -1;
 
-       public ThreadPageDataEvent(long time, String tid, int apiType,
-                       String tooltip, long errorNum, LogData contents) {
+       public ThreadPageDataEvent(long time, int tid, int apiType, String tooltip, long errorNum,
+                       LogData contents) {
                setTime(time);
                setTid(tid);
                setApiType(apiType);
@@ -46,7 +46,7 @@ public abstract class ThreadPageDataEvent implements Cloneable {
                setErrorNum(errorNum);
                setContents(contents);
        }
-       
+
        public ThreadPageDataEvent clone() throws CloneNotSupportedException {
                ThreadPageDataEvent dataEvent = (ThreadPageDataEvent) super.clone();
                dataEvent.setContents(contents);
@@ -55,7 +55,7 @@ public abstract class ThreadPageDataEvent implements Cloneable {
                dataEvent.setApiType(apiType);
                dataEvent.setTooltipContent(tooltip);
                dataEvent.setErrorNum(errorNum);
-               
+
                return dataEvent;
        }
 
@@ -69,22 +69,22 @@ public abstract class ThreadPageDataEvent implements Cloneable {
 
        public long getTime() {
                return time;
-       }       
+       }
 
        public void setTime(long time) {
                this.time = time;
        }
-       
+
        public double getDoubleTime() {
                double dTime = Formatter.longTimeToDoubleTime(time);
                return dTime;
        }
 
-       public String getTid() {
+       public int getTid() {
                return tid;
        }
 
-       public void setTid(String tid) {
+       public void setTid(int tid) {
                this.tid = tid;
        }
 
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageSyncData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageSyncData.java
new file mode 100644 (file)
index 0000000..31cc95c
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.type;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.util.Logger;
+
+public class ThreadPageSyncData extends ThreadPageData {
+       private List<ThreadPageSyncData> children = new ArrayList<ThreadPageSyncData>();
+
+       public static final byte SYNC_PARENT = 0;
+       public static final byte SYNC_CHILD = 1;
+       public static final byte THREAD_CHILD = 2;
+
+       private static int internalSeq = 0;
+       private int syncDataID = -1;
+       private byte syncDataType = -1;
+       private int parentID = -1;
+
+       public ThreadPageSyncData(int type, String name, String pid, int tid, String attrType,
+                       byte syncDataType) {
+               super(type, name, pid, tid, attrType);
+               this.syncDataType = syncDataType;
+               syncDataID = internalSeq++;
+       }
+
+       public ThreadPageSyncData(int id, int pid, int tid, int type, long syncValue, String attrType,
+                       byte syncDataType, int parentID) {
+               super(type, String.valueOf(syncValue), String.valueOf(pid), tid, attrType);
+               this.syncDataID = id;
+               this.syncDataType = syncDataType;
+               this.parentID = parentID;
+       }
+
+       public void pushSync(ThreadPageSyncData sync) {
+               children.add(sync);
+       }
+
+       public ThreadPageSyncData findChildData(int tId) {
+               int size = children.size();
+               ThreadPageSyncData ret;
+               for (int i = 0; i < size; i++) {
+                       ret = children.get(i);
+                       if (ret.getTid() == tId) {
+                               return ret;
+                       }
+               }
+               return null;
+       }
+
+       public List<ThreadPageSyncData> getChildren() {
+               return children;
+       }
+
+       public static boolean isSyncApi(int apiType) {
+               if (apiType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START) {
+                       return false;
+               }
+               if (apiType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START) {
+                       return false;
+               }
+               return true;
+       }
+
+       public String getTypeString() {
+               switch (getType()) {
+               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
+                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MUTEX;
+               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
+                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MONITOR;
+               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
+                       return ThreadPageLabels.SYNC_TYPE_TIZEN_SEMAPHORE;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_MUTEX;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_COND_VARIABLE;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_RWLOCK;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_SPINLOCK;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_BARRIER;
+               default:
+                       Logger.error("unknown sync type!!");
+                       return CommonConstants.EMPTY;
+               }
+       }
+
+       public int getSyncDataID() {
+               return syncDataID;
+       }
+
+       public byte getSyncDataType() {
+               return syncDataType;
+       }
+
+       public int getParentID() {
+               return parentID;
+       }
+
+       public void setParentID(int parentID) {
+               this.parentID = parentID;
+       }
+
+       public static void clear() {
+               internalSeq = 0;
+       }
+}
\ No newline at end of file
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.ui.thread.sync;
+package org.tizen.dynamicanalyzer.ui.thread.type;
 
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageDataEvent;
 
 public class ThreadPageSyncDataEvent extends ThreadPageDataEvent {
        private String syncVal;
        private int type = -1;
        private int syncDataID = -1;
+       private long blockEndTime = -1;
 
-       public ThreadPageSyncDataEvent(String syncVal, int type, int apiType,
-                       long time, String tid, String tooltip, long errorNum,
-                       LogData contents) {
+       public ThreadPageSyncDataEvent(String syncVal, int type, int apiType, long time, int tid,
+                       String tooltip, long errorNum, LogData contents) {
                super(time, tid, apiType, tooltip, errorNum, contents);
                this.syncVal = syncVal;
                this.type = type;
        }
-       
-       // using open trace
-       public ThreadPageSyncDataEvent(long time, int apiType, String tooltip, 
-                       long errorNum, String syncVal) {
-               super(time, null, apiType, tooltip, errorNum, null);
+
+       public ThreadPageSyncDataEvent(long time, int apiType, String tooltip, long errorNum,
+                       String syncVal) {
+               super(time, -1, apiType, tooltip, errorNum, null);
                this.syncVal = syncVal;
        }
-       
+
        public ThreadPageSyncDataEvent clone() throws CloneNotSupportedException {
                ThreadPageSyncDataEvent syncDataEvent = (ThreadPageSyncDataEvent) super.clone();
                syncDataEvent.setSyncVal(syncVal);
                syncDataEvent.setType(type);
                syncDataEvent.setSyncDataID(syncDataID);
-               
                return syncDataEvent;
        }
 
        public String getSyncVal() {
                return syncVal;
        }
-       
+
        public void setSyncVal(String syncVal) {
                this.syncVal = syncVal;
        }
@@ -69,16 +67,24 @@ public class ThreadPageSyncDataEvent extends ThreadPageDataEvent {
        public int getType() {
                return type;
        }
-       
+
        public void setType(int type) {
                this.type = type;
        }
-       
+
        public int getSyncDataID() {
                return syncDataID;
        }
-       
+
        public void setSyncDataID(int syncDataID) {
                this.syncDataID = syncDataID;
        }
+
+       public long getBlockEndTime() {
+               return blockEndTime;
+       }
+
+       public void setBlockEndTime(long blockEndTime) {
+               this.blockEndTime = blockEndTime;
+       }
 }
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageThreadData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/type/ThreadPageThreadData.java
new file mode 100644 (file)
index 0000000..28802b7
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
+ * WooJin Jung <woojin2.jung@samsung.com>
+ * yeongtaik byeon <yeongtaik.byeon@samsung.com>
+ * Juyoung Kim <j0.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.dynamicanalyzer.ui.thread.type;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.Global;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
+import org.tizen.dynamicanalyzer.util.Logger;
+import org.tizen.dynamicanalyzer.utils.Formatter;
+
+public class ThreadPageThreadData extends ThreadPageData {
+       private List<ThreadPageSyncData> syncs = new ArrayList<ThreadPageSyncData>();
+       private long StartTime = -1;
+       private long EndTime = -1;
+       private int threadFuncID;
+       private String threadClassName = CommonConstants.EMPTY;
+
+       public static final byte TYPE_MAIN = 0;
+       public static final byte TYPE_PTHREAD = 1;
+       public static final byte TYPE_TIZEN = 2;
+
+       private static int internalSeq = 0;
+       private int threadDataID = -1;
+
+       public ThreadPageThreadData(int type, String pid, int tid, String attrType, int funcID) {
+               super(type, String.valueOf(tid), pid, tid, attrType);
+               this.threadFuncID = funcID;
+               threadDataID = internalSeq++;
+       }
+
+       public ThreadPageThreadData(int id, int pid, int tid, int threadType, String attrType,
+                       long startTime, long endTime, int functionID, String className) {
+               super(threadType, String.valueOf(tid), String.valueOf(pid), tid, attrType);
+               this.threadDataID = id;
+               this.threadFuncID = functionID;
+               this.StartTime = startTime;
+               this.EndTime = endTime;
+               this.threadClassName = className;
+       }
+
+       public int getThreadFuncID() {
+               return threadFuncID;
+       }
+
+       public String getThreadFuncName() {
+               if (threadFuncID == -1) {
+                       return CommonConstants.EMPTY;
+               } else {
+                       return Global.getFunctionName(threadFuncID);
+               }
+       }
+
+       public String getThreadClassName() {
+               return threadClassName;
+       }
+
+       public void setThreadClassName(String className) {
+               threadClassName = className;
+       }
+
+       public void pushSync(ThreadPageSyncData sync) {
+               syncs.add(sync);
+       }
+
+       public ThreadPageSyncData findSyncData(String syncVal) {
+               int size = syncs.size();
+               ThreadPageSyncData sync;
+               for (int i = 0; i < size; i++) {
+                       sync = syncs.get(i);
+                       if (sync.getKey().equals(syncVal)) {
+                               return sync;
+                       }
+               }
+               return null;
+       }
+
+       public String getTypeString() {
+               switch (getType()) {
+               case TYPE_MAIN:
+                       return ThreadPageLabels.THREAD_ITEM_TYPE_MAIN;
+               case TYPE_PTHREAD:
+                       return ThreadPageLabels.THREAD_ITEM_TYPE_PTHREAD;
+               case TYPE_TIZEN:
+                       return ThreadPageLabels.THREAD_ITEM_TYPE_TIZEN;
+               default:
+                       Logger.error("unknown thread type!!");
+                       return CommonConstants.EMPTY;
+               }
+       }
+
+       public long getStartTime() {
+               return StartTime;
+       }
+
+       public void setStartTime(long startTime) {
+               StartTime = startTime;
+       }
+
+       public String getStartTimeString() {
+               if (StartTime == -1) {
+                       return null;
+               } else {
+                       double startTime = Formatter.longTimeToDoubleTime(StartTime);
+                       return String.valueOf(startTime);
+               }
+       }
+
+       public long getEndTime() {
+               return EndTime;
+       }
+
+       public void setEndTime(long endTime) {
+               EndTime = endTime;
+       }
+
+       public String getEndTimeString() {
+               if (EndTime == -1) {
+                       return null;
+               } else {
+                       double endTime = Formatter.longTimeToDoubleTime(EndTime);
+                       return String.valueOf(endTime);
+               }
+       }
+
+       public int getThreadDataID() {
+               return threadDataID;
+       }
+
+       public static void clear() {
+               internalSeq = 0;
+       }
+}
\ No newline at end of file
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * Hyunjong Park <phjwithyou.park@samsung.com>
  * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  * - S-Core Co., Ltd
  * 
  */
-package org.tizen.dynamicanalyzer.ui.thread.thread;
+package org.tizen.dynamicanalyzer.ui.thread.type;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
-import org.tizen.dynamicanalyzer.ui.thread.ThreadPageDataEvent;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
 
 public class ThreadPageThreadDataEvent extends ThreadPageDataEvent {
        public static final int TYPE_API = 0;
@@ -40,9 +39,8 @@ public class ThreadPageThreadDataEvent extends ThreadPageDataEvent {
        public static final int TYPE_LOAD = 2;
        private int eventType = -1;
        private int threadType = -1;
-       private DAChartSeriesItem chartItem;
        private String callID = null;
-       private String callerTid = null;
+       private int callerTid = -1;
        private int threadDataID = -1;
 
        ArrayList<String> joinAPIs = new ArrayList<String>(Arrays.asList(
@@ -50,7 +48,7 @@ public class ThreadPageThreadDataEvent extends ThreadPageDataEvent {
                        ThreadPageLabels.THREAD_API_TIZEN_JOIN));
 
        public ThreadPageThreadDataEvent(int eventType, int threadType,
-                       int apiType, long time, String tid, String tooltip, long errorNum,
+                       int apiType, long time, int tid, String tooltip, long errorNum,
                        LogData contents) {
                super(time, tid, apiType, tooltip, errorNum, contents);
                setEventType(eventType);
@@ -65,14 +63,6 @@ public class ThreadPageThreadDataEvent extends ThreadPageDataEvent {
                this.eventType = eventType;
        }
 
-       public DAChartSeriesItem getChartItem() {
-               return chartItem;
-       }
-
-       public void setChartItem(DAChartSeriesItem chartItem) {
-               this.chartItem = chartItem;
-       }
-
        public int getThreadType() {
                return threadType;
        }
@@ -89,11 +79,11 @@ public class ThreadPageThreadDataEvent extends ThreadPageDataEvent {
                this.callID = callID;
        }
 
-       public String getCallerTid() {
+       public int getCallerTid() {
                return callerTid;
        }
 
-       public void setCallerTid(String callerTid) {
+       public void setCallerTid(int callerTid) {
                this.callerTid = callerTid;
        }
 
index 92b9873..9810000 100644 (file)
@@ -53,6 +53,11 @@ public class FunctionEntryDBTable extends DBTable {
        public static final String SELECT_QUERY = 
                        "select " + SELECT_COLUMN + " from " + TABLENAME + 
                        "  where " + COLUMN.STARTTIME.name + " >= %s and " + COLUMN.STARTTIME.name + " <= %s";
+       // to make callstack for sample, probe
+       public static final String USERCALLSTACK_QUERY =
+                       "select " + COLUMN.SEQ.name + " from " + TABLENAME + 
+                       " where " + COLUMN.STARTTIME.name + " = (select max( " + COLUMN.STARTTIME.name +
+                       ") from " + TABLENAME + " where " + COLUMN.STARTTIME.name + " <= %s )";
        
        public enum COLUMN {
                SEQ(0, "SEQNUMBER"),
index 4407dd2..2eef100 100644 (file)
@@ -56,6 +56,11 @@ public class FunctionExitDBTable extends DBTable {
                        CommonConstants.COMMA + FunctionEntryDBTable.TABLENAME + " where " + 
                        COLUMN.ENTRYSEQ.name + CommonConstants.EQUAL + FunctionEntryDBTable.COLUMN.SEQ.name +
                        " and " + COLUMN.ENDTIME.name + " >= %s and " + COLUMN.ENDTIME.name + " <= %s";
+       // to make callstack for sample, probe
+       public static final String USERCALLSTACK_QUERY =
+                       "select " + COLUMN.EXITSEQ.name + " from " + TABLENAME + 
+                       " where " + COLUMN.ENDTIME.name + " = (select max( " + COLUMN.ENDTIME.name +
+                       ") from " + TABLENAME + " where " + COLUMN.ENDTIME.name + " <= %s )";
        
        public enum COLUMN {
                ENTRYSEQ(0, "EntrySEQNUMBER"),
index 06440a2..ad58cc1 100644 (file)
@@ -29,6 +29,8 @@ package org.tizen.dynamicanalyzer.ui.timeline.chart;
 
 import java.io.File;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.swt.SWTException;
 import org.eclipse.swt.graphics.Image;
@@ -50,7 +52,8 @@ public class ScreenshotChart extends TimelineChart {
        public static ScreenshotChart instance = null;
 
        private DAChartSeries screenshotSeries;
-
+       private Map<String, Image> imageMap = new ConcurrentHashMap<String, Image>();
+       
        public static ScreenshotChart getInstance() {
                if (instance == null) {
                        instance = new ScreenshotChart();
@@ -88,7 +91,7 @@ public class ScreenshotChart extends TimelineChart {
        public DAChart getChart() {
                return chart;
        }
-
+       
        @Override
        public void inputChartSeries(List<Object> dataList) {
                screenshotSeries.clear();
@@ -102,29 +105,44 @@ public class ScreenshotChart extends TimelineChart {
                                / TimelineConstants.MEGA_DOUBLE;
                        String fileName = (String)row.get(ScreenShotDBTable.COLUMN.IMAGE_FILE_PATH.ordinal());
                        int orientation = (Integer)row.get(ScreenShotDBTable.COLUMN.IMAGE_ORIENTATION.ordinal());
-               if (Global.getProject() == null) {
-                       return;
-               }
-                       String imagePath = Global.getProject().getSavePath()
-                               + File.separator + AnalyzerConstants.IMAGE_FOLDER_NAME
-                               + File.separator
-                               + AnalyzerConstants.SMALL_IMAGE_FOLDER_NAME
-                               + File.separator 
-                               + fileName;
-                       int yPostion;
-                       if (orientation == 0 || orientation == 180) { //$NON-NLS-1$ //$NON-NLS-2$
-                               yPostion = 10;
-                       } else {
-                               yPostion = 23;
-                       }
-                       
-                       Thread createImageThread = new Thread(null, new CreateImageThread(
-                               imagePath, time, yPostion), "small image getter thread");
-                       createImageThread.start();
+                               if (Global.getProject() == null) {
+                                       return;
+                               }
+                                       String imagePath = Global.getProject().getSavePath()
+                                               + File.separator + AnalyzerConstants.IMAGE_FOLDER_NAME
+                                               + File.separator
+                                               + AnalyzerConstants.SMALL_IMAGE_FOLDER_NAME
+                                               + File.separator 
+                                               + fileName;
+                                       int yPosition;
+                                       if (orientation == 0 || orientation == 180) { //$NON-NLS-1$ //$NON-NLS-2$
+                                               yPosition = 10;
+                                       } else {
+                                               yPosition = 23;
+                                       }
+                                       
+                                       /*
+                                        * 1 image need 1 thread.
+                                        */
+                                       if (imageMap.containsKey(imagePath)) {
+                                               Image image = imageMap.get(imagePath);
+                                               screenshotSeries.addSeriesItem(new DAChartSeriesItem(time,
+                                                               yPosition, image));
+                                       } else {
+                                               Thread createImageThread = new Thread(null, new CreateImageThread(
+                                                               imagePath, time, yPosition), "small image getter thread");
+                                               createImageThread.start();
+                                       }
                    }
                } catch (NumberFormatException ne) {
-                       ne.printStackTrace();
-               }
+                       ne.printStackTrace();
+               }
+       }
+
+       @Override
+       public void clear() {
+               super.clear();
+               imageMap.clear();
        }
        
        private class CreateImageThread extends Thread {
@@ -141,10 +159,10 @@ public class ScreenshotChart extends TimelineChart {
                public void run() {
                        Image image = null;
                        int count = 0;
-
                        while (true && count < 5) {
                                try {
                                        image = new Image(Display.getDefault(), imagePath);
+                                       imageMap.put(imagePath, image);
                                        break;
                                } catch (SWTException se) {
                                        count++;
@@ -160,6 +178,7 @@ public class ScreenshotChart extends TimelineChart {
                                screenshotSeries.addSeriesItem(new DAChartSeriesItem(time,
                                                yPosition, image));
                        } else {
+                               imageMap.put(imagePath, ImageResources.NO_IMAGE_SMALL);
                                screenshotSeries.addSeriesItem(new DAChartSeriesItem(time,
                                                yPosition, ImageResources.NO_IMAGE_SMALL));
                        }
index 12923cb..ad5c4bb 100644 (file)
@@ -52,7 +52,10 @@ public class UIEventChart extends TimelineChart {
        private static UIEventChart instance = null;
 
        private DAChartSeries touchEventSeries;
-       private DAChartSeries gestureEventSeries;
+       /*
+        * TODO code about Gesture is commented. it will be reopen when it implemented.
+        */
+//     private DAChartSeries gestureEventSeries;
        private DAChartSeries orientationEventSeries;
 
        private static final int TYPE_TOUCH = 2;
@@ -92,17 +95,17 @@ public class UIEventChart extends TimelineChart {
                                TimelineChartLabels.UI_EVENT_CHART_SERIES_NAME_TOUCH,
                                DAChartSeries.SERIES_STYLE_MULTI_CHECK_BAR,
                                ColorResources.SERIES_COLOR_UI_EVENT_TOUCH);
-               gestureEventSeries = new DAChartSeries(
-                               TimelineChartLabels.UI_EVENT_CHART_SERIES_NAME_GESTURE,
-                               DAChartSeries.SERIES_STYLE_MULTI_CHECK_BAR,
-                               ColorResources.SERIES_COLOR_UI_EVENT_GESTURE);
+//             gestureEventSeries = new DAChartSeries(
+//                             TimelineChartLabels.UI_EVENT_CHART_SERIES_NAME_GESTURE,
+//                             DAChartSeries.SERIES_STYLE_MULTI_CHECK_BAR,
+//                             ColorResources.SERIES_COLOR_UI_EVENT_GESTURE);
                orientationEventSeries = new DAChartSeries(
                                TimelineChartLabels.UI_EVENT_CHART_SERIES_NAME_ORIENTATION,
                                DAChartSeries.SERIES_STYLE_MULTI_CHECK_BAR,
                                ColorResources.SERIES_COLOR_UI_EVENT_ORIENTATION);
 
                touchEventSeries.setFont(FontResources.TIMELINE_UIEVENT_FONT);
-               gestureEventSeries.setFont(FontResources.TIMELINE_UIEVENT_FONT);
+//             gestureEventSeries.setFont(FontResources.TIMELINE_UIEVENT_FONT);
                orientationEventSeries.setFont(FontResources.TIMELINE_UIEVENT_FONT);
        }
 
@@ -130,7 +133,7 @@ public class UIEventChart extends TimelineChart {
                item.useExpand(false);
 
                chart.addSeries(touchEventSeries);
-               chart.addSeries(gestureEventSeries);
+//             chart.addSeries(gestureEventSeries);
                chart.addSeries(orientationEventSeries);
 
                setChartStyle();
@@ -141,7 +144,7 @@ public class UIEventChart extends TimelineChart {
        @Override
        public void inputChartSeries(List<Object> dataList) {
                touchEventSeries.clear();
-               gestureEventSeries.clear();
+//             gestureEventSeries.clear();
                orientationEventSeries.clear();
                
                @SuppressWarnings("unchecked")
@@ -167,10 +170,10 @@ public class UIEventChart extends TimelineChart {
                                touchEventSeries.addSeriesItem(new DAChartSeriesItem(time, 0,
                                                info));
                                break;
-                       case TYPE_GESTURE:
-                               gestureEventSeries.addSeriesItem(new DAChartSeriesItem(time, 0,
-                                               getGestureInfo(detailType, pointX, pointY, info1, info2)));
-                               break;
+//                     case TYPE_GESTURE:
+//                             gestureEventSeries.addSeriesItem(new DAChartSeriesItem(time, 0,
+//                                             getGestureInfo(detailType, pointX, pointY, info1, info2)));
+//                             break;
                        case TYPE_ORIENTATION:
                                orientationEventSeries.addSeriesItem(new DAChartSeriesItem(
                                                time, 0, TimelineChartLabels.UIEVENT_ORIENTATION
index a62167d..d0884f3 100755 (executable)
@@ -63,6 +63,7 @@ import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
 import org.tizen.dynamicanalyzer.shortcut.ShortCutManager;
+import org.tizen.dynamicanalyzer.ui.common.explorer.DeviceExplorerDialog;
 import org.tizen.dynamicanalyzer.ui.page.BaseView;
 import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage;
 import org.tizen.dynamicanalyzer.ui.toolbar.opentrace.OpenTraceDialog;
@@ -81,6 +82,7 @@ import org.tizen.dynamicanalyzer.widgets.combo.DACustomComboSelectionListener;
 import org.tizen.dynamicanalyzer.widgets.da.base.DADialog;
 import org.tizen.dynamicanalyzer.widgets.timer.TimerClock;
 import org.tizen.sdblib.IDevice;
+import org.tizen.sdblib.service.FileEntry;
 
 public class ToolbarArea {
        public static final int START_BUTTON = 0;
@@ -123,9 +125,6 @@ public class ToolbarArea {
 
        private static final int TIMER_WIDTH = 122;
 
-       public static boolean bThreadPageWork = false; // FIXME
-       public static boolean bUIPageWork = false; // FIXME
-
        public static final int TOOLBAR_STATE_RECORDING = 0;
        public static final int TOOLBAR_STATE_READY = 1;
 
@@ -282,7 +281,7 @@ public class ToolbarArea {
 
                        @Override
                        public void selectionEvent(DACustomCombo combo) {
-                               String appName = combo.getText();
+                               final String appName = combo.getText();
                                if (null != appName && !appName.isEmpty()) {
                                        boolean enablestart = true;
 
@@ -303,7 +302,23 @@ public class ToolbarArea {
                                                                enablestart = false;
                                                        }
                                                } else if (appName.equals(AnalyzerConstants.COMMON_EXECUTABLE_LABEL)) {
-                                                       // TODO : implement to select common executable
+                                                       Shell shell = WorkbenchUtil.getWorkbenchWindow().getShell();
+                                                       DeviceExplorerDialog dialog = new DeviceExplorerDialog(shell, false);
+                                                       dialog.setPermissionFilter("111");
+                                                       Object result = dialog.open();
+                                                       if (result != null) {
+                                                               @SuppressWarnings("unchecked")
+                                                               List<FileEntry> files = (List<FileEntry>) result;
+                                                               if (files.size() > 0) {
+                                                                       String execpath = files.get(0).getFullPath();
+                                                                       selectedPkg.getMainApp().setInfo(AppInfo.PROPERTY.EXEC.index,
+                                                                                       execpath);
+                                                               } else {
+                                                                       enablestart = false;
+                                                               }
+                                                       } else {
+                                                               enablestart = false;
+                                                       }
                                                }
 
                                                Global.setCurrentApplication(selectedPkg);
@@ -315,10 +330,7 @@ public class ToolbarArea {
                                        }
 
                                        if (enablestart && null != Global.getCurrentDeviceInfo()) {
-                                               // AnalyzerUtil
-                                               // .setRecordState(RecordStateSourceProvider.RECORD_READY);
                                                AnalyzerManager.setRunningState(false);
-                                               // startButton.setButtonEnabled(true);
                                                setStartButtonState(true);
                                                setRepalyButtonEnable(true);
                                        }
index 1454d27..25697eb 100644 (file)
@@ -56,8 +56,8 @@ import org.tizen.dynamicanalyzer.swap.platform.ui.BinarySettingProgressManager;
 import org.tizen.dynamicanalyzer.swap.platform.ui.InputRow;
 import org.tizen.dynamicanalyzer.swap.platform.ui.LoadSettingDialog;
 import org.tizen.dynamicanalyzer.swap.platform.ui.SaveSettingDialog;
-import org.tizen.dynamicanalyzer.swap.platform.ui.DeviceExplorer.DeviceExplorerDilaog;
-import org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer.FileExplorerDialog;
+import org.tizen.dynamicanalyzer.ui.common.explorer.DeviceExplorerDialog;
+import org.tizen.dynamicanalyzer.ui.common.explorer.FileExplorerDialog;
 import org.tizen.dynamicanalyzer.ui.toolbar.ConfigureManager;
 import org.tizen.dynamicanalyzer.util.CommonUtil;
 import org.tizen.dynamicanalyzer.util.Logger;
@@ -93,7 +93,7 @@ public class BinarySettingsPage extends DAPageComposite {
 
                @Override
                public void handleClickEvent(DACustomButton button) {
-                       DeviceExplorerDilaog dialog = new DeviceExplorerDilaog(getShell());
+                       DeviceExplorerDialog dialog = new DeviceExplorerDialog(getShell(), true);
                        // dialog.setFilter(".so");
                        Object result = dialog.open();
                        if (result != null) {
index dc2528e..b39590e 100644 (file)
@@ -41,6 +41,7 @@ import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
+import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.communicator.DACommunicator;
 import org.tizen.dynamicanalyzer.nl.AnalyzerLabels;
 import org.tizen.dynamicanalyzer.nl.ConfigureLabels;
@@ -328,6 +329,41 @@ public class SettingDialog extends DAMessageBox {
                shell.open();
                return true;
        }
+       
+       private void createBinarySettingPage() {
+               DABaseComposite binarySettings = new SettingDialogBinarySettingsPage(
+                               tabView.getContentComposite(), SWT.NONE);
+               tabView.addView(binarySettings, false);
+
+               
+               // binarySettings tab is selected, the close button will be shown.
+               // ok and cancel button is hidden
+               binarySettings.addListener(SWT.Show, new Listener() {
+
+                       @Override
+                       public void handleEvent(Event event) {
+                               Logger.debug("binary settings show");
+                               cancelButton.setText(WidgetLabels.CLOSE);
+                               FormData data = (FormData) okButton.getLayoutData();
+                               data.width = 0;
+
+                               buttonContentsComp.layout();
+                       }
+               });
+
+               binarySettings.addListener(SWT.Hide, new Listener() {
+
+                       @Override
+                       public void handleEvent(Event event) {
+                               Logger.debug("binary settings hide");
+                               cancelButton.setText(WidgetLabels.CANCEL);
+                               FormData data = (FormData) okButton.getLayoutData();
+                               data.width = 100;
+
+                               buttonContentsComp.layout();
+                       }
+               });
+       }
 
        private ShellListener shellListener = new ShellListener() {
 
index 6a33708..32e13f1 100644 (file)
@@ -57,8 +57,8 @@ import org.tizen.dynamicanalyzer.swap.platform.ui.BinarySettingProgressManager;
 import org.tizen.dynamicanalyzer.swap.platform.ui.InputRow;
 import org.tizen.dynamicanalyzer.swap.platform.ui.LoadSettingDialog;
 import org.tizen.dynamicanalyzer.swap.platform.ui.SaveSettingDialog;
-import org.tizen.dynamicanalyzer.swap.platform.ui.DeviceExplorer.DeviceExplorerDilaog;
-import org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer.FileExplorerDialog;
+import org.tizen.dynamicanalyzer.ui.common.explorer.DeviceExplorerDialog;
+import org.tizen.dynamicanalyzer.ui.common.explorer.FileExplorerDialog;
 import org.tizen.dynamicanalyzer.util.CommonUtil;
 import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
@@ -93,7 +93,7 @@ public class SettingDialogBinarySettingsPage extends DAPageComposite {
 
                @Override
                public void handleClickEvent(DACustomButton button) {
-                       DeviceExplorerDilaog dialog = new DeviceExplorerDilaog(getShell());
+                       DeviceExplorerDialog dialog = new DeviceExplorerDialog(getShell(), true);
 //                     dialog.setFilter(".so");
                        Object result = dialog.open();
                        if (result != null) {
index 919035b..df495da 100755 (executable)
@@ -360,11 +360,6 @@ public class AnalyzerUtil {
                return num;
        }
 
-       public static void printHexdecimal(long value) {
-               String output = String.format("%x", value);
-               System.out.print(output);
-       }
-
        public static String toHexdecimal(Object value) {
                String retStr = null;
                if (value instanceof Long) {
index 32c68f7..82ab6ec 100644 (file)
@@ -1,4 +1,11 @@
 * 2.1.58
+- Optimize the thread analysis
+- Optimize the function profiling
+- Optimize the file analysis
+- Update the UX of setting dialog
+- Fix Bug : Some apps are not launched 
+== JuYoung Kim <j0.kim@samsung.com> 2014-11-03
+* 2.1.58
 - Fix Bug : screenshot periodically in Setting Dialog
 == Heeyoung Hwang <heeyoung1008.hwang@samsung.com> 2014-10-28
 * 2.1.57
index da80f7a..3884138 100644 (file)
@@ -1,5 +1,5 @@
 Source:dynamic-analyzer
-Version:2.1.58
+Version:2.1.59
 Maintainer:Jaewon Lim <jaewon81.lim@samsung.com>, Juyoung Kim <j0.kim@samsung.com>
 
 Package:dynamic-analyzer-product