tmf: Add 'last modified' and 'size' properties for traces
authorPatrick Tasse <patrick.tasse@gmail.com>
Fri, 26 Sep 2014 14:55:05 +0000 (10:55 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Fri, 17 Oct 2014 21:11:20 +0000 (17:11 -0400)
Change-Id: I037bd0eb7f6abb91fa73bcf3ca6fae93986f0eb3
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/33983
Tested-by: Hudson CI
org.eclipse.linuxtools.tmf.ui/META-INF/MANIFEST.MF
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties

index 00f19a3575a7aa1e32196f63f8d050aef9fa7476..1ba880f0fdf996ca6378f4df429776008af095fc 100644 (file)
@@ -9,6 +9,7 @@ Bundle-Activator: org.eclipse.linuxtools.internal.tmf.ui.Activator
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Require-Bundle: org.eclipse.core.expressions,
+ org.eclipse.core.filesystem,
  org.eclipse.core.resources,
  org.eclipse.core.runtime,
  org.eclipse.linuxtools.tmf.core;bundle-version="3.1.0",
@@ -17,7 +18,8 @@ Require-Bundle: org.eclipse.core.expressions,
  org.eclipse.ui.navigator,
  org.eclipse.ui.navigator.resources,
  org.swtchart,
- org.eclipse.cdt.core
+ org.eclipse.cdt.core,
+ com.ibm.icu
 Export-Package: org.eclipse.linuxtools.internal.tmf.ui;x-friends:="org.eclipse.linuxtools.tmf.ui.tests,org.eclipse.linuxtools.tmf.ctf.ui.tests",
  org.eclipse.linuxtools.internal.tmf.ui.commands;x-internal:=true,
  org.eclipse.linuxtools.internal.tmf.ui.dialogs;x-internal:=true,
index 6fe065fdd35045fc958351c51146aebbcbf66e69..9d845daf015bf9d2b2b52c98ba02c74cb60141e7 100644 (file)
@@ -80,6 +80,26 @@ public class Messages extends NLS {
      * @since 3.2*/
     public static String TmfTraceElement_TimeOffset;
 
+    /** The descriptor for the last modified property
+     * @since 3.2 */
+    public static String TmfTraceElement_LastModified;
+
+    /** The descriptor for the size property
+     * @since 3.2 */
+    public static String TmfTraceElement_Size;
+
+    /** The format string for the size property of a file
+     * @since 3.2 */
+    public static String TmfTraceElement_FileSizeString;
+
+    /** The format string for the size property of a folder
+     * @since 3.2 */
+    public static String TmfTraceElement_FolderSizeString;
+
+    /** The format string for the size property of a folder with too many members
+     * @since 3.2 */
+    public static String TmfTraceElement_FolderSizeOverflowString;
+
     /** Trace text
      * @since 3.0*/
     public static String TmfTraceElement_TypeName;
index bf1eb976d85a6a0995abd6e7a1ffc52197dd0231..eaf20d7358684862f69eba33a99019034956a7fe 100644 (file)
 package org.eclipse.linuxtools.tmf.ui.project.model;
 
 import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IResource;
@@ -53,11 +56,15 @@ import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
 import org.eclipse.linuxtools.tmf.core.trace.TmfTraceManager;
 import org.eclipse.linuxtools.tmf.ui.editors.TmfEventsEditor;
 import org.eclipse.linuxtools.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IActionFilter;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertySource2;
 
+import com.ibm.icu.text.DateFormat;
+import com.ibm.icu.text.NumberFormat;
+
 /**
  * Implementation of trace model element representing a trace. It provides
  * methods to instantiate <code>ITmfTrace</code> and <code>ITmfEvent</code> as
@@ -91,6 +98,8 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
     private static final String sfIsLinked = Messages.TmfTraceElement_IsLinked;
     private static final String sfSourceLocation = Messages.TmfTraceElement_SourceLocation;
     private static final String sfTimeOffset = Messages.TmfTraceElement_TimeOffset;
+    private static final String sfLastModified = Messages.TmfTraceElement_LastModified;
+    private static final String sfSize = Messages.TmfTraceElement_Size;
     private static final String sfTracePropertiesCategory = Messages.TmfTraceElement_TraceProperties;
 
     private static final ReadOnlyTextPropertyDescriptor sfNameDescriptor = new ReadOnlyTextPropertyDescriptor(sfName, sfName);
@@ -100,10 +109,12 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
     private static final ReadOnlyTextPropertyDescriptor sfIsLinkedDescriptor = new ReadOnlyTextPropertyDescriptor(sfIsLinked, sfIsLinked);
     private static final ReadOnlyTextPropertyDescriptor sfSourceLocationDescriptor = new ReadOnlyTextPropertyDescriptor(sfSourceLocation, sfSourceLocation);
     private static final ReadOnlyTextPropertyDescriptor sfTimeOffsetDescriptor = new ReadOnlyTextPropertyDescriptor(sfTimeOffset, sfTimeOffset);
+    private static final ReadOnlyTextPropertyDescriptor sfLastModifiedDescriptor = new ReadOnlyTextPropertyDescriptor(sfLastModified, sfLastModified);
+    private static final ReadOnlyTextPropertyDescriptor sfSizeDescriptor = new ReadOnlyTextPropertyDescriptor(sfSize, sfSize);
 
     private static final IPropertyDescriptor[] sfDescriptors = { sfNameDescriptor, sfPathDescriptor, sfLocationDescriptor,
             sfTypeDescriptor, sfIsLinkedDescriptor, sfSourceLocationDescriptor,
-            sfTimeOffsetDescriptor};
+            sfTimeOffsetDescriptor, sfLastModifiedDescriptor, sfSizeDescriptor };
 
     static {
         sfNameDescriptor.setCategory(sfResourcePropertiesCategory);
@@ -113,10 +124,14 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
         sfIsLinkedDescriptor.setCategory(sfResourcePropertiesCategory);
         sfSourceLocationDescriptor.setCategory(sfResourcePropertiesCategory);
         sfTimeOffsetDescriptor.setCategory(sfResourcePropertiesCategory);
+        sfLastModifiedDescriptor.setCategory(sfResourcePropertiesCategory);
+        sfSizeDescriptor.setCategory(sfResourcePropertiesCategory);
     }
 
     private static final TmfTimestampFormat OFFSET_FORMAT = new TmfTimestampFormat("T.SSS SSS SSS s"); //$NON-NLS-1$
 
+    private static final int FOLDER_MAX_COUNT = 1024;
+
     // ------------------------------------------------------------------------
     // Static initialization
     // ------------------------------------------------------------------------
@@ -162,6 +177,22 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
         }
     }
 
+    // ------------------------------------------------------------------------
+    // Classes
+    // ------------------------------------------------------------------------
+
+    private class FileInfo {
+        long lastModified;
+        long size;
+        int count;
+    }
+
+    // ------------------------------------------------------------------------
+    // Attributes
+    // ------------------------------------------------------------------------
+
+    private FileInfo fFileInfo;
+
     // ------------------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------------------
@@ -457,6 +488,32 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
             return ""; //$NON-NLS-1$
         }
 
+        if (sfLastModified.equals(id)) {
+            FileInfo fileInfo = getFileInfo();
+            if (fileInfo == null) {
+                return ""; //$NON-NLS-1$
+            }
+            long date = fileInfo.lastModified;
+            DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM);
+            return format.format(new Date(date));
+        }
+
+        if (sfSize.equals(id)) {
+            FileInfo fileInfo = getFileInfo();
+            if (fileInfo == null) {
+                return ""; //$NON-NLS-1$
+            }
+            if (getResource() instanceof IFolder) {
+                if (fileInfo.count <= FOLDER_MAX_COUNT) {
+                    return NLS.bind(Messages.TmfTraceElement_FolderSizeString,
+                            NumberFormat.getInstance().format(fileInfo.size), fileInfo.count);
+                }
+                return NLS.bind(Messages.TmfTraceElement_FolderSizeOverflowString,
+                        NumberFormat.getInstance().format(fileInfo.size), FOLDER_MAX_COUNT);
+            }
+            return NLS.bind(Messages.TmfTraceElement_FileSizeString, NumberFormat.getInstance().format(fileInfo.size));
+        }
+
         if (sfTraceType.equals(id)) {
             if (getTraceType() != null) {
                 TraceTypeHelper helper = TmfTraceType.getTraceType(getTraceType());
@@ -486,6 +543,44 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
         return null;
     }
 
+    private FileInfo getFileInfo() {
+        /* FileInfo is needed for both 'last modified' and 'size' properties.
+         * It is freshly computed for one, and reused for the other, then
+         * cleared so that the information can be refreshed the next time.
+         */
+        FileInfo fileInfo;
+        if (fFileInfo == null) {
+            try {
+                fileInfo = computeFileInfo(new FileInfo(), getResource());
+            } catch (CoreException e) {
+                return null;
+            }
+            fFileInfo = fileInfo;
+        } else {
+            fileInfo = fFileInfo;
+            fFileInfo = null;
+        }
+        return fileInfo;
+    }
+
+    private FileInfo computeFileInfo(FileInfo fileInfo, IResource resource) throws CoreException {
+        if (fileInfo == null || fileInfo.count > FOLDER_MAX_COUNT) {
+            return fileInfo;
+        }
+        if (resource instanceof IFolder) {
+            IFolder folder = (IFolder) resource;
+            for (IResource member : folder.members()) {
+                computeFileInfo(fileInfo, member);
+            }
+            return fileInfo;
+        }
+        IFileInfo info = EFS.getStore(resource.getLocationURI()).fetchInfo();
+        fileInfo.lastModified = Math.max(fileInfo.lastModified, info.getLastModified());
+        fileInfo.size += info.getLength();
+        fileInfo.count++;
+        return fileInfo;
+    }
+
     @Override
     public void resetPropertyValue(Object id) {
     }
index 419252873dfee6bea4eadbbc27ce3d00609dadcd..f931a19a6f3bc6a5f2c2d0853f2b1d77a39546ce 100644 (file)
@@ -28,6 +28,11 @@ TmfTraceElement_EventType = type
 TmfTraceElement_IsLinked = linked
 TmfTraceElement_SourceLocation = source location
 TmfTraceElement_TimeOffset = time offset
+TmfTraceElement_LastModified = last modified
+TmfTraceElement_Size = size
+TmfTraceElement_FileSizeString={0} bytes
+TmfTraceElement_FolderSizeString={0} bytes in {1} files
+TmfTraceElement_FolderSizeOverflowString=At least {0} bytes in more than {1} files
 TmfTraceElement_TypeName=Trace
 TmfTraceType_SelectTraceType=Select Trace Type
 
This page took 0.032062 seconds and 5 git commands to generate.