diff --git a/pom.xml b/pom.xml
index 5b056dc3f..c6f265724 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
io.ebean
ebean
- 11.22.6-SNAPSHOT
+ 11.22.7-SNAPSHOT
jar
ebean
diff --git a/src/main/java/io/ebean/OrderBy.java b/src/main/java/io/ebean/OrderBy.java
index e9f68f6f5..7ce78f340 100644
--- a/src/main/java/io/ebean/OrderBy.java
+++ b/src/main/java/io/ebean/OrderBy.java
@@ -1,9 +1,12 @@
package io.ebean;
+import io.ebean.util.StringHelper;
+
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
/**
* Represents an Order By for a Query.
@@ -74,6 +77,15 @@ public final class OrderBy implements Serializable {
return query;
}
+ /**
+ * Add a property with ascending order to this OrderBy.
+ */
+ public Query asc(String propertyName, String collation) {
+
+ list.add(new Property(propertyName, true, collation));
+ return query;
+ }
+
/**
* Add a property with descending order to this OrderBy.
*/
@@ -83,6 +95,16 @@ public final class OrderBy implements Serializable {
return query;
}
+ /**
+ * Add a property with descending order to this OrderBy.
+ */
+ public Query desc(String propertyName, String collation) {
+
+ list.add(new Property(propertyName, false, collation));
+ return query;
+ }
+
+
/**
* Return true if the property is known to be contained in the order by clause.
*/
@@ -231,6 +253,8 @@ public final class OrderBy implements Serializable {
private boolean ascending;
+ private String collation;
+
private String nulls;
private String highLow;
@@ -247,17 +271,32 @@ public final class OrderBy implements Serializable {
this.highLow = highLow;
}
+ public Property(String property, boolean ascending, String collation) {
+ this.property = property;
+ this.ascending = ascending;
+ this.collation = collation;
+ }
+
+ public Property(String property, boolean ascending, String collation, String nulls, String highLow) {
+ this.property = property;
+ this.ascending = ascending;
+ this.collation = collation;
+ this.nulls = nulls;
+ this.highLow = highLow;
+ }
+
/**
* Return a copy of this Property with the path trimmed.
*/
public Property copyWithTrim(String path) {
- return new Property(property.substring(path.length() + 1), ascending, nulls, highLow);
+ return new Property(property.substring(path.length() + 1), ascending, collation, nulls, highLow);
}
@Override
public int hashCode() {
int hc = property.hashCode();
hc = hc * 92821 + (ascending ? 0 : 1);
+ hc = hc * 92821 + (collation == null ? 0 : collation.hashCode());
hc = hc * 92821 + (nulls == null ? 0 : nulls.hashCode());
hc = hc * 92821 + (highLow == null ? 0 : highLow.hashCode());
return hc;
@@ -274,8 +313,9 @@ public final class OrderBy implements Serializable {
Property e = (Property) obj;
if (ascending != e.ascending) return false;
if (!property.equals(e.property)) return false;
- if (nulls != null ? !nulls.equals(e.nulls) : e.nulls != null) return false;
- return highLow != null ? highLow.equals(e.highLow) : e.highLow == null;
+ if (!Objects.equals(collation, e.collation)) return false;
+ if (!Objects.equals(nulls, e.nulls)) return false;
+ return Objects.equals(highLow, e.highLow);
}
@Override
@@ -284,7 +324,7 @@ public final class OrderBy implements Serializable {
}
public String toStringFormat() {
- if (nulls == null) {
+ if (nulls == null && collation == null) {
if (ascending) {
return property;
} else {
@@ -292,11 +332,23 @@ public final class OrderBy implements Serializable {
}
} else {
StringBuilder sb = new StringBuilder();
- sb.append(property);
+ if (collation != null) {
+ if (collation.contains("${}")) {
+ // this is a complex collation, e.g. DB2 - we must replace the property
+ sb.append(StringHelper.replaceString(collation, "${}", property));
+ } else {
+ sb.append(property);
+ sb.append(" collate ").append(collation);
+ }
+ } else {
+ sb.append(property);
+ }
if (!ascending) {
sb.append(" ").append("desc");
}
- sb.append(" ").append(nulls).append(" ").append(highLow);
+ if (nulls != null) {
+ sb.append(" ").append(nulls).append(" ").append(highLow);
+ }
return sb.toString();
}
}
@@ -319,7 +371,7 @@ public final class OrderBy implements Serializable {
* Return a copy of this property.
*/
public Property copy() {
- return new Property(property, ascending, nulls, highLow);
+ return new Property(property, ascending, collation, nulls, highLow);
}
/**
diff --git a/src/main/java/io/ebean/bean/EntityBeanIntercept.java b/src/main/java/io/ebean/bean/EntityBeanIntercept.java
index e35384ad4..fcd6bb7ad 100644
--- a/src/main/java/io/ebean/bean/EntityBeanIntercept.java
+++ b/src/main/java/io/ebean/bean/EntityBeanIntercept.java
@@ -71,21 +71,30 @@ public final class EntityBeanIntercept implements Serializable {
/**
* Used when a bean is partially filled.
*/
- private final boolean[] loadedProps;
-
- private boolean fullyLoadedBean;
+ private static final byte FLAG_LOADED_PROP = 1;
/**
* Set of changed properties.
*/
- private boolean[] changedProps;
+ private static final byte FLAG_CHANGED_PROP = 2;
/**
* Flags indicating if a property is a dirty embedded bean. Used to distingush
* between an embedded bean being completely overwritten and one of its
* embedded properties being made dirty.
*/
- private boolean[] embeddedDirty;
+ private static final byte FLAG_EMBEDDED_DIRTY = 4;
+
+ /**
+ * Flags indicating if a property is a dirty embedded bean. Used to distingush
+ * between an embedded bean being completely overwritten and one of its
+ * embedded properties being made dirty.
+ */
+ private static final byte FLAG_ORIG_VALUE_SET = 8;
+
+ private final byte[] flags;
+
+ private boolean fullyLoadedBean;
private Object[] origValues;
@@ -102,7 +111,7 @@ public final class EntityBeanIntercept implements Serializable {
*/
public EntityBeanIntercept(Object ownerBean) {
this.owner = (EntityBean) ownerBean;
- this.loadedProps = new boolean[owner._ebean_getPropertyNames().length];
+ this.flags = new byte[owner._ebean_getPropertyNames().length];
}
/**
@@ -213,8 +222,8 @@ public final class EntityBeanIntercept implements Serializable {
* Check each property to see if the bean is partially loaded.
*/
public boolean isPartial() {
- for (boolean loadedProp : loadedProps) {
- if (!loadedProp) {
+ for (byte flag : flags) {
+ if ((flag & FLAG_LOADED_PROP) == 0) {
return true;
}
}
@@ -259,10 +268,10 @@ public final class EntityBeanIntercept implements Serializable {
* Return true if only the Id property has been loaded.
*/
public boolean hasIdOnly(int idIndex) {
- for (int i = 0; i < loadedProps.length; i++) {
+ for (int i = 0; i < flags.length; i++) {
if (i == idIndex) {
- if (!loadedProps[i]) return false;
- } else if (loadedProps[i]) {
+ if ((flags[i] & FLAG_LOADED_PROP) == 0) return false;
+ } else if ((flags[i] & FLAG_LOADED_PROP) != 0) {
return false;
}
}
@@ -284,9 +293,9 @@ public final class EntityBeanIntercept implements Serializable {
if (idPos > -1) {
// For cases where properties are set on constructor
// set every non Id property to unloaded (for lazy loading)
- for (int i = 0; i < loadedProps.length; i++) {
+ for (int i = 0; i < flags.length; i++) {
if (i != idPos) {
- loadedProps[i] = false;
+ flags[i] &= ~FLAG_LOADED_PROP;
}
}
}
@@ -352,7 +361,9 @@ public final class EntityBeanIntercept implements Serializable {
this.owner._ebean_setEmbeddedLoaded();
this.lazyLoadProperty = -1;
this.origValues = null;
- this.changedProps = null;
+ for (int i = 0; i < flags.length; i++) {
+ flags[i] &= ~(FLAG_CHANGED_PROP + FLAG_ORIG_VALUE_SET);
+ }
this.dirty = false;
}
@@ -475,7 +486,11 @@ public final class EntityBeanIntercept implements Serializable {
if (position == -1) {
throw new IllegalArgumentException("Property " + propertyName + " not found");
}
- loadedProps[position] = loaded;
+ if (loaded) {
+ flags[position] |= FLAG_LOADED_PROP;
+ } else {
+ flags[position] &= ~FLAG_LOADED_PROP;
+ }
}
/**
@@ -483,22 +498,22 @@ public final class EntityBeanIntercept implements Serializable {
* constructor.
*/
public void setPropertyUnloaded(int propertyIndex) {
- loadedProps[propertyIndex] = false;
+ flags[propertyIndex] &= ~FLAG_LOADED_PROP;
}
/**
* Set the property to be loaded.
*/
public void setLoadedProperty(int propertyIndex) {
- loadedProps[propertyIndex] = true;
+ flags[propertyIndex] |= FLAG_LOADED_PROP;
}
/**
* Set all properties to be loaded (post insert).
*/
public void setLoadedPropertyAll() {
- for (int i = 0; i < loadedProps.length; i++) {
- loadedProps[i] = true;
+ for (int i = 0; i < flags.length; i++) {
+ flags[i] |= FLAG_LOADED_PROP;
}
}
@@ -506,14 +521,14 @@ public final class EntityBeanIntercept implements Serializable {
* Return true if the property is loaded.
*/
public boolean isLoadedProperty(int propertyIndex) {
- return loadedProps[propertyIndex];
+ return (flags[propertyIndex] & FLAG_LOADED_PROP) != 0;
}
/**
* Return true if the property is considered changed.
*/
public boolean isChangedProperty(int propertyIndex) {
- return (changedProps != null && changedProps[propertyIndex]);
+ return (flags[propertyIndex] & FLAG_CHANGED_PROP) != 0;
}
/**
@@ -521,8 +536,7 @@ public final class EntityBeanIntercept implements Serializable {
* embedded properties is dirty.
*/
public boolean isDirtyProperty(int propertyIndex) {
- return (changedProps != null && changedProps[propertyIndex]
- || embeddedDirty != null && embeddedDirty[propertyIndex]);
+ return (flags[propertyIndex] & (FLAG_CHANGED_PROP + FLAG_EMBEDDED_DIRTY)) != 0;
}
/**
@@ -534,27 +548,22 @@ public final class EntityBeanIntercept implements Serializable {
}
public void setChangedProperty(int propertyIndex) {
- if (changedProps == null) {
- changedProps = new boolean[owner._ebean_getPropertyNames().length];
- }
- changedProps[propertyIndex] = true;
+ flags[propertyIndex] |= FLAG_CHANGED_PROP;
}
/**
* Set that an embedded bean has had one of its properties changed.
*/
private void setEmbeddedPropertyDirty(int propertyIndex) {
- if (embeddedDirty == null) {
- embeddedDirty = new boolean[owner._ebean_getPropertyNames().length];
- }
- embeddedDirty[propertyIndex] = true;
+ flags[propertyIndex] |= FLAG_EMBEDDED_DIRTY;
}
private void setOriginalValue(int propertyIndex, Object value) {
if (origValues == null) {
origValues = new Object[owner._ebean_getPropertyNames().length];
}
- if (origValues[propertyIndex] == null) {
+ if ((flags[propertyIndex] & FLAG_ORIG_VALUE_SET) == 0) {
+ flags[propertyIndex] |= FLAG_ORIG_VALUE_SET;
origValues[propertyIndex] = value;
}
}
@@ -574,13 +583,9 @@ public final class EntityBeanIntercept implements Serializable {
*/
public void setNewBeanForUpdate() {
- if (changedProps == null) {
- changedProps = new boolean[owner._ebean_getPropertyNames().length];
- }
-
- for (int i = 0; i < loadedProps.length; i++) {
- if (loadedProps[i]) {
- changedProps[i] = true;
+ for (int i = 0; i < flags.length; i++) {
+ if ((flags[i] & FLAG_LOADED_PROP) != 0) {
+ flags[i] |= FLAG_CHANGED_PROP;
}
}
setDirty(true);
@@ -594,8 +599,8 @@ public final class EntityBeanIntercept implements Serializable {
return null;
}
Set props = new LinkedHashSet<>();
- for (int i = 0; i < loadedProps.length; i++) {
- if (loadedProps[i]) {
+ for (int i = 0; i < flags.length; i++) {
+ if ((flags[i] & FLAG_LOADED_PROP) != 0) {
props.add(getProperty(i));
}
}
@@ -609,12 +614,8 @@ public final class EntityBeanIntercept implements Serializable {
int len = getPropertyLength();
boolean[] dirties = new boolean[len];
for (int i = 0; i < len; i++) {
- if (changedProps != null && changedProps[i]) {
- dirties[i] = true;
- } else if (embeddedDirty != null && embeddedDirty[i]) {
- // an embedded property has been changed - recurse
- dirties[i] = true;
- }
+ // this, or an embedded property has been changed - recurse
+ dirties[i] = (flags[i] & (FLAG_CHANGED_PROP + FLAG_EMBEDDED_DIRTY)) != 0;
}
return dirties;
}
@@ -634,11 +635,11 @@ public final class EntityBeanIntercept implements Serializable {
public void addDirtyPropertyNames(Set props, String prefix) {
int len = getPropertyLength();
for (int i = 0; i < len; i++) {
- if (changedProps != null && changedProps[i]) {
+ if ((flags[i] & FLAG_CHANGED_PROP) != 0) {
// the property has been changed on this bean
String propName = (prefix == null ? getProperty(i) : prefix + getProperty(i));
props.add(propName);
- } else if (embeddedDirty != null && embeddedDirty[i]) {
+ } else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
embeddedBean._ebean_getIntercept().addDirtyPropertyNames(props, getProperty(i) + ".");
@@ -654,12 +655,12 @@ public final class EntityBeanIntercept implements Serializable {
String[] names = owner._ebean_getPropertyNames();
int len = getPropertyLength();
for (int i = 0; i < len; i++) {
- if (changedProps != null && changedProps[i]) {
+ if ((flags[i] & FLAG_CHANGED_PROP) != 0) {
// the property has been changed on this bean
if (propertyNames.contains(names[i])) {
return true;
}
- } else if (embeddedDirty != null && embeddedDirty[i]) {
+ } else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
if (propertyNames.contains(names[i])) {
return true;
}
@@ -683,15 +684,16 @@ public final class EntityBeanIntercept implements Serializable {
public void addDirtyPropertyValues(Map dirtyValues, String prefix) {
int len = getPropertyLength();
for (int i = 0; i < len; i++) {
- if (changedProps != null && changedProps[i]) {
+ if ((flags[i] & FLAG_CHANGED_PROP) != 0) {
// the property has been changed on this bean
String propName = (prefix == null ? getProperty(i) : prefix + getProperty(i));
Object newVal = owner._ebean_getField(i);
Object oldVal = getOrigValue(i);
+ if (!areEqual(oldVal, newVal)) {
+ dirtyValues.put(propName, new ValuePair(newVal, oldVal));
+ }
- dirtyValues.put(propName, new ValuePair(newVal, oldVal));
-
- } else if (embeddedDirty != null && embeddedDirty[i]) {
+ } else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
embeddedBean._ebean_getIntercept().addDirtyPropertyValues(dirtyValues, getProperty(i) + ".");
@@ -705,13 +707,15 @@ public final class EntityBeanIntercept implements Serializable {
public void addDirtyPropertyValues(BeanDiffVisitor visitor) {
int len = getPropertyLength();
for (int i = 0; i < len; i++) {
- if (changedProps != null && changedProps[i]) {
+ if ((flags[i] & FLAG_CHANGED_PROP) != 0) {
// the property has been changed on this bean
Object newVal = owner._ebean_getField(i);
Object oldVal = getOrigValue(i);
- visitor.visit(i, newVal, oldVal);
+ if (!areEqual(oldVal, newVal)) {
+ visitor.visit(i, newVal, oldVal);
+ }
- } else if (embeddedDirty != null && embeddedDirty[i]) {
+ } else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
visitor.visitPush(i);
@@ -739,9 +743,9 @@ public final class EntityBeanIntercept implements Serializable {
}
int len = getPropertyLength();
for (int i = 0; i < len; i++) {
- if (changedProps != null && changedProps[i]) {
+ if ((flags[i] & FLAG_CHANGED_PROP) != 0) {
sb.append(i).append(',');
- } else if (embeddedDirty != null && embeddedDirty[i]) {
+ } else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
sb.append(i).append('[');
@@ -765,15 +769,12 @@ public final class EntityBeanIntercept implements Serializable {
return sb;
}
- /**
- * Return the set of property names for changed properties.
- */
- public boolean[] getChanged() {
- return changedProps;
- }
-
public boolean[] getLoaded() {
- return loadedProps;
+ boolean[] ret= new boolean[flags.length];
+ for (int i = 0; i < ret.length; i++) {
+ ret[i] = (flags[i] & FLAG_LOADED_PROP) != 0;
+ }
+ return ret;
}
/**
@@ -821,7 +822,7 @@ public final class EntityBeanIntercept implements Serializable {
*/
private void loadBeanInternal(int loadProperty, BeanLoader loader) {
- if (loadedProps == null || loadedProps[loadProperty]) {
+ if ((flags[loadProperty] & FLAG_LOADED_PROP) != 0) {
// race condition where multiple threads calling preGetter concurrently
return;
}
@@ -887,7 +888,7 @@ public final class EntityBeanIntercept implements Serializable {
* Called when a BeanCollection is initialised automatically.
*/
public void initialisedMany(int propertyIndex) {
- loadedProps[propertyIndex] = true;
+ flags[propertyIndex] |= FLAG_LOADED_PROP;
}
private void preGetterCallback(int propertyIndex) {
diff --git a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java
index 65bdfff4c..152cd3588 100644
--- a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java
+++ b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java
@@ -64,8 +64,6 @@ public class DatabasePlatform {
*/
protected String closeQuote = "\"";
- protected String concatOperator = "||";
-
/**
* When set to true all db column names and table names use quoted identifiers.
*/
@@ -455,13 +453,6 @@ public class DatabasePlatform {
return openQuote;
}
- /**
- * Return the DB concat operator.
- */
- public String getConcatOperator() {
- return concatOperator;
- }
-
/**
* Return the JDBC type used to store booleans.
*/
diff --git a/src/main/java/io/ebean/plugin/BeanType.java b/src/main/java/io/ebean/plugin/BeanType.java
index 2f00cd0af..bb487de35 100644
--- a/src/main/java/io/ebean/plugin/BeanType.java
+++ b/src/main/java/io/ebean/plugin/BeanType.java
@@ -9,6 +9,10 @@ import io.ebean.event.BeanQueryAdapter;
import io.ebeanservice.docstore.api.mapping.DocumentMapping;
import java.util.Collection;
+import java.util.List;
+import java.util.function.Consumer;
+
+import javax.annotation.Nonnull;
/**
* Information and methods on BeanDescriptors made available to plugins.
@@ -18,6 +22,7 @@ public interface BeanType {
/**
* Return the short name of the bean type.
*/
+ @Nonnull
String getName();
/**
@@ -28,11 +33,13 @@ public interface BeanType {
/**
* Return the full name of the bean type.
*/
+ @Nonnull
String getFullName();
/**
* Return the class type this BeanDescriptor describes.
*/
+ @Nonnull
Class getBeanType();
/**
@@ -43,6 +50,7 @@ public interface BeanType {
/**
* Return all the properties for this bean type.
*/
+ @Nonnull
Collection extends Property> allProperties();
/**
@@ -197,6 +205,28 @@ public interface BeanType {
*/
boolean hasInheritance();
+ /**
+ * Return true if this object is the root level object in its entity
+ * inheritance.
+ */
+ boolean isInheritanceRoot();
+
+ /**
+ * Returns all direct children of this beantype
+ */
+ List> getInheritanceChildren();
+
+ /**
+ * Returns the parent in inheritance hiearchy
+ */
+ BeanType> getInheritanceParent();
+
+ /**
+ * Visit all children recursively
+ * @param visitor
+ */
+ void visitAllInheritanceChildren(Consumer> visitor);
+
/**
* Return the discriminator column.
*/
diff --git a/src/main/java/io/ebean/plugin/Property.java b/src/main/java/io/ebean/plugin/Property.java
index e3e9d2c3e..20d81d7e5 100644
--- a/src/main/java/io/ebean/plugin/Property.java
+++ b/src/main/java/io/ebean/plugin/Property.java
@@ -1,5 +1,7 @@
package io.ebean.plugin;
+import javax.annotation.Nonnull;
+
/**
* Property of a entity bean that can be read.
*/
@@ -8,8 +10,15 @@ public interface Property {
/**
* Return the name of the property.
*/
+ @Nonnull
String getName();
+ /**
+ * Return the type of the property.
+ */
+ @Nonnull
+ Class> getPropertyType();
+
/**
* Return the value of the property on the given bean.
*/
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
index 4a0c711d5..f114970f9 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
@@ -100,6 +100,7 @@ import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -107,6 +108,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
/**
* Describes Beans including their deployment information.
@@ -1133,6 +1136,7 @@ public class BeanDescriptor implements BeanType, STreeType {
* Return true if this object is the root level object in its entity
* inheritance.
*/
+ @Override
public boolean isInheritanceRoot() {
return inheritInfo == null || inheritInfo.isRoot();
}
@@ -3475,4 +3479,29 @@ public class BeanDescriptor implements BeanType, STreeType {
public List getUniqueProps() {
return propertiesUnique;
}
+
+ @Override
+ public List> getInheritanceChildren() {
+ if (hasInheritance()) {
+ return getInheritInfo().getChildren()
+ .stream()
+ .map(InheritInfo::desc)
+ .collect(Collectors.toList());
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ public BeanType> getInheritanceParent() {
+ return getInheritInfo() == null ? null : getInheritInfo().getParent().desc();
+ }
+
+ @Override
+ public void visitAllInheritanceChildren(Consumer> visitor) {
+ if (hasInheritance()) {
+ getInheritInfo().visitChildren(info -> visitor.accept(info.desc()));
+ }
+ }
+
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
index 7473e01aa..8b0650f54 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
@@ -979,6 +979,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty {
/**
* Return the full name of this property.
*/
+ @Override
public String getFullBeanName() {
return descriptor.getFullName() + "." + name;
}
@@ -994,6 +995,7 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty {
/**
* Return the scalarType.
*/
+ @Override
@SuppressWarnings(value = "unchecked")
public ScalarType