package io.cattle.platform.extension.dynamic.dao.impl; import static io.cattle.platform.core.model.tables.ExternalHandlerExternalHandlerProcessMapTable.*; import static io.cattle.platform.core.model.tables.ExternalHandlerProcessTable.*; import static io.cattle.platform.core.model.tables.ExternalHandlerTable.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.jooq.Field; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import io.cattle.platform.core.cache.DBCacheManager; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.db.jooq.dao.impl.AbstractJooqDao; import io.cattle.platform.extension.dynamic.dao.ExternalHandlerDao; import io.cattle.platform.extension.dynamic.data.ExternalHandlerData; public class ExternalHandlerDaoImpl extends AbstractJooqDao implements ExternalHandlerDao { LoadingCache<String, List<? extends ExternalHandlerData>> cache; @Inject DBCacheManager dbCacheManager; @PostConstruct public void init() { cache = CacheBuilder.newBuilder() .expireAfterWrite(15, TimeUnit.MINUTES) .build(new CacheLoader<String, List<? extends ExternalHandlerData>>() { @Override public List<? extends ExternalHandlerData> load(String key) throws Exception { return getExternalHandlerDataInternal(key); } }); dbCacheManager.register(cache); } @Override public List<? extends ExternalHandlerData> getExternalHandlerData(String processName) { return cache.getUnchecked(processName); } protected List<? extends ExternalHandlerData> getExternalHandlerDataInternal(String processName) { List<Field<?>> fields = new ArrayList<Field<?>>(Arrays.asList(EXTERNAL_HANDLER.fields())); fields.add(EXTERNAL_HANDLER_EXTERNAL_HANDLER_PROCESS_MAP.ON_ERROR); fields.add(EXTERNAL_HANDLER_EXTERNAL_HANDLER_PROCESS_MAP.EVENT_NAME); return create() .select(fields) .from(EXTERNAL_HANDLER) .join(EXTERNAL_HANDLER_EXTERNAL_HANDLER_PROCESS_MAP) .on(EXTERNAL_HANDLER_EXTERNAL_HANDLER_PROCESS_MAP.EXTERNAL_HANDLER_ID.eq(EXTERNAL_HANDLER.ID)) .join(EXTERNAL_HANDLER_PROCESS) .on(EXTERNAL_HANDLER_EXTERNAL_HANDLER_PROCESS_MAP.EXTERNAL_HANDLER_PROCESS_ID.eq(EXTERNAL_HANDLER_PROCESS.ID)) .where( EXTERNAL_HANDLER_PROCESS.NAME.eq(processName) .and(EXTERNAL_HANDLER.STATE.eq(CommonStatesConstants.ACTIVE)) .and(EXTERNAL_HANDLER_EXTERNAL_HANDLER_PROCESS_MAP.STATE.eq(CommonStatesConstants.ACTIVE)) .and(EXTERNAL_HANDLER_PROCESS.STATE.eq(CommonStatesConstants.ACTIVE))) .fetchInto(ExternalHandlerData.class); } }