package org.netbeans.gradle.model.internal; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.netbeans.gradle.model.util.CollectionUtils; import org.netbeans.gradle.model.util.SerializationCache; import org.netbeans.gradle.model.util.TransferableExceptionWrapper; public final class CustomSerializedMap implements Serializable { private static final long serialVersionUID = 1L; public static final CustomSerializedMap EMPTY = new CustomSerializedMap.Builder(0).create(); public static interface Deserializer { public Map<Object, List<?>> deserialize( SerializationCache serializationCache, ClassLoader parent, IssueTransformer deserializationIssueTransformer); } public static final class Builder { private final Map<Object, List<Object>> map; public Builder(int expectedSize) { this.map = CollectionUtils.newHashMap(expectedSize); } public void addValues(Object key, Collection<?> values) { List<Object> valueContainer = map.get(key); if (valueContainer == null) { valueContainer = new ArrayList<Object>(); map.put(key, valueContainer); } valueContainer.addAll(values); } public void addValue(Object key, Object value) { List<Object> valueContainer = map.get(key); if (valueContainer == null) { valueContainer = new ArrayList<Object>(); map.put(key, valueContainer); } valueContainer.add(value); } public CustomSerializedMap create() { return new CustomSerializedMap(this, null); } public CustomSerializedMap create(Map<Object, Throwable> serializationProblems) { if (serializationProblems == null) throw new NullPointerException("serializationProblems"); return new CustomSerializedMap(this, serializationProblems); } } private final Map<Object, SerializedEntries> map; private final Map<Object, Throwable> serializationProblems; private CustomSerializedMap(Builder builder, Map<Object, Throwable> issueResult) { Map<Object, Throwable> problems = issueResult; Map<Object, SerializedEntries> mutableMap = CollectionUtils.newHashMap(builder.map.size()); for (Map.Entry<Object, List<Object>> entry: builder.map.entrySet()) { Object key = entry.getKey(); List<Object> value = entry.getValue(); SerializedEntries entries; try { entries = new SerializedEntries(value); } catch (Throwable ex) { if (problems == null) { problems = new HashMap<Object, Throwable>(); } problems.put(key, TransferableExceptionWrapper.wrap(ex)); continue; } mutableMap.put(entry.getKey(), entries); } this.map = Collections.unmodifiableMap(mutableMap); this.serializationProblems = issueResult == null && problems != null ? Collections.unmodifiableMap(problems) : null; } public static <V> CustomSerializedMap fromMap(Map<?, List<V>> map) { CustomSerializedMap.Builder result = new Builder(map.size()); for (Map.Entry<?, List<V>> entry: map.entrySet()) { result.addValues(entry.getKey(), entry.getValue()); } return result.create(); } public int size() { return map.size(); } public Map<Object, SerializedEntries> getMap() { return map; } public Map<Object, Throwable> getSerializationProblems() { return serializationProblems != null ? serializationProblems : Collections.<Object, Throwable>emptyMap(); } }