/*
 * Copyright 2011 gitblit.com.
 *
 * 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 com.gitblit.utils;

import java.io.Serializable;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Reusable coarse date-based object cache. The date precision is in
 * milliseconds and in fast, concurrent systems this cache is too simplistic.
 * However, for the cases where its being used in Gitblit this cache technique
 * is just fine.
 *
 * @author James Moger
 *
 */
public class ObjectCache<X> implements Serializable {

	private static final long serialVersionUID = 1L;

	private final Map<String, CachedObject<X>> cache = new ConcurrentHashMap<String, CachedObject<X>>();

	private class CachedObject<Y> {

		public final String name;

		private volatile Date date;

		private volatile Y object;

		CachedObject(String name) {
			this.name = name;
			date = new Date(0);
		}

		@Override
		public String toString() {
			return getClass().getSimpleName() + ": " + name;
		}
	}

	public void clear() {
		cache.clear();
	}

	public boolean hasCurrent(String name, Date date) {
		return cache.containsKey(name) && cache.get(name).date.compareTo(date) == 0;
	}

	public Date getDate(String name) {
		return cache.get(name).date;
	}

	public X getObject(String name) {
		if (cache.containsKey(name)) {
			return cache.get(name).object;
		}
		return null;
	}

	public void updateObject(String name, X object) {
		this.updateObject(name, new Date(), object);
	}

	public void updateObject(String name, Date date, X object) {
		CachedObject<X> obj;
		if (cache.containsKey(name)) {
			obj = cache.get(name);
		} else {
			obj = new CachedObject<X>(name);
			cache.put(name, obj);
		}
		obj.date = date;
		obj.object = object;
	}

	public X remove(String name) {
		if (cache.containsKey(name)) {
			return cache.remove(name).object;
		}
		return null;
	}

	public int size() {
		return cache.size();
	}
}
