001/*
002 * Copyright (C) Photon Vision.
003 *
004 * This program is free software: you can redistribute it and/or modify
005 * it under the terms of the GNU General Public License as published by
006 * the Free Software Foundation, either version 3 of the License, or
007 * (at your option) any later version.
008 *
009 * This program is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012 * GNU General Public License for more details.
013 *
014 * You should have received a copy of the GNU General Public License
015 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
016 */
017
018package org.photonvision.common.util;
019
020public class ReflectionUtils {
021    public static StackTraceElement[] getFullStackTrace() {
022        return Thread.currentThread().getStackTrace();
023    }
024
025    public static StackTraceElement getNthCaller(int n) {
026        if (n < 0) n = 0;
027        return Thread.currentThread().getStackTrace()[n];
028    }
029
030    public static String getCallerClassName() {
031        StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
032        for (int i = 1; i < stElements.length; i++) {
033            StackTraceElement ste = stElements[i];
034            if (!ste.getClassName().equals(ReflectionUtils.class.getName())
035                    && ste.getClassName().indexOf("java.lang.Thread") != 0) {
036                return ste.getClassName();
037            }
038        }
039        return null;
040    }
041
042    public static String getCallerCallerClassName() {
043        StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
044        String callerClassName = null;
045        for (int i = 1; i < stElements.length; i++) {
046            StackTraceElement ste = stElements[i];
047            if (!ste.getClassName().equals(ReflectionUtils.class.getName())
048                    && ste.getClassName().indexOf("java.lang.Thread") != 0) {
049                if (callerClassName == null) {
050                    callerClassName = ste.getClassName();
051                } else if (!callerClassName.equals(ste.getClassName())) {
052                    return ste.getClassName();
053                }
054            }
055        }
056        return null;
057    }
058}