You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/02/28 11:02:00 UTC
[isis] branch master updated: ISIS-1841 Internal API: introduce
_Multimap
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 03d39e4 ISIS-1841 Internal API: introduce _Multimap
03d39e4 is described below
commit 03d39e42a06292d2dee4274f411e7a37f64d23d9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Feb 28 12:01:54 2018 +0100
ISIS-1841 Internal API: introduce _Multimap
---
.../applib/internal/collections/_Multimap.java | 229 +++++++++++++++++++++
1 file changed, 229 insertions(+)
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Multimap.java b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Multimap.java
new file mode 100644
index 0000000..e48c3c4
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/collections/_Multimap.java
@@ -0,0 +1,229 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.isis.applib.internal.collections;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Provides Map-of-List and Map-of-Set implementations
+ * </p>
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/>
+ * These may be changed or removed without notice!
+ * </p>
+ *
+ * @since 2.0.0
+ */
+public class _Multimap {
+
+ /**
+ * Represents a Map of Lists.
+ * @param <K>
+ * @param <V>
+ */
+ public static interface ListMultimap<K, V> extends Map<K, List<V>> {
+ /**
+ * Adds {@code value} to the List stored under {@code key}.
+ * (If no such List exists, a new List is created.)
+ * @param key
+ * @param value
+ */
+ public void putElement(K key, V value);
+ }
+
+ /**
+ * Represents a Map of Sets.
+ * @param <K>
+ * @param <V>
+ */
+ public static interface SetMultimap<K, V> extends Map<K, Set<V>> {
+ /**
+ * Adds {@code value} to the Set stored under {@code key}.
+ * (If no such Set exists, a new Set is created.)
+ * @param key
+ * @param value
+ */
+ public void putElement(K key, V value);
+ }
+
+ /**
+ * Represents a Map of Maps.
+ * @param <K1>
+ * @param <K2>
+ * @param <V>
+ */
+ public static interface MapMultimap<K1, K2, V> extends Map<K1, Map<K2, V>> {
+
+ /**
+ * Puts {@code value} into the element-map stored under {@code key}.
+ * (If no such Map exists, a new Map is created.)
+ * @param key
+ * @param subkey the key into the element-map where to store the {@code value}
+ * @param value
+ */
+ public void putElement(K1 key, K2 subkey, V value);
+
+ /**
+ * Get the element-map by {@code key}, then within the element-map looks up to {@code subkey}.
+ * @param key
+ * @param subkey
+ * @return null if no such element exists
+ */
+ public V getElement(K1 key, K2 subkey);
+ }
+
+ public static <K, V> ListMultimap<K, V> newListMultiMap(
+ final Supplier<Map<K, List<V>>> mapFactory,
+ final Supplier<List<V>> elementCollectionFactory){
+ Objects.requireNonNull(mapFactory);
+ Objects.requireNonNull(elementCollectionFactory);
+
+ return new ListMultimap<K, V>() {
+
+ final Map<K, List<V>> delegate = mapFactory.get();
+
+ @Override public int size() { return delegate.size(); }
+ @Override public boolean isEmpty() { return delegate.isEmpty(); }
+ @Override public boolean containsKey(Object key) { return delegate.containsKey(key); }
+ @Override public boolean containsValue(Object value) { return delegate.containsValue(value); }
+ @Override public List<V> get(Object key) { return delegate.get(key); }
+ @Override public List<V> put(K key, List<V> value) { return delegate.put(key, value); }
+ @Override public List<V> remove(Object key) { return delegate.remove(key); }
+ @Override public void putAll(Map<? extends K, ? extends List<V>> m) { delegate.putAll(m); }
+ @Override public void clear() { delegate.clear(); }
+ @Override public Set<K> keySet() { return delegate.keySet(); }
+ @Override public Collection<List<V>> values() { return delegate.values(); }
+ @Override public Set<Entry<K, List<V>>> entrySet() { return delegate.entrySet(); }
+
+ @Override
+ public void putElement(K key, V value) {
+ final Collection<V> collection = delegate.computeIfAbsent(key, __->elementCollectionFactory.get());
+ collection.add(value);
+ }
+
+ };
+ }
+
+ public static <K, V> SetMultimap<K, V> newSetMultiMap(
+ final Supplier<Map<K, Set<V>>> mapFactory,
+ final Supplier<Set<V>> elementCollectionFactory){
+ Objects.requireNonNull(mapFactory);
+ Objects.requireNonNull(elementCollectionFactory);
+
+ return new SetMultimap<K, V>() {
+
+ final Map<K, Set<V>> delegate = mapFactory.get();
+
+ @Override public int size() { return delegate.size(); }
+ @Override public boolean isEmpty() { return delegate.isEmpty(); }
+ @Override public boolean containsKey(Object key) { return delegate.containsKey(key); }
+ @Override public boolean containsValue(Object value) { return delegate.containsValue(value); }
+ @Override public Set<V> get(Object key) { return delegate.get(key); }
+ @Override public Set<V> put(K key, Set<V> value) { return delegate.put(key, value); }
+ @Override public Set<V> remove(Object key) { return delegate.remove(key); }
+ @Override public void putAll(Map<? extends K, ? extends Set<V>> m) { delegate.putAll(m); }
+ @Override public void clear() { delegate.clear(); }
+ @Override public Set<K> keySet() { return delegate.keySet(); }
+ @Override public Collection<Set<V>> values() { return delegate.values(); }
+ @Override public Set<Entry<K, Set<V>>> entrySet() { return delegate.entrySet(); }
+
+ @Override
+ public void putElement(K key, V value) {
+ final Collection<V> collection = delegate.computeIfAbsent(key, __->elementCollectionFactory.get());
+ collection.add(value);
+ }
+
+ };
+ }
+
+ public static <K1, K2, V> MapMultimap<K1, K2, V> newMapMultimap(
+ final Supplier<Map<K1, Map<K2, V>>> mapFactory,
+ final Supplier<Map<K2, V>> elementMapFactory){
+ Objects.requireNonNull(mapFactory);
+ Objects.requireNonNull(elementMapFactory);
+
+ return new MapMultimap<K1, K2, V>() {
+
+ final Map<K1, Map<K2, V>> delegate = mapFactory.get();
+
+ @Override public int size() { return delegate.size(); }
+ @Override public boolean isEmpty() { return delegate.isEmpty(); }
+ @Override public boolean containsKey(Object key) { return delegate.containsKey(key); }
+ @Override public boolean containsValue(Object value) { return delegate.containsValue(value); }
+ @Override public Map<K2, V> get(Object key) { return delegate.get(key); }
+ @Override public Map<K2, V> put(K1 key, Map<K2, V> value) { return delegate.put(key, value); }
+ @Override public Map<K2, V> remove(Object key) { return delegate.remove(key); }
+ @Override public void putAll(Map<? extends K1, ? extends Map<K2, V>> m) { delegate.putAll(m); }
+ @Override public void clear() { delegate.clear(); }
+ @Override public Set<K1> keySet() { return delegate.keySet(); }
+ @Override public Collection<Map<K2, V>> values() { return delegate.values(); }
+ @Override public Set<Entry<K1, Map<K2, V>>> entrySet() { return delegate.entrySet(); }
+
+ @Override
+ public void putElement(K1 key, K2 subkey, V value) {
+ final Map<K2, V> elementMap = delegate.computeIfAbsent(key, __->elementMapFactory.get());
+ elementMap.put(subkey, value);
+ }
+
+ @Override
+ public V getElement(K1 key, K2 subkey) {
+ final Map<K2, V> elementMap = delegate.get(key);
+ return elementMap!=null ? elementMap.get(subkey) : null;
+ }
+
+ };
+ }
+
+ // -- CONVENIENT DEFAULTS
+
+ /**
+ * @return HashMap of ArrayLists
+ */
+ public static <K, V> ListMultimap<K, V> newListMultiMap(){
+ return newListMultiMap(HashMap::new, ArrayList::new);
+ }
+
+ /**
+ * @return HashMap of HashSets
+ */
+ public static <K, V> SetMultimap<K, V> newSetMultiMap(){
+ return newSetMultiMap(HashMap::new, HashSet::new);
+ }
+
+ /**
+ * @return HashMap of HashMaps
+ */
+ public static <K1, K2, V> MapMultimap<K1, K2, V> newMapMultiMap(){
+ return newMapMultimap(HashMap::new, HashMap::new);
+ }
+
+
+
+}
--
To stop receiving notification emails like this one, please contact
ahuber@apache.org.