/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.myfaces.test.runners;

import org.junit.runner.notification.RunNotifier;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;

/**
 * A Junit 4 runner that stores the name of the method that runs.  The methods marked with @After and @Before 
 * (but also the Test method itself) can request this name for which it is running.
 * 
 * @author Rudy De Busscher
 * @since 1.0.0
 */
public class NamedRunner extends BlockJUnit4ClassRunner
{

    /** The Constant PREFIX_KEY. */
    private static final String PREFIX_KEY = "ClassLoaderRunner_TestMethodName_";

    /** The Constant NO_NAME. */
    private static final String NO_NAME = "null";

    /**
     * Instantiates a new named runner.
     * 
     * @param klass the klass
     * 
     * @throws InitializationError the initialization error
     */
    public NamedRunner(Class<?> klass) throws InitializationError
    {
        super(klass);
    }

    @Override
    protected void runChild(FrameworkMethod method, RunNotifier notifier)

    {
        storeTestMethodName(method.getName());
        super.runChild(method, notifier);
        removeTestMethodName();
    }

    /**
     * Gets the test method name.
     * 
     * @return the test method name
     */
    public static String getTestMethodName()
    {
        return retrieveTestMethodName();
    }

    /**
     * Retrieve test method name.
     * 
     * @return the string
     */
    private static String retrieveTestMethodName()
    {
        // We can't use a ThreadLocal variable in the case the TestPerClassLoader runner is used.  Then this
        // Method is accessed from another classloader and thus reinitialized variables.
        String result = null;
        String storedName = System.getProperty(getKey());
        if (!NO_NAME.equals(storedName))
        {
            result = storedName;
        }
        return result;
    }

    /**
     * Removes the test method name.
     */
    private static void removeTestMethodName()
    {
        // We can't use a ThreadLocal variable in the case the TestPerClassLoader runner is used.  Then this
        // Method is accessed from another classloader and thus reinitialized variables.
        System.setProperty(getKey(), NO_NAME);

    }

    /**
     * Store test method name.
     * 
     * @param name the name
     */
    private static void storeTestMethodName(String name)
    {

        // We can't use a ThreadLocal variable in the case the TestPerClassLoader runner is used.  Then this
        // Method is accessed from another classloader and thus reinitialized variables.
        System.setProperty(getKey(), name);
    }

    /**
     * Gets the key.
     * 
     * @return the key
     */
    private static String getKey()
    {
        StringBuffer buffer = new StringBuffer();
        buffer.append(PREFIX_KEY).append(Thread.currentThread().getName());
        return buffer.toString();
    }
}
