From dafacb73e28cf41a051b994d4db47ce4138b46bc Mon Sep 17 00:00:00 2001 From: Patrick Tasse Date: Fri, 26 Sep 2014 10:55:05 -0400 Subject: tmf: Add 'last modified' and 'size' properties for traces Change-Id: I037bd0eb7f6abb91fa73bcf3ca6fae93986f0eb3 Signed-off-by: Patrick Tasse Reviewed-on: https://git.eclipse.org/r/33983 Tested-by: Hudson CI --- .../META-INF/MANIFEST.MF | 4 +- .../linuxtools/tmf/ui/project/model/Messages.java | 20 +++++ .../tmf/ui/project/model/TmfTraceElement.java | 97 +++++++++++++++++++++- .../tmf/ui/project/model/messages.properties | 5 ++ 4 files changed, 124 insertions(+), 2 deletions(-) diff --git a/lttng/org.eclipse.linuxtools.tmf.ui/META-INF/MANIFEST.MF b/lttng/org.eclipse.linuxtools.tmf.ui/META-INF/MANIFEST.MF index 00f19a3575..1ba880f0fd 100644 --- a/lttng/org.eclipse.linuxtools.tmf.ui/META-INF/MANIFEST.MF +++ b/lttng/org.eclipse.linuxtools.tmf.ui/META-INF/MANIFEST.MF @@ -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, diff --git a/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java b/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java index 6fe065fdd3..9d845daf01 100644 --- a/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java +++ b/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/Messages.java @@ -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; diff --git a/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java b/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java index bf1eb976d8..eaf20d7358 100644 --- a/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java +++ b/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/TmfTraceElement.java @@ -20,11 +20,14 @@ 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 ITmfTrace and ITmfEvent 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) { } diff --git a/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties b/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties index 419252873d..f931a19a6f 100644 --- a/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties +++ b/lttng/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/project/model/messages.properties @@ -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 -- cgit v1.2.3