/*
 * Copyright (c) 2012, 2020 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.
 * <p>
 * @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);
        }
    }


}
