001// ***************************************************************************************************************************
002// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
003// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
004// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
005// * with the License.  You may obtain a copy of the License at                                                              *
006// *                                                                                                                         *
007// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
008// *                                                                                                                         *
009// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
010// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
011// * specific language governing permissions and limitations under the License.                                              *
012// ***************************************************************************************************************************
013package org.apache.juneau.jsonschema.annotation;
014
015import static java.lang.annotation.RetentionPolicy.*;
016
017import java.lang.annotation.*;
018
019import org.apache.juneau.http.annotation.*;
020import org.apache.juneau.oapi.*;
021
022/**
023 * Swagger schema annotation.
024 *
025 * <p>
026 * The Schema Object allows the definition of input and output data types.
027 * These types can be objects, but also primitives and arrays.
028 * This object is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it.
029 * On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
030 *
031 * <p>
032 * Used to populate the auto-generated Swagger documentation and UI for server-side <ja>@RestResource</ja>-annotated classes.
033 * <br>Also used to define OpenAPI schema information for POJOs serialized through {@link OpenApiSerializer} and parsed through {@link OpenApiParser}.
034 *
035 * <h5 class='section'>Examples:</h5>
036 * <p class='bcode w800'>
037 *    <jc>// A response object thats a hex-encoded string</jc>
038 *    <ja>@Response</ja>(
039 *       schema=<ja>@Schema</ja>(
040 *          type=<js>"string"</js>,
041 *          format=<js>"binary"</js>
042 *       )
043 *    )
044 * </p>
045 * <p class='bcode w800'>
046 *    <jc>// Free-form</jc>
047 *    <ja>@Response</ja>(
048 *       schema=<ja>@Schema</ja>({
049 *          <js>"type:'string',"</js>,
050 *          <js>"format:'binary'"</js>
051 *       })
052 *    )
053 * </p>
054 * <p class='bcode w800'>
055 *    <jc>// A request body consisting of an array of arrays, the internal array being of type integer, numbers must be between 0 and 63 (inclusive)</jc>
056</jc>
057 *    <ja>@Body</ja>(
058 *       schema=<ja>@Schema</ja>(
059 *          items=<ja>@Items</ja>(
060 *             type=<js>"array"</js>,
061 *             items=<ja>@SubItems</ja>(
062 *                type=<js>"integer"</js>,
063 *                minimum=<js>"0"</js>,
064 *                maximum=<js>"63"</js>
065 *             )
066 *       )
067 *       )
068 *    )
069 * </p>
070 *
071 * <ul class='seealso'>
072 *    <li class='link'>{@doc juneau-rest-server.Swagger}
073 *    <li class='extlink'>{@doc SwaggerSchemaObject}
074 * </ul>
075 */
076@Documented
077@Retention(RUNTIME)
078public @interface Schema {
079
080   /**
081    * <mk>$ref</mk> field of the {@doc SwaggerSchemaObject}.
082    *
083    * <p>
084    *    A JSON reference to the schema definition.
085    *
086    * <ul class='notes'>
087    *    <li>
088    *       The format is a <a href='https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03'>JSON Reference</a>.
089    *    <li>
090    *       Supports {@doc DefaultRestSvlVariables}
091    *       (e.g. <js>"$L{my.localized.variable}"</js>).
092    * </ul>
093    */
094   String $ref() default "";
095
096   /**
097    * <mk>format</mk> field of the {@doc SwaggerSchemaObject}.
098    *
099    * <h5 class='section'>Examples:</h5>
100    * <p class='bcode w800'>
101    *    <jc>// Used on parameter</jc>
102    *    <ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
103    *    <jk>public void</jk> setAge(
104    *       <ja>@Body</ja>(type=<js>"integer"</js>, format=<js>"int32"</js>) String input
105    *    ) {...}
106    * </p>
107    *
108    * <ul class='notes'>
109    *    <li>
110    *       The format is plain text.
111    *    <li>
112    *       Supports {@doc DefaultRestSvlVariables}
113    *       (e.g. <js>"$L{my.localized.variable}"</js>).
114    * </ul>
115    *
116    * <ul class='seealso'>
117    *    <li class='extlink'>{@doc SwaggerDataTypeFormats}
118    * </ul>
119    */
120   String format() default "";
121
122   /**
123    * <mk>title</mk> field of the {@doc SwaggerSchemaObject}.
124    *
125    * <ul class='notes'>
126    *    <li>
127    *       The format is plain text.
128    *    <li>
129    *       Supports {@doc DefaultRestSvlVariables}
130    *       (e.g. <js>"$L{my.localized.variable}"</js>).
131    * </ul>
132    */
133   String title() default "";
134
135   /**
136    * <mk>description</mk> field of the {@doc SwaggerSchemaObject}.
137    *
138    * <p>
139    * A brief description of the body. This could contain examples of use.
140    *
141    * <h5 class='section'>Examples:</h5>
142    * <p class='bcode w800'>
143    *    <jc>// Used on parameter</jc>
144    *    <ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
145    *    <jk>public void</jk> addPet(
146    *       <ja>@Body</ja>(description=<js>"Pet object to add to the store"</js>) Pet input
147    *    ) {...}
148    * </p>
149    * <p class='bcode w800'>
150    *    <jc>// Used on class</jc>
151    *    <ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
152    *    <jk>public void</jk> addPet(Pet input) {...}
153    *
154    *    <ja>@Body</ja>(description=<js>"Pet object to add to the store"</js>)
155    *    <jk>public class</jk> Pet {...}
156    * </p>
157    *
158    * <ul class='notes'>
159    *    <li>
160    *       The format is plain text.
161    *       <br>Multiple lines are concatenated with newlines.
162    *    <li>
163    *       Supports {@doc DefaultRestSvlVariables}
164    *       (e.g. <js>"$L{my.localized.variable}"</js>).
165    * </ul>
166    */
167   String[] description() default {};
168
169   /**
170    * <mk>default</mk> field of the {@doc SwaggerSchemaObject}.
171    *
172    * <ul class='notes'>
173    *    <li>
174    *       The format is any {@doc SimpleJson}.
175    *       <br>Multiple lines are concatenated with newlines.
176    *    <li>
177    *       Supports {@doc DefaultRestSvlVariables}
178    *       (e.g. <js>"$L{my.localized.variable}"</js>).
179    * </ul>
180    */
181   String[] _default() default {};
182
183   /**
184    * <mk>multipleOf</mk> field of the {@doc SwaggerSchemaObject}.
185    *
186    * <ul class='notes'>
187    *    <li>
188    *       The format is numeric.
189    *    <li>
190    *       Supports {@doc DefaultRestSvlVariables}
191    *       (e.g. <js>"$L{my.localized.variable}"</js>).
192    * </ul>
193    */
194   String multipleOf() default "";
195
196   /**
197    * <mk>maximum</mk> field of the {@doc SwaggerSchemaObject}.
198    *
199    * <ul class='notes'>
200    *    <li>
201    *       The format is numeric.
202    *    <li>
203    *       Supports {@doc DefaultRestSvlVariables}
204    *       (e.g. <js>"$L{my.localized.variable}"</js>).
205    * </ul>
206    */
207   String maximum() default "";
208
209   /**
210    * <mk>exclusiveMaximum</mk> field of the {@doc SwaggerSchemaObject}.
211    *
212    * <ul class='notes'>
213    *    <li>
214    *       The format is numeric.
215    *    <li>
216    *       Supports {@doc DefaultRestSvlVariables}
217    *       (e.g. <js>"$L{my.localized.variable}"</js>).
218    * </ul>
219    */
220   boolean exclusiveMaximum() default false;
221
222   /**
223    * <mk>minimum</mk> field of the {@doc SwaggerSchemaObject}.
224    *
225    * <ul class='notes'>
226    *    <li>
227    *       The format is numeric.
228    *    <li>
229    *       Supports {@doc DefaultRestSvlVariables}
230    *       (e.g. <js>"$L{my.localized.variable}"</js>).
231    * </ul>
232    */
233   String minimum() default "";
234
235   /**
236    * <mk>exclusiveMinimum</mk> field of the {@doc SwaggerSchemaObject}.
237    *
238    * <ul class='notes'>
239    *    <li>
240    *       The format is numeric.
241    *    <li>
242    *       Supports {@doc DefaultRestSvlVariables}
243    *       (e.g. <js>"$L{my.localized.variable}"</js>).
244    * </ul>
245    */
246   boolean exclusiveMinimum() default false;
247
248   /**
249    * <mk>maxLength</mk> field of the {@doc SwaggerSchemaObject}.
250    *
251    * <ul class='notes'>
252    *    <li>
253    *       The format is numeric.
254    *    <li>
255    *       Supports {@doc DefaultRestSvlVariables}
256    *       (e.g. <js>"$L{my.localized.variable}"</js>).
257    * </ul>
258    */
259   long maxLength() default -1;
260
261   /**
262    * <mk>minLength</mk> field of the {@doc SwaggerSchemaObject}.
263    *
264    * <ul class='notes'>
265    *    <li>
266    *       The format is numeric.
267    *    <li>
268    *       Supports {@doc DefaultRestSvlVariables}
269    *       (e.g. <js>"$L{my.localized.variable}"</js>).
270    * </ul>
271    */
272   long minLength() default -1;
273
274   /**
275    * <mk>pattern</mk> field of the {@doc SwaggerSchemaObject}.
276    *
277    * <h5 class='section'>Example:</h5>
278    * <p class='bcode w800'>
279    *    <ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
280    *    <jk>public void</jk> doPut(<ja>@Body</ja>(format=<js>"/\\w+\\.\\d+/"</js>) String input) {...}
281    * </p>
282    *
283    * <ul class='notes'>
284    *    <li>
285    *       The format is plain text.
286    *    <li>
287    *       This string SHOULD be a valid regular expression.
288    *    <li>
289    *       Supports {@doc DefaultRestSvlVariables}
290    *       (e.g. <js>"$L{my.localized.variable}"</js>).
291    * </ul>
292    */
293   String pattern() default "";
294
295   /**
296    * <mk>maxItems</mk> field of the {@doc SwaggerSchemaObject}.
297    *
298    * <ul class='notes'>
299    *    <li>
300    *       The format is numeric.
301    *    <li>
302    *       Supports {@doc DefaultRestSvlVariables}
303    *       (e.g. <js>"$L{my.localized.variable}"</js>).
304    * </ul>
305    */
306   long maxItems() default -1;
307
308   /**
309    * <mk>minItems</mk> field of the {@doc SwaggerSchemaObject}.
310    *
311    * <ul class='notes'>
312    *    <li>
313    *       The format is numeric.
314    *    <li>
315    *       Supports {@doc DefaultRestSvlVariables}
316    *       (e.g. <js>"$L{my.localized.variable}"</js>).
317    * </ul>
318    */
319   long minItems() default -1;
320
321   /**
322    * <mk>uniqueItems</mk> field of the {@doc SwaggerSchemaObject}.
323    *
324    * <ul class='notes'>
325    *    <li>
326    *       The format is boolean.
327    *    <li>
328    *       Supports {@doc DefaultRestSvlVariables}
329    *       (e.g. <js>"$L{my.localized.variable}"</js>).
330    * </ul>
331    */
332   boolean uniqueItems() default false;
333
334
335   /**
336    * <mk>maxProperties</mk> field of the {@doc SwaggerSchemaObject}.
337    *
338    * <ul class='notes'>
339    *    <li>
340    *       The format is a {@doc SimpleJson} object.
341    *       <br>Multiple lines are concatenated with newlines.
342    *    <li>
343    *       Supports {@doc DefaultRestSvlVariables}
344    *       (e.g. <js>"$L{my.localized.variable}"</js>).
345    * </ul>
346    */
347   long maxProperties() default -1;
348
349
350   /**
351    * <mk>minProperties</mk> field of the {@doc SwaggerSchemaObject}.
352    *
353    * <ul class='notes'>
354    *    <li>
355    *       The format is a {@doc SimpleJson} object.
356    *       <br>Multiple lines are concatenated with newlines.
357    *    <li>
358    *       Supports {@doc DefaultRestSvlVariables}
359    *       (e.g. <js>"$L{my.localized.variable}"</js>).
360    * </ul>
361    */
362   long minProperties() default -1;
363
364   /**
365    * <mk>required</mk> field of the {@doc SwaggerSchemaObject}.
366    *
367    * <p>
368    *    Determines whether this parameter is mandatory.
369    *  <br>The property MAY be included and its default value is false.
370    *
371    * <h5 class='section'>Examples:</h5>
372    * <p class='bcode w800'>
373    *    <jc>// Used on parameter</jc>
374    *    <ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
375    *    <jk>public void</jk> addPet(
376    *       <ja>@Body</ja>(required=<jk>true</jk>) Pet input
377    *    ) {...}
378    * </p>
379    * <p class='bcode w800'>
380    *    <jc>// Used on class</jc>
381    *    <ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
382    *    <jk>public void</jk> addPet(Pet input) {...}
383    *
384    *    <ja>@Body</ja>(required=<jk>true</jk>)
385    *    <jk>public class</jk> Pet {...}
386    * </p>
387    *
388    * <ul class='notes'>
389    *    <li>
390    *       The format is boolean.
391    *    <li>
392    *       Supports {@doc DefaultRestSvlVariables}
393    *       (e.g. <js>"$L{my.localized.variable}"</js>).
394    * </ul>
395    */
396   boolean required() default false;
397
398   /**
399    * <mk>enum</mk> field of the {@doc SwaggerSchemaObject}.
400    *
401    * <ul class='notes'>
402    *    <li>
403    *       The format is a {@doc SimpleJson} array or comma-delimited list.
404    *       <br>Multiple lines are concatenated with newlines.
405    *    <li>
406    *       Supports {@doc DefaultRestSvlVariables}
407    *       (e.g. <js>"$L{my.localized.variable}"</js>).
408    * </ul>
409    */
410   String[] _enum() default {};
411
412   /**
413    * <mk>type</mk> field of the {@doc SwaggerSchemaObject}.
414    *
415    * <h5 class='section'>Examples:</h5>
416    * <p class='bcode w800'>
417    *    <jc>// Used on parameter</jc>
418    *    <ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
419    *    <jk>public void</jk> addPet(
420    *       <ja>@Body</ja>(type=<js>"object"</js>) Pet input
421    *    ) {...}
422    * </p>
423    * <p class='bcode w800'>
424    *    <jc>// Used on class</jc>
425    *    <ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
426    *    <jk>public void</jk> addPet(Pet input) {...}
427    *
428    *    <ja>@Body</ja>(type=<js>"object"</js>)
429    *    <jk>public class</jk> Pet {...}
430    * </p>
431    *
432    * <ul class='notes'>
433    *    <li>
434    *       The format is plain text.
435    *    <li>
436    *       The possible values are:
437    *       <ul>
438    *          <li><js>"object"</js>
439    *          <li><js>"string"</js>
440    *          <li><js>"number"</js>
441    *          <li><js>"integer"</js>
442    *          <li><js>"boolean"</js>
443    *          <li><js>"array"</js>
444    *          <li><js>"file"</js>
445    *       </ul>
446    *    <li>
447    *       Supports {@doc DefaultRestSvlVariables}
448    *       (e.g. <js>"$L{my.localized.variable}"</js>).
449    * </ul>
450    *
451    * <ul class='seealso'>
452    *    <li class='extlink'>{@doc SwaggerDataTypes}
453    * </ul>
454    *
455    */
456   String type() default "";
457
458   /**
459    * <mk>items</mk> field of the {@doc SwaggerSchemaObject}.
460    *
461    * <ul class='notes'>
462    *    <li>
463    *       The format is a {@doc SimpleJson} object.
464    *       <br>Multiple lines are concatenated with newlines.
465    *    <li>
466    *       Supports {@doc DefaultRestSvlVariables}
467    *       (e.g. <js>"$L{my.localized.variable}"</js>).
468    * </ul>
469    */
470   Items items() default @Items;
471
472   /**
473    * <mk>collectionFormat</mk> field.
474    *
475    * <p>
476    * Note that this field isn't part of the Swagger 2.0 specification, but the specification does not specify how
477    * items are supposed to be represented.
478    *
479    * <p>
480    * Determines the format of the array if <c>type</c> <js>"array"</js> is used.
481    * <br>Can only be used if <c>type</c> is <js>"array"</js>.
482    *
483    * <br>Possible values are:
484    * <ul class='spaced-list'>
485    *    <li>
486    *       <js>"csv"</js> (default) - Comma-separated values (e.g. <js>"foo,bar"</js>).
487    *    <li>
488    *       <js>"ssv"</js> - Space-separated values (e.g. <js>"foo bar"</js>).
489    *    <li>
490    *       <js>"tsv"</js> - Tab-separated values (e.g. <js>"foo\tbar"</js>).
491    *    <li>
492    *       <js>"pipes</js> - Pipe-separated values (e.g. <js>"foo|bar"</js>).
493    *    <li>
494    *       <js>"multi"</js> - Corresponds to multiple parameter instances instead of multiple values for a single instance (e.g. <js>"foo=bar&amp;foo=baz"</js>).
495    *    <li>
496    *       <js>"uon"</js> - UON notation (e.g. <js>"@(foo,bar)"</js>).
497    * </ul>
498    *
499    * <p>
500    * Static strings are defined in {@link CollectionFormatType}.
501    *
502    * <p>
503    * Note that for collections/arrays parameters with POJO element types, the input is broken into a string array before being converted into POJO elements.
504    *
505    * <h5 class='section'>Used for:</h5>
506    * <ul class='spaced-list'>
507    *    <li>
508    *       Server-side schema-based parsing.
509    *    <li>
510    *       Server-side generated Swagger documentation.
511    *    <li>
512    *       Client-side schema-based serializing.
513    * </ul>
514    */
515   String collectionFormat() default "";
516
517   /**
518    * <mk>allOf</mk> field of the {@doc SwaggerSchemaObject}.
519    *
520    * <ul class='notes'>
521    *    <li>
522    *       The format is a {@doc SimpleJson} object.
523    *       <br>Multiple lines are concatenated with newlines.
524    *    <li>
525    *       Supports {@doc DefaultRestSvlVariables}
526    *       (e.g. <js>"$L{my.localized.variable}"</js>).
527    * </ul>
528    */
529   String[] allOf() default {};
530
531   /**
532    * <mk>properties</mk> field of the {@doc SwaggerSchemaObject}.
533    *
534    * <ul class='notes'>
535    *    <li>
536    *       The format is a {@doc SimpleJson} object.
537    *       <br>Multiple lines are concatenated with newlines.
538    *    <li>
539    *       Supports {@doc DefaultRestSvlVariables}
540    *       (e.g. <js>"$L{my.localized.variable}"</js>).
541    * </ul>
542    */
543   String[] properties() default {};
544
545   /**
546    * <mk>additionalProperties</mk> field of the {@doc SwaggerSchemaObject}.
547    *
548    * <ul class='notes'>
549    *    <li>
550    *       The format is a {@doc SimpleJson} object.
551    *       <br>Multiple lines are concatenated with newlines.
552    *    <li>
553    *       Supports {@doc DefaultRestSvlVariables}
554    *       (e.g. <js>"$L{my.localized.variable}"</js>).
555    * </ul>
556    */
557   String[] additionalProperties() default {};
558
559   /**
560    * <mk>discriminator</mk> field of the {@doc SwaggerSchemaObject}.
561    *
562    * <ul class='notes'>
563    *    <li>
564    *       The format is a {@doc SimpleJson} object.
565    *       <br>Multiple lines are concatenated with newlines.
566    *    <li>
567    *       Supports {@doc DefaultRestSvlVariables}
568    *       (e.g. <js>"$L{my.localized.variable}"</js>).
569    * </ul>
570    */
571   String discriminator() default "";
572
573   /**
574    * <mk>readOnly</mk> field of the {@doc SwaggerSchemaObject}.
575    *
576    * <ul class='notes'>
577    *    <li>
578    *       The format is a {@doc SimpleJson} object.
579    *       <br>Multiple lines are concatenated with newlines.
580    *    <li>
581    *       Supports {@doc DefaultRestSvlVariables}
582    *       (e.g. <js>"$L{my.localized.variable}"</js>).
583    * </ul>
584    */
585   boolean readOnly() default false;
586
587   /**
588    * <mk>xml</mk> field of the {@doc SwaggerSchemaObject}.
589    *
590    * <ul class='notes'>
591    *    <li>
592    *       The format is a {@doc SimpleJson} object.
593    *       <br>Multiple lines are concatenated with newlines.
594    *    <li>
595    *       Supports {@doc DefaultRestSvlVariables}
596    *       (e.g. <js>"$L{my.localized.variable}"</js>).
597    * </ul>
598    */
599   String[] xml() default {};
600
601   /**
602    * <mk>externalDocs</mk> field of the {@doc SwaggerSchemaObject}.
603    *
604    * <ul class='notes'>
605    *    <li>
606    *       The format is a {@doc SimpleJson} object.
607    *       <br>Multiple lines are concatenated with newlines.
608    *    <li>
609    *       Supports {@doc DefaultRestSvlVariables}
610    *       (e.g. <js>"$L{my.localized.variable}"</js>).
611    * </ul>
612    */
613   ExternalDocs externalDocs() default @ExternalDocs;
614
615   /**
616    * <mk>example</mk> field of the {@doc SwaggerSchemaObject}.
617    *
618    * <p>
619    * A free-form property to include an example of an instance for this schema.
620    *
621    * <p>
622    * This attribute defines a JSON representation of the body value that is used by <c>BasicRestInfoProvider</c> to construct
623    * media-type-based examples of the body of the request.
624    *
625    * <ul class='notes'>
626    *    <li>
627    *       The format is a {@doc SimpleJson} object or plain text string.
628    *       <br>Multiple lines are concatenated with newlines.
629    *    <li>
630    *       Supports {@doc DefaultRestSvlVariables}
631    *       (e.g. <js>"$L{my.localized.variable}"</js>).
632    * </ul>
633    */
634   String[] example() default {};
635
636   /**
637    * <mk>x-examples</mk> field of the {@doc SwaggerSchemaObject}.
638    *
639    * <p>
640    * This is a JSON object whose keys are media types and values are string representations of that value.
641    *
642    * <ul class='notes'>
643    *    <li>
644    *       The format is a {@doc SimpleJson} object.
645    *       <br>Multiple lines are concatenated with newlines.
646    *    <li>
647    *       Supports {@doc DefaultRestSvlVariables}
648    *       (e.g. <js>"$L{my.localized.variable}"</js>).
649    * </ul>
650    */
651   String[] examples() default {};
652
653   /**
654    * Specifies that schema information for this part should not be shown in the generated Swagger documentation.
655    */
656   boolean ignore() default false;
657
658   /**
659    * Free-form value for the {@doc SwaggerSchemaObject}.
660    *
661    * <p>
662    * This is a JSON object that makes up the swagger information for this field.
663    *
664    * <p>
665    * The following are completely equivalent ways of defining the swagger description of a Schema object:
666    * <p class='bcode w800'>
667    *    <jc>// Normal</jc>
668    *    <ja>@Schema</ja>(
669    *       type=<js>"array"</js>,
670    *       items=<ja>@Items</ja>(
671    *          $ref=<js>"#/definitions/Pet"</js>
672    *       )
673    *    )
674    * </p>
675    * <p class='bcode w800'>
676    *    <jc>// Free-form</jc>
677    *    <ja>@Schema</ja>(
678    *       <js>"type: 'array',"</js>,
679    *       <js>"items: {"</js>,
680    *          <js>"$ref: '#/definitions/Pet'"</js>,
681    *       <js>"}"</js>
682    *    )
683    * </p>
684    * <p class='bcode w800'>
685    *    <jc>// Free-form using variables</jc>
686    *    <ja>@Schema</ja>(<js>"$L{petArraySwagger}"</js>)
687    * </p>
688    * <p class='bcode w800'>
689    *    <mc>// Contents of MyResource.properties</mc>
690    *    <mk>petArraySwagger</mk> = <mv>{ type: "array", items: { $ref: "#/definitions/Pet" } }</mv>
691    * </p>
692    *
693    * <p>
694    *    The reasons why you may want to use this field include:
695    * <ul>
696    *    <li>You want to pull in the entire Swagger JSON definition for this field from an external source such as a properties file.
697    *    <li>You want to add extra fields to the Swagger documentation that are not officially part of the Swagger specification.
698    * </ul>
699    *
700    * <ul class='notes'>
701    *    <li>
702    *       The format is a {@doc SimpleJson} object.
703    *    <li>
704    *       The leading/trailing <c>{ }</c> characters are optional.
705    *       <br>The following two example are considered equivalent:
706    *       <p class='bcode w800'>
707    *    <ja>@Schema</ja>(<js>"{type: 'array'}"</js>)
708    *       </p>
709    *       <p class='bcode w800'>
710    *    <ja>@Schema</ja>(<js>"type: 'array'"</js>)
711    *       </p>
712    *    <li>
713    *       Multiple lines are concatenated with newlines so that you can format the value to be readable.
714    *    <li>
715    *       Supports {@doc DefaultRestSvlVariables}
716    *       (e.g. <js>"$L{my.localized.variable}"</js>).
717    *    <li>
718    *       Values defined in this field supersede values pulled from the Swagger JSON file and are superseded by individual values defined on this annotation.
719    * </ul>
720    */
721   String[] value() default {};
722}