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;
014
015import static org.apache.juneau.BeanTraverseContext.*;
016
017import java.lang.annotation.*;
018import java.lang.reflect.*;
019import java.util.*;
020
021import org.apache.juneau.http.*;
022import org.apache.juneau.reflect.*;
023import org.apache.juneau.svl.*;
024
025/**
026 * Builder class for building instances of bean traversals.
027 */
028public class BeanTraverseBuilder extends BeanContextBuilder {
029
030   /**
031    * Constructor, default settings.
032    */
033   public BeanTraverseBuilder() {
034      super();
035   }
036
037   /**
038    * Constructor.
039    *
040    * @param ps The initial configuration settings for this builder.
041    */
042   public BeanTraverseBuilder(PropertyStore ps) {
043      super(ps);
044   }
045
046   //-----------------------------------------------------------------------------------------------------------------
047   // Properties
048   //-----------------------------------------------------------------------------------------------------------------
049
050   /**
051    * Configuration property:  Automatically detect POJO recursions.
052    *
053    * <p>
054    * Specifies that recursions should be checked for during traversal.
055    *
056    * <ul class='notes'>
057    *    <li>
058    *       Checking for recursion can cause a small performance penalty.
059    * </ul>
060    *
061    * <ul class='seealso'>
062    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
063    * </ul>
064    *
065    * @param value
066    *    The new value for this property.
067    *    <br>The default is <jk>false</jk>.
068    * @return This object (for method chaining).
069    */
070   public BeanTraverseBuilder detectRecursions(boolean value) {
071      return set(BEANTRAVERSE_detectRecursions, value);
072   }
073
074   /**
075    * Configuration property:  Automatically detect POJO recursions.
076    *
077    * <p>
078    * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
079    *
080    * <ul class='seealso'>
081    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
082    * </ul>
083    *
084    * @return This object (for method chaining).
085    */
086   public BeanTraverseBuilder detectRecursions() {
087      return set(BEANTRAVERSE_detectRecursions, true);
088   }
089
090   /**
091    * Configuration property:  Ignore recursion errors.
092    *
093    * <p>
094    * If <jk>true</jk>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
095    * Otherwise, an exception is thrown.
096    *
097    * <ul class='notes'>
098    *    <li>
099    *       Checking for recursion can cause a small performance penalty.
100    * </ul>
101    *
102    * <ul class='seealso'>
103    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
104    * </ul>
105    *
106    * @param value
107    *    The new value for this property.
108    *    <br>The default is <jk>false</jk>.
109    * @return This object (for method chaining).
110    */
111   public BeanTraverseBuilder ignoreRecursions(boolean value) {
112      return set(BEANTRAVERSE_ignoreRecursions, value);
113   }
114
115   /**
116    * Configuration property:  Ignore recursion errors.
117    *
118    * <p>
119    * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
120    *
121    * <ul class='seealso'>
122    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
123    * </ul>
124    *
125    * @return This object (for method chaining).
126    */
127   public BeanTraverseBuilder ignoreRecursions() {
128      return set(BEANTRAVERSE_ignoreRecursions, true);
129   }
130
131   /**
132    * Configuration property:  Initial depth.
133    *
134    * <p>
135    * The initial indentation level at the root.
136    *
137    * <ul class='seealso'>
138    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
139    * </ul>
140    *
141    * @param value
142    *    The new value for this property.
143    *    <br>The default is <c>0</c>.
144    * @return This object (for method chaining).
145    */
146   public BeanTraverseBuilder initialDepth(int value) {
147      return set(BEANTRAVERSE_initialDepth, value);
148   }
149
150   /**
151    * Configuration property:  Max traversal depth.
152    *
153    * <p>
154    * Abort traversal if specified depth is reached in the POJO tree.
155    * <br>If this depth is exceeded, an exception is thrown.
156    * <br>This prevents stack overflows from occurring when trying to traverse models with recursive references.
157    *
158    * <ul class='seealso'>
159    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
160    * </ul>
161    *
162    * @param value
163    *    The new value for this property.
164    *    <br>The default is <c>100</c>.
165    * @return This object (for method chaining).
166    */
167   public BeanTraverseBuilder maxDepth(int value) {
168      return set(BEANTRAVERSE_maxDepth, value);
169   }
170
171   @Override /* BeanContextBuilder */
172   public BeanTraverseBuilder annotations(Annotation...values) {
173      super.annotations(values);
174      return this;
175   }
176
177   @Override /* BeanContextBuilder */
178   public BeanTraverseBuilder beanClassVisibility(Visibility value) {
179      super.beanClassVisibility(value);
180      return this;
181   }
182
183   @Override /* BeanContextBuilder */
184   public BeanTraverseBuilder beanConstructorVisibility(Visibility value) {
185      super.beanConstructorVisibility(value);
186      return this;
187   }
188
189   @Override /* BeanContextBuilder */
190   @Deprecated
191   public BeanTraverseBuilder beanDictionary(Class<?>...values) {
192      super.beanDictionary(values);
193      return this;
194   }
195
196   @Override /* BeanContextBuilder */
197   @Deprecated
198   public BeanTraverseBuilder beanDictionary(Object...values) {
199      super.beanDictionary(values);
200      return this;
201   }
202
203   @Override /* BeanContextBuilder */
204   @Deprecated
205   public BeanTraverseBuilder beanDictionaryReplace(Class<?>...values) {
206      super.beanDictionaryReplace(values);
207      return this;
208   }
209
210   @Override /* BeanContextBuilder */
211   @Deprecated
212   public BeanTraverseBuilder beanDictionaryReplace(Object...values) {
213      super.beanDictionaryReplace(values);
214      return this;
215   }
216
217   @Override /* BeanContextBuilder */
218   @Deprecated
219   public BeanTraverseBuilder beanDictionaryRemove(Class<?>...values) {
220      super.beanDictionaryRemove(values);
221      return this;
222   }
223
224   @Override /* BeanContextBuilder */
225   @Deprecated
226   public BeanTraverseBuilder beanDictionaryRemove(Object...values) {
227      super.beanDictionaryRemove(values);
228      return this;
229   }
230
231   @Override /* BeanContextBuilder */
232   public BeanTraverseBuilder beanFieldVisibility(Visibility value) {
233      super.beanFieldVisibility(value);
234      return this;
235   }
236
237   @Override /* BeanContextBuilder */
238   public BeanTraverseBuilder beanFilters(Class<?>...values) {
239      super.beanFilters(values);
240      return this;
241   }
242
243   @Override /* BeanContextBuilder */
244   public BeanTraverseBuilder beanFilters(Object...values) {
245      super.beanFilters(values);
246      return this;
247   }
248
249   @Override /* BeanContextBuilder */
250   public BeanTraverseBuilder beanFiltersReplace(Class<?>...values) {
251      super.beanFiltersReplace(values);
252      return this;
253   }
254
255   @Override /* BeanContextBuilder */
256   public BeanTraverseBuilder beanFiltersReplace(Object...values) {
257      super.beanFiltersReplace(values);
258      return this;
259   }
260
261   @Override /* BeanContextBuilder */
262   public BeanTraverseBuilder beanFiltersRemove(Class<?>...values) {
263      super.beanFiltersRemove(values);
264      return this;
265   }
266
267   @Override /* BeanContextBuilder */
268   public BeanTraverseBuilder beanFiltersRemove(Object...values) {
269      super.beanFiltersRemove(values);
270      return this;
271   }
272
273   @Override /* BeanContextBuilder */
274   public BeanTraverseBuilder beanMapPutReturnsOldValue(boolean value) {
275      super.beanMapPutReturnsOldValue(value);
276      return this;
277   }
278
279   @Override /* BeanContextBuilder */
280   public BeanTraverseBuilder beanMapPutReturnsOldValue() {
281      super.beanMapPutReturnsOldValue();
282      return this;
283   }
284
285   @Override /* BeanContextBuilder */
286   public BeanTraverseBuilder beanMethodVisibility(Visibility value) {
287      super.beanMethodVisibility(value);
288      return this;
289   }
290
291   @Override /* BeanContextBuilder */
292   public BeanTraverseBuilder beansRequireDefaultConstructor(boolean value) {
293      super.beansRequireDefaultConstructor(value);
294      return this;
295   }
296
297   @Override /* BeanContextBuilder */
298   public BeanTraverseBuilder beansRequireDefaultConstructor() {
299      super.beansRequireDefaultConstructor();
300      return this;
301   }
302
303   @Override /* BeanContextBuilder */
304   public BeanTraverseBuilder beansRequireSerializable(boolean value) {
305      super.beansRequireSerializable(value);
306      return this;
307   }
308
309   @Override /* BeanContextBuilder */
310   public BeanTraverseBuilder beansRequireSerializable() {
311      super.beansRequireSerializable();
312      return this;
313   }
314
315   @Override /* BeanContextBuilder */
316   public BeanTraverseBuilder beansRequireSettersForGetters(boolean value) {
317      super.beansRequireSettersForGetters(value);
318      return this;
319   }
320
321   @Override /* BeanContextBuilder */
322   public BeanTraverseBuilder beansRequireSettersForGetters() {
323      super.beansRequireSettersForGetters();
324      return this;
325   }
326
327   @Override /* BeanContextBuilder */
328   public BeanTraverseBuilder beansRequireSomeProperties(boolean value) {
329      super.beansRequireSomeProperties(value);
330      return this;
331   }
332
333   @Override /* BeanContextBuilder */
334   public BeanTraverseBuilder beanTypePropertyName(String value) {
335      super.beanTypePropertyName(value);
336      return this;
337   }
338
339   @Override /* BeanContextBuilder */
340   public BeanTraverseBuilder bpi(Class<?> beanClass, String value) {
341      super.bpi(beanClass, value);
342      return this;
343   }
344
345   @Override /* BeanContextBuilder */
346   public BeanTraverseBuilder bpi(Map<String,String> values) {
347      super.bpi(values);
348      return this;
349   }
350
351   @Override /* BeanContextBuilder */
352   public BeanTraverseBuilder bpi(String beanClassName, String value) {
353      super.bpi(beanClassName, value);
354      return this;
355   }
356
357   @Override /* BeanContextBuilder */
358   public BeanTraverseBuilder bpx(Class<?> beanClass, String properties) {
359      super.bpx(beanClass, properties);
360      return this;
361   }
362
363   @Override /* BeanContextBuilder */
364   public BeanTraverseBuilder bpx(Map<String,String> values) {
365      super.bpx(values);
366      return this;
367   }
368
369   @Override /* BeanContextBuilder */
370   public BeanTraverseBuilder bpx(String beanClassName, String value) {
371      super.bpx(beanClassName, value);
372      return this;
373   }
374
375   @Override /* BeanContextBuilder */
376   public BeanTraverseBuilder bpro(Class<?> beanClass, String value) {
377      super.bpro(beanClass, value);
378      return this;
379   }
380
381   @Override /* BeanContextBuilder */
382   public BeanTraverseBuilder bpro(Map<String,String> values) {
383      super.bpro(values);
384      return this;
385   }
386
387   @Override /* BeanContextBuilder */
388   public BeanTraverseBuilder bpro(String beanClassName, String value) {
389      super.bpro(beanClassName, value);
390      return this;
391   }
392
393   @Override /* BeanContextBuilder */
394   public BeanTraverseBuilder bpwo(Class<?> beanClass, String properties) {
395      super.bpwo(beanClass, properties);
396      return this;
397   }
398
399   @Override /* BeanContextBuilder */
400   public BeanTraverseBuilder bpwo(Map<String,String> values) {
401      super.bpwo(values);
402      return this;
403   }
404
405   @Override /* BeanContextBuilder */
406   public BeanTraverseBuilder bpwo(String beanClassName, String value) {
407      super.bpwo(beanClassName, value);
408      return this;
409   }
410
411   @Override /* BeanContextBuilder */
412   public BeanTraverseBuilder debug() {
413      super.debug();
414      return this;
415   }
416
417   @Override /* BeanContextBuilder */
418   public BeanTraverseBuilder dictionary(Class<?>...values) {
419      super.dictionary(values);
420      return this;
421   }
422
423   @Override /* BeanContextBuilder */
424   public BeanTraverseBuilder dictionary(Object...values) {
425      super.dictionary(values);
426      return this;
427   }
428
429   @Override /* BeanContextBuilder */
430   public BeanTraverseBuilder dictionaryReplace(Class<?>...values) {
431      super.dictionaryReplace(values);
432      return this;
433   }
434
435   @Override /* BeanContextBuilder */
436   public BeanTraverseBuilder dictionaryReplace(Object...values) {
437      super.dictionaryReplace(values);
438      return this;
439   }
440
441   @Override /* BeanContextBuilder */
442   public BeanTraverseBuilder dictionaryRemove(Class<?>...values) {
443      super.dictionaryRemove(values);
444      return this;
445   }
446
447   @Override /* BeanContextBuilder */
448   public BeanTraverseBuilder dictionaryRemove(Object...values) {
449      super.dictionaryRemove(values);
450      return this;
451   }
452
453   @Override /* BeanContextBuilder */
454   public <T> BeanTraverseBuilder example(Class<T> c, T o) {
455      super.example(c, o);
456      return this;
457   }
458
459   @Override /* BeanContextBuilder */
460   public <T> BeanTraverseBuilder exampleJson(Class<T> c, String value) {
461      super.exampleJson(c, value);
462      return this;
463   }
464
465   @Override /* BeanContextBuilder */
466   public BeanTraverseBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
467      super.ignoreInvocationExceptionsOnGetters(value);
468      return this;
469   }
470
471   @Override /* BeanContextBuilder */
472   public BeanTraverseBuilder ignoreInvocationExceptionsOnGetters() {
473      super.ignoreInvocationExceptionsOnGetters();
474      return this;
475   }
476
477   @Override /* BeanContextBuilder */
478   public BeanTraverseBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
479      super.ignoreInvocationExceptionsOnSetters(value);
480      return this;
481   }
482
483   @Override /* BeanContextBuilder */
484   public BeanTraverseBuilder ignoreInvocationExceptionsOnSetters() {
485      super.ignoreInvocationExceptionsOnSetters();
486      return this;
487   }
488
489   @Override /* BeanContextBuilder */
490   public BeanTraverseBuilder ignorePropertiesWithoutSetters(boolean value) {
491      super.ignorePropertiesWithoutSetters(value);
492      return this;
493   }
494
495   @Override /* BeanContextBuilder */
496   public BeanTraverseBuilder ignoreUnknownBeanProperties(boolean value) {
497      super.ignoreUnknownBeanProperties(value);
498      return this;
499   }
500
501   @Override /* BeanContextBuilder */
502   public BeanTraverseBuilder ignoreUnknownBeanProperties() {
503      super.ignoreUnknownBeanProperties();
504      return this;
505   }
506
507   @Override /* BeanContextBuilder */
508   public BeanTraverseBuilder ignoreUnknownNullBeanProperties(boolean value) {
509      super.ignoreUnknownNullBeanProperties(value);
510      return this;
511   }
512
513   @Override /* BeanContextBuilder */
514   public BeanTraverseBuilder implClass(Class<?> interfaceClass, Class<?> implClass) {
515      super.implClass(interfaceClass, implClass);
516      return this;
517   }
518
519   @Override /* BeanContextBuilder */
520   public BeanTraverseBuilder implClasses(Map<String,Class<?>> values) {
521      super.implClasses(values);
522      return this;
523   }
524
525   @Override /* BeanContextBuilder */
526   public BeanTraverseBuilder locale(Locale value) {
527      super.locale(value);
528      return this;
529   }
530
531   @Override /* BeanContextBuilder */
532   public BeanTraverseBuilder mediaType(MediaType value) {
533      super.mediaType(value);
534      return this;
535   }
536
537   @Override /* BeanContextBuilder */
538   public BeanTraverseBuilder notBeanClasses(Class<?>...values) {
539      super.notBeanClasses(values);
540      return this;
541   }
542
543   @Override /* BeanContextBuilder */
544   public BeanTraverseBuilder notBeanClasses(Object...values) {
545      super.notBeanClasses(values);
546      return this;
547   }
548
549   @Override /* BeanContextBuilder */
550   public BeanTraverseBuilder notBeanClassesReplace(Class<?>...values) {
551      super.notBeanClassesReplace(values);
552      return this;
553   }
554
555   @Override /* BeanContextBuilder */
556   public BeanTraverseBuilder notBeanClassesReplace(Object...values) {
557      super.notBeanClassesReplace(values);
558      return this;
559   }
560
561   @Override /* BeanContextBuilder */
562   public BeanTraverseBuilder notBeanClassesRemove(Class<?>...values) {
563      super.notBeanClassesRemove(values);
564      return this;
565   }
566
567   @Override /* BeanContextBuilder */
568   public BeanTraverseBuilder notBeanClassesRemove(Object...values) {
569      super.notBeanClassesRemove(values);
570      return this;
571   }
572
573   @Override /* BeanContextBuilder */
574   public BeanTraverseBuilder notBeanPackages(Object...values) {
575      super.notBeanPackages(values);
576      return this;
577   }
578
579   @Override /* BeanContextBuilder */
580   public BeanTraverseBuilder notBeanPackages(String...values) {
581      super.notBeanPackages(values);
582      return this;
583   }
584
585   @Override /* BeanContextBuilder */
586   public BeanTraverseBuilder notBeanPackagesReplace(String...values) {
587      super.notBeanPackagesReplace(values);
588      return this;
589   }
590
591   @Override /* BeanContextBuilder */
592   public BeanTraverseBuilder notBeanPackagesReplace(Object...values) {
593      super.notBeanPackagesReplace(values);
594      return this;
595   }
596
597   @Override /* BeanContextBuilder */
598   public BeanTraverseBuilder notBeanPackagesRemove(String...values) {
599      super.notBeanPackagesRemove(values);
600      return this;
601   }
602
603   @Override /* BeanContextBuilder */
604   public BeanTraverseBuilder notBeanPackagesRemove(Object...values) {
605      super.notBeanPackagesRemove(values);
606      return this;
607   }
608
609   @Override /* BeanContextBuilder */
610   public BeanTraverseBuilder pojoSwaps(Class<?>...values) {
611      super.pojoSwaps(values);
612      return this;
613   }
614
615   @Override /* BeanContextBuilder */
616   public BeanTraverseBuilder pojoSwaps(Object...values) {
617      super.pojoSwaps(values);
618      return this;
619   }
620
621   @Override /* BeanContextBuilder */
622   public BeanTraverseBuilder pojoSwapsReplace(Class<?>...values) {
623      super.pojoSwapsReplace(values);
624      return this;
625   }
626
627   @Override /* BeanContextBuilder */
628   public BeanTraverseBuilder pojoSwapsReplace(Object...values) {
629      super.pojoSwapsReplace(values);
630      return this;
631   }
632
633   @Override /* BeanContextBuilder */
634   public BeanTraverseBuilder pojoSwapsRemove(Class<?>...values) {
635      super.pojoSwapsRemove(values);
636      return this;
637   }
638
639   @Override /* BeanContextBuilder */
640   public BeanTraverseBuilder pojoSwapsRemove(Object...values) {
641      super.pojoSwapsRemove(values);
642      return this;
643   }
644
645   @Override /* BeanContextBuilder */
646   public BeanTraverseBuilder sortProperties(boolean value) {
647      super.sortProperties(value);
648      return this;
649   }
650
651   @Override /* BeanContextBuilder */
652   public BeanTraverseBuilder sortProperties() {
653      super.sortProperties();
654      return this;
655   }
656
657   @Override /* BeanContextBuilder */
658   public BeanTraverseBuilder timeZone(TimeZone value) {
659      super.timeZone(value);
660      return this;
661   }
662
663   @Override /* BeanContextBuilder */
664   public BeanTraverseBuilder useEnumNames(boolean value) {
665      super.useEnumNames(value);
666      return this;
667   }
668
669   @Override /* BeanContextBuilder */
670   public BeanTraverseBuilder useEnumNames() {
671      super.useEnumNames();
672      return this;
673   }
674
675   @Override /* BeanContextBuilder */
676   public BeanTraverseBuilder useInterfaceProxies(boolean value) {
677      super.useInterfaceProxies(value);
678      return this;
679   }
680
681   @Override /* BeanContextBuilder */
682   public BeanTraverseBuilder useJavaBeanIntrospector(boolean value) {
683      super.useJavaBeanIntrospector(value);
684      return this;
685   }
686
687   @Override /* BeanContextBuilder */
688   public BeanTraverseBuilder useJavaBeanIntrospector() {
689      super.useJavaBeanIntrospector();
690      return this;
691   }
692
693   @Override /* ContextBuilder */
694   public BeanTraverseBuilder set(String name, Object value) {
695      super.set(name, value);
696      return this;
697   }
698
699   @Override /* ContextBuilder */
700   public BeanTraverseBuilder set(Map<String,Object> properties) {
701      super.set(properties);
702      return this;
703   }
704
705   @Override /* ContextBuilder */
706   public BeanTraverseBuilder add(Map<String,Object> properties) {
707      super.add(properties);
708      return this;
709   }
710
711   @Override /* ContextBuilder */
712   public BeanTraverseBuilder addTo(String name, Object value) {
713      super.addTo(name, value);
714      return this;
715   }
716
717   @Override /* ContextBuilder */
718   public BeanTraverseBuilder addTo(String name, String key, Object value) {
719      super.addTo(name, key, value);
720      return this;
721   }
722
723   @Override /* ContextBuilder */
724   public BeanTraverseBuilder removeFrom(String name, Object value) {
725      super.removeFrom(name, value);
726      return this;
727   }
728
729   @Override /* ContextBuilder */
730   public BeanTraverseBuilder apply(PropertyStore copyFrom) {
731      super.apply(copyFrom);
732      return this;
733   }
734
735   @Override /* ContextBuilder */
736   public BeanTraverseBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
737      super.applyAnnotations(al, vrs);
738      return this;
739   }
740
741   @Override /* ContextBuilder */
742   public BeanTraverseBuilder applyAnnotations(Class<?>...fromClasses) {
743      super.applyAnnotations(fromClasses);
744      return this;
745   }
746
747   @Override /* ContextBuilder */
748   public BeanTraverseBuilder applyAnnotations(Method...fromMethods) {
749      super.applyAnnotations(fromMethods);
750      return this;
751   }
752
753   @Override /* Context */
754   public BeanTraverseContext build() {
755      return null;
756   }
757}