package org.activiti.engine.impl.persistence.entity;
import java.io.Serializable;
import org.activiti.engine.impl.context.Context;
/**
* <p>Encapsulates the logic for transparently working with {@link ByteArrayEntity}.</p>
*
* <p>Make sure that instance variables (i.e. fields) of this type are always initialized,
* and thus <strong>never</strong> null.</p>
*
* <p>For example:</p>
* <pre>
* private final ByteArrayRef byteArrayRef = new ByteArrayRef();
* </pre>
*
* @author Marcus Klimstra (CGI)
*/
public final class ByteArrayRef implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private ByteArrayEntity entity;
protected boolean deleted = false;
public ByteArrayRef() {
}
// Only intended to be used by ByteArrayRefTypeHandler
public ByteArrayRef(String id) {
this.id = id;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public byte[] getBytes() {
ensureInitialized();
return (entity != null ? entity.getBytes() : null);
}
public void setValue(String name, byte[] bytes) {
this.name = name;
setBytes(bytes);
}
private void setBytes(byte[] bytes) {
if (id == null) {
if (bytes != null) {
entity = ByteArrayEntity.createAndInsert(name, bytes);
id = entity.getId();
}
}
else {
ensureInitialized();
entity.setBytes(bytes);
}
}
public ByteArrayEntity getEntity() {
ensureInitialized();
return entity;
}
public void delete() {
if (!deleted && id != null) {
if (entity != null) {
// if the entity has been loaded already,
// we might as well use the safer optimistic locking delete.
Context.getCommandContext()
.getByteArrayEntityManager()
.deleteByteArray(entity);
}
else {
Context.getCommandContext()
.getByteArrayEntityManager()
.deleteByteArrayById(id);
}
entity = null;
id = null;
deleted = true;
}
}
private void ensureInitialized() {
if (id != null && entity == null) {
entity = Context.getCommandContext()
.getByteArrayEntityManager()
.findById(id);
name = entity.getName();
}
}
public boolean isDeleted() {
return deleted;
}
@Override
public String toString() {
return "ByteArrayRef[id=" + id + ", name=" + name + ", entity=" + entity + (deleted ? ", deleted]" :"]");
}
}