@Override public String toString(){ return "PR->"+get(); } }
@Override public IStatsProducer getProducer(String producerId) { if (producerId == null) throw new IllegalArgumentException("Null is not a valid producerId"); ProducerReference ref = registry.get(producerId); return ref == null ? null : ref.get(); }
/** * This method is primary used for unit tests. */ public void cleanup() { ArrayList<ProducerReference> producerReferences = new ArrayList<ProducerReference>(registry.values()); for (ProducerReference p : producerReferences) { try { if (p.get() != null) unregisterProducer(p.get()); } catch (Exception e) { LOGGER.warn("can't unregister producer " + p, e); } } } }
@Override public IStatsProducer getProducer(String producerId) { if (_cachedProducerList==null) buildProducerCacheFromScratch(); synchronized(cacheLock){ ProducerReference ref = _cachedProducerMap.get(producerId); if (ref==null) throw new NoSuchProducerException(producerId); return ref.get(); } }
@Override public List<IStatsProducer> getProducers(IProducerFilter... filters) { if (_cachedProducerList==null) buildProducerCacheFromScratch(); List <IStatsProducer> ret = new ArrayList<>(); @SuppressWarnings("unchecked") List<ProducerReference> workCopy = (List<ProducerReference>)((ArrayList<ProducerReference>)_cachedProducerList).clone(); for (ProducerReference p : workCopy){ IStatsProducer pp = p.get(); boolean fit = true; if (pp==null) continue; for(IProducerFilter filter: filters) if (!filter.doesFit(pp)){ fit = false; break; } if(fit) ret.add(pp); } return ret; }
@Override public void registerProducer(IStatsProducer producer) { //null pointer exceptions in the toString method of the producer shouldn't crash here. String producerToString = null; try { producerToString = producer.toString(); } catch (Exception e) { producerToString = "Illegal to string method: " + e.getMessage() + ", " + e.getClass(); } LOGGER.info("Registry register producer: " + producer.getProducerId() + " / " + producerToString); ProducerReference previousRef = registry.putIfAbsent(producer.getProducerId(), new ProducerReference(producer)); IStatsProducer previous = (previousRef == null) ? null : previousRef.get(); if (previous != null) { LOGGER.info("Under this name a producer was already registered: " + previous); } else { for (IProducerRegistryListener listener : listeners) { listener.notifyProducerRegistered(producer); } } }