Cleanup: NotNull/Nullable
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / memory / agent / ReferringObjectsInfo.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.debugger.memory.agent;
3
4 import com.intellij.debugger.engine.ReferringObject;
5 import com.intellij.debugger.engine.SimpleReferringObject;
6 import com.intellij.openapi.diagnostic.Logger;
7 import com.sun.jdi.ObjectReference;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.annotations.TestOnly;
10
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.stream.Collectors;
16
17 /**
18  * Stores tree of backward references for particular object
19  */
20 public class ReferringObjectsInfo {
21   private static final Logger LOG = Logger.getInstance(ReferringObjectsInfo.class);
22
23   private final Map<ObjectReference, Integer> myReversedMap = new HashMap<>();
24   private final List<ObjectReference> myDirectMap;
25   private final List<List<Integer>> myReferrers;
26
27   public ReferringObjectsInfo(@NotNull List<ObjectReference> values, @NotNull List<List<Integer>> referrers) {
28     myDirectMap = values;
29     for (int i = 0; i < values.size(); i++) {
30       myReversedMap.put(values.get(i), i);
31     }
32
33     myReferrers = referrers;
34   }
35
36   public boolean hasReferringObjectsFor(@NotNull ObjectReference reference) {
37     return myReversedMap.containsKey(reference);
38   }
39
40   @NotNull
41   @TestOnly
42   public List<ObjectReference> getAllReferrers(@NotNull ObjectReference value) {
43     return myReferrers.get(myReversedMap.get(value)).stream().distinct().map(ix -> myDirectMap.get(ix)).collect(Collectors.toList());
44   }
45
46   @NotNull
47   public List<ReferringObject> getReferringObjects(@NotNull ObjectReference value, long limit) {
48     Integer index = myReversedMap.get(value);
49     if (index == null) {
50       LOG.error("Could not find referring object for reference " + value.toString());
51       return Collections.emptyList();
52     }
53
54     return myReferrers.get(index).stream()
55       .distinct()
56       .limit(limit)
57       .map(ix -> myDirectMap.get(ix))
58       .map(SimpleReferringObject::new)
59       .collect(Collectors.toList());
60   }
61 }