WebDbModel.java
package eu.javaexperience.gsdbrpc;
import java.lang.reflect.Field;
import eu.javaexperience.reflect.Mirror;
import eu.javaexperience.semantic.references.MayNotModified;
import eu.jvx.js.lib.TeaVmTools;
import eu.jvx.js.lib.reflect.TeaVmMockedReflection;
import hu.ddsi.java.database.GenericStorable;
import hu.ddsi.java.database.GenericStorage;
public abstract class WebDbModel extends RpcDbModel
{
@Override
public Object get(String key)
{
if("do".equals(key))
{
return GenericStorage.getID(this);
}
if("class".equals(key))
{
return this.getClass().getName();
}
GsdbModelMappingData mapping = null;
try
{
mapping = getMappingData(getClass());
}
catch(Exception e)
{
Mirror.propagateAnyway(e);
}
Field f = mapping.getFieldValue.get(key);
if(null == f)
{
return getExtraDataMap().get(key);
}
try
{
Object ret = null;
if(TeaVmTools.IS_FRONTEND)
{
return TeaVmMockedReflection.getObjectField(this, key);
}
else
{
ret = f.get(this);
}
if(null != ret)
{
if(ret.getClass().isEnum())
{
return ((Enum)ret).name();
}
else if(ret.getClass().isArray())
{
Class<?> comp = ret.getClass().getComponentType();
if(GenericStorable.class.isAssignableFrom(comp))
{
Long[] r = new Long[((Object[])ret).length];
for(int i=0;i<r.length;++i)
{
GenericStorable elem = ((GenericStorable[])ret)[i];
if(null == elem)
{
r[i] = -1l;
}
else
{
r[i] = GenericStorage.getID(elem);
}
}
return r;
}
return ret;
}
if(ret instanceof GenericStorable)
{
return GenericStorage.getID(((GenericStorable)ret));
}
}
return ret;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public boolean set(String key, Object src, boolean filter)
{
try
{
GsdbModelMappingData mapping = getMappingData(this.getClass());
Field f = mapping.getFieldValue.get(key);
if(null != f)
{
if(filter && null != f.getAnnotation(MayNotModified.class))
{
return false;
}
if(null != src)
{
src = tryCast(this, f.getType(), src);
if(TeaVmTools.IS_FRONTEND)
{
return TeaVmMockedReflection.setObjectField(this, key, src);
}
else
{
f.set(this, src);
return true;
}
}
else
{
f.set(this, null);
}
}
else
{
getExtraDataMap().put(key, src);
}
}
catch(Exception e)
{
//Mirror.propagateAnyway(e);
}
return false;
}
}