All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.mat.inspections.CommonNameResolver Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2008 SAP AG.
 * 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
 *******************************************************************************/
package org.eclipse.mat.inspections;

import org.eclipse.mat.SnapshotException;
import org.eclipse.mat.snapshot.ISnapshot;
import org.eclipse.mat.snapshot.extension.IClassSpecificNameResolver;
import org.eclipse.mat.snapshot.extension.Subject;
import org.eclipse.mat.snapshot.extension.Subjects;
import org.eclipse.mat.snapshot.model.IClass;
import org.eclipse.mat.snapshot.model.IObject;
import org.eclipse.mat.snapshot.model.IObjectArray;
import org.eclipse.mat.snapshot.model.IPrimitiveArray;
import org.eclipse.mat.snapshot.model.PrettyPrinter;

import java.lang.reflect.Modifier;

public class CommonNameResolver {
    @Subject("java.lang.String")
    public static class StringResolver implements IClassSpecificNameResolver {
        public String resolve(IObject obj) throws SnapshotException {
            return PrettyPrinter.objectAsString(obj, 1024);
        }
    }

    @Subjects({"java.lang.StringBuffer", //
            "java.lang.StringBuilder"})
    public static class StringBufferResolver implements IClassSpecificNameResolver {
        public String resolve(IObject obj) throws SnapshotException {
            Integer count = (Integer) obj.resolveValue("count"); //$NON-NLS-1$
            if (count == null)
                return null;
            if (count == 0)
                return ""; //$NON-NLS-1$

            IPrimitiveArray charArray = (IPrimitiveArray) obj.resolveValue("value"); //$NON-NLS-1$
            if (charArray == null)
                return null;

            return PrettyPrinter.arrayAsString(charArray, 0, count, 1024);
        }
    }

    @Subject("java.lang.Thread")
    public static class ThreadResolver implements IClassSpecificNameResolver {
        public String resolve(IObject obj) throws SnapshotException {
            IObject name = (IObject) obj.resolveValue("name"); //$NON-NLS-1$
            return name != null ? name.getClassSpecificName() : null;
        }
    }

    @Subject("java.lang.ThreadGroup")
    public static class ThreadGroupResolver implements IClassSpecificNameResolver {
        public String resolve(IObject object) throws SnapshotException {
            IObject nameString = (IObject) object.resolveValue("name"); //$NON-NLS-1$
            if (nameString == null)
                return null;
            return nameString.getClassSpecificName();
        }
    }

    @Subjects({"java.lang.Byte", //
            "java.lang.Character", //
            "java.lang.Short", //
            "java.lang.Integer", //
            "java.lang.Long", //
            "java.lang.Float", //
            "java.lang.Double", //
            "java.lang.Boolean"})
    public static class ValueResolver implements IClassSpecificNameResolver {
        public String resolve(IObject heapObject) throws SnapshotException {
            return String.valueOf(heapObject.resolveValue("value")); //$NON-NLS-1$
        }
    }

    @Subject("char[]")
    public static class CharArrayResolver implements IClassSpecificNameResolver {
        public String resolve(IObject heapObject) throws SnapshotException {
            IPrimitiveArray charArray = (IPrimitiveArray) heapObject;
            return PrettyPrinter.arrayAsString(charArray, 0, charArray.getLength(), 1024);
        }
    }

    @Subject("byte[]")
    public static class ByteArrayResolver implements IClassSpecificNameResolver {
        public String resolve(IObject heapObject) throws SnapshotException {
            IPrimitiveArray arr = (IPrimitiveArray) heapObject;
            byte[] value = (byte[]) arr.getValueArray(0, Math.min(arr.getLength(), 1024));
            if (value == null)
                return null;

            // must not modify the original byte array
            StringBuilder r = new StringBuilder(value.length);
            for (int i = 0; i < value.length; i++) {
                // ASCII/Unicode 127 is not printable
                if (value[i] < 32 || value[i] > 126)
                    r.append('.');
                else
                    r.append((char) value[i]);
            }
            return r.toString();
        }
    }

    /*
     * Contributed in bug 273915
     */
    @Subject("java.net.URL")
    public static class URLResolver implements IClassSpecificNameResolver {
        public String resolve(IObject obj) throws SnapshotException {
            StringBuilder builder = new StringBuilder();
            IObject protocol = (IObject) obj.resolveValue("protocol"); //$NON-NLS-1$
            builder.append(protocol.getClassSpecificName());
            builder.append(":"); //$NON-NLS-1$
            IObject authority = (IObject) obj.resolveValue("authority"); //$NON-NLS-1$
            if (authority != null) {
                builder.append("//"); //$NON-NLS-1$
                builder.append(authority.getClassSpecificName());
            }
            IObject path = (IObject) obj.resolveValue("path"); //$NON-NLS-1$
            if (path != null) builder.append(path.getClassSpecificName());
            IObject query = (IObject) obj.resolveValue("query"); //$NON-NLS-1$
            if (query != null) {
                builder.append("?"); //$NON-NLS-1$
                builder.append(query.getClassSpecificName());
            }
            IObject ref = (IObject) obj.resolveValue("ref"); //$NON-NLS-1$
            if (ref != null) {
                builder.append("#"); //$NON-NLS-1$
                builder.append(ref.getClassSpecificName());
            }
            return builder.toString();
        }
    }

    @Subject("java.lang.reflect.AccessibleObject")
    public static class AccessibleObjectResolver implements IClassSpecificNameResolver {
        public String resolve(IObject obj) throws SnapshotException {
            // Important fields
            // modifiers - not actually present, but present in all superclasses
            // clazz - not actually present, but present in all superclasses
            StringBuilder r = new StringBuilder();
            ISnapshot snapshot = obj.getSnapshot();
            IObject ref;
            Object val = obj.resolveValue("modifiers"); //$NON-NLS-1$
            if (val instanceof Integer) {
                r.append(Modifier.toString((Integer) val));
                if (r.length() > 0) r.append(' ');
            }
            ref = (IObject) obj.resolveValue("clazz"); //$NON-NLS-1$
            if (ref != null) {
                addClassName(snapshot, ref.getObjectAddress(), r);
            } else {
                return null;
            }
            return r.toString();
        }

        protected void addClassName(ISnapshot snapshot, long addr, StringBuilder r) throws SnapshotException {
            int id = snapshot.mapAddressToId(addr);
            IObject ox = snapshot.getObject(id);
            if (ox instanceof IClass) {
                IClass cls = (IClass) ox;
                r.append(cls.getName());
            }
        }
    }

    @Subject("java.lang.reflect.Field")
    public static class FieldResolver extends AccessibleObjectResolver {
        public String resolve(IObject obj) throws SnapshotException {
            // Important fields
            // modifiers
            // clazz
            // name
            // type
            StringBuilder r = new StringBuilder();
            ISnapshot snapshot = obj.getSnapshot();
            IObject ref;
            Object val = obj.resolveValue("modifiers"); //$NON-NLS-1$
            if (val instanceof Integer) {
                r.append(Modifier.toString((Integer) val));
                if (r.length() > 0) r.append(' ');
            }
            ref = (IObject) obj.resolveValue("type"); //$NON-NLS-1$
            if (ref != null) {
                addClassName(snapshot, ref.getObjectAddress(), r);
                r.append(' ');
            }
            ref = (IObject) obj.resolveValue("clazz"); //$NON-NLS-1$
            if (ref != null) {
                addClassName(snapshot, ref.getObjectAddress(), r);
                r.append('.');
            }
            ref = (IObject) obj.resolveValue("name"); //$NON-NLS-1$
            if (ref != null) {
                r.append(ref.getClassSpecificName());
            } else {
                // No method name so give up
                return null;
            }
            return r.toString();
        }
    }

    @Subject("java.lang.reflect.Method")
    public static class MethodResolver extends AccessibleObjectResolver {
        public String resolve(IObject obj) throws SnapshotException {
            // Important fields
            // modifiers
            // clazz
            // name
            // parameterTypes[]
            // exceptionTypes[]
            // returnType
            StringBuilder r = new StringBuilder();
            ISnapshot snapshot = obj.getSnapshot();
            IObject ref;
            Object val = obj.resolveValue("modifiers"); //$NON-NLS-1$
            if (val instanceof Integer) {
                r.append(Modifier.toString((Integer) val));
                if (r.length() > 0) r.append(' ');
            }
            ref = (IObject) obj.resolveValue("returnType"); //$NON-NLS-1$
            if (ref != null) {
                addClassName(snapshot, ref.getObjectAddress(), r);
                r.append(' ');
            }
            ref = (IObject) obj.resolveValue("clazz"); //$NON-NLS-1$
            if (ref != null) {
                addClassName(snapshot, ref.getObjectAddress(), r);
                r.append('.');
            }
            ref = (IObject) obj.resolveValue("name"); //$NON-NLS-1$
            if (ref != null) {
                r.append(ref.getClassSpecificName());
            } else {
                // No method name so give up
                return null;
            }
            r.append('(');
            ref = (IObject) obj.resolveValue("parameterTypes"); //$NON-NLS-1$
            if (ref instanceof IObjectArray) {
                IObjectArray orefa = (IObjectArray) ref;
                long refs[] = orefa.getReferenceArray();
                for (int i = 0; i < orefa.getLength(); ++i) {
                    if (i > 0)
                        r.append(',');
                    long addr = refs[i];
                    addClassName(snapshot, addr, r);
                }
            }
            r.append(')');
            return r.toString();
        }
    }

    @Subject("java.lang.reflect.Constructor")
    public static class ConstructorResolver extends AccessibleObjectResolver {
        public String resolve(IObject obj) throws SnapshotException {
            // Important fields
            // modifiers
            // clazz
            // parameterTypes[]
            // exceptionTypes[]
            StringBuilder r = new StringBuilder();
            ISnapshot snapshot = obj.getSnapshot();
            IObject ref;
            Object val = obj.resolveValue("modifiers"); //$NON-NLS-1$
            if (val instanceof Integer) {
                r.append(Modifier.toString((Integer) val));
                if (r.length() > 0) r.append(' ');
            }
            ref = (IObject) obj.resolveValue("clazz"); //$NON-NLS-1$
            if (ref != null) {
                addClassName(snapshot, ref.getObjectAddress(), r);
            } else {
                // No class name so give up
                return null;
            }
            r.append('(');
            ref = (IObject) obj.resolveValue("parameterTypes"); //$NON-NLS-1$
            if (ref instanceof IObjectArray) {
                IObjectArray orefa = (IObjectArray) ref;
                long refs[] = orefa.getReferenceArray();
                for (int i = 0; i < orefa.getLength(); ++i) {
                    if (i > 0)
                        r.append(',');
                    long addr = refs[i];
                    addClassName(snapshot, addr, r);
                }
            }
            r.append(')');
            return r.toString();
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy