package org.apache.commons.ognl;

/*
 * 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.
 */

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Member;
import java.lang.reflect.Modifier;
import java.util.Map;

/**
 * This class provides methods for setting up and restoring access in a Field. Java 2 provides access utilities for
 * setting and getting fields that are non-public. This object provides coarse-grained access controls to allow access
 * to private, protected and package protected members. This will apply to all classes and members.
 */
public class DefaultMemberAccess
    implements MemberAccess
{
    private boolean allowPrivateAccess = false;

    private boolean allowProtectedAccess = false;

    private boolean allowPackageProtectedAccess = false;

    /*
     * =================================================================== Constructors
     * ===================================================================
     */
    public DefaultMemberAccess( boolean allowAllAccess )
    {
        this( allowAllAccess, allowAllAccess, allowAllAccess );
    }

    public DefaultMemberAccess( boolean allowPrivateAccess, boolean allowProtectedAccess,
                                boolean allowPackageProtectedAccess )
    {
        this.allowPrivateAccess = allowPrivateAccess;
        this.allowProtectedAccess = allowProtectedAccess;
        this.allowPackageProtectedAccess = allowPackageProtectedAccess;
    }

    /*
     * =================================================================== Public methods
     * ===================================================================
     */
    public boolean getAllowPrivateAccess()
    {
        return allowPrivateAccess;
    }

    public void setAllowPrivateAccess( boolean value )
    {
        allowPrivateAccess = value;
    }

    public boolean getAllowProtectedAccess()
    {
        return allowProtectedAccess;
    }

    public void setAllowProtectedAccess( boolean value )
    {
        allowProtectedAccess = value;
    }

    public boolean getAllowPackageProtectedAccess()
    {
        return allowPackageProtectedAccess;
    }

    public void setAllowPackageProtectedAccess( boolean value )
    {
        allowPackageProtectedAccess = value;
    }

    /*
     * =================================================================== MemberAccess interface
     * ===================================================================
     */
    public Object setup( Map<String, Object> context, Object target, Member member, String propertyName )
    {
        Object result = null;

        if ( isAccessible( context, target, member, propertyName ) )
        {
            AccessibleObject accessible = (AccessibleObject) member;

            if ( !accessible.isAccessible() )
            {
                result = Boolean.TRUE;
                accessible.setAccessible( true );
            }
        }
        return result;
    }

    public void restore( Map<String, Object> context, Object target, Member member, String propertyName, Object state )
    {
        if ( state != null )
        {
            ( (AccessibleObject) member ).setAccessible( (Boolean) state );
        }
    }

    /**
     * Returns true if the given member is accessible or can be made accessible by this object.
     */
    public boolean isAccessible( Map<String, Object> context, Object target, Member member, String propertyName )
    {
        int modifiers = member.getModifiers();
        boolean result = Modifier.isPublic( modifiers );

        if ( !result )
        {
            if ( Modifier.isPrivate( modifiers ) )
            {
                result = getAllowPrivateAccess();
            }
            else
            {
                if ( Modifier.isProtected( modifiers ) )
                {
                    result = getAllowProtectedAccess();
                }
                else
                {
                    result = getAllowPackageProtectedAccess();
                }
            }
        }
        return result;
    }
}
