package io.cattle.platform.process.generic;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.engine.handler.HandlerResult;
import io.cattle.platform.engine.handler.ProcessPostListener;
import io.cattle.platform.engine.process.ProcessInstance;
import io.cattle.platform.engine.process.ProcessState;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.util.ObjectUtils;
import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic;
import io.cattle.platform.util.type.Priority;
import java.util.Date;
import java.util.Random;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import com.netflix.config.DynamicLongProperty;
@Named
public class SetRemovedFields extends AbstractObjectProcessLogic implements ProcessPostListener, Priority {
private static final String REMOVE_DELAY_FORMAT = "object.%s.remove.time.delay.seconds";
private static final DynamicLongProperty DEFAULT_REMOVE_DELAY = ArchaiusUtil.getLong("object.remove.time.delay.seconds");
private static final Random RANDOM = new Random();
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Object resource = state.getResource();
if (!ObjectUtils.hasWritableProperty(resource, ObjectMetaDataManager.REMOVED_FIELD)) {
return null;
}
Date removed = ObjectUtils.getRemoved(resource);
if (removed == null) {
removed = new Date();
}
Date removeTime = ObjectUtils.getRemoveTime(resource);
if (removeTime == null) {
removeTime = new Date(getRemoveTime(resource));
}
return new HandlerResult(ObjectMetaDataManager.REMOVED_FIELD, removed, ObjectMetaDataManager.REMOVE_TIME_FIELD, removeTime);
}
protected Long getRemoveTime(Object obj) {
String type = getObjectManager().getType(obj);
long delay = 0;
/* Look up by string to detect null */
String delayString = ArchaiusUtil.getString(String.format(REMOVE_DELAY_FORMAT, type)).get();
if (StringUtils.isBlank(delayString)) {
delay = DEFAULT_REMOVE_DELAY.get();
} else {
delay = Long.parseLong(delayString);
}
delay *= 1000;
if (delay < 0) {
float f = RANDOM.nextFloat() * delay;
delay = Math.abs((int)f);
}
return System.currentTimeMillis() + delay;
}
@Override
public int getPriority() {
return Priority.DEFAULT;
}
@Override
public String[] getProcessNames() {
return new String[] { "*.remove" };
}
}