1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.commons.weaver.model;
20
21 import java.lang.reflect.Constructor;
22 import java.lang.reflect.Field;
23 import java.lang.reflect.Method;
24 import java.util.Collections;
25 import java.util.Comparator;
26 import java.util.concurrent.ConcurrentNavigableMap;
27 import java.util.concurrent.ConcurrentSkipListMap;
28
29 import org.apache.commons.weaver.utils.Args;
30
31
32
33
34
35
36 public class WeavableClass<T> extends NestedWeavable<WeavableClass<T>, Class<T>, WeavablePackage, Package> {
37 private static final Comparator<Class<?>> CLASS_COMPARATOR = Comparator.comparing(Class::getName);
38
39 private final ConcurrentNavigableMap<String, WeavableField<T>> fields = new ConcurrentSkipListMap<>();
40
41 private final ConcurrentNavigableMap<Constructor<T>, WeavableConstructor<T>> ctors = new ConcurrentSkipListMap<>(
42 (ctor1, ctor2) -> Args.compare(ctor1.getParameterTypes(), ctor2.getParameterTypes()));
43
44 private final ConcurrentNavigableMap<Method, WeavableMethod<T>> methods =
45 new ConcurrentSkipListMap<>((methd1, methd2) -> {
46 final int result = methd1.getName().compareTo(methd2.getName());
47 return result == 0 ? Args.compare(methd1.getParameterTypes(), methd2.getParameterTypes()) : result;
48 });
49
50
51
52
53
54
55 public WeavableClass(final Class<T> target, final WeavablePackage parent) {
56 super(target, parent);
57 }
58
59
60
61
62
63
64 public WeavableField<T> getWeavable(final Field fld) {
65 return fields.computeIfAbsent(fld.getName(), k -> new WeavableField<>(fld, this));
66 }
67
68
69
70
71
72
73 public WeavableMethod<T> getWeavable(final Method methd) {
74 return methods.computeIfAbsent(methd, k -> new WeavableMethod<>(methd, this));
75 }
76
77
78
79
80
81
82 public WeavableConstructor<T> getWeavable(final Constructor<T> ctor) {
83 return ctors.computeIfAbsent(ctor, k -> new WeavableConstructor<>(ctor, this));
84 }
85
86
87
88
89
90 public Iterable<WeavableField<T>> getFields() {
91 return Collections.unmodifiableCollection(fields.values());
92 }
93
94
95
96
97
98 public Iterable<WeavableConstructor<T>> getConstructors() {
99 return Collections.unmodifiableCollection(ctors.values());
100 }
101
102
103
104
105
106 public Iterable<WeavableMethod<T>> getMethods() {
107 return Collections.unmodifiableCollection(methods.values());
108 }
109
110
111
112
113 @Override
114 protected int localCompareTo(final WeavableClass<T> obj) {
115 return obj == null ? 1 : CLASS_COMPARATOR.compare(getTarget(), obj.getTarget());
116 }
117 }