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.rest.annotation;
014
015import static org.apache.juneau.http.HttpHeaders.*;
016import static org.apache.juneau.internal.ArrayUtils.*;
017import java.lang.annotation.*;
018import java.nio.charset.*;
019
020import org.apache.juneau.*;
021import org.apache.juneau.annotation.*;
022import org.apache.juneau.cp.*;
023import org.apache.juneau.encoders.*;
024import org.apache.juneau.httppart.*;
025import org.apache.juneau.reflect.*;
026import org.apache.juneau.rest.*;
027import org.apache.juneau.rest.arg.*;
028import org.apache.juneau.rest.converter.*;
029import org.apache.juneau.rest.debug.*;
030import org.apache.juneau.rest.guard.*;
031import org.apache.juneau.rest.httppart.*;
032import org.apache.juneau.rest.logger.*;
033import org.apache.juneau.rest.processor.*;
034import org.apache.juneau.rest.staticfile.*;
035import org.apache.juneau.rest.swagger.*;
036import org.apache.juneau.serializer.*;
037import org.apache.juneau.svl.*;
038
039/**
040 * Utility classes and methods for the {@link Rest @Rest} annotation.
041 *
042 * <h5 class='section'>See Also:</h5><ul>
043 *    <li class='link'><a class="doclink" href="../../../../../index.html#jrs.AnnotatedClasses">@Rest-Annotated Classes</a>
044 * </ul>
045 */
046public class RestAnnotation {
047
048   //-----------------------------------------------------------------------------------------------------------------
049   // Static
050   //-----------------------------------------------------------------------------------------------------------------
051
052   /** Default value */
053   public static final Rest DEFAULT = create().build();
054
055   /**
056    * Instantiates a new builder for this class.
057    *
058    * @return A new builder object.
059    */
060   public static Builder create() {
061      return new Builder();
062   }
063
064   /**
065    * Instantiates a new builder for this class.
066    *
067    * @param on The targets this annotation applies to.
068    * @return A new builder object.
069    */
070   public static Builder create(Class<?>...on) {
071      return create().on(on);
072   }
073
074   /**
075    * Instantiates a new builder for this class.
076    *
077    * @param on The targets this annotation applies to.
078    * @return A new builder object.
079    */
080   public static Builder create(String...on) {
081      return create().on(on);
082   }
083
084   //-----------------------------------------------------------------------------------------------------------------
085   // Builder
086   //-----------------------------------------------------------------------------------------------------------------
087
088   /**
089    * Builder class.
090    *
091    * <h5 class='section'>See Also:</h5><ul>
092    *    <li class='jm'>{@link org.apache.juneau.BeanContext.Builder#annotations(Annotation...)}
093    * </ul>
094    */
095   @SuppressWarnings("unchecked")
096   public static class Builder extends TargetedAnnotationTBuilder {
097
098      Class<? extends Encoder>[] encoders = new Class[0];
099      Class<? extends HttpPartParser> partParser = HttpPartParser.Void.class;
100      Class<? extends HttpPartSerializer> partSerializer = HttpPartSerializer.Void.class;
101      Class<? extends StaticFiles> staticFiles = StaticFiles.Void.class;
102      Class<? extends ResponseProcessor>[] responseProcessors = new Class[0];
103      Class<? extends CallLogger> callLogger = CallLogger.Void.class;
104      Class<? extends RestConverter>[] converters = new Class[0];
105      Class<? extends RestGuard>[] guards = new Class[0];
106      Class<? extends SwaggerProvider> swaggerProvider = SwaggerProvider.Void.class;
107      Class<? extends RestOpArg>[] restOpArgs = new Class[0];
108      Class<? extends BeanStore> beanStore = BeanStore.Void.class;
109      Class<? extends RestChildren> restChildrenClass = RestChildren.Void.class;
110      Class<? extends RestOperations> restOperationsClass = RestOperations.Void.class;
111      Class<? extends DebugEnablement> debugEnablement = DebugEnablement.Void.class;
112      Class<? extends Serializer>[] serializers = new Class[0];
113      Class<?>[] children={}, parsers={};
114      Swagger swagger = SwaggerAnnotation.DEFAULT;
115      String disableContentParam="", allowedHeaderParams="", allowedMethodHeaders="", allowedMethodParams="", clientVersionHeader="", config="", debug="", debugOn="", defaultAccept="", defaultCharset="", defaultContentType="", maxInput="", messages="", path="", renderResponseStackTraces="", roleGuard="", rolesDeclared="", siteName="", uriAuthority="", uriContext="", uriRelativity="", uriResolution="";
116      String[] consumes={}, defaultRequestAttributes={}, defaultRequestHeaders={}, defaultResponseHeaders={}, description={}, produces={}, title={};
117
118      /**
119       * Constructor.
120       */
121      protected Builder() {
122         super(Rest.class);
123      }
124
125      /**
126       * Instantiates a new {@link Rest @Rest} object initialized with this builder.
127       *
128       * @return A new {@link Rest @Rest} object.
129       */
130      public Rest build() {
131         return new Impl(this);
132      }
133
134      /**
135       * Sets the {@link Rest#disableContentParam()} property on this annotation.
136       *
137       * @param value The new value for this property.
138       * @return This object.
139       */
140      public Builder disableContentParam(String value) {
141         this.disableContentParam = value;
142         return this;
143      }
144
145      /**
146       * Sets the {@link Rest#allowedHeaderParams()} property on this annotation.
147       *
148       * @param value The new value for this property.
149       * @return This object.
150       */
151      public Builder allowedHeaderParams(String value) {
152         this.allowedHeaderParams = value;
153         return this;
154      }
155
156      /**
157       * Sets the {@link Rest#allowedMethodHeaders()} property on this annotation.
158       *
159       * @param value The new value for this property.
160       * @return This object.
161       */
162      public Builder allowedMethodHeaders(String value) {
163         this.allowedMethodHeaders = value;
164         return this;
165      }
166
167      /**
168       * Sets the {@link Rest#allowedMethodParams()} property on this annotation.
169       *
170       * @param value The new value for this property.
171       * @return This object.
172       */
173      public Builder allowedMethodParams(String value) {
174         this.allowedMethodParams = value;
175         return this;
176      }
177
178      /**
179       * Sets the {@link Rest#beanStore()} property on this annotation.
180       *
181       * @param value The new value for this property.
182       * @return This object.
183       */
184      public Builder beanStore(Class<? extends BeanStore> value) {
185         this.beanStore = value;
186         return this;
187      }
188
189      /**
190       * Sets the {@link Rest#callLogger()} property on this annotation.
191       *
192       * @param value The new value for this property.
193       * @return This object.
194       */
195      public Builder callLogger(Class<? extends CallLogger> value) {
196         this.callLogger = value;
197         return this;
198      }
199
200      /**
201       * Sets the {@link Rest#children()} property on this annotation.
202       *
203       * @param value The new value for this property.
204       * @return This object.
205       */
206      public Builder children(Class<?>...value) {
207         this.children = value;
208         return this;
209      }
210
211      /**
212       * Sets the {@link Rest#clientVersionHeader()} property on this annotation.
213       *
214       * @param value The new value for this property.
215       * @return This object.
216       */
217      public Builder clientVersionHeader(String value) {
218         this.clientVersionHeader = value;
219         return this;
220      }
221
222      /**
223       * Sets the {@link Rest#config()} property on this annotation.
224       *
225       * @param value The new value for this property.
226       * @return This object.
227       */
228      public Builder config(String value) {
229         this.config = value;
230         return this;
231      }
232
233      /**
234       * Sets the {@link Rest#consumes()} property on this annotation.
235       *
236       * @param value The new value for this property.
237       * @return This object.
238       */
239      public Builder consumes(String...value) {
240         this.consumes = value;
241         return this;
242      }
243
244      /**
245       * Sets the {@link Rest#converters()} property on this annotation.
246       *
247       * @param value The new value for this property.
248       * @return This object.
249       */
250      public Builder converters(Class<? extends RestConverter>...value) {
251         this.converters = value;
252         return this;
253      }
254
255      /**
256       * Sets the {@link Rest#debug()} property on this annotation.
257       *
258       * @param value The new value for this property.
259       * @return This object.
260       */
261      public Builder debug(String value) {
262         this.debug = value;
263         return this;
264      }
265
266      /**
267       * Sets the {@link Rest#debugEnablement()} property on this annotation.
268       *
269       * @param value The new value for this property.
270       * @return This object.
271       */
272      public Builder debugEnablement(Class<? extends DebugEnablement> value) {
273         this.debugEnablement = value;
274         return this;
275      }
276
277      /**
278       * Sets the {@link Rest#debugOn()} property on this annotation.
279       *
280       * @param value The new value for this property.
281       * @return This object.
282       */
283      public Builder debugOn(String value) {
284         this.debugOn = value;
285         return this;
286      }
287
288      /**
289       * Sets the {@link Rest#defaultAccept()} property on this annotation.
290       *
291       * @param value The new value for this property.
292       * @return This object.
293       */
294      public Builder defaultAccept(String value) {
295         this.defaultAccept = value;
296         return this;
297      }
298
299      /**
300       * Sets the {@link Rest#defaultCharset()} property on this annotation.
301       *
302       * @param value The new value for this property.
303       * @return This object.
304       */
305      public Builder defaultCharset(String value) {
306         this.defaultCharset = value;
307         return this;
308      }
309
310      /**
311       * Sets the {@link Rest#defaultContentType()} property on this annotation.
312       *
313       * @param value The new value for this property.
314       * @return This object.
315       */
316      public Builder defaultContentType(String value) {
317         this.defaultContentType = value;
318         return this;
319      }
320
321      /**
322       * Sets the {@link Rest#defaultRequestAttributes()} property on this annotation.
323       *
324       * @param value The new value for this property.
325       * @return This object.
326       */
327      public Builder defaultRequestAttributes(String...value) {
328         this.defaultRequestAttributes = value;
329         return this;
330      }
331
332      /**
333       * Sets the {@link Rest#defaultRequestHeaders()} property on this annotation.
334       *
335       * @param value The new value for this property.
336       * @return This object.
337       */
338      public Builder defaultRequestHeaders(String...value) {
339         this.defaultRequestHeaders = value;
340         return this;
341      }
342
343      /**
344       * Sets the {@link Rest#defaultResponseHeaders()} property on this annotation.
345       *
346       * @param value The new value for this property.
347       * @return This object.
348       */
349      public Builder defaultResponseHeaders(String...value) {
350         this.defaultResponseHeaders = value;
351         return this;
352      }
353
354      /**
355       * Sets the {@link Rest#description()} property on this annotation.
356       *
357       * @param value The new value for this property.
358       * @return This object.
359       */
360      public Builder description(String...value) {
361         this.description = value;
362         return this;
363      }
364
365      /**
366       * Sets the {@link Rest#encoders()} property on this annotation.
367       *
368       * @param value The new value for this property.
369       * @return This object.
370       */
371      public Builder encoders(Class<? extends Encoder>...value) {
372         this.encoders = value;
373         return this;
374      }
375
376      /**
377       * Sets the {@link Rest#guards()} property on this annotation.
378       *
379       * @param value The new value for this property.
380       * @return This object.
381       */
382      public Builder guards(Class<? extends RestGuard>...value) {
383         this.guards = value;
384         return this;
385      }
386
387      /**
388       * Sets the {@link Rest#maxInput()} property on this annotation.
389       *
390       * @param value The new value for this property.
391       * @return This object.
392       */
393      public Builder maxInput(String value) {
394         this.maxInput = value;
395         return this;
396      }
397
398      /**
399       * Sets the {@link Rest#messages()} property on this annotation.
400       *
401       * @param value The new value for this property.
402       * @return This object.
403       */
404      public Builder messages(String value) {
405         this.messages = value;
406         return this;
407      }
408
409      /**
410       * Sets the {@link Rest#parsers()} property on this annotation.
411       *
412       * @param value The new value for this property.
413       * @return This object.
414       */
415      public Builder parsers(Class<?>...value) {
416         this.parsers = value;
417         return this;
418      }
419
420      /**
421       * Sets the {@link Rest#partParser()} property on this annotation.
422       *
423       * @param value The new value for this property.
424       * @return This object.
425       */
426      public Builder partParser(Class<? extends HttpPartParser> value) {
427         this.partParser = value;
428         return this;
429      }
430
431      /**
432       * Sets the {@link Rest#partSerializer()} property on this annotation.
433       *
434       * @param value The new value for this property.
435       * @return This object.
436       */
437      public Builder partSerializer(Class<? extends HttpPartSerializer> value) {
438         this.partSerializer = value;
439         return this;
440      }
441
442      /**
443       * Sets the {@link Rest#path()} property on this annotation.
444       *
445       * @param value The new value for this property.
446       * @return This object.
447       */
448      public Builder path(String value) {
449         this.path = value;
450         return this;
451      }
452
453      /**
454       * Sets the {@link Rest#produces()} property on this annotation.
455       *
456       * @param value The new value for this property.
457       * @return This object.
458       */
459      public Builder produces(String...value) {
460         this.produces = value;
461         return this;
462      }
463
464      /**
465       * Sets the {@link Rest#renderResponseStackTraces()} property on this annotation.
466       *
467       * @param value The new value for this property.
468       * @return This object.
469       */
470      public Builder renderResponseStackTraces(String value) {
471         this.renderResponseStackTraces = value;
472         return this;
473      }
474
475      /**
476       * Sets the {@link Rest#responseProcessors()} property on this annotation.
477       *
478       * @param value The new value for this property.
479       * @return This object.
480       */
481      public Builder responseProcessors(Class<? extends ResponseProcessor>...value) {
482         this.responseProcessors = value;
483         return this;
484      }
485
486      /**
487       * Sets the {@link Rest#restChildrenClass()} property on this annotation.
488       *
489       * @param value The new value for this property.
490       * @return This object.
491       */
492      public Builder restChildrenClass(Class<? extends RestChildren> value) {
493         this.restChildrenClass = value;
494         return this;
495      }
496
497      /**
498       * Sets the {@link Rest#restOpArgs()} property on this annotation.
499       *
500       * @param value The new value for this property.
501       * @return This object.
502       */
503      public Builder restOpArgs(Class<? extends RestOpArg>...value) {
504         this.restOpArgs = value;
505         return this;
506      }
507
508      /**
509       * Sets the {@link Rest#restOperationsClass()} property on this annotation.
510       *
511       * @param value The new value for this property.
512       * @return This object.
513       */
514      public Builder restOperationsClass(Class<? extends RestOperations> value) {
515         this.restOperationsClass = value;
516         return this;
517      }
518
519      /**
520       * Sets the {@link Rest#roleGuard()} property on this annotation.
521       *
522       * @param value The new value for this property.
523       * @return This object.
524       */
525      public Builder roleGuard(String value) {
526         this.roleGuard = value;
527         return this;
528      }
529
530      /**
531       * Sets the {@link Rest#rolesDeclared()} property on this annotation.
532       *
533       * @param value The new value for this property.
534       * @return This object.
535       */
536      public Builder rolesDeclared(String value) {
537         this.rolesDeclared = value;
538         return this;
539      }
540
541      /**
542       * Sets the {@link Rest#serializers()} property on this annotation.
543       *
544       * @param value The new value for this property.
545       * @return This object.
546       */
547      public Builder serializers(Class<? extends Serializer>...value) {
548         this.serializers = value;
549         return this;
550      }
551
552      /**
553       * Sets the {@link Rest#siteName()} property on this annotation.
554       *
555       * @param value The new value for this property.
556       * @return This object.
557       */
558      public Builder siteName(String value) {
559         this.siteName = value;
560         return this;
561      }
562
563      /**
564       * Sets the {@link Rest#staticFiles()} property on this annotation.
565       *
566       * @param value The new value for this property.
567       * @return This object.
568       */
569      public Builder staticFiles(Class<? extends StaticFiles> value) {
570         this.staticFiles = value;
571         return this;
572      }
573
574      /**
575       * Sets the {@link Rest#swagger()} property on this annotation.
576       *
577       * @param value The new value for this property.
578       * @return This object.
579       */
580      public Builder swagger(Swagger value) {
581         this.swagger = value;
582         return this;
583      }
584
585      /**
586       * Sets the {@link Rest#swaggerProvider()} property on this annotation.
587       *
588       * @param value The new value for this property.
589       * @return This object.
590       */
591      public Builder swaggerProvider(Class<? extends SwaggerProvider> value) {
592         this.swaggerProvider = value;
593         return this;
594      }
595
596      /**
597       * Sets the {@link Rest#title()} property on this annotation.
598       *
599       * @param value The new value for this property.
600       * @return This object.
601       */
602      public Builder title(String...value) {
603         this.title = value;
604         return this;
605      }
606
607      /**
608       * Sets the {@link Rest#uriAuthority()} property on this annotation.
609       *
610       * @param value The new value for this property.
611       * @return This object.
612       */
613      public Builder uriAuthority(String value) {
614         this.uriAuthority = value;
615         return this;
616      }
617
618      /**
619       * Sets the {@link Rest#uriContext()} property on this annotation.
620       *
621       * @param value The new value for this property.
622       * @return This object.
623       */
624      public Builder uriContext(String value) {
625         this.uriContext = value;
626         return this;
627      }
628
629      /**
630       * Sets the {@link Rest#uriRelativity()} property on this annotation.
631       *
632       * @param value The new value for this property.
633       * @return This object.
634       */
635      public Builder uriRelativity(String value) {
636         this.uriRelativity = value;
637         return this;
638      }
639
640      /**
641       * Sets the {@link Rest#uriResolution()} property on this annotation.
642       *
643       * @param value The new value for this property.
644       * @return This object.
645       */
646      public Builder uriResolution(String value) {
647         this.uriResolution = value;
648         return this;
649      }
650
651      // <FluentSetters>
652
653      @Override /* GENERATED - TargetedAnnotationBuilder */
654      public Builder on(String...values) {
655         super.on(values);
656         return this;
657      }
658
659      @Override /* GENERATED - TargetedAnnotationTBuilder */
660      public Builder on(java.lang.Class<?>...value) {
661         super.on(value);
662         return this;
663      }
664
665      @Override /* GENERATED - TargetedAnnotationTBuilder */
666      public Builder onClass(java.lang.Class<?>...value) {
667         super.onClass(value);
668         return this;
669      }
670
671      // </FluentSetters>
672   }
673
674   //-----------------------------------------------------------------------------------------------------------------
675   // Implementation
676   //-----------------------------------------------------------------------------------------------------------------
677
678   private static class Impl extends TargetedAnnotationTImpl implements Rest {
679
680      private final Class<? extends Encoder>[] encoders;
681      private final Class<? extends HttpPartParser> partParser;
682      private final Class<? extends HttpPartSerializer> partSerializer;
683      private final Class<? extends StaticFiles> staticFiles;
684      private final Class<? extends ResponseProcessor>[] responseProcessors;
685      private final Class<? extends CallLogger> callLogger;
686      private final Class<? extends RestConverter>[] converters;
687      private final Class<? extends RestGuard>[] guards;
688      private final Class<? extends SwaggerProvider> swaggerProvider;
689      private final Class<? extends RestOpArg>[] restOpArgs;
690      private final Class<? extends BeanStore> beanStore;
691      private final Class<? extends RestChildren> restChildrenClass;
692      private final Class<? extends RestOperations> restOperationsClass;
693      private final Class<? extends DebugEnablement> debugEnablement;
694      private final Class<? extends Serializer>[] serializers;
695      private final Class<?>[] children, parsers;
696      private final Swagger swagger;
697      private final String disableContentParam, allowedHeaderParams, allowedMethodHeaders, allowedMethodParams, clientVersionHeader, config, debug, debugOn, defaultAccept, defaultCharset, defaultContentType, maxInput, messages, path, renderResponseStackTraces, roleGuard, rolesDeclared, siteName, uriAuthority, uriContext, uriRelativity, uriResolution;
698      private final String[] consumes, description, produces, defaultRequestAttributes, defaultRequestHeaders, defaultResponserHeaders, title;
699
700      Impl(Builder b) {
701         super(b);
702         this.disableContentParam = b.disableContentParam;
703         this.allowedHeaderParams = b.allowedHeaderParams;
704         this.allowedMethodHeaders = b.allowedMethodHeaders;
705         this.allowedMethodParams = b.allowedMethodParams;
706         this.beanStore = b.beanStore;
707         this.callLogger = b.callLogger;
708         this.children = copyOf(b.children);
709         this.clientVersionHeader = b.clientVersionHeader;
710         this.config = b.config;
711         this.consumes = copyOf(b.consumes);
712         this.converters = copyOf(b.converters);
713         this.debug = b.debug;
714         this.debugEnablement = b.debugEnablement;
715         this.debugOn = b.debugOn;
716         this.defaultAccept = b.defaultAccept;
717         this.defaultCharset = b.defaultCharset;
718         this.defaultContentType = b.defaultContentType;
719         this.defaultRequestAttributes = copyOf(b.defaultRequestAttributes);
720         this.defaultRequestHeaders = copyOf(b.defaultRequestHeaders);
721         this.defaultResponserHeaders = copyOf(b.defaultResponseHeaders);
722         this.description = copyOf(b.description);
723         this.encoders = copyOf(b.encoders);
724         this.guards = copyOf(b.guards);
725         this.maxInput = b.maxInput;
726         this.messages = b.messages;
727         this.parsers = copyOf(b.parsers);
728         this.partParser = b.partParser;
729         this.partSerializer = b.partSerializer;
730         this.path = b.path;
731         this.produces = copyOf(b.produces);
732         this.renderResponseStackTraces = b.renderResponseStackTraces;
733         this.responseProcessors = copyOf(b.responseProcessors);
734         this.restChildrenClass = b.restChildrenClass;
735         this.restOperationsClass = b.restOperationsClass;
736         this.restOpArgs = copyOf(b.restOpArgs);
737         this.roleGuard = b.roleGuard;
738         this.rolesDeclared = b.rolesDeclared;
739         this.serializers = copyOf(b.serializers);
740         this.siteName = b.siteName;
741         this.staticFiles = b.staticFiles;
742         this.swagger = b.swagger;
743         this.swaggerProvider = b.swaggerProvider;
744         this.title = copyOf(b.title);
745         this.uriAuthority = b.uriAuthority;
746         this.uriContext = b.uriContext;
747         this.uriRelativity = b.uriRelativity;
748         this.uriResolution = b.uriResolution;
749         postConstruct();
750      }
751
752      @Override /* Rest */
753      public String disableContentParam() {
754         return disableContentParam;
755      }
756
757      @Override /* Rest */
758      public String allowedHeaderParams() {
759         return allowedHeaderParams;
760      }
761
762      @Override /* Rest */
763      public String allowedMethodHeaders() {
764         return allowedMethodHeaders;
765      }
766
767      @Override /* Rest */
768      public String allowedMethodParams() {
769         return allowedMethodParams;
770      }
771
772      @Override /* Rest */
773      public Class<? extends BeanStore> beanStore() {
774         return beanStore;
775      }
776
777      @Override /* Rest */
778      public Class<? extends CallLogger> callLogger() {
779         return callLogger;
780      }
781
782      @Override /* Rest */
783      public Class<?>[] children() {
784         return children;
785      }
786
787      @Override /* Rest */
788      public String clientVersionHeader() {
789         return clientVersionHeader;
790      }
791
792      @Override /* Rest */
793      public String config() {
794         return config;
795      }
796
797      @Override /* Rest */
798      public String[] consumes() {
799         return consumes;
800      }
801
802      @Override /* Rest */
803      public Class<? extends RestConverter>[] converters() {
804         return converters;
805      }
806
807      @Override /* Rest */
808      public String debug() {
809         return debug;
810      }
811
812      @Override /* Rest */
813      public Class<? extends DebugEnablement> debugEnablement() {
814         return debugEnablement;
815      }
816
817      @Override /* Rest */
818      public String debugOn() {
819         return debugOn;
820      }
821
822      @Override /* Rest */
823      public String defaultAccept() {
824         return defaultAccept;
825      }
826
827      @Override /* Rest */
828      public String defaultCharset() {
829         return defaultCharset;
830      }
831
832      @Override /* Rest */
833      public String defaultContentType() {
834         return defaultContentType;
835      }
836
837      @Override /* Rest */
838      public String[] defaultRequestAttributes() {
839         return defaultRequestAttributes;
840      }
841
842      @Override /* Rest */
843      public String[] defaultRequestHeaders() {
844         return defaultRequestHeaders;
845      }
846
847      @Override /* Rest */
848      public String[] defaultResponseHeaders() {
849         return defaultResponserHeaders;
850      }
851
852      @Override /* Rest */
853      public String[] description() {
854         return description;
855      }
856
857      @Override /* Rest */
858      public Class<? extends Encoder>[] encoders() {
859         return encoders;
860      }
861
862      @Override /* Rest */
863      public Class<? extends RestGuard>[] guards() {
864         return guards;
865      }
866
867      @Override /* Rest */
868      public String maxInput() {
869         return maxInput;
870      }
871
872      @Override /* Rest */
873      public String messages() {
874         return messages;
875      }
876
877      @Override /* Rest */
878      public Class<?>[] parsers() {
879         return parsers;
880      }
881
882      @Override /* Rest */
883      public Class<? extends HttpPartParser> partParser() {
884         return partParser;
885      }
886
887      @Override /* Rest */
888      public Class<? extends HttpPartSerializer> partSerializer() {
889         return partSerializer;
890      }
891
892      @Override /* Rest */
893      public String path() {
894         return path;
895      }
896
897      @Override /* Rest */
898      public String[] produces() {
899         return produces;
900      }
901
902      @Override /* Rest */
903      public String renderResponseStackTraces() {
904         return renderResponseStackTraces;
905      }
906
907      @Override /* Rest */
908      public Class<? extends ResponseProcessor>[] responseProcessors() {
909         return responseProcessors;
910      }
911
912      @Override /* Rest */
913      public Class<? extends RestChildren> restChildrenClass() {
914         return restChildrenClass;
915      }
916
917      @Override /* Rest */
918      public Class<? extends RestOpArg>[] restOpArgs() {
919         return restOpArgs;
920      }
921
922      @Override /* Rest */
923      public Class<? extends RestOperations> restOperationsClass() {
924         return restOperationsClass;
925      }
926
927      @Override /* Rest */
928      public String roleGuard() {
929         return roleGuard;
930      }
931
932      @Override /* Rest */
933      public String rolesDeclared() {
934         return rolesDeclared;
935      }
936
937      @Override /* Rest */
938      public Class<? extends Serializer>[] serializers() {
939         return serializers;
940      }
941
942      @Override /* Rest */
943      public String siteName() {
944         return siteName;
945      }
946
947      @Override /* Rest */
948      public Class<? extends StaticFiles> staticFiles() {
949         return staticFiles;
950      }
951
952      @Override /* Rest */
953      public Swagger swagger() {
954         return swagger;
955      }
956
957      @Override /* Rest */
958      public Class<? extends SwaggerProvider> swaggerProvider() {
959         return swaggerProvider;
960      }
961
962      @Override /* Rest */
963      public String[] title() {
964         return title;
965      }
966
967      @Override /* Rest */
968      public String uriAuthority() {
969         return uriAuthority;
970      }
971
972      @Override /* Rest */
973      public String uriContext() {
974         return uriContext;
975      }
976
977      @Override /* Rest */
978      public String uriRelativity() {
979         return uriRelativity;
980      }
981
982      @Override /* Rest */
983      public String uriResolution() {
984         return uriResolution;
985      }
986   }
987
988   //-----------------------------------------------------------------------------------------------------------------
989   // Appliers
990   //-----------------------------------------------------------------------------------------------------------------
991
992   /**
993    * Applies {@link Rest} annotations to a {@link org.apache.juneau.rest.RestContext.Builder}.
994    */
995   public static class RestContextApply extends AnnotationApplier<Rest,RestContext.Builder> {
996
997      /**
998       * Constructor.
999       *
1000       * @param vr The resolver for resolving values in annotations.
1001       */
1002      public RestContextApply(VarResolverSession vr) {
1003         super(Rest.class, RestContext.Builder.class, vr);
1004      }
1005
1006      @Override
1007      public void apply(AnnotationInfo<Rest> ai, RestContext.Builder b) {
1008         Rest a = ai.inner();
1009
1010         classes(a.serializers()).ifPresent(x -> b.serializers().add(x));
1011         classes(a.parsers()).ifPresent(x -> b.parsers().add(x));
1012         type(a.partSerializer()).ifPresent(x -> b.partSerializer().type(x));
1013         type(a.partParser()).ifPresent(x -> b.partParser().type(x));
1014         stream(a.produces()).map(MediaType::of).forEach(x -> b.produces(x));
1015         stream(a.consumes()).map(MediaType::of).forEach(x -> b.consumes(x));
1016         stream(a.defaultRequestAttributes()).map(x -> BasicNamedAttribute.ofPair(x)).forEach(x -> b.defaultRequestAttributes(x));
1017         stream(a.defaultRequestHeaders()).map(x -> stringHeader(x)).forEach(x -> b.defaultRequestHeaders(x));
1018         stream(a.defaultResponseHeaders()).map(x -> stringHeader(x)).forEach(x -> b.defaultResponseHeaders(x));
1019         string(a.defaultAccept()).map(x -> accept(x)).ifPresent(x -> b.defaultRequestHeaders(x));
1020         string(a.defaultContentType()).map(x -> contentType(x)).ifPresent(x -> b.defaultRequestHeaders(x));
1021         b.responseProcessors().add(a.responseProcessors());
1022         b.children((Object[])a.children());
1023         b.restOpArgs(a.restOpArgs());
1024         classes(a.encoders()).ifPresent(x -> b.encoders().add(x));
1025         string(a.uriContext()).ifPresent(x -> b.uriContext(x));
1026         string(a.uriAuthority()).ifPresent(x -> b.uriAuthority(x));
1027         string(a.uriRelativity()).map(UriRelativity::valueOf).ifPresent(x -> b.uriRelativity(x));
1028         string(a.uriResolution()).map(UriResolution::valueOf).ifPresent(x -> b.uriResolution(x));
1029         b.messages().location(string(a.messages()).orElse(null));
1030         type(a.staticFiles()).ifPresent(x -> b.staticFiles().type(x));
1031         string(a.path()).ifPresent(x -> b.path(x));
1032         string(a.clientVersionHeader()).ifPresent(x -> b.clientVersionHeader(x));
1033         type(a.callLogger()).ifPresent(x -> b.callLogger().type(x));
1034         type(a.swaggerProvider()).ifPresent(x -> b.swaggerProvider(x));
1035         type(a.restChildrenClass()).ifPresent(x -> b.restChildrenClass(x));
1036         type(a.restOperationsClass()).ifPresent(x -> b.restOperationsClass(x));
1037         type(a.debugEnablement()).ifPresent(x -> b.debugEnablement().type(x));
1038         string(a.disableContentParam()).map(Boolean::parseBoolean).ifPresent(x -> b.disableContentParam(x));
1039         string(a.allowedHeaderParams()).ifPresent(x -> b.allowedHeaderParams(x));
1040         string(a.allowedMethodHeaders()).ifPresent(x -> b.allowedMethodHeaders(x));
1041         string(a.allowedMethodParams()).ifPresent(x -> b.allowedMethodParams(x));
1042         bool(a.renderResponseStackTraces()).ifPresent(x -> b.renderResponseStackTraces(x));
1043      }
1044   }
1045
1046   /**
1047    * Applies {@link Rest} annotations to a {@link org.apache.juneau.rest.RestOpContext.Builder}.
1048    */
1049   public static class RestOpContextApply extends AnnotationApplier<Rest,RestOpContext.Builder> {
1050
1051      /**
1052       * Constructor.
1053       *
1054       * @param vr The resolver for resolving values in annotations.
1055       */
1056      public RestOpContextApply(VarResolverSession vr) {
1057         super(Rest.class, RestOpContext.Builder.class, vr);
1058      }
1059
1060      @Override
1061      public void apply(AnnotationInfo<Rest> ai, RestOpContext.Builder b) {
1062         Rest a = ai.inner();
1063
1064         stream(a.produces()).map(MediaType::of).forEach(x -> b.produces(x));
1065         stream(a.consumes()).map(MediaType::of).forEach(x -> b.consumes(x));
1066         b.converters().append(a.converters());
1067         b.guards().append(a.guards());
1068         string(a.defaultCharset()).map(Charset::forName).ifPresent(x -> b.defaultCharset(x));
1069         string(a.maxInput()).ifPresent(x -> b.maxInput(x));
1070         cdl(a.rolesDeclared()).forEach(x -> b.rolesDeclared(x));
1071         string(a.roleGuard()).ifPresent(x -> b.roleGuard(x));
1072      }
1073   }
1074}