1 package org.pojomatic.internal;
2
3 import java.lang.reflect.Array;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Objects;
7
8 public class ArrayType implements Type {
9 private final Type componentType;
10 private final List<Object> sampleValues;
11
12 public ArrayType(Type componentType) {
13 this.componentType = componentType;
14 sampleValues = new ArrayList<>();
15 sampleValues.add(null);
16 for (int size = 0; size < componentType.getSampleValues().size(); size++) {
17 Object array = Array.newInstance(componentType.getClazz(), size);
18 for (int i = 0; i < size; i++) {
19 Array.set(array, i, componentType.getSampleValues().get(i));
20 }
21 sampleValues.add(array);
22 }
23 }
24
25 @Override
26 public Class<?> getClazz() {
27 return Array.newInstance(componentType.getClazz(), 0).getClass();
28 }
29
30 @Override
31 public List<Object> getSampleValues() {
32 return sampleValues;
33 }
34
35 @Override
36 public String toString() {
37 return componentType.toString() + "[]";
38 }
39
40 @Override
41 public int hashCode(Object value) {
42 return value == null ? 0 : arrayToList(value).hashCode();
43 }
44 @Override
45 public int deepHashCode(Object value) {
46 if (value == null) {
47 return 0;
48 }
49 else {
50 int hash = 1;
51 for (Object element: arrayToList(value)) {
52 hash = hash*31 + componentType.deepHashCode(element);
53 }
54 return hash;
55 }
56 }
57
58 @Override
59 public String toString(Object value) {
60 if (value == null) {
61 return "null";
62 }
63 else {
64 ArrayList<String> strings = new ArrayList<>();
65 for (Object element: arrayToList(value)) {
66 if (componentType instanceof ArrayType) {
67 strings.add(Objects.toString(element));
68 }
69 else {
70 strings.add(componentType.toString(element));
71 }
72 }
73 return strings.toString();
74 }
75 }
76
77 @Override
78 public String deepToString(Object value) {
79 if (value == null) {
80 return "null";
81 }
82 else {
83 ArrayList<String> strings = new ArrayList<>();
84 for (Object element: arrayToList(value)) {
85 strings.add(componentType.deepToString(element));
86 }
87 return strings.toString();
88 }
89 }
90
91 private static List<?> arrayToList(Object array) {
92 List<Object> result = new ArrayList<>();
93 for (int i = 0; i < Array.getLength(array); i++) {
94 result.add(Array.get(array, i));
95 }
96 return result;
97 }
98
99 @Override
100 public int arrayDepth() {
101 return componentType.arrayDepth() + 1;
102 }
103 }