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