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