/*
* Copyright 2008-2009 the original author or authors.
*
* 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 net.hasor.core.setting;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* 可以将多个Map合并成一个Map对象给予操作,每个子map可以通过一个空间字符串进行标识。
* @version : 2016-07-17
* @author 赵永春 (zyc@hasor.net)
*/
public class DecSpaceMap<K, T> {
protected Map<String, Map<K, T>> spaceMap = new HashMap<String, Map<K, T>>();
//
/**将一个值保存到一个命名空间下。*/
public T put(final String space, final K key, final T value) {
Map<K, T> spaceMap = this.spaceMap.get(space);
if (spaceMap == null) {
spaceMap = new ConcurrentHashMap<K, T>();
this.spaceMap.put(space, spaceMap);
}
return spaceMap.put(key, value);
}
/**将一个map加入或追加到一个命名空间下。*/
public void putAll(final String space, final Map<K, T> newMap) {
Map<K, T> spaceMap = this.spaceMap.get(space);
if (spaceMap == null) {
spaceMap = new ConcurrentHashMap<K, T>();
this.spaceMap.put(space, spaceMap);
}
spaceMap.putAll(newMap);
}
//
//
/**确认K所在的命名空间。*/
public List<T> get(final K key) {
List<T> findVal = new ArrayList<T>();
for (Map<K, T> map : this.spaceMap.values()) {
T val = map.get(key);
if (val != null) {
findVal.add(val);
}
}
return findVal;
}
/**确认K所在的命名空间。*/
public T get(final String space, final K key) {
Map<K, T> map = this.spaceMap.get(space);
if (map == null) {
return null;
} else {
return map.get(key);
}
}
//
//
/**删除命名空间下的key。*/
public T remove(String space, K key) {
Map<K, T> spaceMap = this.spaceMap.get(space);
if (spaceMap != null) {
return spaceMap.remove(key);
}
return null;
}
/**清空所有空间中为指定key的数据。*/
public void removeAll(final K key) {
for (Map<K, T> mapItem : this.spaceMap.values()) {
mapItem.remove(key);
}
}
//
//
/**命名空间集合。*/
public Set<String> spaceSet() {
return this.spaceMap.keySet();
}
/**所有Key集合。*/
public Set<K> keySet() {
Set<K> keys = new HashSet<K>();
for (Map<K, T> mapItem : this.spaceMap.values()) {
keys.addAll(mapItem.keySet());
}
return keys;
}
/**命名空间下的key集合。*/
public Set<K> keySet(String space) {
Map<K, T> map = this.spaceMap.get(space);
if (map != null) {
return map.keySet();
}
return new HashSet<K>();
}
//
//
/**删除某个命名空间的所有数据。*/
public void deleteSpace(String space) {
this.spaceMap.remove(space);
}
/**删除某个命名空间的所有数据。*/
public void deleteAllSpace() {
this.spaceMap.clear();
}
//
//
public int size() {
int count = 0;
for (Map<K, T> map : this.spaceMap.values()) {
count += map.size();
}
return count;
}
public int size(String space) {
Map<K, T> map = this.spaceMap.get(space);
if (map == null) {
return 0;
} else {
return map.size();
}
}
//
//
public DecSpaceMap<K, T> space(final String space) {
DecSpaceMap<K, T> spaceMap = new DecSpaceMap<K, T>();
Map<K, T> dataMap = this.spaceMap.get(space);
if (dataMap != null) {
spaceMap.putAll(space, dataMap);
}
return spaceMap;
}
//
//
/**所有Key集合。*/
public Set<T> valueSet() {
Set<T> values = new HashSet<T>();
for (Map<K, T> mapItem : this.spaceMap.values()) {
values.addAll(mapItem.values());
}
return values;
}
/**命名空间下的key集合。*/
public Set<T> valueSet(String space) {
Map<K, T> dataMap = this.spaceMap.get(space);
if (dataMap != null) {
return new HashSet<T>(dataMap.values());
}
return new HashSet<T>();
}
// @Override
// public Iterator<Map.Entry<K, T>> iterator() {
// Iterator<Map.Entry<K, T>> seqIter = null;
// for (Map<K, T> mapItem : this.spaceMap.values()) {
// seqIter = MergeUtils.mergeIterator(seqIter, mapItem.entrySet().iterator());
// }
// return seqIter;
// }
}