Files
ebean/src/main/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBean.java
T

79 lines
2.5 KiB
Java

package com.avaje.ebeaninternal.server.cache;
import com.avaje.ebean.bean.EntityBean;
import com.avaje.ebean.bean.EntityBeanIntercept;
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
import com.avaje.ebeaninternal.server.deploy.BeanProperty;
public class CachedBeanDataFromBean {
private final BeanDescriptor<?> desc;
private final EntityBean bean;
private final EntityBeanIntercept ebi;
public static CachedBeanData extract(BeanDescriptor<?> desc, EntityBean bean) {
return new CachedBeanDataFromBean(desc, bean, bean._ebean_getIntercept()).extract();
}
private CachedBeanDataFromBean(BeanDescriptor<?> desc, EntityBean bean, EntityBeanIntercept ebi) {
this.desc = desc;
this.bean = bean;
this.ebi = ebi;
}
private CachedBeanData extract() {
Object[] data = new Object[desc.getPropertyCount()];
boolean[] loaded = new boolean[desc.getPropertyCount()];
BeanProperty[] props = desc.propertiesNonMany();
int naturalKeyUpdate = -1;
for (int i = 0; i < props.length; i++) {
BeanProperty prop = props[i];
if (isLoaded(prop)) {
int propertyIndex = prop.getPropertyIndex();
data[propertyIndex] = prop.getCacheDataValue(bean);
loaded[propertyIndex] = true;
if (prop.isNaturalKey()) {
naturalKeyUpdate = propertyIndex;
}
}
}
EntityBean sharableBean = createSharableBean();
return new CachedBeanData(sharableBean, loaded, data, naturalKeyUpdate);
}
private EntityBean createSharableBean() {
if (!desc.isCacheSharableBeans() || !ebi.isFullyLoadedBean()) {
return null;
}
if (ebi.isReadOnly()) {
return bean;
}
// create a readOnly sharable instance by copying the data
EntityBean sharableBean = desc.createBean();
BeanProperty[] propertiesId = desc.propertiesId();
for (int i = 0; i < propertiesId.length; i++) {
Object v = propertiesId[i].getValue(bean);
propertiesId[i].setValue(sharableBean, v);
}
BeanProperty[] propertiesNonTransient = desc.propertiesNonTransient();
for (int i = 0; i < propertiesNonTransient.length; i++) {
Object v = propertiesNonTransient[i].getValue(bean);
propertiesNonTransient[i].setValue(sharableBean, v);
}
EntityBeanIntercept ebi = ((EntityBean) sharableBean)._ebean_intercept();
ebi.setReadOnly(true);
ebi.setLoaded();
return sharableBean;
}
private boolean isLoaded(BeanProperty prop) {
return ebi.isLoadedProperty(prop.getPropertyIndex());
}
}