1 package org.opentrafficsim.road.od;
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.djutils.base.Identifiable;
8 import org.djutils.exceptions.Throw;
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public class Categorization implements Serializable, Identifiable
23 {
24
25
26 public static final Categorization UNCATEGORIZED = new Categorization("Uncategorized");
27
28
29 private static final long serialVersionUID = 20160921L;
30
31
32 private final String id;
33
34
35 private final List<Class<?>> classes = new ArrayList<>();
36
37
38
39
40 private Categorization(final String id)
41 {
42 Throw.whenNull(id, "Id may not be null.");
43 this.id = id;
44 }
45
46
47
48
49
50
51
52
53 public Categorization(final String id, final Class<?> class1, final Class<?>... classes)
54 {
55 this(id);
56 Throw.whenNull(class1, "Classes may not be null.");
57 this.classes.add(class1);
58 for (Class<?> clazz : classes)
59 {
60 Throw.whenNull(clazz, "Classes may not be null.");
61 Throw.when(this.classes.contains(clazz), IllegalArgumentException.class, "Class %s is given multiple times.",
62 clazz);
63 this.classes.add(clazz);
64 }
65 }
66
67
68
69
70
71 public final int size()
72 {
73 return this.classes.size();
74 }
75
76
77
78
79
80
81
82 public final Class<?> get(final int i)
83 {
84 Throw.when(i < 0 || i >= size(), IndexOutOfBoundsException.class,
85 "Index %d is out of range for categorization of size %d.", i, size());
86 return this.classes.get(i);
87 }
88
89
90
91
92 @Override
93 public final String getId()
94 {
95 return this.id;
96 }
97
98
99
100
101
102
103 public final boolean entails(final Class<?> clazz)
104 {
105 for (Class<?> clazz2 : this.classes)
106 {
107 if (clazz.isAssignableFrom(clazz2))
108 {
109 return true;
110 }
111 }
112 return false;
113 }
114
115 @Override
116 public final int hashCode()
117 {
118 final int prime = 31;
119 int result = 1;
120 result = prime * result + ((this.classes == null) ? 0 : this.classes.hashCode());
121 return result;
122 }
123
124 @Override
125 public final boolean equals(final Object obj)
126 {
127 if (this == obj)
128 {
129 return true;
130 }
131 if (obj == null)
132 {
133 return false;
134 }
135 if (getClass() != obj.getClass())
136 {
137 return false;
138 }
139 Categorization other = (Categorization) obj;
140 if (this.classes == null)
141 {
142 if (other.classes != null)
143 {
144 return false;
145 }
146 }
147 else if (!this.classes.equals(other.classes))
148 {
149 return false;
150 }
151 return true;
152 }
153
154 @Override
155 public final String toString()
156 {
157 return "Categorization [id=" + this.id + ", classes=" + this.classes + "]";
158 }
159
160 }