package com.brightgenerous.orm; import static com.brightgenerous.commons.ObjectUtils.*; import static com.brightgenerous.orm.ICloneable.Utils.*; import java.io.Serializable; import com.brightgenerous.commons.EqualsUtils; import com.brightgenerous.commons.HashCodeUtils; import com.brightgenerous.commons.ToStringUtils; public class Condition implements Clearable, ICloneable<Condition>, Serializable { private static final long serialVersionUID = -6912482213181209264L; private final ConditionContext context; private final UpdatedCallback callback; private Fields fields; private Options options; private Sorts sorts; private Long offset; private Long limit; private boolean forUpdate; public Condition() { this((ConditionContext) null); } public Condition(ConditionContext context) { this(context, null); } public Condition(UpdatedCallback callback) { this(null, callback); } public Condition(ConditionContext context, UpdatedCallback callback) { this.context = (context == null) ? DefaultConditionContext.get() : context; this.callback = callback; } protected ConditionContext getContext() { return context; } public Fields getFields() { if (fields == null) { fields = getContext().newFields(callback); } return fields; } public Options getOptions() { if (options == null) { options = getContext().newOptions(callback); } return options; } public Sorts getSorts() { if (sorts == null) { sorts = getContext().newSorts(callback); } return sorts; } public Long getOffset() { return offset; } public void setOffset(long offset) { setOffset(Long.valueOf(offset)); } public void setOffset(Long offset) { if (!equalsEscapeNull(this.offset, offset)) { this.offset = offset; callbackUpdated(); } } public void clearOffset() { setOffset(null); } public Long getLimit() { return limit; } public void setLimit(long limit) { setLimit(Long.valueOf(limit)); } public void setLimit(Long limit) { if (!equalsEscapeNull(this.limit, limit)) { this.limit = limit; callbackUpdated(); } } public void clearLimit() { setLimit(null); } public void setOffsetLimit(long offset, long limit) { setOffsetLimit(Long.valueOf(offset), Long.valueOf(limit)); } public void setOffsetLimit(long offset, Long limit) { setOffsetLimit(Long.valueOf(offset), limit); } public void setOffsetLimit(Long offset, long limit) { setOffsetLimit(offset, Long.valueOf(limit)); } public void setOffsetLimit(Long offset, Long limit) { boolean changed = false; if (!equalsEscapeNull(this.offset, offset)) { this.offset = offset; changed |= true; } if (!equalsEscapeNull(this.limit, limit)) { this.limit = limit; changed |= true; } if (changed) { callbackUpdated(); } } public void clearOffsetLimit() { setOffsetLimit(null, null); } public boolean getForUpdate() { return forUpdate; } public void setForUpdate(boolean forUpdate) { if (this.forUpdate != forUpdate) { this.forUpdate = forUpdate; callbackUpdated(); } } public void clean() { if (fields != null) { fields.clean(); } if (options != null) { options.clean(); } } @Override public void clear() { clean(); boolean changed = false; if ((fields != null) && !fields.isEmpty()) { fields.clear(); changed |= true; } if ((options != null) && !options.isEmpty()) { options.clear(); changed |= true; } if ((sorts != null) && !sorts.isEmpty()) { sorts.clear(); changed |= true; } if (offset != null) { offset = null; changed |= true; } if (limit != null) { limit = null; changed |= true; } if (forUpdate) { forUpdate = false; changed |= true; } if (changed) { callbackUpdated(); } } @Override public Condition clone() { clean(); Condition ret; try { ret = (Condition) super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage()); } ret.fields = getIfClone(fields); ret.options = getIfClone(options); ret.sorts = getIfClone(sorts); ret.offset = getIfClone(offset); ret.limit = getIfClone(limit); ret.forUpdate = forUpdate; return ret; } private void callbackUpdated() { if (callback != null) { callback.updated(); } } @Override public int hashCode() { if (HashCodeUtils.resolved()) { return HashCodeUtils.hashCodeAlt(null, this); } return super.hashCode(); } @Override public boolean equals(Object obj) { if (EqualsUtils.resolved()) { return EqualsUtils.equalsAlt(null, this, obj); } return super.equals(obj); } @Override public String toString() { if (ToStringUtils.resolved()) { return ToStringUtils.toStringAlt(this); } return super.toString(); } }