blob: 96fe3b1890b92d67b879c2a696d28872db8f0348 [file] [log] [blame]
/*
* Copyright (c) 1998, 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:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.jpa.weaving;
import org.eclipse.persistence.internal.libraries.asm.Type;
import org.eclipse.persistence.mappings.DatabaseMapping;
/**
* INTERNAL:
* Internal helper class that holds details of a persistent attribute.
* Used by {@link ClassDetails}
*/
public class AttributeDetails {
/** The name of this attribute. */
protected String attributeName;
protected String referenceClassName;
protected Type referenceClassType;
protected boolean weaveValueHolders = false;
// Determine if we need to weave field level value holders as transient.
// With JPA 2.0 a mapping may have PROPERTY access when the owning class
// itself has FIELD access, meaning we want to avoid having the class
// process a weaved value holder field into a descriptor mapping.
protected boolean weaveTransientFieldValueHolders;
protected DatabaseMapping mapping;
protected String getterMethodName;
protected String setterMethodName;
protected boolean attributeOnSuperClass = false;
/** Determines if the attribute has a real field. */
protected boolean hasField = false;
/** Determines if the attribute has a real field. */
protected Type declaringType;
/** Caches the set method signature. */
protected String setMethodSignature;
protected boolean isVirtualProperty = false;
public AttributeDetails(String attributeName, DatabaseMapping mapping) {
this.attributeName = attributeName;
this.mapping = mapping;
}
public String getAttributeName() {
return this.attributeName;
}
public DatabaseMapping getMapping() {
return mapping;
}
public String getGetterMethodName() {
return getterMethodName;
}
public String getSetterMethodSignature() {
if (setMethodSignature == null) {
if (isVirtualProperty){
setMethodSignature = ClassWeaver.VIRTUAL_SETTER_SIGNATURE;
} else {
setMethodSignature = "(" + getReferenceClassType().getDescriptor() + ")V";
}
}
return setMethodSignature;
}
public String getSetterMethodName() {
return setterMethodName;
}
public String getReferenceClassName() {
return referenceClassName;
}
public void setReferenceClassName(String className) {
referenceClassName = className;
}
public Type getDeclaringType() {
return declaringType;
}
public void setDeclaringType(Type declaringType) {
this.declaringType = declaringType;
}
public Type getReferenceClassType() {
return referenceClassType;
}
public void setReferenceClassType(Type classType){
referenceClassType = classType;
}
public void setAttributeOnSuperClass(boolean onSuperClass) {
attributeOnSuperClass = onSuperClass;
}
public boolean isVirtualProperty() {
return isVirtualProperty;
}
public void setVirtualProperty(boolean isVirtualProperty) {
this.isVirtualProperty = isVirtualProperty;
}
public boolean isAttributeOnSuperClass() {
return attributeOnSuperClass;
}
public void setWeaveTransientFieldValueHolders() {
weaveTransientFieldValueHolders = true;
}
public boolean weaveTransientFieldValueHolders() {
return weaveTransientFieldValueHolders;
}
public boolean weaveValueHolders() {
return weaveValueHolders;
}
public void weaveVH(boolean weaveValueHolders, DatabaseMapping mapping) {
this.weaveValueHolders = weaveValueHolders;
}
public void setGetterMethodName(String getMethodName){
this.getterMethodName = getMethodName;
}
public void setSetterMethodName(String setMethodName){
this.setterMethodName = setMethodName;
}
/**
* Set if the attribute has a real field.
* This allows properties to still be weaved at the field level.
*/
public void setHasField(boolean hasField) {
this.hasField = hasField;
}
/**
* Return if the attribute has a real field.
* This allows properties to still be weaved at the field level.
*/
public boolean hasField() {
return hasField;
}
public boolean isCollectionMapping() {
return mapping.isCollectionMapping();
}
public boolean isMappedWithAttributeAccess(){
return getterMethodName == null;
}
public boolean isOneToOneMapping() {
return mapping.isOneToOneMapping();
}
public boolean isLazy() {
return mapping.isLazy();
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer(attributeName);
if (referenceClassName != null) {
sb.append("[");
sb.append(referenceClassName);
sb.append("]");
}
sb.append(" weaveVH: ");
if (weaveValueHolders()) {
sb.append("true");
}
else {
sb.append("false");
}
sb.append(" CM: ");
if (isCollectionMapping()) {
sb.append("true");
}
else {
sb.append("false");
}
return sb.toString();
}
}