/*
* ModeShape (http://www.modeshape.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.modeshape.jcr.journal;
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import org.modeshape.jcr.cache.NodeKey;
import org.modeshape.jcr.cache.change.Change;
import org.modeshape.jcr.cache.change.ChangeSet;
/**
* A record stored by the {@link LocalJournal}
*
* @author Horia Chiorean (hchiorea@redhat.com)
*/
public final class JournalRecord implements Serializable, Iterable<Change> {
private static final long serialVersionUID = 1L;
/**
* The time based key for this journal record.
*/
private long timeBasedKey;
/**
* The content of the record.
*/
private final ChangeSet content;
protected JournalRecord( ChangeSet content ) {
this.content = content;
this.timeBasedKey = -1;
}
protected JournalRecord withTimeBasedKey( final long timeBasedKey ) {
this.timeBasedKey = timeBasedKey;
return this;
}
/**
* @return the time when this record was created
*/
public long getTimeBasedKey() {
return timeBasedKey;
}
/**
* Get the key of the process in which the changes were made.
*
* @return the process key; never null
* @see org.modeshape.jcr.cache.change.ChangeSet#getProcessKey()
*/
public String getProcessKey() {
return content.getProcessKey();
}
/**
* Get the key of the repository in which the changes were made.
*
* @return the repository key; never null
* @see org.modeshape.jcr.cache.change.ChangeSet#getRepositoryKey()
*/
public String getRepositoryKey() {
return content.getRepositoryKey();
}
/**
* Returns the ID (username) of the user which performed the changes.
*
* @return a {@link String} representing the username; may be {@code null} in the case of changes performed "by the system.
* @see org.modeshape.jcr.cache.change.ChangeSet#getUserId()
*/
public String getUserId() {
return content.getUserId();
}
/**
* Get the name of the workspace in which the changes were made.
*
* @return the workspace name; may be null only when workspaces are added or removed
* @see org.modeshape.jcr.cache.change.ChangeSet#getWorkspaceName()
*/
public String getWorkspaceName() {
return content.getWorkspaceName();
}
/**
* Returns the time of the changeset, in UTC millis.
*
* @return a timestamp
* @see org.modeshape.jcr.cache.change.ChangeSet#getTimestamp()
*/
public long getChangeTimeMillis() {
return content.getTimestamp().getMillisecondsInUtc();
}
/**
* Returns the set of keys for the nodes which has been changed.
*
* @return the set of changed node keys; never {@code null}
* @see org.modeshape.jcr.cache.change.ChangeSet#changedNodes()
*/
public Set<NodeKey> changedNodes() {
return content.changedNodes();
}
/**
* Returns the identifier of the local {@link org.modeshape.jcr.journal.ChangeJournal} instance.
*
* @return either a non-null {@link String} if journaling is enabled, or {@code null} if journaling isn't enabled.
* @see org.modeshape.jcr.cache.change.ChangeSet#getJournalId()
*/
public String getJournalId() {
return content.getJournalId();
}
/**
* Returns the underlying change set.
*
* @return {@link org.modeshape.jcr.cache.change.ChangeSet} instance; never null
*/
public ChangeSet getChangeSet() {
return this.content;
}
@Override
public Iterator<Change> iterator() {
return content.iterator();
}
@Override
public boolean equals( Object o ) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
JournalRecord record = (JournalRecord)o;
return content.getUUID().equals(record.content.getUUID());
}
@Override
public int hashCode() {
return content.getUUID().hashCode();
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("JournalRecord {");
sb.append("timeBasedKey=").append(new Date(timeBasedKey).toString());
sb.append(", journalId=").append(getJournalId());
sb.append(", processKey=").append(getProcessKey());
sb.append(", userId=").append(getUserId());
sb.append(", repositoryKey=").append(getRepositoryKey());
sb.append(", workspaceName=").append(getWorkspaceName());
sb.append(", content=").append(content.toString());
sb.append('}');
return sb.toString();
}
}