1+ package blue .language .utils ;
2+
3+ import blue .language .model .Node ;
4+
5+ import java .util .*;
6+ import java .util .function .BiConsumer ;
7+ import java .util .function .Function ;
8+
9+ import static blue .language .utils .Nodes .NodeField .*;
10+ import static blue .language .utils .Nodes .hasFieldsAndMayHaveFields ;
11+
12+ public class MergeReverser {
13+
14+ public Node reverse (Node mergedNode ) {
15+ Node minimalNode = new Node ();
16+ reverseNode (minimalNode , mergedNode , null );
17+ return minimalNode ;
18+ }
19+
20+ private void reverseNode (Node minimal , Node merged , Node fromType ) {
21+
22+ if (merged .getBlueId () != null && fromType != null && merged .getBlueId ().equals (fromType .getBlueId ())) {
23+ return ;
24+ }
25+
26+ if (merged .getValue () != null && (fromType == null || fromType .getValue () == null )) {
27+ minimal .value (merged .getValue ());
28+ }
29+
30+ setTypeIfDifferent (merged , fromType , minimal , Node ::getType , Node ::type );
31+ setTypeIfDifferent (merged , fromType , minimal , Node ::getItemType , Node ::itemType );
32+ setTypeIfDifferent (merged , fromType , minimal , Node ::getKeyType , Node ::keyType );
33+ setTypeIfDifferent (merged , fromType , minimal , Node ::getValueType , Node ::valueType );
34+
35+ if (merged .getName () != null && (fromType == null || !merged .getName ().equals (fromType .getName ()))) {
36+ minimal .name (merged .getName ());
37+ }
38+ if (merged .getDescription () != null && (fromType == null || !merged .getDescription ().equals (fromType .getDescription ()))) {
39+ minimal .description (merged .getDescription ());
40+ }
41+
42+ if (merged .getBlueId () != null && (fromType == null || !merged .getBlueId ().equals (fromType .getBlueId ()))) {
43+ minimal .blueId (merged .getBlueId ());
44+ }
45+
46+ if (merged .getItems () != null ) {
47+ int start = 0 ;
48+ List <Node > minimalItems = new ArrayList <>();
49+ if (fromType != null && fromType .getItems () != null ) {
50+ String itemsBlueId = BlueIdCalculator .calculateBlueId (fromType .getItems ());
51+ minimalItems .add (new Node ().blueId (itemsBlueId ));
52+ start = fromType .getItems ().size ();
53+ }
54+ if (merged .getItems ().size () > start ) {
55+ for (int i = start ; i < merged .getItems ().size (); i ++) {
56+ Node item = merged .getItems ().get (i );
57+ Node minimalItem = new Node ();
58+ reverseNode (minimalItem , item , null );
59+ minimalItems .add (minimalItem );
60+ }
61+ minimal .items (minimalItems );
62+ }
63+ }
64+
65+ if (merged .getProperties () != null ) {
66+ Map <String , Node > minimalProperties = new HashMap <>();
67+ for (Map .Entry <String , Node > entry : merged .getProperties ().entrySet ()) {
68+ Node minimalProperty = new Node ();
69+ Node typeProperty = (merged .getType () != null && merged .getType ().getProperties () != null ) ?
70+ merged .getType ().getProperties ().get (entry .getKey ()) : null ;
71+ reverseNode (minimalProperty , entry .getValue (), typeProperty );
72+ if (!Nodes .isEmptyNode (minimalProperty )) {
73+ minimalProperties .put (entry .getKey (), minimalProperty );
74+ }
75+ }
76+ if (!minimalProperties .isEmpty ()) {
77+ minimal .properties (minimalProperties );
78+ }
79+ }
80+
81+ }
82+
83+ private void setTypeIfDifferent (Node merged , Node fromType , Node minimal ,
84+ Function <Node , Node > typeGetter ,
85+ BiConsumer <Node , Node > typeSetter ) {
86+ Node mergedType = typeGetter .apply (merged );
87+ if (mergedType != null && (fromType == null || typeGetter .apply (fromType ) == null ||
88+ !typeGetter .apply (fromType ).getBlueId ().equals (mergedType .getBlueId ()))) {
89+ Node typeNode = new Node ().blueId (mergedType .getBlueId ());
90+ typeSetter .accept (minimal , typeNode );
91+ }
92+ }
93+ }
0 commit comments