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     * {@value #WEIGHT}
274     */
275    public static final String WEIGHT = "weight"; // NOI18N
276
277    /* JSON panel tokens */
278    /**
279     * {@value #CONTROL_PANEL}
280     */
281    public static final String CONTROL_PANEL = "Control Panel"; // NOI18N
282    /**
283     * {@value #LAYOUT_PANEL}
284     */
285    public static final String LAYOUT_PANEL = "Layout"; // NOI18N
286    /**
287     * {@value #SWITCHBOARD_PANEL}
288     */
289    public static final String SWITCHBOARD_PANEL = "Switchboard"; // NOI18N
290    /**
291     * {@value #PANEL_PANEL}
292     */
293    public static final String PANEL_PANEL = "Panel"; // NOI18N
294    /**
295     * {@value #URL}
296     */
297    public static final String URL = "URL"; // NOI18N
298    /**
299     * {@value #FORMAT}
300     */
301    public static final String FORMAT = "format"; // NOI18N
302    /**
303     * {@value #JSON}
304     */
305    public static final String JSON = "json"; // NOI18N
306    /**
307     * {@value #XML}
308     */
309    public static final String XML = "xml"; // NOI18N
310
311    /* JSON programmer tokens */
312    /**
313     * {@value #MODE}
314     */
315    public static final String MODE = "mode"; // NOI18N
316    /**
317     * {@value #NODE_CV}
318     */
319    public static final String NODE_CV = "CV"; // NOI18N
320    /**
321     * {@value #OP}
322     */
323    public static final String OP = "mode"; // NOI18N
324    /**
325     * {@value #READ}
326     */
327    public static final String READ = "read"; // NOI18N
328    /**
329     * {@value #WRITE}
330     */
331    public static final String WRITE = "write"; // NOI18N
332    /**
333     * {@value #MODEL}
334     */
335    public static final String MODEL = "model"; // NOI18N
336    /**
337     * {@value #ROAD}
338     */
339    public static final String ROAD = "road"; // NOI18N
340    /**
341     * {@value #NUMBER}
342     */
343    public static final String NUMBER = "number"; // NOI18N
344    /**
345     * {@value #IS_LONG_ADDRESS}
346     */
347    public static final String IS_LONG_ADDRESS = "isLongAddress"; // NOI18N
348    /**
349     * {@value #MFG}
350     */
351    public static final String MFG = "mfg"; // NOI18N
352    /**
353     * {@value #DECODER_MODEL}
354     */
355    public static final String DECODER_MODEL = "decoderModel"; // NOI18N
356    /**
357     * {@value #DECODER_FAMILY}
358     */
359    public static final String DECODER_FAMILY = "decoderFamily"; // NOI18N
360    /**
361     * {@value #MAX_SPD_PCT}
362     */
363    public static final String MAX_SPD_PCT = "maxSpeedPct"; // NOI18N
364    /**
365     * {@value #FUNCTION_KEYS}
366     */
367    public static final String FUNCTION_KEYS = "functionKeys"; // NOI18N
368    /**
369     * {@value #IMAGE}
370     *
371     * @since 2.0
372     */
373    public static final String IMAGE = "image"; // NOI18N
374    /**
375     * {@value #ICON}
376     *
377     * @since 2.0
378     */
379    public static final String ICON = "icon"; // NOI18N
380    /**
381     * {@value #SELECTED_ICON}
382     *
383     * @since 2.0
384     */
385    public static final String SELECTED_ICON = "selectedIcon"; // NOI18N
386    /**
387     * {@value #LABEL}
388     */
389    public static final String LABEL = "label"; // NOI18N
390    /**
391     * {@value #LOCKABLE}
392     */
393    public static final String LOCKABLE = "lockable"; // NOI18N
394    /**
395     * {@value #GROUP}
396     */
397    public static final String GROUP = "group"; // NOI18N
398    /**
399     * {@value #OWNER}
400     *
401     * @since 1.1
402     */
403    public static final String OWNER = "owner"; // NOI18N
404    /**
405     * {@value #SHUNTING_FUNCTION}
406     *
407     * @since 2.0
408     */
409    public static final String SHUNTING_FUNCTION = "shuntingFunction"; // NOI18N
410
411    /* JSON route (operations) tokens */
412    /**
413     * {@value #TRAIN_DIRECTION}
414     */
415    public static final String TRAIN_DIRECTION = "trainDirection"; // NOI18N
416    /**
417     * {@value #SEQUENCE}
418     */
419    public static final String SEQUENCE = "sequenceId"; // NOI18N
420    /**
421     * {@value #ARRIVAL_TIME}
422     *
423     * @since 1.1
424     */
425    public static final String ARRIVAL_TIME = "arrivalTime"; // NOI18N
426    /**
427     * {@value #EXPECTED_ARRIVAL}
428     */
429    public static final String EXPECTED_ARRIVAL = "expectedArrivalTime"; // NOI18N
430    /**
431     * {@value #EXPECTED_DEPARTURE}
432     */
433    public static final String EXPECTED_DEPARTURE = "expectedDepartureTime"; // NOI18N
434    /**
435     * {@value #DEPARTURE_TIME}
436     */
437    public static final String DEPARTURE_TIME = "departureTime"; // NOI18N
438    /**
439     * {@value #DEPARTURE_LOCATION}
440     */
441    public static final String DEPARTURE_LOCATION = "trainDepartsName"; // NOI18N
442    /**
443     * {@value #TERMINATES_LOCATION}
444     */
445    public static final String TERMINATES_LOCATION = "trainTerminatesName"; // NOI18N
446    /**
447     * {@value #DESCRIPTION}
448     */
449    public static final String DESCRIPTION = "description"; // NOI18N
450    /**
451     * {@value #ROUTE_ID}
452     */
453    public static final String ROUTE_ID = "routeId"; // NOI18N
454    /**
455     * {@value #KERNEL}
456     *
457     * @since 1.1
458     */
459    public static final String KERNEL = "kernel"; // NOI18N
460    /**
461     * {@value #LOCATIONS}
462     */
463    public static final String LOCATIONS = "locations"; // NOI18N
464    /**
465     * {@value #LOCATION}
466     */
467    public static final String LOCATION = "location"; // NOI18N
468    /**
469     * {@value #TRACK}
470     *
471     * @since 1.1
472     */
473    public static final String TRACK = "track";
474    /**
475     * {@value #DESTINATION}
476     */
477    public static final String DESTINATION = "destination"; // NOI18N
478    /**
479     * {@value #ADD_HELPERS}
480     *
481     * @since 1.1
482     */
483    public static final String ADD_HELPERS = "addHelpers";
484    /**
485     * {@value #CHANGE_CABOOSE}
486     *
487     * @since 1.1
488     */
489    public static final String CHANGE_CABOOSE = "changeCaboose";
490    /**
491     * {@value #CHANGE_ENGINES}
492     *
493     * @since 1.1
494     */
495    public static final String CHANGE_ENGINES = "changeEngines";
496    /**
497     * {@value #REMOVE_HELPERS}
498     *
499     * @since 1.1
500     */
501    public static final String REMOVE_HELPERS = "removeHelpers";
502    /**
503     * {@value #OPTIONS}
504     *
505     * @since 1.1
506     */
507    public static final String OPTIONS = "options";
508    /**
509     * {@value #ADD}
510     * <p>
511     * As an attribute of a {@link jmri.server.json.roster.JsonRoster#ROSTER},
512     * this is an entry that has been added to the roster.
513     *
514     * @since 1.1
515     */
516    public static final String ADD = "add";
517    /**
518     * {@value #REMOVE}
519     * <p>
520     * In operations, this indicates the dropping or setting out of a car or
521     * engine.
522     * <p>
523     * As an attribute of a {@link jmri.server.json.roster.JsonRoster#ROSTER},
524     * this is an entry that has been removed from the roster.
525     *
526     * @since 1.1
527     */
528    public static final String REMOVE = "remove";
529    /**
530     * {@value #ADD_AND_REMOVE}
531     *
532     * @since 1.1
533     */
534    public static final String ADD_AND_REMOVE = "addAndRemove";
535    /**
536     * {@value #TOTAL}
537     *
538     * @since 1.1
539     */
540    public static final String TOTAL = "total";
541    /**
542     * {@value #LOADS}
543     *
544     * @since 1.1
545     */
546    public static final String LOADS = "loads";
547    /**
548     * {@value #EMPTIES}
549     *
550     * @since 1.1
551     */
552    public static final String EMPTIES = "empties";
553
554    /* JSON signalling tokens */
555    /**
556     * {@value #APPEARANCE}
557     */
558    public static final String APPEARANCE = "appearance"; // NOI18N
559    /**
560     * {@value #APPEARANCE_NAME}
561     */
562    public static final String APPEARANCE_NAME = "appearanceName"; // NOI18N
563    /**
564     * {@value #ASPECT}
565     */
566    public static final String ASPECT = "aspect"; // NOI18N
567    /**
568     * {@value #ASPECT_DARK}
569     */
570    public static final String ASPECT_DARK = "Dark"; // NOI18N
571    /**
572     * {@value #ASPECT_HELD}
573     */
574    public static final String ASPECT_HELD = "Held"; // NOI18N
575    /**
576     * {@value #ASPECT_UNKNOWN}
577     */
578    public static final String ASPECT_UNKNOWN = "Unknown"; // NOI18N
579    /**
580     * {@value #TOKEN_HELD}
581     */
582    public static final String TOKEN_HELD = "held"; // NOI18N
583    /**
584     * {@value #LIT}
585     */
586    public static final String LIT = "lit"; // NOI18N
587
588    /* Shared JSON consist, roster, and throttle tokens */
589    /**
590     * {@value #ADDRESS}
591     */
592    public static final String ADDRESS = "address"; // NOI18N
593    /**
594     * {@value #FORWARD}
595     */
596    public static final String FORWARD = "forward"; // NOI18N
597    /**
598     * Prefix for the throttle function keys (F0-F28).
599     * <p>
600     * {@value #F}
601     */
602    public static final String F = "F"; // NOI18N
603
604    /* JSON Sensor and Turnout Tokens */
605    /**
606     * {@value #INVERTED}
607     */
608    public static final String INVERTED = "inverted"; // NOI18N
609
610    /* JSON value types */
611    /**
612     * {@value #INTEGER}
613     */
614    public static final String INTEGER = "int"; // NOI18N
615
616    /* JSON network services tokens */
617    /**
618     * {@value #PORT}
619     */
620    public static final String PORT = "port"; // NOI18N
621
622    /* JSON consist tokens */
623    /**
624     * {@value #POSITION}
625     */
626    public static final String POSITION = "position"; // NOI18N
627    /**
628     * {@value #SIZE_LIMIT}
629     */
630    public static final String SIZE_LIMIT = "sizeLimit"; // NOI18N
631
632    /* Time constants */
633    /**
634     * {@value #RATE}
635     */
636    public static final String RATE = "rate"; // NOI18N
637
638    /*
639     * JSON State (an unsigned integer)
640     */
641
642    /* Audio commands */
643    /**
644     * {@value #AUDIO_ICON_IDENTITY}
645     */
646    public static final String AUDIO_ICON_IDENTITY = "identity";
647    /**
648     * {@value #AUDIO_COMMAND}
649     */
650    public static final String AUDIO_COMMAND = "command";
651    /**
652     * {@value #AUDIO_COMMAND_NONE}
653     */
654    public static final String AUDIO_COMMAND_NONE = "None";
655    /**
656     * {@value #AUDIO_COMMAND_PLAY}
657     */
658    public static final String AUDIO_COMMAND_PLAY = "Play";
659    /**
660     * {@value #AUDIO_COMMAND_PLAY_NUM_LOOPS}
661     */
662    public static final String AUDIO_COMMAND_PLAY_NUM_LOOPS = "playNumLoops";
663    /**
664     * {@value #AUDIO_COMMAND_STOP}
665     */
666    public static final String AUDIO_COMMAND_STOP = "Stop";
667
668    /* Common state */
669    /**
670     * {@value #UNKNOWN}
671     * <p>
672     * Note that this value deliberately differs from
673     * {@link jmri.NamedBean#UNKNOWN} so that JSON clients can treat all known
674     * states as true, and the unknown state as false.
675     */
676    public static final int UNKNOWN = 0x00;
677
678    /* Light and PowerManager state */
679    /**
680     * {@value #ON}
681     */
682    public static final int ON = 0x02;
683    /**
684     * {@value #OFF}
685     */
686    public static final int OFF = 0x04;
687
688    /* NamedBean state */
689    /**
690     * {@value #INCONSISTENT}
691     */
692    public static final int INCONSISTENT = 0x08;
693
694    /* Audio state */
695    /**
696     * {@value #AUDIO_PLAYING}
697     */
698    public static final int AUDIO_PLAYING = Audio.STATE_PLAYING;
699    /**
700     * {@value #AUDIO_STOPPED}
701     */
702    public static final int AUDIO_STOPPED = Audio.STATE_STOPPED;
703
704    /* Route state */
705    /**
706     * {@value #TOGGLE}
707     */
708    public static final int TOGGLE = 0x08;
709
710    /* Sensor state */
711    /**
712     * {@value #ACTIVE}
713     */
714    public static final int ACTIVE = 0x02;
715    /**
716     * {@value #INACTIVE}
717     */
718    public static final int INACTIVE = 0x04;
719
720    /* SignalHead state */
721    /**
722     * {@value #STATE_DARK}
723     */
724    public static final int STATE_DARK = 0x00;
725    /**
726     * {@value #RED}
727     */
728    public static final int RED = 0x01;
729    /**
730     * {@value #FLASHRED}
731     */
732    public static final int FLASHRED = 0x02;
733    /**
734     * {@value #YELLOW}
735     */
736    public static final int YELLOW = 0x04;
737    /**
738     * {@value #FLASHYELLOW}
739     */
740    public static final int FLASHYELLOW = 0x08;
741    /**
742     * {@value #GREEN}
743     */
744    public static final int GREEN = 0x10;
745    /**
746     * {@value #FLASHGREEN}
747     */
748    public static final int FLASHGREEN = 0x20;
749    /**
750     * {@value #LUNAR}
751     */
752    public static final int LUNAR = 0x40;
753    /**
754     * {@value #FLASHLUNAR}
755     */
756    public static final int FLASHLUNAR = 0x80;
757    /**
758     * {@value #STATE_HELD}
759     */
760    public static final int STATE_HELD = 0x100;
761
762    /* Turnout state */
763    /**
764     * {@value #CLOSED}
765     */
766    public static final int CLOSED = 0x02;
767    /**
768     * {@value #THROWN}
769     */
770    public static final int THROWN = 0x04;
771
772    /* OBlock status */
773    /**
774     * {@value #ALLOCATED}
775     */
776    public static final int ALLOCATED = 0x10;
777    /**
778     * {@value #RUNNING}
779     */
780    public static final int RUNNING = 0x20;
781    /**
782     * {@value #OUT_OF_SERVICE}
783     */
784    public static final int OUT_OF_SERVICE = 0x30;
785    /**
786     * {@value #TRACK_ERROR}
787     */
788    public static final int TRACK_ERROR = 0x40;
789
790    /**
791     * {@value #UNIT}
792     *
793     * @since 1.1
794     */
795    public static final String UNIT = "unit"; // NOI18N
796
797    /* JMRI JSON Client Autoconfiguration support */
798    /**
799     * {@value #PREFIX}
800     *
801     * @since 2.0
802     */
803    public static final String PREFIX = "prefix"; // NOI18N
804    /**
805     * {@value #SYSTEM_CONNECTION}
806     *
807     * @since 2.0
808     */
809    public static final String SYSTEM_CONNECTION = "systemConnection"; // NOI18N
810    /**
811     * {@value #SYSTEM_CONNECTIONS}
812     *
813     * @since 2.0
814     */
815    public static final String SYSTEM_CONNECTIONS = "systemConnections"; // NOI18N
816
817    /* JSON Schema */
818    /**
819     * {@value #SCHEMA}
820     *
821     * @since 4.1
822     */
823    public static final String SCHEMA = "schema"; // NOI18N
824    /**
825     * {@value #SERVER}
826     *
827     * @since 4.1
828     */
829    public static final String SERVER = "server"; // NOI18N
830    /**
831     * {@value #CLIENT}
832     *
833     * @since 4.1
834     */
835    public static final String CLIENT = "client"; // NOI18N
836    /**
837     * {@value #FORCE_DELETE}
838     *
839     * @since 5.0.0
840     */
841    public static final String FORCE_DELETE = "forceDelete"; // NOI18N
842    /**
843     * {@value #CONFLICT}
844     *
845     * @since 5.0.0
846     */
847    public static final String CONFLICT = "conflict"; // NOI18N
848    /**
849     * {@value #RENAME}
850     * <p>
851     * In a message from a client, carries the new name for the object in the
852     * message; note that some services may bar changing the name of an object,
853     * while other services will change the name based on other values. In a
854     * message from the server, carries the old name for a recently renamed
855     * object in the message.
856     *
857     * @since 5.0.0
858     */
859    public static final String RENAME = "rename"; // NOI18N
860    /**
861     * {@value #RFID}
862     *
863     * @since 5.0.0
864     */
865    public static final String RFID = "rfid"; // NOI18N
866    /**
867     * {@value #WHERELASTSEEN}
868     *
869     * @since 5.7.6
870     */
871    public static final String WHERELASTSEEN = "whereLastSeen"; // NOI18N
872    /**
873     * {@value #WHENLASTSEEN}
874     *
875     * @since 5.7.6
876     */
877    public static final String WHENLASTSEEN = "whenLastSeen"; // NOI18N
878    /**
879     * {@value #TIME}
880     *
881     * @since 5.0.0
882     */
883    public static final String TIME = "time"; // NOI18N
884
885    /* ZeroConf support */
886    /**
887     * {@value #ZEROCONF_SERVICE_TYPE} Not used within the protocol, but used to
888     * support discovery of servers supporting the protocol.
889     */
890    public static final String ZEROCONF_SERVICE_TYPE = "_jmri-json._tcp.local."; // NOI18N
891
892    /* prevent the constructor from being documented */
893    private JSON() {
894        throw new UnsupportedOperationException("There is no valid instance of this class");
895    }
896}