package com.telefonica.claudia.slm.recovery; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import com.telefonica.claudia.slm.common.PersistentObject; import com.telefonica.claudia.slm.naming.DirectoryEntry; @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public abstract class OperationLog implements PersistentObject { @Id @GeneratedValue protected long internalId; /** * Identifier of the operation type. */ protected String opType; /** * List of subjects of the operation. */ @OneToMany(fetch=FetchType.EAGER) protected Set<Subject> subjects = new HashSet<Subject>(); /** * Current status of the operation. Subclasses may add new types of status. */ protected String status; public final static String STATE_INIT="init"; public final static String STATE_FAILED="failed"; public final static String STATE_SUCCESS="success"; public final static String STATE_WAITING="waiting"; @OneToMany(mappedBy="parent", cascade=CascadeType.MERGE) protected List<OperationLog> operationList = new ArrayList<OperationLog>(); @ManyToOne protected OperationLog parent; //-------------------------------------------------------------------------------- public void setWaiting() { this.status= STATE_WAITING; } public void rollback() { this.status= STATE_FAILED; if (parent!=null) this.parent.rollback(); } public void commit() { if (this.status!= STATE_FAILED) this.status= STATE_SUCCESS; } public void addOp(OperationLog op) { operationList.add(op); op.setParent(this); } public void setOpType(String opType) { this.opType = opType; } public String getOpType() { return opType; } public <T extends DirectoryEntry & PersistentObject > Subject addSubject(T subject) { Subject sub = new Subject(); sub.setClassName(subject.getClass().getCanonicalName()); sub.setFqn(subject.getFQN().toString()); sub.setId(subject.getObjectId()); subjects.add(sub); return sub; } public String getStatus() { return status; } public long getObjectId() { return internalId; } public void setParent(OperationLog parent) { this.parent = parent; } public OperationLog getParent() { return parent; } public Set<Subject> getSubjects() { return subjects; } public List<OperationLog> getOperations() { return operationList; } }