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.encoders.*;
026import org.apache.juneau.http.*;
027import org.apache.juneau.commons.annotation.*;
028import org.apache.juneau.commons.reflect.*;
029import org.apache.juneau.rest.*;
030import org.apache.juneau.rest.guard.*;
031import org.apache.juneau.rest.httppart.*;
032import org.apache.juneau.rest.matcher.*;
033import org.apache.juneau.svl.*;
034
035/**
036 * Utility classes and methods for the {@link RestDelete @RestDelete} annotation.
037 *
038 * <h5 class='section'>See Also:</h5><ul>
039 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/RestOpAnnotatedMethodBasics">@RestOp-Annotated Method Basics</a>
040 * </ul>
041 */
042public class RestDeleteAnnotation {
043   /**
044    * Builder class.
045    *
046    * <h5 class='section'>See Also:</h5><ul>
047    *    <li class='jm'>{@link org.apache.juneau.BeanContext.Builder#annotations(Annotation...)}
048    * </ul>
049    */
050   @SuppressWarnings("unchecked")
051   public static class Builder extends AppliedAnnotationObject.BuilderM {
052
053      private String[] description = {};
054      private Class<? extends RestGuard>[] guards = new Class[0];
055      private Class<? extends RestMatcher>[] matchers = new Class[0];
056      private Class<? extends Encoder>[] encoders = new Class[0];
057      private OpSwagger swagger = OpSwaggerAnnotation.DEFAULT;
058      private String clientVersion = "", debug = "", defaultAccept = "", defaultCharset = "", rolesDeclared = "", roleGuard = "", summary = "", value = "";
059      private String[] defaultRequestQueryData = {}, defaultRequestAttributes = {}, defaultRequestHeaders = {}, defaultResponseHeaders = {}, path = {};
060
061      /**
062       * Constructor.
063       */
064      protected Builder() {
065         super(RestDelete.class);
066      }
067
068      /**
069       * Instantiates a new {@link RestDelete @RestDelete} object initialized with this builder.
070       *
071       * @return A new {@link RestDelete @RestDelete} object.
072       */
073      public RestDelete build() {
074         return new Object(this);
075      }
076
077      /**
078       * Sets the description property on this annotation.
079       *
080       * @param value The new value for this property.
081       * @return This object.
082       */
083      public Builder description(String...value) {
084         description = value;
085         return this;
086      }
087
088      /**
089       * Sets the {@link RestDelete#clientVersion()} property on this annotation.
090       *
091       * @param value The new value for this property.
092       * @return This object.
093       */
094      public Builder clientVersion(String value) {
095         clientVersion = value;
096         return this;
097      }
098
099      /**
100       * Sets the {@link RestDelete#debug()} property on this annotation.
101       *
102       * @param value The new value for this property.
103       * @return This object.
104       */
105      public Builder debug(String value) {
106         debug = value;
107         return this;
108      }
109
110      /**
111       * Sets the {@link RestDelete#defaultAccept()} property on this annotation.
112       *
113       * @param value The new value for this property.
114       * @return This object.
115       */
116      public Builder defaultAccept(String value) {
117         defaultAccept = value;
118         return this;
119      }
120
121      /**
122       * Sets the {@link RestDelete#defaultCharset()} property on this annotation.
123       *
124       * @param value The new value for this property.
125       * @return This object.
126       */
127      public Builder defaultCharset(String value) {
128         defaultCharset = value;
129         return this;
130      }
131
132      /**
133       * Sets the {@link RestDelete#defaultRequestAttributes()} property on this annotation.
134       *
135       * @param value The new value for this property.
136       * @return This object.
137       */
138      public Builder defaultRequestAttributes(String...value) {
139         defaultRequestAttributes = value;
140         return this;
141      }
142
143      /**
144       * Sets the {@link RestDelete#defaultRequestHeaders()} property on this annotation.
145       *
146       * @param value The new value for this property.
147       * @return This object.
148       */
149      public Builder defaultRequestHeaders(String...value) {
150         defaultRequestHeaders = value;
151         return this;
152      }
153
154      /**
155       * Sets the {@link RestDelete#defaultRequestQueryData()} property on this annotation.
156       *
157       * @param value The new value for this property.
158       * @return This object.
159       */
160      public Builder defaultRequestQueryData(String...value) {
161         defaultRequestQueryData = value;
162         return this;
163      }
164
165      /**
166       * Sets the {@link RestDelete#defaultResponseHeaders()} property on this annotation.
167       *
168       * @param value The new value for this property.
169       * @return This object.
170       */
171      public Builder defaultResponseHeaders(String...value) {
172         defaultResponseHeaders = value;
173         return this;
174      }
175
176      /**
177       * Sets the {@link RestDelete#encoders()} property on this annotation.
178       *
179       * @param value The new value for this property.
180       * @return This object.
181       */
182      @SafeVarargs
183      public final Builder encoders(Class<? extends Encoder>...value) {
184         encoders = value;
185         return this;
186      }
187
188      /**
189       * Sets the {@link RestDelete#guards()} property on this annotation.
190       *
191       * @param value The new value for this property.
192       * @return This object.
193       */
194      @SafeVarargs
195      public final Builder guards(Class<? extends RestGuard>...value) {
196         guards = value;
197         return this;
198      }
199
200      /**
201       * Sets the {@link RestDelete#matchers()} property on this annotation.
202       *
203       * @param value The new value for this property.
204       * @return This object.
205       */
206      @SafeVarargs
207      public final Builder matchers(Class<? extends RestMatcher>...value) {
208         matchers = value;
209         return this;
210      }
211
212      /**
213       * Sets the {@link RestDelete#path()} property on this annotation.
214       *
215       * @param value The new value for this property.
216       * @return This object.
217       */
218      public Builder path(String...value) {
219         path = value;
220         return this;
221      }
222
223      /**
224       * Sets the {@link RestDelete#roleGuard()} property on this annotation.
225       *
226       * @param value The new value for this property.
227       * @return This object.
228       */
229      public Builder roleGuard(String value) {
230         roleGuard = value;
231         return this;
232      }
233
234      /**
235       * Sets the {@link RestDelete#rolesDeclared()} property on this annotation.
236       *
237       * @param value The new value for this property.
238       * @return This object.
239       */
240      public Builder rolesDeclared(String value) {
241         rolesDeclared = value;
242         return this;
243      }
244
245      /**
246       * Sets the {@link RestDelete#summary()} property on this annotation.
247       *
248       * @param value The new value for this property.
249       * @return This object.
250       */
251      public Builder summary(String value) {
252         summary = value;
253         return this;
254      }
255
256      /**
257       * Sets the {@link RestDelete#swagger()} property on this annotation.
258       *
259       * @param value The new value for this property.
260       * @return This object.
261       */
262      public Builder swagger(OpSwagger value) {
263         swagger = value;
264         return this;
265      }
266
267      /**
268       * Sets the {@link RestDelete#value()} property on this annotation.
269       *
270       * @param value The new value for this property.
271       * @return This object.
272       */
273      public Builder value(String value) {
274         this.value = value;
275         return this;
276      }
277
278      @Override /* Overridden from AppliedAnnotationObject.Builder */
279      public Builder on(String...value) {
280         super.on(value);
281         return this;
282      }
283
284      @Override /* Overridden from AppliedAnnotationObject.BuilderM */
285      public Builder on(java.lang.reflect.Method...value) {
286         super.on(value);
287         return this;
288      }
289   
290      @Override /* Overridden from AppliedAnnotationObject.BuilderM */
291      public Builder on(MethodInfo...value) {
292         super.on(value);
293         return this;
294      }
295
296   }
297
298   /**
299    * Applies {@link RestDelete} annotations to a {@link org.apache.juneau.rest.RestOpContext.Builder}.
300    */
301   public static class RestOpContextApply extends AnnotationApplier<RestDelete,RestOpContext.Builder> {
302
303      /**
304       * Constructor.
305       *
306       * @param vr The resolver for resolving values in annotations.
307       */
308      public RestOpContextApply(VarResolverSession vr) {
309         super(RestDelete.class, RestOpContext.Builder.class, vr);
310      }
311
312      @Override
313      public void apply(AnnotationInfo<RestDelete> ai, RestOpContext.Builder b) {
314         RestDelete a = ai.inner();
315
316         b.httpMethod("delete");
317
318         classes(a.encoders()).ifPresent(x -> b.encoders().set(x));
319         stream(a.defaultRequestHeaders()).map(HttpHeaders::stringHeader).forEach(x -> b.defaultRequestHeaders().setDefault(x));
320         stream(a.defaultResponseHeaders()).map(HttpHeaders::stringHeader).forEach(x -> b.defaultResponseHeaders().setDefault(x));
321         stream(a.defaultRequestAttributes()).map(BasicNamedAttribute::ofPair).forEach(x -> b.defaultRequestAttributes().add(x));
322         stream(a.defaultRequestQueryData()).map(HttpParts::basicPart).forEach(x -> b.defaultRequestQueryData().setDefault(x));
323         string(a.defaultAccept()).map(HttpHeaders::accept).ifPresent(x -> b.defaultRequestHeaders().setDefault(x));
324         b.guards().append(a.guards());
325         b.matchers().append(a.matchers());
326         string(a.clientVersion()).ifPresent(x -> b.clientVersion(x));
327         string(a.defaultCharset()).map(Charset::forName).ifPresent(x -> b.defaultCharset(x));
328         stream(a.path()).forEach(x -> b.path(x));
329         string(a.value()).ifPresent(x -> b.path(x));
330         cdl(a.rolesDeclared()).forEach(x -> b.rolesDeclared(x));
331         string(a.roleGuard()).ifPresent(x -> b.roleGuard(x));
332         string(a.debug()).map(Enablement::fromString).ifPresent(x -> b.debug(x));
333      }
334
335   }
336
337   private static class Object extends AppliedAnnotationObject implements RestDelete {
338
339      private final String[] description;
340      private final Class<? extends RestGuard>[] guards;
341      private final Class<? extends RestMatcher>[] matchers;
342      private final Class<? extends Encoder>[] encoders;
343      private final OpSwagger swagger;
344      private final String clientVersion, debug, defaultAccept, defaultCharset, rolesDeclared, roleGuard, summary, value;
345      private final String[] defaultRequestQueryData, defaultRequestAttributes, defaultRequestHeaders, defaultResponseHeaders, path;
346
347      Object(RestDeleteAnnotation.Builder b) {
348         super(b);
349         description = copyOf(b.description);
350         clientVersion = b.clientVersion;
351         debug = b.debug;
352         defaultAccept = b.defaultAccept;
353         defaultCharset = b.defaultCharset;
354         defaultRequestQueryData = copyOf(b.defaultRequestQueryData);
355         defaultRequestAttributes = copyOf(b.defaultRequestAttributes);
356         defaultRequestHeaders = copyOf(b.defaultRequestHeaders);
357         defaultResponseHeaders = copyOf(b.defaultResponseHeaders);
358         encoders = copyOf(b.encoders);
359         guards = copyOf(b.guards);
360         matchers = copyOf(b.matchers);
361         path = copyOf(b.path);
362         roleGuard = b.roleGuard;
363         rolesDeclared = b.rolesDeclared;
364         summary = b.summary;
365         swagger = b.swagger;
366         value = b.value;
367      }
368
369      @Override /* Overridden from RestDelete */
370      public String clientVersion() {
371         return clientVersion;
372      }
373
374      @Override /* Overridden from RestDelete */
375      public String debug() {
376         return debug;
377      }
378
379      @Override /* Overridden from RestDelete */
380      public String defaultAccept() {
381         return defaultAccept;
382      }
383
384      @Override /* Overridden from RestDelete */
385      public String defaultCharset() {
386         return defaultCharset;
387      }
388
389      @Override /* Overridden from RestDelete */
390      public String[] defaultRequestAttributes() {
391         return defaultRequestAttributes;
392      }
393
394      @Override /* Overridden from RestDelete */
395      public String[] defaultRequestHeaders() {
396         return defaultRequestHeaders;
397      }
398
399      @Override /* Overridden from RestDelete */
400      public String[] defaultRequestQueryData() {
401         return defaultRequestQueryData;
402      }
403
404      @Override /* Overridden from RestDelete */
405      public String[] defaultResponseHeaders() {
406         return defaultResponseHeaders;
407      }
408
409      @Override /* Overridden from RestDelete */
410      public Class<? extends Encoder>[] encoders() {
411         return encoders;
412      }
413
414      @Override /* Overridden from RestDelete */
415      public Class<? extends RestGuard>[] guards() {
416         return guards;
417      }
418
419      @Override /* Overridden from RestDelete */
420      public Class<? extends RestMatcher>[] matchers() {
421         return matchers;
422      }
423
424      @Override /* Overridden from RestDelete */
425      public String[] path() {
426         return path;
427      }
428
429      @Override /* Overridden from RestDelete */
430      public String roleGuard() {
431         return roleGuard;
432      }
433
434      @Override /* Overridden from RestDelete */
435      public String rolesDeclared() {
436         return rolesDeclared;
437      }
438
439      @Override /* Overridden from RestDelete */
440      public String summary() {
441         return summary;
442      }
443
444      @Override /* Overridden from RestDelete */
445      public OpSwagger swagger() {
446         return swagger;
447      }
448
449      @Override /* Overridden from RestDelete */
450      public String value() {
451         return value;
452      }
453
454      @Override /* Overridden from annotation */
455      public String[] description() {
456         return description;
457      }
458   }
459
460   /** Default value */
461   public static final RestDelete DEFAULT = create().build();
462
463   /**
464    * Instantiates a new builder for this class.
465    *
466    * @return A new builder object.
467    */
468   public static Builder create() {
469      return new Builder();
470   }
471}