/** * */ package siena.core; import java.lang.reflect.Field; import siena.BaseQuery; import siena.ClassInfo; import siena.PersistenceManager; import siena.Query; import siena.Util; /** * @author mandubian <pascal.voitot@mandubian.org> * */ public class BaseOne<T> implements One4PM<T>{ transient protected PersistenceManager pm; transient protected Class<T> clazz; protected Relation relation; transient protected Query<T> query; transient protected T target; transient protected boolean isSync = true; transient protected boolean isModified = false; transient protected T prevTarget; public BaseOne(PersistenceManager pm, Class<T> clazz){ this.pm = pm; this.clazz = clazz; this.query = pm.createQuery(clazz); } public BaseOne(PersistenceManager pm, Class<T> clazz, RelationMode mode, Object obj, String fieldName) { this.pm = pm; this.clazz = clazz; switch(mode){ case AGGREGATION: this.relation = new Relation(mode, obj, fieldName); this.query = pm.createQuery(clazz).aggregated(obj, fieldName); break; case RELATION: this.query = pm.createQuery(clazz).owned(obj, fieldName); break; } query = pm.createQuery(clazz); } public T get() { sync(); return target; } public void set(T obj) { this.prevTarget = this.target; this.target = obj; if(relation != null && relation.mode == RelationMode.AGGREGATION){ // sets relation on target object if(this.target != null){ Util.setField(this.target, ClassInfo.getClassInfo(clazz).aggregator, this.relation); } // resets relation on previous objectll if(this.prevTarget != null){ Util.setField(this.prevTarget, ClassInfo.getClassInfo(clazz).aggregator, null); } } isModified = true; } public One<T> sync() { if(!isSync){ return forceSync(); } return this; } public One<T> forceSync() { target = query.get(); isSync = true; isModified = false; return this; } public One4PM<T> setSync(boolean isSync) { this.isSync = isSync; return this; } public boolean isModified() { return isModified; } public One4PM<T> setModified(boolean isModified) { this.isModified = isModified; return this; } public T getPrev() { return this.prevTarget; } public One4PM<T> aggregationMode(Object aggregator, Field field) { if(relation == null){ this.relation = new Relation(RelationMode.AGGREGATION, aggregator, field); }else { this.relation.mode = RelationMode.AGGREGATION; this.relation.target = aggregator; this.relation.discriminator = field; } ((BaseQuery<T>)(this.query)).aggregated(aggregator, field); return this; } public One4PM<T> relationMode(Object owner, Field field) { ((BaseQuery<T>)(this.query)).owned(owner, field); return this; } }