001package jmri.server.json;
002
003import java.util.Arrays;
004import java.util.Collections;
005import java.util.List;
006
007import jmri.Audio;
008
009/**
010 * Common and utility constants used in the JMRI JSON protocol.
011 * <p>
012 * <strong>Note</strong> any documented use of a constant is not the exclusive
013 * or sole use of the constant. Review the JSON schemas for all uses of any
014 * given constant.
015 *
016 * @author Randall Wood (C) 2013, 2014, 2016, 2018, 2019
017 */
018public final class JSON {
019
020    /**
021     * JSON protocol version for requesting version 5.x.y protocol. {@value #V5}
022     */
023    public static final String V5 = "v5";
024
025    /**
026     * List of supported versions, as used in the HTTP URL paths.
027     * <p>
028     * <strong>Note:</strong> this being a List&lt;String&gt; is not stable API
029     * and is subject to change without notice.
030     */
031    public static final List<String> VERSIONS = Collections.unmodifiableList(Arrays.asList(V5));
032
033    /**
034     * JMRI JSON protocol version 5 complete version. See
035     * {@link jmri.server.json} for the version history. Starting with 5.0.0,
036     * this is a semantic version string; prior to that, it is just an X.Y
037     * version string.
038     */
039    public static final String V5_PROTOCOL_VERSION = "5.4.0"; // NOI18N
040
041    /**
042     * JMRI JSON protocol version. See {@link jmri.server.json} for the version
043     * history. Starting with 5.0.0, this is a semantic version string; prior to
044     * that, it is just an X.Y version string.
045     */
046    public static final String JSON_PROTOCOL_VERSION = V5_PROTOCOL_VERSION; // NOI18N
047
048    /**
049     * {@value #VERSION}
050     */
051    public static final String VERSION = "version"; // NOI18N
052
053    /* JSON structure */
054    /**
055     * {@value #TYPE}
056     */
057    public static final String TYPE = "type"; // NOI18N
058    /**
059     * {@value #LIST}
060     */
061    public static final String LIST = "list"; // NOI18N
062    /**
063     * {@value #DATA}
064     */
065    public static final String DATA = "data"; // NOI18N
066    /**
067     * {@value #PING}
068     */
069    public static final String PING = "ping"; // NOI18N
070    /**
071     * {@value #PONG}
072     */
073    public static final String PONG = "pong"; // NOI18N
074    /**
075     * {@value #GOODBYE}
076     */
077    public static final String GOODBYE = "goodbye"; // NOI18N
078    /**
079     * {@value #NAME}
080     */
081    public static final String NAME = "name"; // NOI18N
082
083    /* JSON methods */
084    /**
085     * {@value #METHOD}
086     */
087    public static final String METHOD = "method"; // NOI18N
088    /**
089     * {@value #DELETE}
090     */
091    public static final String DELETE = "delete"; // NOI18N
092    /**
093     * {@value #GET}
094     */
095    public static final String GET = "get"; // NOI18N
096    /**
097     * {@value #POST}
098     */
099    public static final String POST = "post"; // NOI18N
100    /**
101     * {@value #PUT}
102     */
103    public static final String PUT = "put"; // NOI18N
104
105    /* JSON common tokens */
106    /**
107     * {@value #COMMENT}
108     */
109    public static final String COMMENT = "comment"; // NOI18N
110    /**
111     * {@value #USERNAME}
112     */
113    public static final String USERNAME = "userName"; // NOI18N
114    /**
115     * {@value #STATE}
116     */
117    public static final String STATE = "state"; // NOI18N
118    /**
119     * {@value #VALUE}
120     */
121    public static final String VALUE = "value"; // NOI18N
122    /**
123     * {@value #ID}
124     */
125    public static final String ID = "id"; // NOI18N
126    /**
127     * {@value #STATUS}
128     */
129    public static final String STATUS = "status"; // NOI18N
130    /**
131     * Numeric status value
132     * <p>
133     * {@value #STATUS_CODE}
134     */
135    public static final String STATUS_CODE = "statusCode"; // NOI18N
136    /**
137     * {@value #PROPERTIES}
138     */
139    public static final String PROPERTIES = "properties"; // NOI18N
140    /**
141     * {@value #DEFAULT}
142     */
143    public static final String DEFAULT = "default"; // NOI18N
144    /**
145     * {@value #SPEED}
146     */
147    public static final String SPEED = "speed"; // NOI18N
148    /**
149     * {@value #DIRECTION}
150     */
151    public static final String DIRECTION = "direction"; // NOI18N
152
153    /* JSON hello and metadata */
154    /**
155     * {@value #HELLO}
156     */
157    public static final String HELLO = "hello"; // NOI18N
158    /**
159     * {@value #JMRI}
160     */
161    public static final String JMRI = "JMRI"; // NOI18N
162    /**
163     * {@value #HEARTBEAT}
164     */
165    public static final String HEARTBEAT = "heartbeat"; // NOI18N
166    /**
167     * {@value #RAILROAD}
168     */
169    public static final String RAILROAD = "railroad"; // NOI18N
170    /**
171     * {@value #NODE}
172     *
173     * @since 1.1
174     */
175    public static final String NODE = "node"; // NOI18N
176    /**
177     * {@value #ACTIVE_PROFILE}
178     *
179     * @since 3.0
180     */
181    public static final String ACTIVE_PROFILE = "activeProfile"; // NOI18N
182    /**
183     * {@value #FORMER_NODES}
184     *
185     * @since 1.1
186     */
187    public static final String FORMER_NODES = "formerNodes"; // NOI18N
188    /**
189     * {@value #LOCALE}
190     *
191     * @since 1.1
192     */
193    public static final String LOCALE = "locale"; // NOI18N
194
195    /* JSON list types */
196    /**
197     * {@value #ENGINES}
198     */
199    public static final String ENGINES = "engines"; // NOI18N
200    /**
201     * {@value #METADATA}
202     */
203    public static final String METADATA = "metadata"; // NOI18N
204    /**
205     * {@value #PANELS}
206     */
207    public static final String PANELS = "panels"; // NOI18N
208    /**
209     * {@value #ROUTES}
210     */
211    public static final String ROUTES = "routes"; // NOI18N
212    /**
213     * {@value #NETWORK_SERVICES}
214     */
215    public static final String NETWORK_SERVICES = "networkServices"; // NOI18N
216    /**
217     * {@value #CONFIG_PROFILES}
218     */
219    public static final String CONFIG_PROFILES = "configProfiles"; // NOI18N
220    /**
221     * {@value #CONFIG_PROFILE}
222     */
223    public static final String CONFIG_PROFILE = "configProfile"; // NOI18N
224    /**
225     * {@value #UNIQUE_ID}
226     */
227    public static final String UNIQUE_ID = "uniqueId"; // NOI18N
228    /**
229     * {@value #IS_ACTIVE_PROFILE}
230     */
231    public static final String IS_ACTIVE_PROFILE = "isActiveProfile"; // NOI18N
232    /**
233     * {@value #IS_AUTO_START}
234     */
235    public static final String IS_AUTO_START = "isAutoStart"; // NOI18N
236    /**
237     * {@value #IS_NEXT_PROFILE}
238     */
239    public static final String IS_NEXT_PROFILE = "isNextProfile"; // NOI18N
240
241    /* JSON data types */
242    /**
243     * {@value #NETWORK_SERVICE}
244     *
245     * @since 2.0
246     */
247    public static final String NETWORK_SERVICE = "networkService"; // NOI18N
248    /**
249     * {@value #PANEL}
250     */
251    public static final String PANEL = "panel"; // NOI18N
252    /**
253     * {@value #PROGRAMMER}
254     */
255    public static final String PROGRAMMER = "programmer"; // NOI18N
256    /**
257     * {@value #ROUTE}
258     */
259    public static final String ROUTE = "route"; // NOI18N
260    /**
261     * {@value #THROTTLE}
262     */
263    public static final String THROTTLE = "throttle"; // NOI18N
264
265    /* JSON operations tokens */
266    /**
267     * {@value #ICON_NAME}
268     */
269    public static final String ICON_NAME = "iconName"; // NOI18N
270    /**
271     * {@value #LENGTH}
272     */
273    public static final String LENGTH = "length"; // NOI18N
274
275    /* JSON panel tokens */
276    /**
277     * {@value #CONTROL_PANEL}
278     */
279    public static final String CONTROL_PANEL = "Control Panel"; // NOI18N
280    /**
281     * {@value #LAYOUT_PANEL}
282     */
283    public static final String LAYOUT_PANEL = "Layout"; // NOI18N
284    /**
285     * {@value #SWITCHBOARD_PANEL}
286     */
287    public static final String SWITCHBOARD_PANEL = "Switchboard"; // NOI18N
288    /**
289     * {@value #PANEL_PANEL}
290     */
291    public static final String PANEL_PANEL = "Panel"; // NOI18N
292    /**
293     * {@value #URL}
294     */
295    public static final String URL = "URL"; // NOI18N
296    /**
297     * {@value #FORMAT}
298     */
299    public static final String FORMAT = "format"; // NOI18N
300    /**
301     * {@value #JSON}
302     */
303    public static final String JSON = "json"; // NOI18N
304    /**
305     * {@value #XML}
306     */
307    public static final String XML = "xml"; // NOI18N
308
309    /* JSON programmer tokens */
310    /**
311     * {@value #MODE}
312     */
313    public static final String MODE = "mode"; // NOI18N
314    /**
315     * {@value #NODE_CV}
316     */
317    public static final String NODE_CV = "CV"; // NOI18N
318    /**
319     * {@value #OP}
320     */
321    public static final String OP = "mode"; // NOI18N
322    /**
323     * {@value #READ}
324     */
325    public static final String READ = "read"; // NOI18N
326    /**
327     * {@value #WRITE}
328     */
329    public static final String WRITE = "write"; // NOI18N
330
331    /* JSON roster and car/engine (operations) tokens */
332    /**
333     * {@value #COLOR}
334     */
335    public static final String COLOR = "color"; // NOI18N
336    /**
337     * {@value #LOAD}
338     */
339    public static final String LOAD = "load"; // NOI18N
340    /**
341     * {@value #MODEL}
342     */
343    public static final String MODEL = "model"; // NOI18N
344    /**
345     * {@value #ROAD}
346     */
347    public static final String ROAD = "road"; // NOI18N
348    /**
349     * {@value #NUMBER}
350     */
351    public static final String NUMBER = "number"; // NOI18N
352    /**
353     * {@value #IS_LONG_ADDRESS}
354     */
355    public static final String IS_LONG_ADDRESS = "isLongAddress"; // NOI18N
356    /**
357     * {@value #MFG}
358     */
359    public static final String MFG = "mfg"; // NOI18N
360    /**
361     * {@value #DECODER_MODEL}
362     */
363    public static final String DECODER_MODEL = "decoderModel"; // NOI18N
364    /**
365     * {@value #DECODER_FAMILY}
366     */
367    public static final String DECODER_FAMILY = "decoderFamily"; // NOI18N
368    /**
369     * {@value #MAX_SPD_PCT}
370     */
371    public static final String MAX_SPD_PCT = "maxSpeedPct"; // NOI18N
372    /**
373     * {@value #FUNCTION_KEYS}
374     */
375    public static final String FUNCTION_KEYS = "functionKeys"; // NOI18N
376    /**
377     * {@value #IMAGE}
378     *
379     * @since 2.0
380     */
381    public static final String IMAGE = "image"; // NOI18N
382    /**
383     * {@value #ICON}
384     *
385     * @since 2.0
386     */
387    public static final String ICON = "icon"; // NOI18N
388    /**
389     * {@value #SELECTED_ICON}
390     *
391     * @since 2.0
392     */
393    public static final String SELECTED_ICON = "selectedIcon"; // NOI18N
394    /**
395     * {@value #LABEL}
396     */
397    public static final String LABEL = "label"; // NOI18N
398    /**
399     * {@value #LOCKABLE}
400     */
401    public static final String LOCKABLE = "lockable"; // NOI18N
402    /**
403     * {@value #GROUP}
404     */
405    public static final String GROUP = "group"; // NOI18N
406    /**
407     * {@value #OWNER}
408     *
409     * @since 1.1
410     */
411    public static final String OWNER = "owner"; // NOI18N
412    /**
413     * {@value #SHUNTING_FUNCTION}
414     *
415     * @since 2.0
416     */
417    public static final String SHUNTING_FUNCTION = "shuntingFunction"; // NOI18N
418
419    /* JSON route (operations) tokens */
420    /**
421     * {@value #TRAIN_DIRECTION}
422     */
423    public static final String TRAIN_DIRECTION = "trainDirection"; // NOI18N
424    /**
425     * {@value #SEQUENCE}
426     */
427    public static final String SEQUENCE = "sequenceId"; // NOI18N
428    /**
429     * {@value #ARRIVAL_TIME}
430     *
431     * @since 1.1
432     */
433    public static final String ARRIVAL_TIME = "arrivalTime"; // NOI18N
434    /**
435     * {@value #EXPECTED_ARRIVAL}
436     */
437    public static final String EXPECTED_ARRIVAL = "expectedArrivalTime"; // NOI18N
438    /**
439     * {@value #EXPECTED_DEPARTURE}
440     */
441    public static final String EXPECTED_DEPARTURE = "expectedDepartureTime"; // NOI18N
442    /**
443     * {@value #DEPARTURE_TIME}
444     */
445    public static final String DEPARTURE_TIME = "departureTime"; // NOI18N
446    /**
447     * {@value #DEPARTURE_LOCATION}
448     */
449    public static final String DEPARTURE_LOCATION = "trainDepartsName"; // NOI18N
450    /**
451     * {@value #TERMINATES_LOCATION}
452     */
453    public static final String TERMINATES_LOCATION = "trainTerminatesName"; // NOI18N
454    /**
455     * {@value #DESCRIPTION}
456     */
457    public static final String DESCRIPTION = "description"; // NOI18N
458    /**
459     * {@value #ROUTE_ID}
460     */
461    public static final String ROUTE_ID = "routeId"; // NOI18N
462    /**
463     * {@value #HAZARDOUS}
464     *
465     * @since 1.1
466     */
467    public static final String HAZARDOUS = "hazardous"; // NOI18N
468    /**
469     * {@value #KERNEL}
470     *
471     * @since 1.1
472     */
473    public static final String KERNEL = "kernel"; // NOI18N
474    /**
475     * {@value #FINAL_DESTINATION}
476     *
477     * @since 1.1
478     */
479    public static final String FINAL_DESTINATION = "finalDestination"; // NOI18N
480    /**
481     * {@value #REMOVE_COMMENT}
482     *
483     * @since 1.1
484     */
485    public static final String REMOVE_COMMENT = "removeComment"; // NOI18N
486    /**
487     * {@value #ADD_COMMENT}
488     *
489     * @since 1.1
490     */
491    public static final String ADD_COMMENT = "addComment"; // NOI18N
492    /**
493     * {@value #IS_LOCAL}
494     *
495     * @since 1.1
496     */
497    public static final String IS_LOCAL = "isLocal";
498    /**
499     * {@value #ADD_HELPERS}
500     *
501     * @since 1.1
502     */
503    public static final String ADD_HELPERS = "addHelpers";
504    /**
505     * {@value #CHANGE_CABOOSE}
506     *
507     * @since 1.1
508     */
509    public static final String CHANGE_CABOOSE = "changeCaboose";
510    /**
511     * {@value #CHANGE_ENGINES}
512     *
513     * @since 1.1
514     */
515    public static final String CHANGE_ENGINES = "changeEngines";
516    /**
517     * {@value #REMOVE_HELPERS}
518     *
519     * @since 1.1
520     */
521    public static final String REMOVE_HELPERS = "removeHelpers";
522    /**
523     * {@value #OPTIONS}
524     *
525     * @since 1.1
526     */
527    public static final String OPTIONS = "options";
528    /**
529     * {@value #ADD}
530     * <p>
531     * As an attribute of a {@link jmri.server.json.roster.JsonRoster#ROSTER},
532     * this is an entry that has been added to the roster.
533     *
534     * @since 1.1
535     */
536    public static final String ADD = "add";
537    /**
538     * {@value #REMOVE}
539     * <p>
540     * In operations, this indicates the dropping or setting out of a car or
541     * engine.
542     * <p>
543     * As an attribute of a {@link jmri.server.json.roster.JsonRoster#ROSTER},
544     * this is an entry that has been removed from the roster.
545     *
546     * @since 1.1
547     */
548    public static final String REMOVE = "remove";
549    /**
550     * {@value #ADD_AND_REMOVE}
551     *
552     * @since 1.1
553     */
554    public static final String ADD_AND_REMOVE = "addAndRemove";
555    /**
556     * {@value #TOTAL}
557     *
558     * @since 1.1
559     */
560    public static final String TOTAL = "total";
561    /**
562     * {@value #LOADS}
563     *
564     * @since 1.1
565     */
566    public static final String LOADS = "loads";
567    /**
568     * {@value #EMPTIES}
569     *
570     * @since 1.1
571     */
572    public static final String EMPTIES = "empties";
573    /**
574     * {@value #RETURN_WHEN_EMPTY}
575     *
576     * @since 1.1
577     */
578    public static final String RETURN_WHEN_EMPTY = "returnWhenEmpty";
579    /**
580     * {@value #RETURN_WHEN_LOADED}
581     *
582     * @since 5.4.0
583     */
584    public static final String RETURN_WHEN_LOADED = "returnWhenLoaded";
585    /**
586     * {@value #DIVISION}
587     *
588     * @since 5.4.0
589     */
590    public static final String DIVISION = "division";
591    /**
592     * {@value #UTILITY}
593     *
594     * @since 1.1
595     */
596    public static final String UTILITY = "utility";
597
598    /* JSON signalling tokens */
599    /**
600     * {@value #APPEARANCE}
601     */
602    public static final String APPEARANCE = "appearance"; // NOI18N
603    /**
604     * {@value #APPEARANCE_NAME}
605     */
606    public static final String APPEARANCE_NAME = "appearanceName"; // NOI18N
607    /**
608     * {@value #ASPECT}
609     */
610    public static final String ASPECT = "aspect"; // NOI18N
611    /**
612     * {@value #ASPECT_DARK}
613     */
614    public static final String ASPECT_DARK = "Dark"; // NOI18N
615    /**
616     * {@value #ASPECT_HELD}
617     */
618    public static final String ASPECT_HELD = "Held"; // NOI18N
619    /**
620     * {@value #ASPECT_UNKNOWN}
621     */
622    public static final String ASPECT_UNKNOWN = "Unknown"; // NOI18N
623    /**
624     * {@value #TOKEN_HELD}
625     */
626    public static final String TOKEN_HELD = "held"; // NOI18N
627    /**
628     * {@value #LIT}
629     */
630    public static final String LIT = "lit"; // NOI18N
631
632    /* Shared JSON consist, roster, and throttle tokens */
633    /**
634     * {@value #ADDRESS}
635     */
636    public static final String ADDRESS = "address"; // NOI18N
637    /**
638     * {@value #FORWARD}
639     */
640    public static final String FORWARD = "forward"; // NOI18N
641    /**
642     * Prefix for the throttle function keys (F0-F28).
643     * <p>
644     * {@value #F}
645     */
646    public static final String F = "F"; // NOI18N
647
648    /* JSON Sensor and Turnout Tokens */
649    /**
650     * {@value #INVERTED}
651     */
652    public static final String INVERTED = "inverted"; // NOI18N
653
654    /* JSON value types */
655    /**
656     * {@value #INTEGER}
657     */
658    public static final String INTEGER = "int"; // NOI18N
659
660    /* JSON network services tokens */
661    /**
662     * {@value #PORT}
663     */
664    public static final String PORT = "port"; // NOI18N
665
666    /* JSON consist tokens */
667    /**
668     * {@value #POSITION}
669     */
670    public static final String POSITION = "position"; // NOI18N
671    /**
672     * {@value #SIZE_LIMIT}
673     */
674    public static final String SIZE_LIMIT = "sizeLimit"; // NOI18N
675
676    /* Time constants */
677    /**
678     * {@value #RATE}
679     */
680    public static final String RATE = "rate"; // NOI18N
681
682    /*
683     * JSON State (an unsigned integer)
684     */
685
686    /* Audio commands */
687    /**
688     * {@value #AUDIO_ICON_IDENTITY}
689     */
690    public static final String AUDIO_ICON_IDENTITY = "identity";
691    /**
692     * {@value #AUDIO_COMMAND}
693     */
694    public static final String AUDIO_COMMAND = "command";
695    /**
696     * {@value #AUDIO_COMMAND_NONE}
697     */
698    public static final String AUDIO_COMMAND_NONE = "None";
699    /**
700     * {@value #AUDIO_COMMAND_PLAY}
701     */
702    public static final String AUDIO_COMMAND_PLAY = "Play";
703    /**
704     * {@value #AUDIO_COMMAND_PLAY_NUM_LOOPS}
705     */
706    public static final String AUDIO_COMMAND_PLAY_NUM_LOOPS = "playNumLoops";
707    /**
708     * {@value #AUDIO_COMMAND_STOP}
709     */
710    public static final String AUDIO_COMMAND_STOP = "Stop";
711
712    /* Common state */
713    /**
714     * {@value #UNKNOWN}
715     * <p>
716     * Note that this value deliberately differs from
717     * {@link jmri.NamedBean#UNKNOWN} so that JSON clients can treat all known
718     * states as true, and the unknown state as false.
719     */
720    public static final int UNKNOWN = 0x00;
721
722    /* Light and PowerManager state */
723    /**
724     * {@value #ON}
725     */
726    public static final int ON = 0x02;
727    /**
728     * {@value #OFF}
729     */
730    public static final int OFF = 0x04;
731
732    /* NamedBean state */
733    /**
734     * {@value #INCONSISTENT}
735     */
736    public static final int INCONSISTENT = 0x08;
737
738    /* Audio state */
739    /**
740     * {@value #AUDIO_PLAYING}
741     */
742    public static final int AUDIO_PLAYING = Audio.STATE_PLAYING;
743    /**
744     * {@value #AUDIO_STOPPED}
745     */
746    public static final int AUDIO_STOPPED = Audio.STATE_STOPPED;
747
748    /* Route state */
749    /**
750     * {@value #TOGGLE}
751     */
752    public static final int TOGGLE = 0x08;
753
754    /* Sensor state */
755    /**
756     * {@value #ACTIVE}
757     */
758    public static final int ACTIVE = 0x02;
759    /**
760     * {@value #INACTIVE}
761     */
762    public static final int INACTIVE = 0x04;
763
764    /* SignalHead state */
765    /**
766     * {@value #STATE_DARK}
767     */
768    public static final int STATE_DARK = 0x00;
769    /**
770     * {@value #RED}
771     */
772    public static final int RED = 0x01;
773    /**
774     * {@value #FLASHRED}
775     */
776    public static final int FLASHRED = 0x02;
777    /**
778     * {@value #YELLOW}
779     */
780    public static final int YELLOW = 0x04;
781    /**
782     * {@value #FLASHYELLOW}
783     */
784    public static final int FLASHYELLOW = 0x08;
785    /**
786     * {@value #GREEN}
787     */
788    public static final int GREEN = 0x10;
789    /**
790     * {@value #FLASHGREEN}
791     */
792    public static final int FLASHGREEN = 0x20;
793    /**
794     * {@value #LUNAR}
795     */
796    public static final int LUNAR = 0x40;
797    /**
798     * {@value #FLASHLUNAR}
799     */
800    public static final int FLASHLUNAR = 0x80;
801    /**
802     * {@value #STATE_HELD}
803     */
804    public static final int STATE_HELD = 0x100;
805
806    /* Turnout state */
807    /**
808     * {@value #CLOSED}
809     */
810    public static final int CLOSED = 0x02;
811    /**
812     * {@value #THROWN}
813     */
814    public static final int THROWN = 0x04;
815
816    /* OBlock status */
817    /**
818     * {@value #ALLOCATED}
819     */
820    public static final int ALLOCATED = 0x10;
821    /**
822     * {@value #RUNNING}
823     */
824    public static final int RUNNING = 0x20;
825    /**
826     * {@value #OUT_OF_SERVICE}
827     */
828    public static final int OUT_OF_SERVICE = 0x30;
829    /**
830     * {@value #TRACK_ERROR}
831     */
832    public static final int TRACK_ERROR = 0x40;
833
834    /**
835     * {@value #UNIT}
836     *
837     * @since 1.1
838     */
839    public static final String UNIT = "unit"; // NOI18N
840
841    /* JMRI JSON Client Autoconfiguration support */
842    /**
843     * {@value #PREFIX}
844     *
845     * @since 2.0
846     */
847    public static final String PREFIX = "prefix"; // NOI18N
848    /**
849     * {@value #SYSTEM_CONNECTION}
850     *
851     * @since 2.0
852     */
853    public static final String SYSTEM_CONNECTION = "systemConnection"; // NOI18N
854    /**
855     * {@value #SYSTEM_CONNECTIONS}
856     *
857     * @since 2.0
858     */
859    public static final String SYSTEM_CONNECTIONS = "systemConnections"; // NOI18N
860
861    /* JSON Schema */
862    /**
863     * {@value #SCHEMA}
864     *
865     * @since 4.1
866     */
867    public static final String SCHEMA = "schema"; // NOI18N
868    /**
869     * {@value #SERVER}
870     *
871     * @since 4.1
872     */
873    public static final String SERVER = "server"; // NOI18N
874    /**
875     * {@value #CLIENT}
876     *
877     * @since 4.1
878     */
879    public static final String CLIENT = "client"; // NOI18N
880    /**
881     * {@value #FORCE_DELETE}
882     *
883     * @since 5.0.0
884     */
885    public static final String FORCE_DELETE = "forceDelete"; // NOI18N
886    /**
887     * {@value #CONFLICT}
888     *
889     * @since 5.0.0
890     */
891    public static final String CONFLICT = "conflict"; // NOI18N
892    /**
893     * {@value #RENAME}
894     * <p>
895     * In a message from a client, carries the new name for the object in the
896     * message; note that some services may bar changing the name of an object,
897     * while other services will change the name based on other values. In a
898     * message from the server, carries the old name for a recently renamed
899     * object in the message.
900     *
901     * @since 5.0.0
902     */
903    public static final String RENAME = "rename"; // NOI18N
904    /**
905     * {@value #RFID}
906     *
907     * @since 5.0.0
908     */
909    public static final String RFID = "rfid"; // NOI18N
910    /**
911     * {@value #TIME}
912     *
913     * @since 5.0.0
914     */
915    public static final String TIME = "time"; // NOI18N
916
917    /* ZeroConf support */
918    /**
919     * {@value #ZEROCONF_SERVICE_TYPE} Not used within the protocol, but used to
920     * support discovery of servers supporting the protocol.
921     */
922    public static final String ZEROCONF_SERVICE_TYPE = "_jmri-json._tcp.local."; // NOI18N
923
924    /* prevent the constructor from being documented */
925    private JSON() {
926        throw new UnsupportedOperationException("There is no valid instance of this class");
927    }
928}