// 
// Decompiled by Procyon v0.6.0
// 

package com.google.common.flogger.util;

import org.checkerframework.checker.nullness.compatqual.NullableDecl;

public final class StaticMethodCaller
{
    @NullableDecl
    public static <T> T getInstanceFromSystemProperty(final String propertyName, @NullableDecl final String defaultClassName, final Class<T> type) {
        final String className = readProperty(propertyName, defaultClassName);
        if (className == null) {
            return null;
        }
        return (T)callStaticMethod(className, "getInstance", (Class<Object>)type);
    }
    
    @NullableDecl
    public static <T> T callGetterFromSystemProperty(final String propertyName, @NullableDecl final String defaultValue, final Class<T> type) {
        final String getter = readProperty(propertyName, defaultValue);
        if (getter == null) {
            return null;
        }
        final int idx = getter.indexOf(35);
        if (idx <= 0 || idx == getter.length() - 1) {
            error("invalid getter (expected <class>#<method>): %s\n", getter);
            return null;
        }
        return (T)callStaticMethod(getter.substring(0, idx), getter.substring(idx + 1), (Class<Object>)type);
    }
    
    @NullableDecl
    public static <T> T callGetterFromSystemProperty(final String propertyName, final Class<T> type) {
        return callGetterFromSystemProperty(propertyName, null, type);
    }
    
    private static String readProperty(final String propertyName, @NullableDecl final String defaultValue) {
        Checks.checkNotNull(propertyName, "property name");
        try {
            return System.getProperty(propertyName, defaultValue);
        }
        catch (final SecurityException e) {
            error("cannot read property name %s: %s", propertyName, e);
            return null;
        }
    }
    
    private static <T> T callStaticMethod(final String className, final String methodName, final Class<T> type) {
        try {
            return type.cast(Class.forName(className).getMethod(methodName, (Class<?>[])new Class[0]).invoke(null, new Object[0]));
        }
        catch (final ClassNotFoundException ex) {}
        catch (final ClassCastException e) {
            error("cannot cast result of calling '%s#%s' to '%s': %s\n", className, methodName, type.getName(), e);
        }
        catch (final Exception e2) {
            error("cannot call expected no-argument static method '%s#%s': %s\n", className, methodName, e2);
        }
        return null;
    }
    
    private static void error(final String msg, final Object... args) {
        System.err.println(StaticMethodCaller.class + ": " + String.format(msg, args));
    }
    
    private StaticMethodCaller() {
    }
}
