// *************************************************************************************************************************** | |
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * | |
// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * | |
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * | |
// * with the License. You may obtain a copy of the License at * | |
// * * | |
// * http://www.apache.org/licenses/LICENSE-2.0 * | |
// * * | |
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * | |
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * | |
// * specific language governing permissions and limitations under the License. * | |
// *************************************************************************************************************************** | |
package org.apache.juneau.urlencoding; | |
import static org.apache.juneau.collections.JsonMap.*; | |
import java.lang.annotation.*; | |
import java.lang.reflect.*; | |
import java.nio.charset.*; | |
import java.util.*; | |
import java.util.concurrent.*; | |
import org.apache.juneau.*; | |
import org.apache.juneau.collections.*; | |
import org.apache.juneau.internal.*; | |
import org.apache.juneau.uon.*; | |
import org.apache.juneau.utils.*; | |
/** | |
* Serializes POJO models to URL-encoded notation with UON-encoded values (a notation for URL-encoded query paramter values). | |
* | |
* <h5 class='section'>Media types:</h5> | |
* <p> | |
* Handles <c>Accept</c> types: <bc>application/x-www-form-urlencoded</bc> | |
* <p> | |
* Produces <c>Content-Type</c> types: <bc>application/x-www-form-urlencoded</bc> | |
* | |
* <h5 class='topic'>Description</h5> | |
* | |
* This serializer provides several serialization options. | |
* <br>Typically, one of the predefined DEFAULT serializers will be sufficient. | |
* <br>However, custom serializers can be constructed to fine-tune behavior. | |
* | |
* <p> | |
* The following shows a sample object defined in Javascript: | |
* <p class='bjson'> | |
* { | |
* id: 1, | |
* name: <js>'John Smith'</js>, | |
* uri: <js>'http://sample/addressBook/person/1'</js>, | |
* addressBookUri: <js>'http://sample/addressBook'</js>, | |
* birthDate: <js>'1946-08-12T00:00:00Z'</js>, | |
* otherIds: <jk>null</jk>, | |
* addresses: [ | |
* { | |
* uri: <js>'http://sample/addressBook/address/1'</js>, | |
* personUri: <js>'http://sample/addressBook/person/1'</js>, | |
* id: 1, | |
* street: <js>'100 Main Street'</js>, | |
* city: <js>'Anywhereville'</js>, | |
* state: <js>'NY'</js>, | |
* zip: 12345, | |
* isCurrent: <jk>true</jk>, | |
* } | |
* ] | |
* } | |
* </p> | |
* | |
* <p> | |
* Using the "strict" syntax defined in this document, the equivalent URL-encoded notation would be as follows: | |
* <p class='burlenc'> | |
* <ua>id</ua>=<un>1</un> | |
* &<ua>name</ua>=<us>'John+Smith'</us>, | |
* &<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>, | |
* &<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>, | |
* &<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>, | |
* &<ua>otherIds</ua>=<uk>null</uk>, | |
* &<ua>addresses</ua>=@( | |
* ( | |
* <ua>uri</ua>=<us>http://sample/addressBook/address/1</us>, | |
* <ua>personUri</ua>=<us>http://sample/addressBook/person/1</us>, | |
* <ua>id</ua>=<un>1</un>, | |
* <ua>street</ua>=<us>'100+Main+Street'</us>, | |
* <ua>city</ua>=<us>Anywhereville</us>, | |
* <ua>state</ua>=<us>NY</us>, | |
* <ua>zip</ua>=<un>12345</un>, | |
* <ua>isCurrent</ua>=<uk>true</uk> | |
* ) | |
* ) | |
* </p> | |
* | |
* <h5 class='section'>Example:</h5> | |
* <p class='bjava'> | |
* <jc>// Serialize a Map</jc> | |
* Map <jv>map</jv> = JsonMap.<jsm>ofJson</jsm>(<js>"{a:'b',c:1,d:false,e:['f',1,false],g:{h:'i'}}"</js>); | |
* | |
* <jc>// Serialize to value equivalent to JSON.</jc> | |
* <jc>// Produces "a=b&c=1&d=false&e=@(f,1,false)&g=(h=i)"</jc> | |
* String <jv>uenc</jv> = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(<jv>map</jv>); | |
* | |
* <jc>// Serialize a bean</jc> | |
* <jk>public class</jk> Person { | |
* <jk>public</jk> Person(String <jv>name</jv>); | |
* <jk>public</jk> String getName(); | |
* <jk>public int</jk> getAge(); | |
* <jk>public</jk> Address getAddress(); | |
* <jk>public boolean</jk> deceased; | |
* } | |
* | |
* <jk>public class</jk> Address { | |
* <jk>public</jk> String getStreet(); | |
* <jk>public</jk> String getCity(); | |
* <jk>public</jk> String getState(); | |
* <jk>public int</jk> getZip(); | |
* } | |
* | |
* Person <jv>person</jv> = <jk>new</jk> Person(<js>"John Doe"</js>, 23, <js>"123 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12345, <jk>false</jk>); | |
* | |
* <jc>// Produces "name=John+Doe&age=23&address=(street='123+Main+St',city=Anywhere,state=NY,zip=12345)&deceased=false"</jc> | |
* String <jv>uenc</jv> = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(<jv>person</jv>); | |
* </p> | |
* | |
* <h5 class='section'>Notes:</h5><ul> | |
* <li class='note'>This class is thread safe and reusable. | |
* </ul> | |
* | |
* <h5 class='section'>See Also:</h5><ul> | |
* <li class='link'><a class="doclink" href="../../../../index.html#jm.UrlEncodingDetails">URL-Encoding Details</a> | |
* </ul> | |
*/ | |
public class UrlEncodingSerializer extends UonSerializer implements UrlEncodingMetaProvider { | |
//------------------------------------------------------------------------------------------------------------------- | |
// Static | |
//------------------------------------------------------------------------------------------------------------------- | |
/** Reusable instance of {@link UrlEncodingSerializer}, all default settings. */ | |
public static final UrlEncodingSerializer DEFAULT = new UrlEncodingSerializer(create()); | |
/** Reusable instance of {@link UrlEncodingSerializer.PlainText}. */ | |
public static final UrlEncodingSerializer DEFAULT_PLAINTEXT = new PlainText(create()); | |
/** Reusable instance of {@link UrlEncodingSerializer.Expanded}. */ | |
public static final UrlEncodingSerializer DEFAULT_EXPANDED = new Expanded(create()); | |
/** Reusable instance of {@link UrlEncodingSerializer.Readable}. */ | |
public static final UrlEncodingSerializer DEFAULT_READABLE = new Readable(create()); | |
/** | |
* Creates a new builder for this object. | |
* | |
* @return A new builder. | |
*/ | |
public static Builder create() { | |
return new Builder(); | |
} | |
//------------------------------------------------------------------------------------------------------------------- | |
// Static subclasses | |
//------------------------------------------------------------------------------------------------------------------- | |
/** | |
* Equivalent to <code>UrlEncodingSerializer.<jsm>create</jsm>().expandedParams().build();</code>. | |
*/ | |
public static class Expanded extends UrlEncodingSerializer { | |
/** | |
* Constructor. | |
* | |
* @param builder The builder for this object. | |
*/ | |
public Expanded(Builder builder) { | |
super(builder.expandedParams()); | |
} | |
} | |
/** | |
* Equivalent to <code>UrlEncodingSerializer.<jsm>create</jsm>().useWhitespace().build();</code>. | |
*/ | |
public static class Readable extends UrlEncodingSerializer { | |
/** | |
* Constructor. | |
* | |
* @param builder The builder for this object. | |
*/ | |
public Readable(Builder builder) { | |
super(builder.useWhitespace()); | |
} | |
} | |
/** | |
* Equivalent to <code>UrlEncodingSerializer.<jsm>create</jsm>().plainTextParts().build();</code>. | |
*/ | |
public static class PlainText extends UrlEncodingSerializer { | |
/** | |
* Constructor. | |
* | |
* @param builder The builder for this object. | |
*/ | |
public PlainText(Builder builder) { | |
super(builder.paramFormatPlain()); | |
} | |
} | |
//------------------------------------------------------------------------------------------------------------------- | |
// Builder | |
//------------------------------------------------------------------------------------------------------------------- | |
/** | |
* Builder class. | |
*/ | |
@FluentSetters | |
public static class Builder extends UonSerializer.Builder { | |
private static final Cache<HashKey,UrlEncodingSerializer> CACHE = Cache.of(HashKey.class, UrlEncodingSerializer.class).build(); | |
boolean expandedParams; | |
/** | |
* Constructor, default settings. | |
*/ | |
protected Builder() { | |
produces("application/x-www-form-urlencoded"); | |
expandedParams = env("UrlEncoding.expandedParams", false); | |
} | |
/** | |
* Copy constructor. | |
* | |
* @param copyFrom The bean to copy from. | |
*/ | |
protected Builder(UrlEncodingSerializer copyFrom) { | |
super(copyFrom); | |
expandedParams = copyFrom.expandedParams; | |
} | |
/** | |
* Copy constructor. | |
* | |
* @param copyFrom The builder to copy from. | |
*/ | |
protected Builder(Builder copyFrom) { | |
super(copyFrom); | |
expandedParams = copyFrom.expandedParams; | |
} | |
@Override /* Context.Builder */ | |
public Builder copy() { | |
return new Builder(this); | |
} | |
@Override /* Context.Builder */ | |
public UrlEncodingSerializer build() { | |
return cache(CACHE).build(UrlEncodingSerializer.class); | |
} | |
@Override /* Context.Builder */ | |
public HashKey hashKey() { | |
return HashKey.of( | |
super.hashKey(), | |
expandedParams | |
); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// Properties | |
//----------------------------------------------------------------------------------------------------------------- | |
/** | |
* Serialize bean property collections/arrays as separate key/value pairs. | |
* | |
* <p> | |
* By default, serializing the array <c>[1,2,3]</c> results in <c>?key=$a(1,2,3)</c>. | |
* <br>When enabled, serializing the same array results in <c>?key=1&key=2&key=3</c>. | |
* | |
* <p> | |
* This option only applies to beans. | |
* | |
* <h5 class='section'>Notes:</h5><ul> | |
* <li class='note'> | |
* If parsing multi-part parameters, it's highly recommended to use <c>Collections</c> or <c>Lists</c> | |
* as bean property types instead of arrays since arrays have to be recreated from scratch every time a value | |
* is added to it. | |
* </ul> | |
* | |
* <h5 class='section'>Example:</h5> | |
* <p class='bjava'> | |
* <jc>// A sample bean.</jc> | |
* <jk>public class</jk> A { | |
* <jk>public</jk> String[] <jf>f1</jf> = {<js>"a"</js>,<js>"b"</js>}; | |
* <jk>public</jk> List<String> <jf>f2</jf> = Arrays.<jsm>asList</jsm>(<jk>new</jk> String[]{<js>"c"</js>,<js>"d"</js>}); | |
* } | |
* | |
* <jc>// Normal serializer.</jc> | |
* WriterSerializer <jv>serializer1</jv> = UrlEncodingSerializer.<jsf>DEFAULT</jsf>; | |
* | |
* <jc>// Expanded-params serializer.</jc> | |
* WriterSerializer <jv>serializer2</jv> = UrlEncodingSerializer.<jsm>create</jsm>().expandedParams().build(); | |
* | |
* <jc>// Produces "f1=(a,b)&f2=(c,d)"</jc> | |
* String <jv>out1</jv> = <jv>serializer1</jv>.serialize(<jk>new</jk> A()); | |
* | |
* <jc>// Produces "f1=a&f1=b&f2=c&f2=d"</jc> | |
* String <jv>out2</jv> = <jv>serializer2</jv>.serialize(<jk>new</jk> A()); | |
* </p> | |
* | |
* @return This object. | |
*/ | |
@FluentSetter | |
public Builder expandedParams() { | |
return expandedParams(true); | |
} | |
/** | |
* Same as {@link #expandedParams()} but allows you to explicitly specify the value. | |
* | |
* @param value The value for this setting. | |
* @return This object. | |
*/ | |
@FluentSetter | |
public Builder expandedParams(boolean value) { | |
expandedParams = value; | |
return this; | |
} | |
// <FluentSetters> | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder annotations(Annotation...values) { | |
super.annotations(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder apply(AnnotationWorkList work) { | |
super.apply(work); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder applyAnnotations(java.lang.Class<?>...fromClasses) { | |
super.applyAnnotations(fromClasses); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder applyAnnotations(Method...fromMethods) { | |
super.applyAnnotations(fromMethods); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder cache(Cache<HashKey,? extends org.apache.juneau.Context> value) { | |
super.cache(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder debug() { | |
super.debug(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder debug(boolean value) { | |
super.debug(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder impl(Context value) { | |
super.impl(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.Context.Builder */ | |
public Builder type(Class<? extends org.apache.juneau.Context> value) { | |
super.type(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanClassVisibility(Visibility value) { | |
super.beanClassVisibility(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanConstructorVisibility(Visibility value) { | |
super.beanConstructorVisibility(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanContext(BeanContext value) { | |
super.beanContext(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanContext(BeanContext.Builder value) { | |
super.beanContext(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanDictionary(java.lang.Class<?>...values) { | |
super.beanDictionary(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanFieldVisibility(Visibility value) { | |
super.beanFieldVisibility(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanInterceptor(Class<?> on, Class<? extends org.apache.juneau.swap.BeanInterceptor<?>> value) { | |
super.beanInterceptor(on, value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanMapPutReturnsOldValue() { | |
super.beanMapPutReturnsOldValue(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanMethodVisibility(Visibility value) { | |
super.beanMethodVisibility(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanProperties(Map<String,Object> values) { | |
super.beanProperties(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanProperties(Class<?> beanClass, String properties) { | |
super.beanProperties(beanClass, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanProperties(String beanClassName, String properties) { | |
super.beanProperties(beanClassName, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesExcludes(Map<String,Object> values) { | |
super.beanPropertiesExcludes(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesExcludes(Class<?> beanClass, String properties) { | |
super.beanPropertiesExcludes(beanClass, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesExcludes(String beanClassName, String properties) { | |
super.beanPropertiesExcludes(beanClassName, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesReadOnly(Map<String,Object> values) { | |
super.beanPropertiesReadOnly(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesReadOnly(Class<?> beanClass, String properties) { | |
super.beanPropertiesReadOnly(beanClass, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesReadOnly(String beanClassName, String properties) { | |
super.beanPropertiesReadOnly(beanClassName, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesWriteOnly(Map<String,Object> values) { | |
super.beanPropertiesWriteOnly(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesWriteOnly(Class<?> beanClass, String properties) { | |
super.beanPropertiesWriteOnly(beanClass, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beanPropertiesWriteOnly(String beanClassName, String properties) { | |
super.beanPropertiesWriteOnly(beanClassName, properties); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beansRequireDefaultConstructor() { | |
super.beansRequireDefaultConstructor(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beansRequireSerializable() { | |
super.beansRequireSerializable(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder beansRequireSettersForGetters() { | |
super.beansRequireSettersForGetters(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder dictionaryOn(Class<?> on, java.lang.Class<?>...values) { | |
super.dictionaryOn(on, values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder disableBeansRequireSomeProperties() { | |
super.disableBeansRequireSomeProperties(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder disableIgnoreMissingSetters() { | |
super.disableIgnoreMissingSetters(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder disableIgnoreTransientFields() { | |
super.disableIgnoreTransientFields(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder disableIgnoreUnknownNullBeanProperties() { | |
super.disableIgnoreUnknownNullBeanProperties(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder disableInterfaceProxies() { | |
super.disableInterfaceProxies(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public <T> Builder example(Class<T> pojoClass, T o) { | |
super.example(pojoClass, o); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public <T> Builder example(Class<T> pojoClass, String json) { | |
super.example(pojoClass, json); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder findFluentSetters() { | |
super.findFluentSetters(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder findFluentSetters(Class<?> on) { | |
super.findFluentSetters(on); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder ignoreInvocationExceptionsOnGetters() { | |
super.ignoreInvocationExceptionsOnGetters(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder ignoreInvocationExceptionsOnSetters() { | |
super.ignoreInvocationExceptionsOnSetters(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder ignoreUnknownBeanProperties() { | |
super.ignoreUnknownBeanProperties(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder ignoreUnknownEnumValues() { | |
super.ignoreUnknownEnumValues(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder implClass(Class<?> interfaceClass, Class<?> implClass) { | |
super.implClass(interfaceClass, implClass); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder implClasses(Map<Class<?>,Class<?>> values) { | |
super.implClasses(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder interfaceClass(Class<?> on, Class<?> value) { | |
super.interfaceClass(on, value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder interfaces(java.lang.Class<?>...value) { | |
super.interfaces(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder locale(Locale value) { | |
super.locale(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder mediaType(MediaType value) { | |
super.mediaType(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder notBeanClasses(java.lang.Class<?>...values) { | |
super.notBeanClasses(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder notBeanPackages(String...values) { | |
super.notBeanPackages(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder propertyNamer(Class<? extends org.apache.juneau.PropertyNamer> value) { | |
super.propertyNamer(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder propertyNamer(Class<?> on, Class<? extends org.apache.juneau.PropertyNamer> value) { | |
super.propertyNamer(on, value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder sortProperties() { | |
super.sortProperties(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder sortProperties(java.lang.Class<?>...on) { | |
super.sortProperties(on); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder stopClass(Class<?> on, Class<?> value) { | |
super.stopClass(on, value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public <T, S> Builder swap(Class<T> normalClass, Class<S> swappedClass, ThrowingFunction<T,S> swapFunction) { | |
super.swap(normalClass, swappedClass, swapFunction); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public <T, S> Builder swap(Class<T> normalClass, Class<S> swappedClass, ThrowingFunction<T,S> swapFunction, ThrowingFunction<S,T> unswapFunction) { | |
super.swap(normalClass, swappedClass, swapFunction, unswapFunction); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder swaps(java.lang.Class<?>...values) { | |
super.swaps(values); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder timeZone(TimeZone value) { | |
super.timeZone(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder typeName(Class<?> on, String value) { | |
super.typeName(on, value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder typePropertyName(String value) { | |
super.typePropertyName(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder typePropertyName(Class<?> on, String value) { | |
super.typePropertyName(on, value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder useEnumNames() { | |
super.useEnumNames(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanContextable.Builder */ | |
public Builder useJavaBeanIntrospector() { | |
super.useJavaBeanIntrospector(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanTraverseContext.Builder */ | |
public Builder detectRecursions() { | |
super.detectRecursions(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanTraverseContext.Builder */ | |
public Builder detectRecursions(boolean value) { | |
super.detectRecursions(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanTraverseContext.Builder */ | |
public Builder ignoreRecursions() { | |
super.ignoreRecursions(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanTraverseContext.Builder */ | |
public Builder ignoreRecursions(boolean value) { | |
super.ignoreRecursions(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanTraverseContext.Builder */ | |
public Builder initialDepth(int value) { | |
super.initialDepth(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.BeanTraverseContext.Builder */ | |
public Builder maxDepth(int value) { | |
super.maxDepth(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder accept(String value) { | |
super.accept(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder addBeanTypes() { | |
super.addBeanTypes(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder addBeanTypes(boolean value) { | |
super.addBeanTypes(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder addRootType() { | |
super.addRootType(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder addRootType(boolean value) { | |
super.addRootType(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder keepNullProperties() { | |
super.keepNullProperties(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder keepNullProperties(boolean value) { | |
super.keepNullProperties(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) { | |
super.listener(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder produces(String value) { | |
super.produces(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder sortCollections() { | |
super.sortCollections(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder sortCollections(boolean value) { | |
super.sortCollections(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder sortMaps() { | |
super.sortMaps(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder sortMaps(boolean value) { | |
super.sortMaps(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder trimEmptyCollections() { | |
super.trimEmptyCollections(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder trimEmptyCollections(boolean value) { | |
super.trimEmptyCollections(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder trimEmptyMaps() { | |
super.trimEmptyMaps(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder trimEmptyMaps(boolean value) { | |
super.trimEmptyMaps(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder trimStrings() { | |
super.trimStrings(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder trimStrings(boolean value) { | |
super.trimStrings(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder uriContext(UriContext value) { | |
super.uriContext(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder uriRelativity(UriRelativity value) { | |
super.uriRelativity(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.Serializer.Builder */ | |
public Builder uriResolution(UriResolution value) { | |
super.uriResolution(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder fileCharset(Charset value) { | |
super.fileCharset(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder maxIndent(int value) { | |
super.maxIndent(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder quoteChar(char value) { | |
super.quoteChar(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder quoteCharOverride(char value) { | |
super.quoteCharOverride(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder sq() { | |
super.sq(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder streamCharset(Charset value) { | |
super.streamCharset(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder useWhitespace() { | |
super.useWhitespace(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder useWhitespace(boolean value) { | |
super.useWhitespace(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.serializer.WriterSerializer.Builder */ | |
public Builder ws() { | |
super.ws(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.uon.UonSerializer.Builder */ | |
public Builder addBeanTypesUon() { | |
super.addBeanTypesUon(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.uon.UonSerializer.Builder */ | |
public Builder addBeanTypesUon(boolean value) { | |
super.addBeanTypesUon(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.uon.UonSerializer.Builder */ | |
public Builder encoding() { | |
super.encoding(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.uon.UonSerializer.Builder */ | |
public Builder paramFormat(ParamFormat value) { | |
super.paramFormat(value); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.uon.UonSerializer.Builder */ | |
public Builder paramFormatPlain() { | |
super.paramFormatPlain(); | |
return this; | |
} | |
@Override /* GENERATED - org.apache.juneau.uon.UonSerializer.Builder */ | |
public Builder quoteCharUon(char value) { | |
super.quoteCharUon(value); | |
return this; | |
} | |
// </FluentSetters> | |
} | |
//------------------------------------------------------------------------------------------------------------------- | |
// Instance | |
//------------------------------------------------------------------------------------------------------------------- | |
final boolean | |
expandedParams; | |
private final Map<ClassMeta<?>,UrlEncodingClassMeta> urlEncodingClassMetas = new ConcurrentHashMap<>(); | |
private final Map<BeanPropertyMeta,UrlEncodingBeanPropertyMeta> urlEncodingBeanPropertyMetas = new ConcurrentHashMap<>(); | |
/** | |
* Constructor. | |
* | |
* @param builder The builder for this object. | |
*/ | |
public UrlEncodingSerializer(Builder builder) { | |
super(builder.encoding()); | |
expandedParams = builder.expandedParams; | |
} | |
@Override /* Context */ | |
public Builder copy() { | |
return new Builder(this); | |
} | |
@Override /* Context */ | |
public UrlEncodingSerializerSession.Builder createSession() { | |
return UrlEncodingSerializerSession.create(this); | |
} | |
@Override /* Context */ | |
public UrlEncodingSerializerSession getSession() { | |
return createSession().build(); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// Extended metadata | |
//----------------------------------------------------------------------------------------------------------------- | |
@Override /* UrlEncodingMetaProvider */ | |
public UrlEncodingClassMeta getUrlEncodingClassMeta(ClassMeta<?> cm) { | |
UrlEncodingClassMeta m = urlEncodingClassMetas.get(cm); | |
if (m == null) { | |
m = new UrlEncodingClassMeta(cm, this); | |
urlEncodingClassMetas.put(cm, m); | |
} | |
return m; | |
} | |
@Override /* UrlEncodingMetaProvider */ | |
public UrlEncodingBeanPropertyMeta getUrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm) { | |
if (bpm == null) | |
return UrlEncodingBeanPropertyMeta.DEFAULT; | |
UrlEncodingBeanPropertyMeta m = urlEncodingBeanPropertyMetas.get(bpm); | |
if (m == null) { | |
m = new UrlEncodingBeanPropertyMeta(bpm.getDelegateFor(), this); | |
urlEncodingBeanPropertyMetas.put(bpm, m); | |
} | |
return m; | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// Properties | |
//----------------------------------------------------------------------------------------------------------------- | |
/** | |
* Serialize bean property collections/arrays as separate key/value pairs. | |
* | |
* @see Builder#expandedParams() | |
* @return | |
* <jk>false</jk> if serializing the array <c>[1,2,3]</c> results in <c>?key=$a(1,2,3)</c>. | |
* <br><jk>true</jk> if serializing the same array results in <c>?key=1&key=2&key=3</c>. | |
*/ | |
protected final boolean isExpandedParams() { | |
return expandedParams; | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// Other methods | |
//----------------------------------------------------------------------------------------------------------------- | |
@Override /* Context */ | |
protected JsonMap properties() { | |
return filteredMap("expandedParams", expandedParams); | |
} | |
} |