package org.dcache.pinmanager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.security.auth.Subject;
import java.util.Date;
import diskCacheV111.util.PnfsId;
import diskCacheV111.vehicles.PoolMgrSelectReadPoolMsg;
import diskCacheV111.vehicles.ProtocolInfo;
import org.dcache.cells.MessageReply;
import org.dcache.pinmanager.model.Pin;
import org.dcache.vehicles.FileAttributes;
public class PinTask
{
private static final Logger _log = LoggerFactory.getLogger(PinTask.class);
private final PinManagerPinMessage _request;
private final MessageReply<PinManagerPinMessage> _reply;
private Pin _pin;
private PoolMgrSelectReadPoolMsg.Context _readPoolSelectionContext;
public PinTask(PinManagerPinMessage request, MessageReply<PinManagerPinMessage> reply, Pin pin)
{
_request = request;
_reply = reply;
_pin = pin;
}
public Pin getPin()
{
return _pin;
}
public void setPin(Pin pin)
{
_pin = pin;
}
public boolean isValidIn(long delay)
{
return _reply.isValidIn(delay);
}
public PnfsId getPnfsId()
{
return _request.getFileAttributes().getPnfsId();
}
public FileAttributes getFileAttributes()
{
return _request.getFileAttributes();
}
public void setFileAttributes(FileAttributes attributes)
{
_request.setFileAttributes(attributes);
}
public ProtocolInfo getProtocolInfo()
{
return _request.getProtocolInfo();
}
public Subject getSubject()
{
return _request.getSubject();
}
public String getRequestId()
{
return _request.getRequestId();
}
public long getLifetime()
{
return _request.getLifetime();
}
public long getPinId()
{
return _pin.getPinId();
}
public String getPool()
{
return _pin.getPool();
}
public String getSticky()
{
return _pin.getSticky();
}
public PoolMgrSelectReadPoolMsg.Context getReadPoolSelectionContext()
{
return _readPoolSelectionContext;
}
public void setReadPoolSelectionContext(PoolMgrSelectReadPoolMsg.Context context)
{
_readPoolSelectionContext = context;
}
public Date freezeExpirationTime()
{
long now = System.currentTimeMillis();
long lifetime = getLifetime();
Date date = (lifetime == -1) ? null : new Date(now + lifetime);
_request.setExpirationTime(date);
return date;
}
public Date getExpirationTime()
{
return _request.getExpirationTime();
}
public void fail(int rc, String error)
{
_reply.fail(_request, rc, error);
_log.warn("Failed to pin {}: {} [{}]", _pin.getPnfsId(), error, rc);
}
public void success()
{
_request.setPin(_pin);
_reply.reply(_request);
_log.info("Pinned {} on {} ({})", _pin.getPnfsId(), _pin.getPool(), _pin.getPinId());
}
}