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