/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.model.internal;
import com.qcadoo.model.api.*;
import com.qcadoo.model.api.validators.ErrorMessage;
import com.qcadoo.model.internal.api.EntityAwareCopyPerformers;
import com.qcadoo.model.internal.api.EntityAwareEqualsPerformers;
import com.qcadoo.model.internal.api.PerformerEntitiesChain;
import org.apache.commons.lang3.builder.EqualsBuilder;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import static com.google.common.base.Preconditions.checkNotNull;
import com.qcadoo.model.api.validators.GlobalMessage;
public final class ProxyEntity implements Entity, EntityAwareCopyPerformers, EntityAwareEqualsPerformers {
private final DataDefinition dataDefinition;
private final Long id;
private AtomicReference<Entity> entity = new AtomicReference<Entity>(null);
public ProxyEntity(final DataDefinition dataDefinition, final Long id) {
checkNotNull(id, "missing id for proxied entity");
this.dataDefinition = dataDefinition;
this.id = id;
}
private Entity getEntity() {
if (entity.get() == null) {
entity.compareAndSet(null, dataDefinition.get(id));
checkNotNull(entity.get(), "Proxy can't load entity");
}
return entity.get();
}
@Override
public void setId(final Long id) {
getEntity().setId(id);
}
@Override
public Long getId() {
if (entity.get() == null) {
return id;
} else {
return entity.get().getId();
}
}
@Override
public Object getField(final String fieldName) {
return getEntity().getField(fieldName);
}
@Override
public void setField(final String fieldName, final Object fieldValue) {
getEntity().setField(fieldName, fieldValue);
}
@Override
public Map<String, Object> getFields() {
return getEntity().getFields();
}
@Override
public void addGlobalError(final String message, final String... vars) {
getEntity().addGlobalError(message, vars);
}
@Override
public void addGlobalMessage(final String message, final String... vars) {
getEntity().addGlobalMessage(message, vars);
}
@Override
public void addGlobalMessage(final String message, final boolean autoClose, final boolean extraLarge, final String... vars) {
getEntity().addGlobalMessage(message, autoClose, extraLarge, vars);
}
@Override
public void addGlobalError(final String message, final boolean autoClose, final String... vars) {
getEntity().addGlobalError(message, autoClose, vars);
}
@Override
public void addGlobalError(final String message, final boolean autoClose, final boolean extraLarge, final String... vars) {
getEntity().addGlobalError(message, autoClose, extraLarge, vars);
}
@Override
public void addError(final FieldDefinition fieldDefinition, final String message, final String... vars) {
getEntity().addError(fieldDefinition, message, vars);
}
@Override
public List<ErrorMessage> getGlobalErrors() {
return getEntity().getGlobalErrors();
}
@Override
public List<GlobalMessage> getGlobalMessages() {
return getEntity().getGlobalMessages();
}
@Override
public Map<String, ErrorMessage> getErrors() {
return getEntity().getErrors();
}
@Override
public ErrorMessage getError(final String fieldName) {
return getEntity().getError(fieldName);
}
@Override
public boolean isValid() {
return getEntity().isValid();
}
@Override
public void setNotValid() {
getEntity().setNotValid();
}
@Override
public boolean isFieldValid(final String fieldName) {
return getEntity().isFieldValid(fieldName);
}
@Override
public boolean isActive() {
return getEntity().isActive();
}
@Override
public void setActive(final boolean active) {
getEntity().setActive(active);
}
@Override
public Entity copy() {
return copy(new PerformerEntitiesChainImpl(this));
}
@Override
public Entity copy(final PerformerEntitiesChain performersChain) {
Entity entityCopy = null;
if (getEntity() instanceof EntityAwareCopyPerformers) {
entityCopy = ((EntityAwareCopyPerformers) getEntity()).copy(performersChain);
} else {
entityCopy = getEntity().copy();
}
return entityCopy;
}
@Override
public String getStringField(final String fieldName) {
return getEntity().getStringField(fieldName);
}
@Override
public boolean getBooleanField(final String fieldName) {
return getEntity().getBooleanField(fieldName);
}
@Override
public BigDecimal getDecimalField(final String fieldName) {
return getEntity().getDecimalField(fieldName);
}
@Override
public Integer getIntegerField(String fieldName) {
return getEntity().getIntegerField(fieldName);
}
@Override
public Long getLongField(String fieldName) {
return getEntity().getLongField(fieldName);
}
@Override
public Entity getBelongsToField(final String fieldName) {
return getEntity().getBelongsToField(fieldName);
}
@Override
public EntityList getHasManyField(final String fieldName) {
return getEntity().getHasManyField(fieldName);
}
@Override
public List<Entity> getManyToManyField(final String fieldName) {
return getEntity().getManyToManyField(fieldName);
}
@Override
public EntityTree getTreeField(final String fieldName) {
return getEntity().getTreeField(fieldName);
}
@Override
public DataDefinition getDataDefinition() {
return dataDefinition;
}
@Override
public String toString() {
return "EntityProxy[" + dataDefinition.getPluginIdentifier() + "." + dataDefinition.getName() + "][id=" + id + "]";
}
@Override
public int hashCode() {
return getEntity().hashCode();
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (!(obj instanceof Entity)) {
return false;
}
Entity other = (Entity) obj;
if (!definitionsAreEquals(other)) {
return false;
}
return getEntity().equals(other);
}
private boolean definitionsAreEquals(final Entity other) {
return new EqualsBuilder().append(id, other.getId()).append(dataDefinition, other.getDataDefinition()).isEquals();
}
@Override
public boolean equals(final Entity obj, final PerformerEntitiesChain performersChain) {
boolean isEquals;
final Entity entity = getEntity();
if (entity instanceof EntityAwareEqualsPerformers) {
isEquals = ((EntityAwareEqualsPerformers) entity).equals(obj, performersChain);
} else {
isEquals = entity.equals(obj);
}
return isEquals;
}
@Override
public boolean flatEquals(final Entity obj) {
boolean isEquals;
final Entity entity = getEntity();
if (entity instanceof EntityAwareEqualsPerformers) {
isEquals = ((EntityAwareEqualsPerformers) entity).flatEquals(obj);
} else {
isEquals = entity.equals(obj);
}
return isEquals;
}
@Override
public Date getDateField(String fieldName) {
return getEntity().getDateField(fieldName);
}
}