Skip to content

Commit 67f1d52

Browse files
committed
Added interface to convert classes to text format
1 parent 764940e commit 67f1d52

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package jbbp.io;
2+
3+
import com.igormaznitsa.jbbp.mapper.Bin;
4+
import com.igormaznitsa.jbbp.mapper.BinType;
5+
6+
import java.lang.reflect.Field;
7+
import java.util.Arrays;
8+
import java.util.Comparator;
9+
import java.util.List;
10+
import java.util.stream.Collectors;
11+
import java.util.stream.Stream;
12+
13+
public interface Binary {
14+
default List<Field> getSortedBinFieldList() {
15+
Class clazz = this.getClass();
16+
17+
Stream<Field> fields = Arrays.stream(clazz.getDeclaredFields());
18+
19+
Stream<Field> binFields = fields.filter(f -> Arrays.stream(f.getDeclaredAnnotations()).anyMatch(a -> a instanceof Bin));
20+
21+
Comparator<Bin> binComparator = Comparator.comparing(Bin::outOrder);
22+
Comparator<Field> binFieldComparator = Comparator.comparing(f -> f.getDeclaredAnnotation(Bin.class), binComparator);
23+
24+
Stream<Field> sortedBinFields = binFields.sorted(binFieldComparator);
25+
26+
List<Field> sortedBinFieldList = sortedBinFields.collect(Collectors.toList());
27+
28+
return sortedBinFieldList;
29+
}
30+
31+
default String getFormat() {
32+
List<Field> sortedBinFields = getSortedBinFieldList();
33+
34+
String format = sortedBinFields.stream().map(this::getString)
35+
.collect(Collectors.joining(" "));
36+
37+
return format;
38+
}
39+
40+
default String getString(Field field) {
41+
try {
42+
boolean array = false;
43+
44+
Class<?> clazz = field.getType();
45+
46+
if (clazz.isArray()) {
47+
array = true;
48+
clazz = clazz.getComponentType();
49+
}
50+
51+
StringBuilder stringBuilder = new StringBuilder();
52+
String name = field.getName();
53+
54+
if (Binary.class.isAssignableFrom(clazz)) {
55+
// Embedded object
56+
stringBuilder.append(name);
57+
stringBuilder.append(" ");
58+
addArrayIndicatorIfNecessary(array, stringBuilder);
59+
stringBuilder.append(" { ");
60+
Object a = field.get(this);
61+
Object b = clazz.newInstance();
62+
stringBuilder.append(((Binary) b).getFormat());
63+
stringBuilder.append(" } ");
64+
} else {
65+
Bin bin = field.getDeclaredAnnotation(Bin.class);
66+
BinType binType = bin.type();
67+
String arraySize = "_";
68+
69+
if (!bin.extra().isEmpty()) {
70+
arraySize = bin.extra();
71+
}
72+
73+
String binTypeString = binType.toString().replace("_ARRAY", "[" + arraySize + "]");
74+
stringBuilder.append(binTypeString);
75+
stringBuilder.append(" ");
76+
stringBuilder.append(name);
77+
stringBuilder.append(";");
78+
}
79+
80+
return stringBuilder.toString();
81+
} catch (IllegalAccessException e) {
82+
// THIS IS A BUG
83+
throw new UnsupportedOperationException(e);
84+
} catch (InstantiationException e) {
85+
// THIS IS A BUG
86+
throw new UnsupportedOperationException(e);
87+
}
88+
}
89+
90+
default void addArrayIndicatorIfNecessary(boolean array, StringBuilder stringBuilder) {
91+
if (array) {
92+
stringBuilder.append("[_]");
93+
}
94+
}
95+
}

0 commit comments

Comments
 (0)