/*
 * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Matt MacIvor - 2.4 - initial implementation
package org.eclipse.persistence.internal.jaxb;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.eclipse.persistence.exceptions.JAXBException;
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;

/**
 * <p><b>Purpose:</b> This class provides a wrapper for an instance of AccessorFactory.
 * The instance can be from either the internal or public package. This class will
 * reflectively invoke the createFieldAccessor and createPropertyAccessor methods
 * on the underlying AccessorFactory to create Accessor instances.
 *
 * @author mmacivor
 * @since EclipseLink 2.4
 *
 */
public class AccessorFactoryWrapper {
    private static final String ACCESSOR_FACTORY_CREATE_FIELD_ACCESSOR = "createFieldAccessor";
    private static final String ACCESSOR_FACTORY_CREATE_PROPERTY_ACCESSOR = "createPropertyAccessor";

    private Object accessorFactory;
    private Method createFieldAccessorMethod;
    private Method createPropertyAccessorMethod;


    public AccessorFactoryWrapper(Object factory) {
        this.accessorFactory = factory;
        Class accessorClass = factory.getClass();
        try {
            createPropertyAccessorMethod = PrivilegedAccessHelper.getDeclaredMethod(accessorClass, ACCESSOR_FACTORY_CREATE_PROPERTY_ACCESSOR, new Class[]{Class.class, Method.class, Method.class});
            createFieldAccessorMethod = PrivilegedAccessHelper.getDeclaredMethod(accessorClass, ACCESSOR_FACTORY_CREATE_FIELD_ACCESSOR, new Class[]{Class.class, Field.class, boolean.class});
        } catch(Exception ex) {
            throw JAXBException.invalidAccessorFactory(accessorClass, ex);
        }
    }

    public Object createFieldAccessor(Class beanClass, Field field, boolean isReadOnly) {
        try {
            return PrivilegedAccessHelper.invokeMethod(createFieldAccessorMethod, accessorFactory, new Object[]{beanClass, field, isReadOnly});
        } catch(Exception ex) {
            throw JAXBException.errorCreatingFieldAccessor(accessorFactory, ex);
        }
    }

    public Object createPropertyAccessor(Class beanClass, Method getMethod, Method setMethod) {
        try {
            return PrivilegedAccessHelper.invokeMethod(createPropertyAccessorMethod, accessorFactory, new Object[]{beanClass, getMethod, setMethod});
        } catch(Exception ex) {
            throw JAXBException.errorCreatingPropertyAccessor(accessorFactory, ex);
        }
    }


}
