/* * Copyright 2015-2016 http://hsweb.me * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hsweb.concureent.cache.monitor; import org.hsweb.web.core.cache.monitor.MonitorCache; import org.springframework.cache.concurrent.ConcurrentMapCache; import java.lang.ref.Reference; import java.lang.ref.SoftReference; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; public class SimpleMonitorCache extends ConcurrentMapCache implements MonitorCache { private final AtomicInteger totalTimes = new AtomicInteger(0); private final AtomicInteger hitTimes = new AtomicInteger(0); private final AtomicInteger putTimes = new AtomicInteger(0); public SimpleMonitorCache(String name) { super(name, true); } @Override public Set<Object> keySet() { return getNativeCache().keySet(); } @Override public int size() { return getNativeCache().size(); } @Override public long getTotalTimes() { return totalTimes.get(); } @Override public long getHitTimes() { return hitTimes.get(); } @Override protected Object lookup(Object key) { Object value = super.lookup(key); if (value != null && value instanceof Reference) { Reference reference = (Reference) value; value = reference.get(); if (value == null) evict(key); } return value; } @Override public ValueWrapper get(Object key) { ValueWrapper wrapper = super.get(key); totalTimes.addAndGet(1); if (wrapper != null) { hitTimes.addAndGet(1); } return wrapper; } @Override public <T> T get(Object key, Class<T> type) { T value = super.get(key, type); totalTimes.addAndGet(1); if (value != null) { hitTimes.addAndGet(1); } return value; } protected Object buildValue(Object value) { if (null == value) return null; return new SoftReference(value); } @Override public void put(Object key, Object value) { if (key == null) return; putTimes.addAndGet(1); super.put(key, buildValue(value)); } @Override public ValueWrapper putIfAbsent(Object key, Object value) { if (key == null) return null; putTimes.addAndGet(1); return super.putIfAbsent(key, buildValue(value)); } @Override public long getPutTimes() { return putTimes.get(); } }