package diskCacheV111.vehicles; import javax.annotation.Nullable; import javax.security.auth.Subject; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.concurrent.atomic.AtomicLong; import dmg.cells.nucleus.CellAddressCore; import org.dcache.auth.Subjects; public abstract class InfoMessage implements Serializable { private static final SimpleDateFormat __dateFormat = new SimpleDateFormat("MM.dd HH:mm:ss"); private static final AtomicLong COUNTER = new AtomicLong(0); private final String _cellType; private final String _messageType; @Deprecated // Since 2.17, remove after next golden release private final String _cellName = null; private CellAddressCore _cellAddress; private long _timeQueued; private int _resultCode; private String _message = ""; private final long _timestamp = System.currentTimeMillis(); private String _transaction; private final long _transactionID = COUNTER.incrementAndGet(); private Subject _subject; private static final long serialVersionUID = -8035876156296337291L; public InfoMessage(String messageType, String cellType, CellAddressCore address) { _cellAddress = address; _cellType = cellType; _messageType = messageType; } public abstract void accept(InfoMessageVisitor visitor); @Override public String toString() { return "InfoMessage{" + "cellType='" + _cellType + '\'' + ", messageType='" + _messageType + '\'' + ", cellAddress=" + _cellAddress + ", timeQueued=" + _timeQueued + ", resultCode=" + _resultCode + ", message='" + _message + '\'' + ", timestamp=" + _timestamp + ", transaction='" + _transaction + '\'' + ", transactionID=" + _transactionID + ", subject=" + _subject + '}'; } public void setResult(int resultCode, String resultMessage) { _message = resultMessage; _resultCode = resultCode; } public void setTimeQueued(long timeQueued) { _timeQueued = timeQueued; } public long getTimeQueued() { return _timeQueued; } public String getCellType() { return _cellType; } public String getMessageType() { return _messageType; } @Nullable public CellAddressCore getCellAddress() { return _cellAddress; } public String getMessage() { return _message; } public int getResultCode() { return _resultCode; } public long getTimestamp() { return _timestamp; } public synchronized void setTransaction(String transaction) { _transaction = transaction; } public synchronized String getTransaction() { if (_transaction == null) { String sb = this.getCellType() + ':' + this.getCellAddress() + ':' + this.getTimestamp() + '-' + _transactionID; _transaction = sb; } return _transaction; } public void setSubject(Subject subject) { _subject = subject; } public Subject getSubject() { /* The null check ensures compatibility with pools earlier * than version 2.1. Those pools do not include a subject * field. */ return (_subject == null) ? Subjects.ROOT : _subject; } private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { stream.defaultReadObject(); if (_cellName != null) { _cellAddress = new CellAddressCore(_cellName); } } }