Project

General

Profile

Download (22.2 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / json / JsonWriter.java @ 5377b942

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.json;
11

    
12
import java.io.BufferedWriter;
13
import java.io.FileOutputStream;
14
import java.io.IOException;
15
import java.io.OutputStreamWriter;
16
import java.nio.charset.StandardCharsets;
17

    
18
import org.distorted.objectlib.helpers.ObjectFaceShape;
19
import org.distorted.objectlib.helpers.ObjectStickerOverride;
20
import org.distorted.objectlib.helpers.ObjectVertexEffects;
21
import org.json.JSONArray;
22
import org.json.JSONException;
23
import org.json.JSONObject;
24

    
25
import org.distorted.library.type.Static3D;
26
import org.distorted.library.type.Static4D;
27

    
28
import org.distorted.objectlib.helpers.ObjectShape;
29
import org.distorted.objectlib.helpers.ObjectSticker;
30
import org.distorted.objectlib.main.TwistyObject;
31

    
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

    
34
public class JsonWriter
35
{
36
  public static final int VERSION_OBJECT_MAJOR = 11;
37
  public static final int VERSION_OBJECT_MINOR = 0;
38
  public static final int VERSION_EXTRAS_MAJOR = 1;
39
  public static final int VERSION_EXTRAS_MINOR = 0;
40

    
41
  private static JsonWriter mThis;
42
  private static int mNumCubitFaces;
43

    
44
///////////////////////////////////////////////////////////////////////////////////////////////////
45

    
46
  private JsonWriter()
47
    {
48

    
49
    }
50

    
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

    
53
  private JSONArray generateCubits(TwistyObject object) throws JSONException
54
    {
55
    JSONArray array = new JSONArray();
56

    
57
    int[] numLayers     = object.getNumLayers();
58
    float[][] positions = object.getCubitPositions(numLayers);
59
    int numCubits       = positions.length;
60

    
61
    for(int c=0; c<numCubits; c++)
62
      {
63
      JSONObject cubit = new JSONObject();
64
      Static4D rotQuat = object.getCubitQuats(c,numLayers);
65
      int variant      = object.getCubitVariant(c,numLayers);
66
      int type         = object.getCubitType(c);
67
      float[] offset   = object.getCubitOffset(c);
68

    
69
      JSONArray pos = new JSONArray();
70
      int numPos = positions[c].length;
71
      for(int j=0; j<numPos; j++) pos.put(positions[c][j]);
72
      cubit.put("centers", pos);
73
      cubit.put("qx", rotQuat.get0() );
74
      cubit.put("qy", rotQuat.get1() );
75
      cubit.put("qz", rotQuat.get2() );
76
      cubit.put("qw", rotQuat.get3() );
77
      cubit.put("variant", variant );
78
      cubit.put("type", type);
79

    
80
      if( offset!=null )
81
        {
82
        cubit.put("offsetX", offset[0]);
83
        cubit.put("offsetY", offset[1]);
84
        cubit.put("offsetZ", offset[2]);
85
        }
86

    
87
      JSONArray colors = new JSONArray();
88

    
89
      for(int f=0; f<mNumCubitFaces; f++)
90
        {
91
        int cubColor = object.getCubitFaceMap(c,f);
92
        colors.put(cubColor);
93
        }
94
      cubit.put("colors",colors);
95

    
96
      array.put(cubit);
97
      }
98

    
99
    return array;
100
    }
101

    
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103

    
104
  private JSONArray generateBands(float[][] bands) throws JSONException
105
    {
106
    JSONArray array = new JSONArray();
107

    
108
    for (float[] b : bands)
109
      {
110
      JSONObject band = new JSONObject();
111
      band.put("height"          , b[0]);
112
      band.put("angle"           , b[1]);
113
      band.put("distanceToCenter", b[2]);
114
      band.put("distanceToFlat"  , b[3]);
115
      band.put("numOfBands"      , b[4]);
116
      band.put("extraI"          , b[5]);
117
      band.put("extraJ"          , b[6]);
118
      array.put(band);
119
      }
120

    
121
    return array;
122
    }
123

    
124
///////////////////////////////////////////////////////////////////////////////////////////////////
125

    
126
  private JSONArray generateFaces(TwistyObject object, ObjectShape shape, int[] bandIndices, int[] faceOuter, int cubit, int[] numLayers) throws JSONException
127
    {
128
    JSONArray array = new JSONArray();
129
    int numFaces = shape.getNumFaces();
130
    int variant = object.getCubitVariant(cubit,numLayers);
131
    boolean multigon = shape.isMultigon();
132
    int[][] vertIndices1   = shape.getVertIndices();
133
    int[][][] vertIndices2 = shape.getMultigonIndices();
134

    
135
    for(int i=0; i<numFaces; i++)
136
      {
137
      JSONObject face = new JSONObject();
138
      face.put("bandIndex", bandIndices[i]);
139

    
140
      int stiShape = object.getVariantStickerShape(variant,i);
141
      face.put("sticker", stiShape);
142
      face.put("isOuter", faceOuter[i]);
143

    
144
      JSONArray faceArr = new JSONArray();
145

    
146
      if( !multigon )
147
        {
148
        int num = vertIndices1[i].length;
149
        for(int j=0; j<num; j++) faceArr.put(vertIndices1[i][j]);
150
        }
151
      else
152
        {
153
        int num = vertIndices2[i].length;
154
        for(int j=0; j<num; j++)
155
          {
156
          JSONArray compArr = new JSONArray();
157
          int com = vertIndices2[i][j].length;
158
          for(int k=0; k<com; k++) compArr.put(vertIndices2[i][j][k]);
159
          faceArr.put(compArr);
160
          }
161
        }
162

    
163
      face.put("vertexIndices",faceArr);
164
      array.put(face);
165
      }
166

    
167
    return array;
168
    }
169

    
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171

    
172
  private JSONArray generateVertices(float[][] vertices) throws JSONException
173
    {
174
    JSONArray array = new JSONArray();
175

    
176
    for (float[] vertex : vertices)
177
      {
178
      JSONObject vert = new JSONObject();
179
      vert.put("x", vertex[0]);
180
      vert.put("y", vertex[1]);
181
      vert.put("z", vertex[2]);
182
      array.put(vert);
183
      }
184

    
185
    return array;
186
    }
187

    
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189

    
190
  private JSONObject generateConvexity(float[] convexity) throws JSONException
191
    {
192
    JSONObject object = new JSONObject();
193
    object.put("x", convexity[0]);
194
    object.put("y", convexity[1]);
195
    object.put("z", convexity[2]);
196
    return object;
197
    }
198

    
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200

    
201
  private JSONObject generateEffect(String name, float[] var, float[] center, float[] region, boolean use) throws JSONException
202
    {
203
    JSONObject object = new JSONObject();
204

    
205
    object.put("name",name);
206

    
207
    object.put("var0", var[0]);
208
    object.put("var1", var[1]);
209
    object.put("var2", var[2]);
210
    object.put("var3", var[3]);
211
    object.put("var4", var[4]);
212

    
213
    object.put("center0", center[0]);
214
    object.put("center1", center[1]);
215
    object.put("center2", center[2]);
216

    
217
    object.put("region0", region[0]);
218
    object.put("region1", region[1]);
219
    object.put("region2", region[2]);
220
    object.put("region3", region[3]);
221

    
222
    object.put("use", use);
223

    
224
    return object;
225
    }
226

    
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228

    
229
  private JSONArray generateEffects(String[] names, float[][] vars, float[][] centers, float[][] regions, boolean[] uses) throws JSONException
230
    {
231
    int numEffects = names==null ? 0 : names.length;
232

    
233
    if( numEffects>0 )
234
      {
235
      JSONArray array = new JSONArray();
236

    
237
      for(int i=0; i<numEffects; i++)
238
        {
239
        if( names[i]!=null )
240
          {
241
          JSONObject object = generateEffect(names[i],vars[i],centers[i],regions[i],uses[i]);
242
          array.put(object);
243
          }
244
        }
245

    
246
      return array;
247
      }
248

    
249
    return null;
250
    }
251

    
252
///////////////////////////////////////////////////////////////////////////////////////////////////
253

    
254
  private int findCubitWithVariant(TwistyObject object, int variant, int numCubits, int[] numLayers)
255
    {
256
    for(int i=0; i<numCubits; i++)
257
      {
258
      if( object.getCubitVariant(i,numLayers)==variant ) return i;
259
      }
260

    
261
    return -1;
262
    }
263

    
264
///////////////////////////////////////////////////////////////////////////////////////////////////
265

    
266
  private JSONArray generateShapes(TwistyObject object) throws JSONException
267
    {
268
    JSONArray shapes = new JSONArray();
269

    
270
    int[] numLayers = object.getNumLayers();
271
    int numVariants = object.getNumCubitVariants(numLayers);
272
    float[][] positions = object.getCubitPositions(numLayers);
273
    int[][] faceOuter   = object.getVariantFaceIsOuter();
274
    int numCubits = positions.length;
275
    mNumCubitFaces = 0;
276

    
277
    for(int i=0; i<numVariants; i++)
278
      {
279
      JSONObject shapeObj = new JSONObject();
280

    
281
      ObjectShape shape = object.getObjectShape(i);
282
      ObjectFaceShape face = object.getObjectFaceShape(i);
283
      ObjectVertexEffects effects = object.getVertexEffects(i);
284

    
285
      float[] convexity  = face.getConvexityCenter();
286
      float[][] vertices = shape.getVertices();
287
      float[][] bands    = face.getBands();
288
      int[] bandIndices  = face.getBandIndices();
289

    
290
      int num = shape.getNumFaces();
291
      if( num>mNumCubitFaces ) mNumCubitFaces=num;
292

    
293
      int cubit = findCubitWithVariant(object,i,numCubits,numLayers);
294

    
295
      if( convexity!=null )
296
        {
297
        JSONObject convObj = generateConvexity(convexity);
298
        shapeObj.put("convexity", convObj);
299
        }
300

    
301
      if( shape.isMultigon() ) shapeObj.put("facesMultigon", true);
302

    
303
      JSONArray verticesArr = generateVertices(vertices);
304
      shapeObj.put("vertices", verticesArr);
305
      JSONArray facesArr = generateFaces(object,shape,bandIndices,faceOuter[i],cubit,numLayers);
306
      shapeObj.put("faces", facesArr);
307
      JSONArray bandsArr = generateBands(bands);
308
      shapeObj.put("bands", bandsArr);
309

    
310
      if( effects!=null )
311
        {
312
        String[] effNames = effects.getNames();
313
        float[][] effVars = effects.getVariables();
314
        float[][] effCent = effects.getCenters();
315
        float[][] effRegi = effects.getRegions();
316
        boolean[] effUses = effects.getUses();
317

    
318
        JSONArray effectsArr = generateEffects(effNames,effVars,effCent,effRegi,effUses);
319
        if( effectsArr!=null ) shapeObj.put("effects", effectsArr);
320
        }
321

    
322
      shapes.put(shapeObj);
323
      }
324

    
325
    return shapes;
326
    }
327

    
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329

    
330
  private JSONArray generateStickers(TwistyObject object) throws JSONException
331
    {
332
    JSONArray stickers = new JSONArray();
333

    
334
    int numStickers = object.getNumStickerTypes();
335

    
336
    for(int i=0; i<numStickers; i++)
337
      {
338
      JSONObject stickerObj = new JSONObject();
339
      JSONArray  vertexArray= new JSONArray();
340

    
341
      ObjectSticker sticker = object.retSticker(i);
342

    
343
      float[] coords     = sticker.getCoords();
344
      float[] curvatures = sticker.getCurvature();
345
      float[] radii      = sticker.getRadii();
346
      float   stroke     = sticker.getStroke();
347

    
348
      stickerObj.put("stroke", stroke);
349
      int numVertices = radii.length;
350

    
351
      for(int j=0; j<numVertices; j++)
352
        {
353
        JSONObject vertex = new JSONObject();
354
        vertex.put("x", coords[2*j  ]);
355
        vertex.put("y", coords[2*j+1]);
356
        vertex.put("angle", curvatures==null ? 0 : curvatures[j]);
357
        vertex.put("radius",radii[j]);
358
        vertexArray.put(vertex);
359
        }
360
      stickerObj.put("vertices", vertexArray);
361
      stickers.put(stickerObj);
362
      }
363

    
364
    return stickers;
365
    }
366

    
367
///////////////////////////////////////////////////////////////////////////////////////////////////
368

    
369
  private JSONArray generateOverrides(TwistyObject object) throws JSONException
370
    {
371
    ObjectStickerOverride[] overrides = object.getStickerOverrides();
372

    
373
    if( overrides!=null )
374
      {
375
      JSONArray overrideArray = new JSONArray();
376

    
377
      for (ObjectStickerOverride objectStickerOverride : overrides)
378
        {
379
        JSONObject override = new JSONObject();
380
        int[] cubfac = objectStickerOverride.getCubitFaces();
381
        int color    = objectStickerOverride.getColor();
382
        JSONArray cubfacArray = new JSONArray();
383
        for (int cf : cubfac) cubfacArray.put(cf);
384

    
385
        override.put("cubitfaces", cubfacArray);
386
        override.put("color", color);
387

    
388
        overrideArray.put(override);
389
        }
390

    
391
      return overrideArray;
392
      }
393

    
394
    return null;
395
    }
396

    
397
///////////////////////////////////////////////////////////////////////////////////////////////////
398

    
399
  private JSONObject generateMesh(TwistyObject object) throws JSONException
400
    {
401
    JSONObject mesh = new JSONObject();
402

    
403
    JSONArray shapes   = generateShapes(object);  // do this before cubits so we calculate numCubitFaces
404
    JSONArray cubits   = generateCubits(object);
405
    JSONArray stickers = generateStickers(object);
406

    
407
    mesh.put("shapes"  , shapes);
408
    mesh.put("cubits"  , cubits);
409
    mesh.put("stickers", stickers);
410
    mesh.put("pillow"  , object.getPillowCoeff() );
411

    
412
    JSONArray overrides = generateOverrides(object);
413
    if( overrides!=null ) mesh.put("overrides", overrides);
414

    
415
    return mesh;
416
    }
417

    
418
///////////////////////////////////////////////////////////////////////////////////////////////////
419

    
420
  private JSONObject generateMetadata(TwistyObject object, int numScramble, int price) throws JSONException
421
    {
422
    JSONObject metadata = new JSONObject();
423

    
424
    metadata.put("longname"   , object.getObjectName() );
425
    metadata.put("inventor"   , object.getInventor());
426
    metadata.put("year"       , object.getYearOfInvention());
427
    metadata.put("complexity" , object.getComplexity());
428
    metadata.put("size"       , object.getSize() );
429
    metadata.put("scrambles"  , numScramble );
430
    metadata.put("shortname"  , object.getShortName() );
431
    metadata.put("resetmaps"  , object.shouldResetTextureMaps() );
432
    metadata.put("num_faces"  , object.getNumFaces() );
433
    metadata.put("price"      , price );
434

    
435
    JSONArray sigArray = new JSONArray();
436
    long[] sig = object.getSignature().getArray();
437
    for (long l : sig) sigArray.put(l);
438
    metadata.put("signature" , sigArray );
439

    
440
    return metadata;
441
    }
442

    
443
///////////////////////////////////////////////////////////////////////////////////////////////////
444

    
445
  private JSONArray generateQuats(TwistyObject object) throws JSONException
446
    {
447
    JSONArray quatsArray = new JSONArray();
448
    Static4D[] quats = object.getQuats();
449

    
450
    for(Static4D quat : quats)
451
      {
452
      JSONObject q = new JSONObject();
453
      q.put("x",quat.get0());
454
      q.put("y",quat.get1());
455
      q.put("z",quat.get2());
456
      q.put("w",quat.get3());
457
      quatsArray.put(q);
458
      }
459

    
460
    return quatsArray;
461
    }
462

    
463
///////////////////////////////////////////////////////////////////////////////////////////////////
464

    
465
  private JSONArray generateAxis(TwistyObject object) throws JSONException
466
    {
467
    JSONArray axis = new JSONArray();
468

    
469
    Static3D[] rotAxis = object.getRotationAxis();
470
    int numAxis = rotAxis.length;
471
    int[][] basicAngle = object.getBasicAngles();
472
    int[] numLayers = object.getNumLayers();
473
    float[][] cuts = object.getCuts(numLayers);
474
    boolean[][] rotatable = object.getLayerRotatable(numLayers);
475
    float[][] rotFactor = object.returnRotationFactor();
476

    
477
    for( int i=0; i<numAxis; i++ )
478
      {
479
      JSONObject axObject = new JSONObject();
480
      Static3D ax = rotAxis[i];
481

    
482
      axObject.put("x", ax.get0() );
483
      axObject.put("y", ax.get1() );
484
      axObject.put("z", ax.get2() );
485

    
486
      JSONArray angleArray = new JSONArray();
487
      for(float angle : basicAngle[i]) angleArray.put(angle);
488
      axObject.put("basicAngles", angleArray);
489
      JSONArray cutsArray = new JSONArray();
490
      if( cuts[i]!=null ) for(float cut : cuts[i]) cutsArray.put(cut);
491
      axObject.put("cuts", cutsArray);
492
      JSONArray rotaArray = new JSONArray();
493
      for(boolean rot : rotatable[i]) rotaArray.put(rot);
494
      axObject.put("rotatable", rotaArray );
495
      JSONArray factorArray = new JSONArray();
496
      for(float rotf : rotFactor[i]) factorArray.put(rotf);
497
      axObject.put("factor", factorArray );
498

    
499
      axis.put(axObject);
500
      }
501

    
502
    return axis;
503
    }
504

    
505
///////////////////////////////////////////////////////////////////////////////////////////////////
506

    
507
  private JSONObject generateScrambling(TwistyObject object) throws JSONException
508
    {
509
    JSONObject scrambling = new JSONObject();
510

    
511
    int scrambleType = object.getScrambleType();
512
    scrambling.put("scrambleType",scrambleType );
513
    int[][] algorithms = object.getScrambleAlgorithms();
514

    
515
    if( algorithms!=null )
516
      {
517
      JSONArray scrambleAlgorithms = new JSONArray();
518

    
519
      for(int[] algorithm : algorithms)
520
        {
521
        JSONArray algArray = new JSONArray();
522
        for (int entry : algorithm) algArray.put(entry);
523
        scrambleAlgorithms.put(algArray);
524
        }
525

    
526
      scrambling.put("algorithms", scrambleAlgorithms);
527
      }
528

    
529
    int[][] edges = object.getScrambleEdges();
530

    
531
    if( edges!=null )
532
      {
533
      JSONArray scrambleEdges = new JSONArray();
534

    
535
      for(int[] edge : edges)
536
        {
537
        JSONArray edgeArray = new JSONArray();
538
        for (int entry : edge) edgeArray.put(entry);
539
        scrambleEdges.put(edgeArray);
540
        }
541

    
542
      scrambling.put("edges", scrambleEdges);
543
      }
544

    
545
    return scrambling;
546
    }
547

    
548
///////////////////////////////////////////////////////////////////////////////////////////////////
549

    
550
  private JSONObject generateTouchControl(TwistyObject object) throws JSONException
551
    {
552
    JSONObject touchControl = new JSONObject();
553

    
554
    touchControl.put("movementType" , object.getTouchControlType() );
555
    touchControl.put("movementSplit", object.getTouchControlSplit() );
556

    
557
    int[][][] enabled = object.getEnabled();
558

    
559
    if( enabled!=null )
560
      {
561
      JSONArray enabledArray = new JSONArray();
562

    
563
      for(int[][] faceEnabled : enabled)
564
        {
565
        JSONArray faceArray = new JSONArray();
566

    
567
        for(int[] sectionEnabled : faceEnabled)
568
          {
569
          JSONArray sectionArray = new JSONArray();
570
          for(int ax : sectionEnabled) sectionArray.put(ax);
571
          faceArray.put(sectionArray);
572
          }
573
        enabledArray.put(faceArray);
574
        }
575

    
576
      touchControl.put("enabledAxis", enabledArray);
577
      }
578

    
579
    int[] numLayers = object.getNumLayers();
580
    float[] dist3D = object.getDist3D(numLayers);
581

    
582
    if( dist3D!=null )
583
      {
584
      JSONArray distArray = new JSONArray();
585
      for( float dist: dist3D ) distArray.put(dist);
586
      touchControl.put("dist3D", distArray);
587
      }
588

    
589
    return touchControl;
590
    }
591

    
592
///////////////////////////////////////////////////////////////////////////////////////////////////
593

    
594
  private JSONArray generateColors(TwistyObject object)
595
    {
596
    JSONArray jsonColors = new JSONArray();
597
    int numFaceColors = object.getNumFaceColors();
598
    for(int i=0; i<numFaceColors; i++) jsonColors.put(object.getColor(i));
599

    
600
    jsonColors.put(object.getInternalColor());
601

    
602
    return jsonColors;
603
    }
604

    
605
///////////////////////////////////////////////////////////////////////////////////////////////////
606

    
607
  private JSONObject generateSolved(TwistyObject object) throws JSONException
608
    {
609
    JSONObject solved = new JSONObject();
610
    int[][] solvedGroups = object.getSolvedQuats();
611

    
612
    solved.put("functionIndex", object.getSolvedFunctionIndex() );
613

    
614
    if( solvedGroups!=null )
615
      {
616
      JSONArray groupArray = new JSONArray();
617

    
618
      for( int[] group : solvedGroups )
619
        {
620
        JSONArray groupElements = new JSONArray();
621
        for( int element : group ) groupElements.put(element);
622
        groupArray.put(groupElements);
623
        }
624

    
625
      solved.put("groups", groupArray );
626
      }
627

    
628
    return solved;
629
    }
630

    
631
///////////////////////////////////////////////////////////////////////////////////////////////////
632

    
633
  public String createObjectString(TwistyObject object,int numScramble, int price) throws JSONException
634
    {
635
    JSONObject json = new JSONObject();
636

    
637
    JSONObject metadata    = generateMetadata(object,numScramble,price);
638
    JSONObject mesh        = generateMesh(object);
639
    JSONArray  axis        = generateAxis(object);
640
    JSONArray  quats       = generateQuats(object);
641
    JSONObject scrambling  = generateScrambling(object);
642
    JSONObject touchControl= generateTouchControl(object);
643
    JSONArray  colors      = generateColors(object);
644
    JSONObject solved      = generateSolved(object);
645

    
646
    json.put("major"       , VERSION_OBJECT_MAJOR);
647
    json.put("minor"       , VERSION_OBJECT_MINOR);
648
    json.put("metadata"    , metadata);
649
    json.put("mesh"        , mesh);
650
    json.put("axis"        , axis);
651
    json.put("quats"       , quats);
652
    json.put("scrambling"  , scrambling);
653
    json.put("touchcontrol", touchControl);
654
    json.put("colors"      , colors);
655
    json.put("solved"      , solved);
656

    
657
    return json.toString();
658
    }
659

    
660
///////////////////////////////////////////////////////////////////////////////////////////////////
661

    
662
  public String createExtrasString(TwistyObject object) throws JSONException
663
    {
664
    String[][] tuts = object.getTutorials();
665

    
666
    if( tuts!=null )
667
      {
668
      JSONObject json = new JSONObject();
669
      JSONArray  tutorials = new JSONArray();
670

    
671
      for(String[] tut : tuts)
672
        {
673
        String language = tut[0];
674
        String link     = tut[1];
675
        String title    = tut[2];
676
        String author   = tut[3];
677

    
678
        JSONObject oneTut = new JSONObject();
679

    
680
        oneTut.put("language", language);
681
        oneTut.put("link"    , link    );
682
        oneTut.put("title"   , title   );
683
        oneTut.put("author"  , author  );
684

    
685
        tutorials.put(oneTut);
686
        }
687

    
688
      json.put("major"     , VERSION_EXTRAS_MAJOR);
689
      json.put("minor"     , VERSION_EXTRAS_MINOR);
690
      json.put("object"    , object.getShortName() );
691
      json.put("tutorials" , tutorials);
692

    
693
      return json.toString();
694
      }
695

    
696
    return null;
697
    }
698

    
699
///////////////////////////////////////////////////////////////////////////////////////////////////
700

    
701
  public void write(String filename, String contents) throws IOException
702
    {
703
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8);
704
    BufferedWriter bw = new BufferedWriter(osw);
705
    bw.write(contents);
706
    bw.flush();
707
    }
708

    
709
///////////////////////////////////////////////////////////////////////////////////////////////////
710

    
711
  public static JsonWriter getInstance()
712
    {
713
    if( mThis==null ) mThis = new JsonWriter();
714
    return mThis;
715
    }
716
}
(2-2/2)