package io.cattle.platform.sample.data;
import static io.cattle.platform.core.model.tables.DataTable.*;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.core.dao.AccountDao;
import io.cattle.platform.core.model.Account;
import io.cattle.platform.core.model.Data;
import io.cattle.platform.engine.process.impl.ProcessCancelException;
import io.cattle.platform.json.JsonMapper;
import io.cattle.platform.lock.LockCallbackNoReturn;
import io.cattle.platform.lock.LockManager;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.process.ObjectProcessManager;
import io.cattle.platform.object.process.StandardProcess;
import io.cattle.platform.sample.lock.SampleDataLock;
import io.cattle.platform.util.type.CollectionUtils;
import io.cattle.platform.util.type.InitializationTask;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.config.DynamicBooleanProperty;
public abstract class AbstractSampleData implements InitializationTask {
private static final Logger log = LoggerFactory.getLogger(SampleDataStartupV3.class);
private static final DynamicBooleanProperty RUN = ArchaiusUtil.getBoolean("sample.setup");
protected ObjectManager objectManager;
protected ObjectProcessManager processManager;
protected AccountDao accountDao;
protected JsonMapper jsonMapper;
protected LockManager lockManager;
@Override
public final void start() {
if (!RUN.get()) {
return;
}
lockManager.lock(new SampleDataLock(), new LockCallbackNoReturn() {
@Override
public void doWithLockNoResult() {
startWithLock();
}
});
}
protected final void startWithLock() {
if (!RUN.get()) {
return;
}
String name = getName();
Data data = objectManager.findAny(Data.class, DATA.NAME, name);
if (data != null) {
return;
}
Account system = accountDao.getSystemAccount();
if (system == null) {
log.warn("Failed to find system account, not populating system data");
return;
}
List<Object> toCreate = new ArrayList<Object>();
populatedData(system, toCreate);
for (Object object : toCreate) {
try {
processManager.executeStandardProcess(StandardProcess.CREATE, object, null);
} catch (ProcessCancelException e) {
}
}
objectManager.create(Data.class, DATA.NAME, name, DATA.VALUE, "true");
}
protected abstract String getName();
protected abstract void populatedData(Account system, List<Object> toCreate);
protected <T> T createByUuid(Class<T> type, String uuid, Object key, Object... values) {
Map<Object, Object> inputProperties = CollectionUtils.asMap(key, values);
inputProperties.put(ObjectMetaDataManager.UUID_FIELD, uuid);
Map<String, Object> properties = objectManager.convertToPropertiesFor(type, inputProperties);
T existing = objectManager.findAny(type, ObjectMetaDataManager.UUID_FIELD, uuid);
if (existing != null) {
objectManager.setFields(existing, properties);
return existing;
}
return objectManager.create(type, properties);
}
public ObjectManager getObjectManager() {
return objectManager;
}
@Inject
public void setObjectManager(ObjectManager objectManager) {
this.objectManager = objectManager;
}
public AccountDao getAccountDao() {
return accountDao;
}
@Inject
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public JsonMapper getJsonMapper() {
return jsonMapper;
}
@Inject
public void setJsonMapper(JsonMapper jsonMapper) {
this.jsonMapper = jsonMapper;
}
public ObjectProcessManager getProcessManager() {
return processManager;
}
@Inject
public void setProcessManager(ObjectProcessManager processManager) {
this.processManager = processManager;
}
public LockManager getLockManager() {
return lockManager;
}
@Inject
public void setLockManager(LockManager lockManager) {
this.lockManager = lockManager;
}
}