package io.cattle.platform.core.dao.impl; import static io.cattle.platform.core.model.tables.DataTable.*; import io.cattle.platform.core.dao.DataDao; import io.cattle.platform.core.model.Data; import io.cattle.platform.db.jooq.dao.impl.AbstractJooqDao; import io.cattle.platform.lock.LockCallback; import io.cattle.platform.lock.LockManager; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.util.exception.ExceptionUtils; import java.util.concurrent.Callable; import javax.inject.Inject; import javax.inject.Named; @Named public class DataDaoImpl extends AbstractJooqDao implements DataDao { LockManager lockManager; ObjectManager objectManager; @Override public String getOrCreate(final String key, final boolean visible, final Callable<String> generator) { Data data = objectManager.findAny(Data.class, DATA.NAME, key); if ( data != null && data.getVisible() != null && data.getVisible() == visible ) { return data.getValue(); } return lockManager.lock(new DataChangeLock(key), new LockCallback<String>() { @Override public String doWithLock() { Data data = objectManager.findAny(Data.class, DATA.NAME, key); if ( data != null && data.getVisible() != null && data.getVisible() == visible ) { return data.getValue(); } else if ( data != null ) { data.setVisible(visible); objectManager.persist(data); return data.getValue(); } try { String value = generator.call(); if ( value == null ) { return value; } return objectManager.create(Data.class, DATA.NAME, key, DATA.VISIBLE, visible, DATA.VALUE, value).getValue(); } catch (Exception e) { ExceptionUtils.rethrowRuntime(e); throw new RuntimeException("Failed to generate value for [" + key + "]", e); } } }); } public LockManager getLockManager() { return lockManager; } @Inject public void setLockManager(LockManager lockManager) { this.lockManager = lockManager; } public ObjectManager getObjectManager() { return objectManager; } @Inject public void setObjectManager(ObjectManager objectManager) { this.objectManager = objectManager; } }