blob: a8f33389af9a8bf8fd74c8aa2405447db893a4cd [file] [log] [blame]
/*
* 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);
}
}
}