package com.bagri.xdm.cache.coherence.process; import com.bagri.xdm.cache.coherence.store.AbstractCacheStore; import com.tangosol.net.AbstractInvocable; import com.tangosol.net.BackingMapManager; import com.tangosol.net.BackingMapManagerContext; import com.tangosol.net.CacheFactory; import com.tangosol.net.CacheService; import com.tangosol.net.InvocationObserver; import com.tangosol.net.Member; import com.tangosol.net.NamedCache; import com.tangosol.net.cache.ReadWriteBackingMap; //import com.tangosol.util.MapListener; import com.tangosol.util.MapListener; import com.tangosol.util.MapTrigger; import com.tangosol.util.MapTriggerListener; import com.tangosol.util.ValueExtractor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.Map; /** * Abstract Populator class */ public abstract class AbstractPopulator extends AbstractInvocable implements InvocationObserver { protected final Logger log; private int batchSize = 10000; //default size private String cacheName; private List<ValueExtractor> indexes; private List<MapTrigger> triggers; private boolean populating; private AbstractCacheStore store; //private MapListener listener; /** * Class constructor * @param cacheName Cache name */ public AbstractPopulator(String cacheName) { this.cacheName = cacheName; log = LoggerFactory.getLogger(getClass().getName() + "[" + cacheName + "]"); } /** * * @return Cache name */ public String getCacheName() { return cacheName; } /** * * @return Cache store */ public AbstractCacheStore getStore() { return store; } /** * * @return Named cache */ protected NamedCache getCache() { return CacheFactory.getCache(cacheName); } /** * * @return Batch size */ public int getBatchSize() { return batchSize; } /** * * @return Populating flag */ public boolean isPopulating() { return populating; } /** * * @param batchSize Batch size */ public void setPopulating(boolean populating) { this.populating = populating; } /** * * @param batchSize Batch size */ public void setBatchSize(int batchSize) { this.batchSize = batchSize; } //public void setCacheListener(MapListener listener) { // this.listener = listener; //} /** * * @param store Cache store */ public void setCacheStore(AbstractCacheStore store) { this.store = store; } /** * * @param indexes Indexes */ public void setIndexes(List<ValueExtractor> indexes) { this.indexes = indexes; } /** * * @param triggers Triggers */ public void setTriggers(List<MapTrigger> triggers) { this.triggers = triggers; } protected void ensureIndexes(NamedCache cache) { if (indexes != null && indexes.size() > 0) { for (ValueExtractor ex : indexes) { cache.addIndex(ex, true, null); log.debug("applied index: {}", ex); } } } protected void ensureTriggers(NamedCache cache) { if (triggers != null && triggers.size() > 0) { for (MapTrigger t : triggers) { MapListener listener = getMapTriggerListener(t); if (listener != null) { cache.addMapListener(listener); log.debug("applied trigger: {}", t); } } } } protected MapListener getMapTriggerListener(MapTrigger t) { return null; } //protected void ensureListener(NamedCache cache, BackingMapManagerContext ctx) { // if (instantiateBML) { // DelegatingBackingMapListener bml = new DelegatingBackingMapListener(ctx, cacheName); // ctx.getBackingMapContext(cacheName).getBackingMap().addMapListener(bml); // } else if (listener != null) { // cache.addMapListener(listener); // } //} /** * Run method */ @Override public void run() { log.trace("run.enter"); try { NamedCache cache = getCache(); if (populating) { CacheService svc = cache.getCacheService(); BackingMapManager mgr = svc.getBackingMapManager(); BackingMapManagerContext ctx = mgr.getContext(); if (store == null) { Map map = ctx.getBackingMapContext(cache.getCacheName()).getBackingMap(); // got NPE here!!! store = (AbstractCacheStore) ((ReadWriteBackingMap) map).getCacheStore().getStore(); } populate(cache); } ensureIndexes(cache); ensureTriggers(cache); //ensureListener(cache, ctx); } catch (Exception ex) { log.error("Exception on population: {}", ex.getMessage(), ex); } } /** * * @param cache Named cache */ public abstract void populate(NamedCache cache); /** * Invocation completed method */ @Override public void invocationCompleted() { log.debug("invocationCompleted"); } /** * * @param member Member * @param result Object */ @Override public void memberCompleted(Member member, Object result) { log.debug("memberCompleted; result: {}, member: {}", result, member); } /** * * @param member Member * @param error in case of error */ @Override public void memberFailed(Member member, Throwable error) { // TODO: resubmit tasks due to transient failures log.error("memberFailed; member: {}", member, error); } /** * * @param member Member */ @Override public void memberLeft(Member member) { // TODO: resubmit to a member that is up log.error("memberLeft; member: {}", member); } }