/* * Copyright (c) 2011-2014 Jeppetto and Jonathan Thompson * * 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.iternine.jeppetto.dao.mongodb; import com.mongodb.DBObject; import java.lang.ref.WeakReference; import java.util.AbstractMap; import java.util.Collections; import java.util.HashMap; import java.util.Map; final class MongoDBSessionCache { //------------------------------------------------------------- // Variables - Private //------------------------------------------------------------- private final Map<Map<String, String>, WeakReference> objectCache = new HashMap<Map<String, String>, WeakReference>(); //------------------------------------------------------------- // Methods - Public //------------------------------------------------------------- public void put(DBObject key, Object object) { //noinspection unchecked objectCache.put(flatten(key.toMap()), new WeakReference(object)); } public Object get(DBObject key) { //noinspection unchecked Map<String, String> flattenedKey = flatten(key.toMap()); WeakReference reference = objectCache.get(flattenedKey); if (reference == null) { return null; } if (reference.get() == null) { objectCache.remove(flattenedKey); return null; } return reference.get(); } public void clear() { objectCache.clear(); } //------------------------------------------------------------- // Methods - Private //------------------------------------------------------------- private Map<String, String> flatten(Map<String, ?> input) { Map<String, String> result = new HashMap<String, String>(); for (Map.Entry<String, ?> entry : input.entrySet()) { for (Map.Entry<String, String> flattened : flatten(entry)) { if (flattened.getValue() != null) { result.put(flattened.getKey(), flattened.getValue()); } } } return result; } private Iterable<? extends Map.Entry<String, String>> flatten(Map.Entry<String, ?> entry) { if (entry.getValue() instanceof DBObject) { return flatten(entry.getKey(), ((DBObject) entry.getValue()).toMap()); } else if (entry.getValue() != null) { return Collections.singletonList( new AbstractMap.SimpleEntry<String, String>(entry.getKey(), entry.getValue().toString())); } else { return Collections.emptyList(); } } private Iterable<? extends Map.Entry<String, String>> flatten(String key, Map<?, ?> value) { Map<String, String> result = new HashMap<String, String>(); for (Map.Entry<?, ?> entry : value.entrySet()) { for (Map.Entry<String, String> flattened : flatten(new AbstractMap.SimpleEntry<String, Object>(key + '.' + entry.getKey(), entry.getValue()))) { result.put(flattened.getKey(), flattened.getValue()); } } return result.entrySet(); } }