11package org .javawebstack .graph ;
22
3+ import com .google .gson .Gson ;
4+ import com .google .gson .GsonBuilder ;
35import com .google .gson .JsonElement ;
6+ import org .javawebstack .querystring .QueryString ;
7+ import org .yaml .snakeyaml .DumperOptions ;
8+ import org .yaml .snakeyaml .Yaml ;
49
510import java .util .HashMap ;
11+ import java .util .List ;
612import java .util .Map ;
713
814public interface GraphElement {
915 Type getType ();
10- default boolean isPrimitive (){
16+
17+ default boolean isPrimitive () {
1118 return false ;
1219 }
13- default boolean isObject (){
20+
21+ default boolean isObject () {
1422 return false ;
1523 }
16- default boolean isArray (){
24+
25+ default boolean isArray () {
1726 return false ;
1827 }
19- default boolean isNull (){
28+
29+ default boolean isNull () {
2030 return false ;
2131 }
22- default boolean isNumber (){
32+
33+ default boolean isNumber () {
2334 return false ;
2435 }
25- default boolean isBoolean (){
36+
37+ default boolean isBoolean () {
2638 return false ;
2739 }
28- default boolean isString (){
40+
41+ default boolean isString () {
2942 return false ;
3043 }
31- default GraphPrimitive primitive (){
44+
45+ default GraphPrimitive primitive () {
3246 return null ;
3347 }
34- default GraphArray array (){
48+
49+ default GraphArray array () {
3550 return null ;
3651 }
37- default GraphObject object (){
52+
53+ default GraphObject object () {
3854 return null ;
3955 }
40- default String string (){
41- if (!isString ())
56+
57+ default String string () {
58+ if (!isString ())
4259 return null ;
4360 return primitive ().string ();
4461 }
45- default Boolean bool (){
46- if (!isBoolean ())
62+
63+ default Boolean bool () {
64+ if (!isBoolean ())
4765 return null ;
4866 return primitive ().bool ();
4967 }
50- default Number number (){
51- if (!isNumber ())
68+
69+ default Number number () {
70+ if (!isNumber ())
5271 return null ;
5372 return primitive ().number ();
5473 }
74+
5575 JsonElement toJson ();
76+ default String toJsonString (boolean pretty ){
77+ if (pretty )
78+ return new GsonBuilder ().setPrettyPrinting ().create ().toJson (toJson ());
79+ return new Gson ().toJson (toJson ());
80+ }
81+ default String toJsonString (){
82+ return toJsonString (false );
83+ }
5684
57- default Map < String , String > toFormData (){
58- Map < String [], Object > tree = toTree ();
59- Map < String , String > data = new HashMap <>();
60- for ( String [] key : tree . keySet ()){
61- if (key == null || key . length == 0 )
62- continue ;
63- StringBuilder sb = new StringBuilder ( key [ 0 ] );
64- for ( int i = 1 ; i < key . length ; i ++)
65- sb . append ( '[' ). append ( key [ i ]). append ( ']' );
66- Object value = tree . get ( key );
67- data . put ( sb . toString (), value == null ? "" : value . toString () );
85+ Object toAbstractObject ();
86+
87+ default String toYaml ( boolean pretty ){
88+ Yaml yaml ;
89+ if (pretty ){
90+ DumperOptions options = new DumperOptions () ;
91+ options . setDefaultFlowStyle ( DumperOptions . FlowStyle . BLOCK );
92+ options . setPrettyFlow ( true );
93+ yaml = new Yaml ( options );
94+ } else {
95+ yaml = new Yaml ( );
6896 }
97+ return yaml .dump (toAbstractObject ());
98+ }
99+
100+ default String toYaml (){
101+ return toYaml (true );
102+ }
103+
104+ static GraphElement fromYaml (String source , boolean singleRoot ){
105+ Yaml yaml = new Yaml ();
106+ Object object = yaml .load (source );
107+ if (singleRoot && object instanceof List ){
108+ List <Object > list = (List <Object >) object ;
109+ if (list .size () == 0 ){
110+ object = new HashMap <>();
111+ }else {
112+ object = list .get (0 );
113+ }
114+ }
115+ return fromAbstractObject (object );
116+ }
117+
118+ static GraphElement fromYaml (String source ){
119+ return fromYaml (source , false );
120+ }
121+
122+ static GraphElement fromAbstractObject (Object object ){
123+ if (object == null )
124+ return GraphNull .INSTANCE ;
125+ if (object instanceof List ){
126+ List <Object > list = (List <Object >) object ;
127+ GraphArray array = new GraphArray ();
128+ list .forEach (e -> array .add (fromAbstractObject (e )));
129+ return array ;
130+ }
131+ if (object instanceof Map ){
132+ Map <String , Object > map = (Map <String , Object >) object ;
133+ GraphObject graphObject = new GraphObject ();
134+ map .forEach ((k ,v ) -> graphObject .set (k , fromAbstractObject (v )));
135+ return graphObject ;
136+ }
137+ if (object instanceof Number )
138+ return new GraphPrimitive ((Number ) object );
139+ if (object instanceof String )
140+ return new GraphPrimitive ((String ) object );
141+ if (object instanceof Boolean )
142+ return new GraphPrimitive ((Boolean ) object );
143+ return GraphNull .INSTANCE ;
144+ }
145+
146+ default QueryString toFormData () {
147+ Map <String [], Object > tree = toTree ();
148+ QueryString data = new QueryString ();
149+ for (String [] key : tree .keySet ())
150+ data .set (key , tree .get (key ) == null ? "" : tree .get (key ).toString ());
69151 return data ;
70152 }
71153
154+ default String toFormDataString () {
155+ return toFormData ().toString ();
156+ }
157+
72158 Map <String [], Object > toTree ();
73159
74- static GraphElement fromJson (JsonElement element ){
75- if (element == null )
160+ static GraphElement fromJson (JsonElement element ) {
161+ if (element == null )
76162 return null ;
77- if (element .isJsonArray ())
163+ if (element .isJsonArray ())
78164 return GraphArray .fromJson (element .getAsJsonArray ());
79- if (element .isJsonObject ())
165+ if (element .isJsonObject ())
80166 return GraphObject .fromJson (element .getAsJsonObject ());
81- if (element .isJsonPrimitive ())
167+ if (element .isJsonPrimitive ())
82168 return GraphPrimitive .fromJson (element .getAsJsonPrimitive ());
83169 return GraphNull .INSTANCE ;
84170 }
85171
86- static GraphElement fromTree (Map <String [], Object > tree ){
172+ static GraphElement fromJson (String json ) {
173+ return fromJson (new Gson ().fromJson (json , JsonElement .class ));
174+ }
175+
176+ static GraphElement fromTree (Map <String [], Object > tree ) {
87177 GraphObject object = new GraphObject ();
88- for (String [] key : tree .keySet ()){
178+ for (String [] key : tree .keySet ()) {
89179 GraphObject current = object ;
90180 Object value = tree .get (key );
91181 int offset = 0 ;
92- while (key .length - offset > 1 ){
93- if (current .has (key [offset ])){
182+ while (key .length - offset > 1 ) {
183+ if (current .has (key [offset ])) {
94184 current = current .get (key [offset ]).object ();
95- }else {
185+ } else {
96186 GraphObject n = new GraphObject ();
97187 current .set (key [offset ], n );
98188 current = n ;
@@ -104,15 +194,16 @@ static GraphElement fromTree(Map<String[], Object> tree){
104194 return object ;
105195 }
106196
107- static GraphElement fromFormData (Map <String , String > formData ){
108- Map <String [], Object > tree = new HashMap <>();
109- for (String k : formData .keySet ()){
110- String [] key = k .split ("\\ [" );
111- for (int i =1 ; i <key .length ; i ++)
112- key [i ] = key [i ].substring (0 , key [i ].length ()-1 );
113- tree .put (key , formData .get (k ));
114- }
115- return fromTree (tree );
197+ static GraphElement fromFormData (Map <String , String > formData ) {
198+ return fromFormData (new QueryString (formData ));
199+ }
200+
201+ static GraphElement fromFormData (QueryString formData ) {
202+ return fromTree (formData .toTree ());
203+ }
204+
205+ static GraphElement fromFormData (String formData ) {
206+ return fromFormData (new QueryString (formData ));
116207 }
117208
118209 enum Type {
@@ -122,7 +213,8 @@ enum Type {
122213 BOOLEAN ,
123214 OBJECT ,
124215 ARRAY ;
125- public boolean isPrimitive (){
216+
217+ public boolean isPrimitive () {
126218 return this == NUMBER || this == BOOLEAN || this == STRING ;
127219 }
128220 }
0 commit comments