package org.rhq.enterprise.server.plugins.drift.mongodb.entities; import java.io.Serializable; import com.google.code.morphia.annotations.Embedded; import com.google.code.morphia.annotations.Property; import com.google.code.morphia.annotations.Transient; import org.bson.types.ObjectId; import org.rhq.core.domain.drift.Drift; import org.rhq.core.domain.drift.DriftCategory; /** * A MongoChangeSetEntry is embedded in a {@link MongoDBChangeSet}. In the database, a change set * is stored as a single document, and the document contains an array of its entries. */ @Embedded public class MongoDBChangeSetEntry implements Drift<MongoDBChangeSet, MongoDBFile>, Serializable { private static final long serialVersionUID = 1L; /** * This is the array index of the entry in the document that exists in the database. * Each entry has a unique index relative to its owning change set. The index is used * to form a unique id for the entry. */ @Property("idx") private int index; /** * The time that the entry was created. */ private Long ctime = System.currentTimeMillis(); /** * The category is one added, removed, or changed. */ private DriftCategory category; /** * This is the path relative to the base directory defined in the * {@link org.rhq.core.domain.drift.DriftDefinition} */ private String path; private String directory; @Transient private MongoDBChangeSet changeSet; @Transient private ObjectId changeSetId; private String oldFileHash; private String newFileHash; public MongoDBChangeSetEntry() { } public MongoDBChangeSetEntry(String path, DriftCategory category) { this.path = path; int i = path.lastIndexOf("/"); directory = (i != -1) ? path.substring(0, i) : "./"; this.category = category; } /** * Returns an id that uniquely identifies this entry. Since a MongoChangeSetEntry does * not have a PK in the database, this is a combination of the change set id with its * index which is assigned by the owning change set. The format is: * <p/> * <pre> * <changeset_id>:<n> * </pre> * <p/> * where <i>n</i> is an integer id assigned by the owning change set that is unique * within that change set. * * @return A unique identifier for the change set entry */ @Override public String getId() { if (changeSetId == null) { return null; } return changeSetId.toString() + ":" + index; } /** * This method does <strong>not</strong> actually set the id. It is here * only because it is required by the {@link Drift} interface. * @param id */ @Override public void setId(String id) { } /** * Sets the index of the entry which is the array index within the document stored in the * database. The index is used to form a unique id for the entry. * * @param index The array index of the entry as it is stored in the change set document * in the database. */ public void setIndex(int index) { this.index = index; } @Override public Long getCtime() { return ctime; } /** * This is here only for testing. * @param ctime The timestamp */ public void setCtime(Long ctime) { this.ctime = ctime; } @Override public MongoDBChangeSet getChangeSet() { return changeSet; } @Override public void setChangeSet(MongoDBChangeSet changeSet) { this.changeSet = changeSet; changeSetId = changeSet.getObjectId(); } @Override public DriftCategory getCategory() { return category; } @Override public void setCategory(DriftCategory category) { this.category = category; } @Override public String getPath() { return path; } @Override public void setPath(String path) { this.path = path; int i = path.lastIndexOf("/"); directory = (i != -1) ? path.substring(0, i) : "./"; } @Override public String getDirectory() { return this.directory; } @Override public void setDirectory(String directory) { this.directory = directory; } public String getOldFileHash() { return oldFileHash; } public void setOldFileHash(String oldFileHash) { this.oldFileHash = oldFileHash; } public String getNewFileHash() { return newFileHash; } public void setNewFileHash(String newFileHash) { this.newFileHash = newFileHash; } @Override public MongoDBFile getOldDriftFile() { return new MongoDBFile(oldFileHash); } @Override public void setOldDriftFile(MongoDBFile oldDriftFile) { oldFileHash = oldDriftFile.getHashId(); } @Override public MongoDBFile getNewDriftFile() { return new MongoDBFile(newFileHash); } @Override public void setNewDriftFile(MongoDBFile newDriftFile) { newFileHash = newDriftFile.getHashId(); } }