/*******************************************************************************
 * 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.ofbiz.api.context;

import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

import org.ofbiz.api.authorization.AccessController;
import org.ofbiz.api.authorization.AuthorizationManager;
import org.ofbiz.api.authorization.NullAuthorizationManager;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilProperties;

/** A convenience class for accessing the current thread's <code>ExecutionContext</code>.
 * @see {@link org.ofbiz.service.ExecutionContext} 
 */
public class ThreadContext {

    protected static final String module = ThreadContext.class.getName();
    protected static final AuthorizationManager nullAuthorizationManager = new NullAuthorizationManager();

    protected static final ThreadLocal<ExecutionContext> executionContext = new ThreadLocal<ExecutionContext>() {
        protected synchronized ExecutionContext initialValue() {
            ExecutionContext result = null;
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            String className = UtilProperties.getPropertyValue("api.properties", "executionContext.class");
            try {
                result = (ExecutionContext) loader.loadClass(className).newInstance();
            } catch (Exception e) {
                Debug.logError(e, module);
            }
            return result;
        }
    };

    /** Used by <code>runUnprotected</code> and <code>endRunUnprotected</code>
     * to save/restore the original <code>AuthorizationManager</code> instance.
     */
    protected static final ThreadLocal<AuthorizationManager> authManager = new ThreadLocal<AuthorizationManager>() {
        protected synchronized AuthorizationManager initialValue() {return null;};
    };

    public static void endRunUnprotected() {
        AuthorizationManager savedAuthorizationManager = authManager.get();
        if (savedAuthorizationManager != null) {
            setSecurity(savedAuthorizationManager);
            authManager.set(null);
        }
    }

    public static AccessController getAccessController() {
        return executionContext.get().getAccessController();
    }

    public static String getCurrencyUom() {
        return executionContext.get().getCurrencyUom();
    }

    public static String getExecutionPath() {
        return executionContext.get().getExecutionPath();
    }

    public static Locale getLocale() {
        return executionContext.get().getLocale();
    }

    public static Map<String, ? extends Object> getParameters() {
        return executionContext.get().getParameters();
    }

    public static Object getProperty(String key) {
        return executionContext.get().getProperty(key);
    }

    public static AuthorizationManager getSecurity() {
        return executionContext.get().getSecurity();
    }

    public static TimeZone getTimeZone() {
        return executionContext.get().getTimeZone();
    }

    public static void initializeContext(Map<String, ? extends Object> params) {
        executionContext.get().initializeContext(params);
    }

    public static void popExecutionArtifact() {
        executionContext.get().popExecutionArtifact();
    }

    public static void pushExecutionArtifact(ExecutionArtifact artifact) {
        executionContext.get().pushExecutionArtifact(artifact);
    }

    public static void pushExecutionArtifact(ExecutionArtifact artifact, Map<String, ? extends Object> parameters) {
        pushExecutionArtifact(new GenericParametersArtifact(artifact, parameters));
    }

    public static void pushExecutionArtifact(String location, String name) {
        pushExecutionArtifact(new GenericExecutionArtifact(location, name));
    }

    public static void pushExecutionArtifact(String location, String name, Map<String, ? extends Object> parameters) {
        pushExecutionArtifact(new GenericParametersArtifact(location, name, parameters));
    }

    public static void reset() {
        executionContext.get().reset();
    }

    public static void runUnprotected() {
        authManager.set(getSecurity());
        setSecurity(nullAuthorizationManager);
    }

    public static void setCurrencyUom(String currencyUom) {
        executionContext.get().setCurrencyUom(currencyUom);
    }

    public static void setLocale(Locale locale) {
        executionContext.get().setLocale(locale);
    }

    public static Object setProperty(String key, Object value) {
        return executionContext.get().setProperty(key, value);
    }

    public static void setSecurity(AuthorizationManager security) {
        executionContext.get().setSecurity(security);
    }

    public static void setTimeZone(TimeZone timeZone) {
        executionContext.get().setTimeZone(timeZone);
    }

}
