blob: a1f5fdbd7aebe3d914ac305c865502f332355bea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 SAP AG and IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
* IBM Corporation - enhancements and fixes
*******************************************************************************/
package org.eclipse.mat.inspections;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.mat.internal.Messages;
import org.eclipse.mat.query.IQuery;
import org.eclipse.mat.query.IResult;
import org.eclipse.mat.query.annotations.Argument;
import org.eclipse.mat.query.annotations.Category;
import org.eclipse.mat.query.annotations.CommandName;
import org.eclipse.mat.query.annotations.Icon;
import org.eclipse.mat.query.results.ListResult;
import org.eclipse.mat.snapshot.ISnapshot;
import org.eclipse.mat.snapshot.SnapshotInfo;
import org.eclipse.mat.util.IProgressListener;
import org.eclipse.mat.util.MessageUtil;
import org.eclipse.mat.util.Units;
@Category(Category.HIDDEN)
@CommandName("heap_dump_overview")
@Icon("/META-INF/icons/heapdump_details.gif")
public class HeapDumpInfoQuery implements IQuery
{
public static class TextEntry
{
private String propertyValue;
private String propertyName;
public TextEntry(String propertyName, String propertyValue)
{
this.propertyName = propertyName;
this.propertyValue = propertyValue;
}
public String getPropertyValue()
{
return propertyValue;
}
public String getPropertyName()
{
return propertyName;
}
}
/**
* Provides translatable names for the columns.
* @author ajohnson
*
*/
public static class TextEntryBeanInfo extends SimpleBeanInfo
{
public TextEntryBeanInfo()
{
}
public PropertyDescriptor[] getPropertyDescriptors()
{
PropertyDescriptor ret[];
try
{
final PropertyDescriptor propertyDescriptor1 = new PropertyDescriptor("propertyName", TextEntry.class, "getPropertyName", null) //$NON-NLS-1$ //$NON-NLS-2$
{
public String getDisplayName()
{
return Messages.HeapDumpInfoQuery_PropertyName;
}
};
final PropertyDescriptor propertyDescriptor2 = new PropertyDescriptor("propertyValue", TextEntry.class, "getPropertyValue", null) //$NON-NLS-1$ //$NON-NLS-2$
{
public String getDisplayName()
{
return Messages.HeapDumpInfoQuery_ProperyValue;
}
};
ret = new PropertyDescriptor[] { propertyDescriptor1, propertyDescriptor2 };
}
catch (IntrospectionException e)
{
ret = null;
}
return ret;
}
}
@Argument
public ISnapshot snapshot;
public IResult execute(IProgressListener listener) throws Exception
{
SnapshotInfo info = snapshot.getSnapshotInfo();
if (listener.isCanceled())
throw new IProgressListener.OperationCanceledException();
List<TextEntry> entries = new ArrayList<TextEntry>(12);
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_UsedHeapDump, getUsedHeapInMb(info
.getUsedHeapSize())));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_NumObjects, MessageUtil.format(Messages.HeapDumpInfoQuery_NumObjectsFormat,
info.getNumberOfObjects())));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_NumClasses, MessageUtil.format(Messages.HeapDumpInfoQuery_NumClassesFormat,
info.getNumberOfClasses())));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_NumClassLoaders, MessageUtil.format(Messages.HeapDumpInfoQuery_NumClassLoadersFormat,
info.getNumberOfClassLoaders())));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_NumGCRoots, MessageUtil.format(Messages.HeapDumpInfoQuery_NumGCRootsFormat,
info.getNumberOfGCRoots())));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_HeapFormat, info.getProperty("$heapFormat").toString())); //$NON-NLS-1$
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_JVMVersion, info.getJvmInfo()));
if (info.getCreationDate() != null)
{
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_Time, MessageUtil.format(Messages.HeapDumpInfoQuery_TimeFormat, info.getCreationDate())));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_Date, MessageUtil.format(Messages.HeapDumpInfoQuery_DateFormat, info.getCreationDate())));
}
else
{
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_Time, null));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_Date, null));
}
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_IdentifierSize, getSize(info.getIdentifierSize())));
if (info.getIdentifierSize() == 8)
{
Boolean useCompressedOops = (Boolean) info.getProperty("$useCompressedOops"); //$NON-NLS-1$
if (useCompressedOops != null)
{
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_UseCompressedOops, useCompressedOops.toString()));
}
}
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_FilePath, info.getPath()));
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_Column_FileLength, MessageUtil.format(Messages.HeapDumpInfoQuery_FileLengthFormat, (new File(info.getPath())).length())));
Serializable identifier = info.getProperty("$runtimeId"); //$NON-NLS-1$
if (identifier instanceof String)
{
entries.add(new TextEntry(Messages.HeapDumpInfoQuery_MultipleSnapshotIdentifier, identifier.toString()));
}
return new ListResult(TextEntry.class, entries, "propertyName", "propertyValue"); //$NON-NLS-1$ //$NON-NLS-2$
}
private String getUsedHeapInMb(long usedHeapSize)
{
return Units.Storage.of(usedHeapSize).format(usedHeapSize);
}
private String getSize(int identifierSize)
{
switch (identifierSize)
{
case 0:
return null;
case 4:
return Messages.HeapDumpInfoQuery_32bit;
case 8:
return Messages.HeapDumpInfoQuery_64bit;
default:
return String.valueOf(identifierSize);
}
}
}