001package jmri.server.json;
002
003import java.util.Arrays;
004import java.util.Collections;
005import java.util.List;
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     * <p>
171     * 
172     * @since 1.1
173     */
174    public static final String NODE = "node"; // NOI18N
175    /**
176     * {@value #ACTIVE_PROFILE}
177     * <p>
178     * 
179     * @since 3.0
180     */
181    public static final String ACTIVE_PROFILE = "activeProfile"; // NOI18N
182    /**
183     * {@value #FORMER_NODES}
184     * <p>
185     * 
186     * @since 1.1
187     */
188    public static final String FORMER_NODES = "formerNodes"; // NOI18N
189    /**
190     * {@value #LOCALE}
191     * <p>
192     * 
193     * @since 1.1
194     */
195    public static final String LOCALE = "locale"; // NOI18N
196
197    /* JSON list types */
198    /**
199     * {@value #ENGINES}
200     */
201    public static final String ENGINES = "engines"; // NOI18N
202    /**
203     * {@value #METADATA}
204     */
205    public static final String METADATA = "metadata"; // NOI18N
206    /**
207     * {@value #PANELS}
208     */
209    public static final String PANELS = "panels"; // NOI18N
210    /**
211     * {@value #ROUTES}
212     */
213    public static final String ROUTES = "routes"; // NOI18N
214    /**
215     * {@value #NETWORK_SERVICES}
216     */
217    public static final String NETWORK_SERVICES = "networkServices"; // NOI18N
218    /**
219     * {@value #CONFIG_PROFILES}
220     */
221    public static final String CONFIG_PROFILES = "configProfiles"; // NOI18N
222    /**
223     * {@value #CONFIG_PROFILE}
224     */
225    public static final String CONFIG_PROFILE = "configProfile"; // NOI18N
226    /**
227     * {@value #UNIQUE_ID}
228     */
229    public static final String UNIQUE_ID = "uniqueId"; // NOI18N
230    /**
231     * {@value #IS_ACTIVE_PROFILE}
232     */
233    public static final String IS_ACTIVE_PROFILE = "isActiveProfile"; // NOI18N
234    /**
235     * {@value #IS_AUTO_START}
236     */
237    public static final String IS_AUTO_START = "isAutoStart"; // NOI18N
238    /**
239     * {@value #IS_NEXT_PROFILE}
240     */
241    public static final String IS_NEXT_PROFILE = "isNextProfile"; // NOI18N
242
243    /* JSON data types */
244    /**
245     * {@value #NETWORK_SERVICE}
246     *
247     * @since 2.0
248     */
249    public static final String NETWORK_SERVICE = "networkService"; // NOI18N
250    /**
251     * {@value #PANEL}
252     */
253    public static final String PANEL = "panel"; // NOI18N
254    /**
255     * {@value #PROGRAMMER}
256     */
257    public static final String PROGRAMMER = "programmer"; // NOI18N
258    /**
259     * {@value #ROUTE}
260     */
261    public static final String ROUTE = "route"; // NOI18N
262    /**
263     * {@value #THROTTLE}
264     */
265    public static final String THROTTLE = "throttle"; // NOI18N
266
267    /* JSON operations tokens */
268    /**
269     * {@value #ICON_NAME}
270     */
271    public static final String ICON_NAME = "iconName"; // NOI18N
272    /**
273     * {@value #LENGTH}
274     */
275    public static final String LENGTH = "length"; // 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    /* JSON roster and car/engine (operations) tokens */
334    /**
335     * {@value #COLOR}
336     */
337    public static final String COLOR = "color"; // NOI18N
338    /**
339     * {@value #LOAD}
340     */
341    public static final String LOAD = "load"; // NOI18N
342    /**
343     * {@value #MODEL}
344     */
345    public static final String MODEL = "model"; // NOI18N
346    /**
347     * {@value #ROAD}
348     */
349    public static final String ROAD = "road"; // NOI18N
350    /**
351     * {@value #NUMBER}
352     */
353    public static final String NUMBER = "number"; // NOI18N
354    /**
355     * {@value #IS_LONG_ADDRESS}
356     */
357    public static final String IS_LONG_ADDRESS = "isLongAddress"; // NOI18N
358    /**
359     * {@value #MFG}
360     */
361    public static final String MFG = "mfg"; // NOI18N
362    /**
363     * {@value #DECODER_MODEL}
364     */
365    public static final String DECODER_MODEL = "decoderModel"; // NOI18N
366    /**
367     * {@value #DECODER_FAMILY}
368     */
369    public static final String DECODER_FAMILY = "decoderFamily"; // NOI18N
370    /**
371     * {@value #MAX_SPD_PCT}
372     */
373    public static final String MAX_SPD_PCT = "maxSpeedPct"; // NOI18N
374    /**
375     * {@value #FUNCTION_KEYS}
376     */
377    public static final String FUNCTION_KEYS = "functionKeys"; // NOI18N
378    /**
379     * {@value #IMAGE}
380     *
381     * @since 2.0
382     */
383    public static final String IMAGE = "image"; // NOI18N
384    /**
385     * {@value #ICON}
386     *
387     * @since 2.0
388     */
389    public static final String ICON = "icon"; // NOI18N
390    /**
391     * {@value #SELECTED_ICON}
392     *
393     * @since 2.0
394     */
395    public static final String SELECTED_ICON = "selectedIcon"; // NOI18N
396    /**
397     * {@value #LABEL}
398     */
399    public static final String LABEL = "label"; // NOI18N
400    /**
401     * {@value #LOCKABLE}
402     */
403    public static final String LOCKABLE = "lockable"; // NOI18N
404    /**
405     * {@value #GROUP}
406     */
407    public static final String GROUP = "group"; // NOI18N
408    /**
409     * {@value #OWNER}
410     *
411     * @since 1.1
412     */
413    public static final String OWNER = "owner"; // NOI18N
414    /**
415     * {@value #SHUNTING_FUNCTION}
416     *
417     * @since 2.0
418     */
419    public static final String SHUNTING_FUNCTION = "shuntingFunction"; // NOI18N
420
421    /* JSON route (operations) tokens */
422    /**
423     * {@value #TRAIN_DIRECTION}
424     */
425    public static final String TRAIN_DIRECTION = "trainDirection"; // NOI18N
426    /**
427     * {@value #SEQUENCE}
428     */
429    public static final String SEQUENCE = "sequenceId"; // NOI18N
430    /**
431     * {@value #ARRIVAL_TIME}
432     *
433     * @since 1.1
434     */
435    public static final String ARRIVAL_TIME = "arrivalTime"; // NOI18N
436    /**
437     * {@value #EXPECTED_ARRIVAL}
438     */
439    public static final String EXPECTED_ARRIVAL = "expectedArrivalTime"; // NOI18N
440    /**
441     * {@value #EXPECTED_DEPARTURE}
442     */
443    public static final String EXPECTED_DEPARTURE = "expectedDepartureTime"; // NOI18N
444    /**
445     * {@value #DEPARTURE_TIME}
446     */
447    public static final String DEPARTURE_TIME = "departureTime"; // NOI18N
448    /**
449     * {@value #DEPARTURE_LOCATION}
450     */
451    public static final String DEPARTURE_LOCATION = "trainDepartsName"; // NOI18N
452    /**
453     * {@value #TERMINATES_LOCATION}
454     */
455    public static final String TERMINATES_LOCATION = "trainTerminatesName"; // NOI18N
456    /**
457     * {@value #DESCRIPTION}
458     */
459    public static final String DESCRIPTION = "description"; // NOI18N
460    /**
461     * {@value #ROUTE_ID}
462     */
463    public static final String ROUTE_ID = "routeId"; // NOI18N
464    /**
465     * {@value #HAZARDOUS}
466     *
467     * @since 1.1
468     */
469    public static final String HAZARDOUS = "hazardous"; // NOI18N
470    /**
471     * {@value #KERNEL}
472     *
473     * @since 1.1
474     */
475    public static final String KERNEL = "kernel"; // NOI18N
476    /**
477     * {@value #FINAL_DESTINATION}
478     *
479     * @since 1.1
480     */
481    public static final String FINAL_DESTINATION = "finalDestination"; // NOI18N
482    /**
483     * {@value #REMOVE_COMMENT}
484     *
485     * @since 1.1
486     */
487    public static final String REMOVE_COMMENT = "removeComment"; // NOI18N
488    /**
489     * {@value #ADD_COMMENT}
490     *
491     * @since 1.1
492     */
493    public static final String ADD_COMMENT = "addComment"; // NOI18N
494    /**
495     * {@value #IS_LOCAL}
496     *
497     * @since 1.1
498     */
499    public static final String IS_LOCAL = "isLocal";
500    /**
501     * {@value #ADD_HELPERS}
502     *
503     * @since 1.1
504     */
505    public static final String ADD_HELPERS = "addHelpers";
506    /**
507     * {@value #CHANGE_CABOOSE}
508     *
509     * @since 1.1
510     */
511    public static final String CHANGE_CABOOSE = "changeCaboose";
512    /**
513     * {@value #CHANGE_ENGINES}
514     *
515     * @since 1.1
516     */
517    public static final String CHANGE_ENGINES = "changeEngines";
518    /**
519     * {@value #REMOVE_HELPERS}
520     *
521     * @since 1.1
522     */
523    public static final String REMOVE_HELPERS = "removeHelpers";
524    /**
525     * {@value #OPTIONS}
526     *
527     * @since 1.1
528     */
529    public static final String OPTIONS = "options";
530    /**
531     * {@value #ADD}
532     * <p>
533     * As an attribute of a {@link jmri.server.json.roster.JsonRoster#ROSTER},
534     * this is an entry that has been added to the roster.
535     *
536     * @since 1.1
537     */
538    public static final String ADD = "add";
539    /**
540     * {@value #REMOVE}
541     * <p>
542     * In operations, this indicates the dropping or setting out of a car or
543     * engine.
544     * <p>
545     * As an attribute of a {@link jmri.server.json.roster.JsonRoster#ROSTER},
546     * this is an entry that has been removed from the roster.
547     *
548     * @since 1.1
549     */
550    public static final String REMOVE = "remove";
551    /**
552     * {@value #ADD_AND_REMOVE}
553     *
554     * @since 1.1
555     */
556    public static final String ADD_AND_REMOVE = "addAndRemove";
557    /**
558     * {@value #TOTAL}
559     *
560     * @since 1.1
561     */
562    public static final String TOTAL = "total";
563    /**
564     * {@value #LOADS}
565     *
566     * @since 1.1
567     */
568    public static final String LOADS = "loads";
569    /**
570     * {@value #EMPTIES}
571     *
572     * @since 1.1
573     */
574    public static final String EMPTIES = "empties";
575    /**
576     * {@value #RETURN_WHEN_EMPTY}
577     *
578     * @since 1.1
579     */
580    public static final String RETURN_WHEN_EMPTY = "returnWhenEmpty";
581    /**
582     * {@value #UTILITY}
583     *
584     * @since 1.1
585     */
586    public static final String UTILITY = "utility";
587
588    /* JSON signalling tokens */
589    /**
590     * {@value #APPEARANCE}
591     */
592    public static final String APPEARANCE = "appearance"; // NOI18N
593    /**
594     * {@value #APPEARANCE_NAME}
595     */
596    public static final String APPEARANCE_NAME = "appearanceName"; // NOI18N
597    /**
598     * {@value #ASPECT}
599     */
600    public static final String ASPECT = "aspect"; // NOI18N
601    /**
602     * {@value #ASPECT_DARK}
603     */
604    public static final String ASPECT_DARK = "Dark"; // NOI18N
605    /**
606     * {@value #ASPECT_HELD}
607     */
608    public static final String ASPECT_HELD = "Held"; // NOI18N
609    /**
610     * {@value #ASPECT_UNKNOWN}
611     */
612    public static final String ASPECT_UNKNOWN = "Unknown"; // NOI18N
613    /**
614     * {@value #TOKEN_HELD}
615     */
616    public static final String TOKEN_HELD = "held"; // NOI18N
617    /**
618     * {@value #LIT}
619     */
620    public static final String LIT = "lit"; // NOI18N
621
622    /* Shared JSON consist, roster, and throttle tokens */
623    /**
624     * {@value #ADDRESS}
625     */
626    public static final String ADDRESS = "address"; // NOI18N
627    /**
628     * {@value #FORWARD}
629     */
630    public static final String FORWARD = "forward"; // NOI18N
631    /**
632     * Prefix for the throttle function keys (F0-F28).
633     * <p>
634     * {@value #F}
635     */
636    public static final String F = "F"; // NOI18N
637
638    /* JSON Sensor and Turnout Tokens */
639    /**
640     * {@value #INVERTED}
641     */
642    public static final String INVERTED = "inverted"; // NOI18N
643
644    /* JSON value types */
645    /**
646     * {@value #INTEGER}
647     */
648    public static final String INTEGER = "int"; // NOI18N
649
650    /* JSON network services tokens */
651    /**
652     * {@value #PORT}
653     */
654    public static final String PORT = "port"; // NOI18N
655
656    /* JSON consist tokens */
657    /**
658     * {@value #POSITION}
659     */
660    public static final String POSITION = "position"; // NOI18N
661    /**
662     * {@value #SIZE_LIMIT}
663     */
664    public static final String SIZE_LIMIT = "sizeLimit"; // NOI18N
665
666    /* Time constants */
667    /**
668     * {@value #RATE}
669     */
670    public static final String RATE = "rate"; // NOI18N
671
672    /*
673     * JSON State (an unsigned integer)
674     */
675
676    /* Common state */
677    /**
678     * {@value #UNKNOWN}
679     * <p>
680     * Note that this value deliberately differs from
681     * {@link jmri.NamedBean#UNKNOWN} so that JSON clients can treat all known
682     * states as true, and the unknown state as false.
683     */
684    public static final int UNKNOWN = 0x00;
685
686    /* Light and PowerManager state */
687    /**
688     * {@value #ON}
689     */
690    public static final int ON = 0x02;
691    /**
692     * {@value #OFF}
693     */
694    public static final int OFF = 0x04;
695
696    /* NamedBean state */
697    /**
698     * {@value #INCONSISTENT}
699     */
700    public static final int INCONSISTENT = 0x08;
701
702    /* Route state */
703    /**
704     * {@value #TOGGLE}
705     */
706    public static final int TOGGLE = 0x08;
707
708    /* Sensor state */
709    /**
710     * {@value #ACTIVE}
711     */
712    public static final int ACTIVE = 0x02;
713    /**
714     * {@value #INACTIVE}
715     */
716    public static final int INACTIVE = 0x04;
717
718    /* SignalHead state */
719    /**
720     * {@value #STATE_DARK}
721     */
722    public static final int STATE_DARK = 0x00;
723    /**
724     * {@value #RED}
725     */
726    public static final int RED = 0x01;
727    /**
728     * {@value #FLASHRED}
729     */
730    public static final int FLASHRED = 0x02;
731    /**
732     * {@value #YELLOW}
733     */
734    public static final int YELLOW = 0x04;
735    /**
736     * {@value #FLASHYELLOW}
737     */
738    public static final int FLASHYELLOW = 0x08;
739    /**
740     * {@value #GREEN}
741     */
742    public static final int GREEN = 0x10;
743    /**
744     * {@value #FLASHGREEN}
745     */
746    public static final int FLASHGREEN = 0x20;
747    /**
748     * {@value #LUNAR}
749     */
750    public static final int LUNAR = 0x40;
751    /**
752     * {@value #FLASHLUNAR}
753     */
754    public static final int FLASHLUNAR = 0x80;
755    /**
756     * {@value #STATE_HELD}
757     */
758    public static final int STATE_HELD = 0x100;
759
760    /* Turnout state */
761    /**
762     * {@value #CLOSED}
763     */
764    public static final int CLOSED = 0x02;
765    /**
766     * {@value #THROWN}
767     */
768    public static final int THROWN = 0x04;
769
770    /* OBlock status */
771    /**
772     * {@value #ALLOCATED}
773     */
774    public static final int ALLOCATED = 0x10;
775    /**
776     * {@value #RUNNING}
777     */
778    public static final int RUNNING = 0x20;
779    /**
780     * {@value #OUT_OF_SERVICE}
781     */
782    public static final int OUT_OF_SERVICE = 0x30;
783    /**
784     * {@value #TRACK_ERROR}
785     */
786    public static final int TRACK_ERROR = 0x40;
787
788    /**
789     * {@value #UNIT}
790     *
791     * @since 1.1
792     */
793    public static final String UNIT = "unit"; // NOI18N
794
795    /* JMRI JSON Client Autoconfiguration support */
796    /**
797     * {@value #PREFIX}
798     *
799     * @since 2.0
800     */
801    public static final String PREFIX = "prefix"; // NOI18N
802    /**
803     * {@value #SYSTEM_CONNECTION}
804     *
805     * @since 2.0
806     */
807    public static final String SYSTEM_CONNECTION = "systemConnection"; // NOI18N
808    /**
809     * {@value #SYSTEM_CONNECTIONS}
810     *
811     * @since 2.0
812     */
813    public static final String SYSTEM_CONNECTIONS = "systemConnections"; // NOI18N
814
815    /* JSON Schema */
816    /**
817     * {@value #SCHEMA}
818     *
819     * @since 4.1
820     */
821    public static final String SCHEMA = "schema"; // NOI18N
822    /**
823     * {@value #SERVER}
824     *
825     * @since 4.1
826     */
827    public static final String SERVER = "server"; // NOI18N
828    /**
829     * {@value #CLIENT}
830     *
831     * @since 4.1
832     */
833    public static final String CLIENT = "client"; // NOI18N
834    /**
835     * {@value #FORCE_DELETE}
836     * 
837     * @since 5.0.0
838     */
839    public static final String FORCE_DELETE = "forceDelete"; // NOI18N
840    /**
841     * {@value #CONFLICT}
842     * 
843     * @since 5.0.0
844     */
845    public static final String CONFLICT = "conflict"; // NOI18N
846    /**
847     * {@value #RENAME}
848     * <p>
849     * In a message from a client, carries the new name for the object in the
850     * message; note that some services may bar changing the name of an object,
851     * while other services will change the name based on other values. In a
852     * message from the server, carries the old name for a recently renamed
853     * object in the message.
854     * 
855     * @since 5.0.0
856     */
857    public static final String RENAME = "rename"; // NOI18N
858    /**
859     * {@value #RFID}
860     * 
861     * @since 5.0.0
862     */
863    public static final String RFID = "rfid"; // NOI18N
864    /**
865     * {@value #TIME}
866     * 
867     * @since 5.0.0
868     */
869    public static final String TIME = "time"; // NOI18N
870
871    /* ZeroConf support */
872    /**
873     * {@value #ZEROCONF_SERVICE_TYPE} Not used within the protocol, but used to
874     * support discovery of servers supporting the protocol.
875     */
876    public static final String ZEROCONF_SERVICE_TYPE = "_jmri-json._tcp.local."; // NOI18N
877
878    /* prevent the constructor from being documented */
879    private JSON() {
880        throw new UnsupportedOperationException("There is no valid instance of this class");
881    }
882}