1b71955639ab617e0a4115b1439c8b9982227a018sberlin/**
2b71955639ab617e0a4115b1439c8b9982227a018sberlin * Copyright (C) 2011 Google Inc.
3b71955639ab617e0a4115b1439c8b9982227a018sberlin *
4b71955639ab617e0a4115b1439c8b9982227a018sberlin * Licensed under the Apache License, Version 2.0 (the "License");
5b71955639ab617e0a4115b1439c8b9982227a018sberlin * you may not use this file except in compliance with the License.
6b71955639ab617e0a4115b1439c8b9982227a018sberlin * You may obtain a copy of the License at
7b71955639ab617e0a4115b1439c8b9982227a018sberlin *
8b71955639ab617e0a4115b1439c8b9982227a018sberlin * http://www.apache.org/licenses/LICENSE-2.0
9b71955639ab617e0a4115b1439c8b9982227a018sberlin *
10b71955639ab617e0a4115b1439c8b9982227a018sberlin * Unless required by applicable law or agreed to in writing, software
11b71955639ab617e0a4115b1439c8b9982227a018sberlin * distributed under the License is distributed on an "AS IS" BASIS,
12b71955639ab617e0a4115b1439c8b9982227a018sberlin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b71955639ab617e0a4115b1439c8b9982227a018sberlin * See the License for the specific language governing permissions and
14b71955639ab617e0a4115b1439c8b9982227a018sberlin * limitations under the License.
15b71955639ab617e0a4115b1439c8b9982227a018sberlin */
16b71955639ab617e0a4115b1439c8b9982227a018sberlin
17b71955639ab617e0a4115b1439c8b9982227a018sberlinpackage com.google.inject.grapher;
18b71955639ab617e0a4115b1439c8b9982227a018sberlin
19b71955639ab617e0a4115b1439c8b9982227a018sberlinimport com.google.common.base.Objects;
20b71955639ab617e0a4115b1439c8b9982227a018sberlinimport java.lang.reflect.Member;
21b71955639ab617e0a4115b1439c8b9982227a018sberlin
22b71955639ab617e0a4115b1439c8b9982227a018sberlin/**
23b71955639ab617e0a4115b1439c8b9982227a018sberlin * Node for instances. Used when a type is bound to an instance.
24b71955639ab617e0a4115b1439c8b9982227a018sberlin *
25b71955639ab617e0a4115b1439c8b9982227a018sberlin * @author bojand@google.com (Bojan Djordjevic)
26bac730fa1b717351736182034aff62827a383090Ben McCann * @since 4.0
27b71955639ab617e0a4115b1439c8b9982227a018sberlin */
28b71955639ab617e0a4115b1439c8b9982227a018sberlinpublic class InstanceNode extends Node {
29b71955639ab617e0a4115b1439c8b9982227a018sberlin  private final Object instance;
30b71955639ab617e0a4115b1439c8b9982227a018sberlin  private final Iterable<Member> members;
31b71955639ab617e0a4115b1439c8b9982227a018sberlin
32b71955639ab617e0a4115b1439c8b9982227a018sberlin  public InstanceNode(NodeId id, Object source, Object instance, Iterable<Member> members) {
33b71955639ab617e0a4115b1439c8b9982227a018sberlin    super(id, source);
34b71955639ab617e0a4115b1439c8b9982227a018sberlin    this.instance = instance;
35b71955639ab617e0a4115b1439c8b9982227a018sberlin    this.members = members;
36b71955639ab617e0a4115b1439c8b9982227a018sberlin  }
37b71955639ab617e0a4115b1439c8b9982227a018sberlin
38b71955639ab617e0a4115b1439c8b9982227a018sberlin  public Object getInstance() {
39b71955639ab617e0a4115b1439c8b9982227a018sberlin    return instance;
40b71955639ab617e0a4115b1439c8b9982227a018sberlin  }
41b71955639ab617e0a4115b1439c8b9982227a018sberlin
42b71955639ab617e0a4115b1439c8b9982227a018sberlin  public Iterable<Member> getMembers() {
43b71955639ab617e0a4115b1439c8b9982227a018sberlin    return members;
44b71955639ab617e0a4115b1439c8b9982227a018sberlin  }
45b71955639ab617e0a4115b1439c8b9982227a018sberlin
46b71955639ab617e0a4115b1439c8b9982227a018sberlin  @Override public boolean equals(Object obj) {
47b71955639ab617e0a4115b1439c8b9982227a018sberlin    if (!(obj instanceof InstanceNode)) {
48b71955639ab617e0a4115b1439c8b9982227a018sberlin      return false;
49b71955639ab617e0a4115b1439c8b9982227a018sberlin    }
50b71955639ab617e0a4115b1439c8b9982227a018sberlin    InstanceNode other = (InstanceNode) obj;
51b71955639ab617e0a4115b1439c8b9982227a018sberlin    return super.equals(other) && Objects.equal(instance, other.instance)
52b71955639ab617e0a4115b1439c8b9982227a018sberlin        && Objects.equal(members, other.members);
53b71955639ab617e0a4115b1439c8b9982227a018sberlin  }
54b71955639ab617e0a4115b1439c8b9982227a018sberlin
55b71955639ab617e0a4115b1439c8b9982227a018sberlin  @Override public int hashCode() {
56b71955639ab617e0a4115b1439c8b9982227a018sberlin    return 31 * super.hashCode() + Objects.hashCode(instance, members);
57b71955639ab617e0a4115b1439c8b9982227a018sberlin  }
58b71955639ab617e0a4115b1439c8b9982227a018sberlin
59b71955639ab617e0a4115b1439c8b9982227a018sberlin  @Override public String toString() {
60b71955639ab617e0a4115b1439c8b9982227a018sberlin    return "InstanceNode{id=" + getId() + " source=" + getSource() + " instance=" + instance
61b71955639ab617e0a4115b1439c8b9982227a018sberlin        + " members=" + members + "}";
62b71955639ab617e0a4115b1439c8b9982227a018sberlin  }
63b71955639ab617e0a4115b1439c8b9982227a018sberlin
64b71955639ab617e0a4115b1439c8b9982227a018sberlin  @Override public Node copy(NodeId id) {
65b71955639ab617e0a4115b1439c8b9982227a018sberlin    return new InstanceNode(id, getSource(), getInstance(), getMembers());
66b71955639ab617e0a4115b1439c8b9982227a018sberlin  }
67b71955639ab617e0a4115b1439c8b9982227a018sberlin}
68