/******************************************************************************* * Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * 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 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. * * @param parameterTypeAsString * @param loader */ public JAXBSetMethodAttributeAccessor(String parameterTypeAsString, ClassLoader loader) { this.parameterTypeAsString = parameterTypeAsString; this.loader = loader; } /** * Override to avoid exceptions due to lack of get method. */ 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. */ public Class getAttributeClass() { return attributeClassification; } }