You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MapUtils.java 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package com.gitblit.utils;
  2. import java.text.MessageFormat;
  3. import java.util.Collection;
  4. import java.util.Map;
  5. import java.util.Set;
  6. import org.apache.mina.util.ConcurrentHashSet;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. /**
  10. * A utility wrapper class to generate a default value over an existing map
  11. *
  12. * @author Jan Vanhercke
  13. *
  14. */
  15. public class MapUtils {
  16. private static final Logger logger = LoggerFactory.getLogger(MapUtils.class);
  17. public static <K, V> Map<K, V> defaultMap(Map<K, V> delegate, V value) {
  18. return new Wrap<>(delegate, value);
  19. }
  20. private static class Wrap<K, V> implements Map<K, V> {
  21. private Map<K, V> delegate;
  22. // HashSet is only used to reduce logging
  23. private Set<K> unknownKeys = new ConcurrentHashSet<>();
  24. private V value;
  25. private Wrap(Map<K, V> delegate, V value) {
  26. this.delegate = delegate;
  27. this.value = value;
  28. }
  29. @Override
  30. public int size() {
  31. return delegate.size();
  32. }
  33. @Override
  34. public boolean isEmpty() {
  35. return delegate.isEmpty();
  36. }
  37. @Override
  38. public boolean containsKey(Object key) {
  39. return true;
  40. }
  41. @Override
  42. public boolean containsValue(Object value) {
  43. return true;
  44. }
  45. @SuppressWarnings("unchecked")
  46. @Override
  47. public V get(Object key) {
  48. V retv = delegate.get(key);
  49. if (retv == null) {
  50. if (unknownKeys.add((K) key))
  51. logger.error(MessageFormat.format("Default value {0} generated for key {1}", value, key));
  52. return value;
  53. }
  54. return retv;
  55. }
  56. @Override
  57. public V put(K key, V value) {
  58. return delegate.put(key, value);
  59. }
  60. @Override
  61. public V remove(Object key) {
  62. V retv = delegate.remove(key);
  63. if (retv == null)
  64. return value;
  65. return value;
  66. }
  67. @Override
  68. public void putAll(Map<? extends K, ? extends V> m) {
  69. delegate.putAll(m);
  70. }
  71. @Override
  72. public void clear() {
  73. delegate.clear();
  74. }
  75. @Override
  76. public Set<K> keySet() {
  77. return delegate.keySet();
  78. }
  79. @Override
  80. public Collection<V> values() {
  81. return delegate.values();
  82. }
  83. @Override
  84. public Set<java.util.Map.Entry<K, V>> entrySet() {
  85. return delegate.entrySet();
  86. }
  87. }
  88. }