blob: 05ead1418e9473167c448248dbea7e890d94bcc3 [file] [log] [blame]
/*
* Copyright (c) 1998, 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:
// dmccann - May 29/2009 - 2.0 - Initial implementation
package org.eclipse.persistence.internal.jaxb;
import org.eclipse.persistence.exceptions.DescriptorException;
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
import org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor;
import org.eclipse.persistence.internal.helper.Helper;
/**
* This accessor should be used when processing a class that uses method access,
* and a has set method but no get method. The get method is required during
* mapping initialization to determine the type of the set method's input
* parameter, and an exception will occur if none is present. Using this
* custom method accessor, the input parameter of the set method can be
* set (as a string) and loaded (using the provided classloader) during
* the initialization phase.
*
* Two methods are overridden to avoid exceptions due to lack of a get
* method:
*
* - initializeAttributes
* - getAttributeClass
*
*/
public class JAXBSetMethodAttributeAccessor extends MethodAttributeAccessor {
String parameterTypeAsString;
ClassLoader loader;
Class<Object> attributeClassification = CoreClassConstants.OBJECT;
/**
* This constructor sets the set method input parameter type (as string) as
* well as the classloader that will be used to load the associated class
* during initialization.
*
*/
public JAXBSetMethodAttributeAccessor(String parameterTypeAsString, ClassLoader loader) {
this.parameterTypeAsString = parameterTypeAsString;
this.loader = loader;
}
/**
* Override to avoid exceptions due to lack of get method.
*/
@Override
public void initializeAttributes(Class theJavaClass) throws DescriptorException {
if (getAttributeName() == null) {
throw DescriptorException.attributeNameNotSpecified();
}
try {
if (!isWriteOnly()) {
Class[] parameterTypes = new Class[1];
parameterTypes[0] = Helper.getClassFromClasseName(parameterTypeAsString, loader);
attributeClassification = parameterTypes[0];
setSetMethod(Helper.getDeclaredMethod(theJavaClass, setMethodName, parameterTypes));
}
} catch (NoSuchMethodException ex) {
DescriptorException descriptorException = DescriptorException.noSuchMethodWhileInitializingAttributesInMethodAccessor(getSetMethodName(), getGetMethodName(), theJavaClass.getName());
descriptorException.setInternalException(ex);
throw descriptorException;
}
}
/**
* Return the return type of the method accessor.
*/
@Override
public Class getAttributeClass() {
return attributeClassification;
}
}