This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new 728b0c5 Context API refactoring.
728b0c5 is described below
commit 728b0c5535996a735b888699fd7d68a7ee12d10d
Author: JamesBognar <[email protected]>
AuthorDate: Mon Sep 27 11:18:00 2021 -0400
Context API refactoring.
---
.../juneau/urlencoding/UrlEncodingParser.java | 45 +++-----------------
.../urlencoding/UrlEncodingParserBuilder.java | 27 ++++++++----
.../urlencoding/UrlEncodingParserSession.java | 2 +-
.../juneau/urlencoding/UrlEncodingSerializer.java | 49 +++-------------------
.../urlencoding/UrlEncodingSerializerBuilder.java | 25 +++++++----
.../urlencoding/UrlEncodingSerializerSession.java | 2 +-
.../juneau/urlencoding/annotation/UrlEncoding.java | 4 +-
.../urlencoding/annotation/UrlEncodingConfig.java | 6 +--
.../annotation/UrlEncodingConfigAnnotation.java | 35 ++++++++++++----
9 files changed, 83 insertions(+), 112 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
index e9bb44b..7ce4012 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
@@ -43,52 +43,18 @@ import org.apache.juneau.uon.*;
public class UrlEncodingParser extends UonParser implements
UrlEncodingMetaProvider {
//-------------------------------------------------------------------------------------------------------------------
- // Configurable properties
-
//-------------------------------------------------------------------------------------------------------------------
-
- static final String PREFIX = "UrlEncodingParser";
-
- /**
- * Configuration property: Parser bean property collections/arrays as
separate key/value pairs.
- *
- * <p>
- * This is the parser-side equivalent of the {@link
#URLENC_expandedParams} setting.
- *
- * <h5 class='section'>Property:</h5>
- * <ul class='spaced-list'>
- * <li><b>ID:</b> {@link
org.apache.juneau.urlencoding.UrlEncodingParser#URLENC_expandedParams
URLENC_expandedParams}
- * <li><b>Name:</b> <js>"UrlEncodingParser.expandedParams.b"</js>
- * <li><b>Data type:</b> <jk>boolean</jk>
- * <li><b>System property:</b>
<c>UrlEncodingParser.expandedParams</c>
- * <li><b>Environment variable:</b>
<c>URLENCODINGPARSER_EXPANDEDPARAMS</c>
- * <li><b>Default:</b> <jk>false</jk>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Annotations:</b>
- * <ul>
- * <li class='ja'>{@link
org.apache.juneau.urlencoding.annotation.UrlEncodingConfig#expandedParams()}
- * </ul>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link
org.apache.juneau.urlencoding.UrlEncodingParserBuilder#expandedParams()}
- * </ul>
- * </ul>
- */
- public static final String URLENC_expandedParams = PREFIX +
".expandedParams.b";
-
-
-
//-------------------------------------------------------------------------------------------------------------------
- // Predefined instances
+ // Static
//-------------------------------------------------------------------------------------------------------------------
/** Reusable instance of {@link UrlEncodingParser}. */
public static final UrlEncodingParser DEFAULT = new
UrlEncodingParser(create());
-
//-------------------------------------------------------------------------------------------------------------------
// Instance
//-------------------------------------------------------------------------------------------------------------------
- private final boolean expandedParams;
+ final boolean expandedParams;
+
private final Map<ClassMeta<?>,UrlEncodingClassMeta>
urlEncodingClassMetas = new ConcurrentHashMap<>();
private final Map<BeanPropertyMeta,UrlEncodingBeanPropertyMeta>
urlEncodingBeanPropertyMetas = new ConcurrentHashMap<>();
@@ -99,8 +65,7 @@ public class UrlEncodingParser extends UonParser implements
UrlEncodingMetaProvi
*/
protected UrlEncodingParser(UrlEncodingParserBuilder builder) {
super(builder);
- ContextProperties cp = getContextProperties();
- expandedParams =
cp.getBoolean(URLENC_expandedParams).orElse(false);
+ expandedParams = builder.expandedParams;
}
@Override /* Context */
@@ -172,7 +137,7 @@ public class UrlEncodingParser extends UonParser implements
UrlEncodingMetaProvi
/**
* Parser bean property collections/arrays as separate key/value pairs.
*
- * @see #URLENC_expandedParams
+ * @see UrlEncodingParserBuilder#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>.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
index c735e58..98be6d3 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
@@ -12,8 +12,6 @@
//
***************************************************************************************************************************
package org.apache.juneau.urlencoding;
-import static org.apache.juneau.urlencoding.UrlEncodingParser.*;
-
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.nio.charset.*;
@@ -31,6 +29,8 @@ import org.apache.juneau.uon.*;
@FluentSetters
public class UrlEncodingParserBuilder extends UonParserBuilder {
+ boolean expandedParams;
+
/**
* Constructor, default settings.
*/
@@ -39,6 +39,7 @@ public class UrlEncodingParserBuilder extends
UonParserBuilder {
decoding();
consumes("application/x-www-form-urlencoded");
type(UrlEncodingParser.class);
+ expandedParams = env("UrlEncoding.expandedParams", false);
}
/**
@@ -48,6 +49,7 @@ public class UrlEncodingParserBuilder extends
UonParserBuilder {
*/
protected UrlEncodingParserBuilder(UrlEncodingParser copyFrom) {
super(copyFrom);
+ expandedParams = copyFrom.expandedParams;
}
/**
@@ -57,6 +59,7 @@ public class UrlEncodingParserBuilder extends
UonParserBuilder {
*/
protected UrlEncodingParserBuilder(UrlEncodingParserBuilder copyFrom) {
super(copyFrom);
+ expandedParams = copyFrom.expandedParams;
}
@Override /* ContextBuilder */
@@ -77,7 +80,7 @@ public class UrlEncodingParserBuilder extends
UonParserBuilder {
* Serialize bean property collections/arrays as separate key/value
pairs.
*
* <p>
- * This is the parser-side equivalent of the {@link
#URLENC_expandedParams} setting.
+ * This is the parser-side equivalent of the {@link
UrlEncodingSerializerBuilder#expandedParams()} setting.
*
* <p>
* If <jk>false</jk>, serializing the array <c>[1,2,3]</c> results in
<c>?key=$a(1,2,3)</c>.
@@ -108,15 +111,23 @@ public class UrlEncodingParserBuilder extends
UonParserBuilder {
* is added to it.
* </ul>
*
- * <ul class='seealso'>
- * <li class='jf'>{@link UrlEncodingParser#URLENC_expandedParams}
- * </ul>
- *
* @return This object (for method chaining).
*/
@FluentSetter
public UrlEncodingParserBuilder expandedParams() {
- return set(URLENC_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 UrlEncodingParserBuilder expandedParams(boolean value) {
+ expandedParams = value;
+ return this;
}
// <FluentSetters>
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
index 6d16d3f..4c4b26e 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
@@ -380,7 +380,7 @@ public class UrlEncodingParserSession extends
UonParserSession {
/**
* Configuration property: Parser bean property collections/arrays as
separate key/value pairs.
*
- * @see UrlEncodingParser#URLENC_expandedParams
+ * @see UrlEncodingParserBuilder#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>.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
index f75ccff..5118bf1 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
@@ -120,42 +120,7 @@ import org.apache.juneau.uon.*;
public class UrlEncodingSerializer extends UonSerializer implements
UrlEncodingMetaProvider {
//-------------------------------------------------------------------------------------------------------------------
- // Configurable properties
-
//-------------------------------------------------------------------------------------------------------------------
-
- static final String PREFIX = "UrlEncodingSerializer";
-
- /**
- * Configuration property: Serialize bean property collections/arrays
as separate key/value pairs.
- *
- * <p>
- * If <jk>false</jk>, serializing the array <c>[1,2,3]</c> results in
<c>?key=$a(1,2,3)</c>.
- * <br>If <jk>true</jk>, serializing the same array results in
<c>?key=1&key=2&key=3</c>.
- *
- * <h5 class='section'>Property:</h5>
- * <ul class='spaced-list'>
- * <li><b>ID:</b> {@link
org.apache.juneau.urlencoding.UrlEncodingSerializer#URLENC_expandedParams
URLENC_expandedParams}
- * <li><b>Name:</b>
<js>"UrlEncodingSerializer.expandedParams.b"</js>
- * <li><b>Data type:</b> <jk>boolean</jk>
- * <li><b>System property:</b>
<c>UrlEncodingSerializer.expandedParams</c>
- * <li><b>Environment variable:</b>
<c>URLENCODINGSERIALIZER_EXPANDEDPARAMS</c>
- * <li><b>Default:</b> <jk>false</jk>
- * <li><b>Session property:</b> <jk>false</jk>
- * <li><b>Annotations:</b>
- * <ul>
- * <li class='ja'>{@link
org.apache.juneau.urlencoding.annotation.UrlEncodingConfig#expandedParams()}
- * </ul>
- * <li><b>Methods:</b>
- * <ul>
- * <li class='jm'>{@link
org.apache.juneau.urlencoding.UrlEncodingSerializerBuilder#expandedParams()}
- * </ul>
- * </ul>
- */
- public static final String URLENC_expandedParams = PREFIX +
".expandedParams.b";
-
-
-
//-------------------------------------------------------------------------------------------------------------------
- // Predefined instances
+ // Static
//-------------------------------------------------------------------------------------------------------------------
/** Reusable instance of {@link UrlEncodingSerializer}, all default
settings. */
@@ -170,9 +135,8 @@ public class UrlEncodingSerializer extends UonSerializer
implements UrlEncodingM
/** Reusable instance of {@link UrlEncodingSerializer.Readable}. */
public static final UrlEncodingSerializer DEFAULT_READABLE = new
Readable(create());
-
//-------------------------------------------------------------------------------------------------------------------
- // Predefined subclasses
+ // Static subclasses
//-------------------------------------------------------------------------------------------------------------------
/**
@@ -220,13 +184,13 @@ public class UrlEncodingSerializer extends UonSerializer
implements UrlEncodingM
}
}
-
//-------------------------------------------------------------------------------------------------------------------
// Instance
//-------------------------------------------------------------------------------------------------------------------
- private final boolean
+ final boolean
expandedParams;
+
private final Map<ClassMeta<?>,UrlEncodingClassMeta>
urlEncodingClassMetas = new ConcurrentHashMap<>();
private final Map<BeanPropertyMeta,UrlEncodingBeanPropertyMeta>
urlEncodingBeanPropertyMetas = new ConcurrentHashMap<>();
@@ -237,8 +201,7 @@ public class UrlEncodingSerializer extends UonSerializer
implements UrlEncodingM
*/
protected UrlEncodingSerializer(UrlEncodingSerializerBuilder builder) {
super(builder.encoding());
- ContextProperties cp = getContextProperties();
- expandedParams =
cp.getBoolean(URLENC_expandedParams).orElse(false);
+ expandedParams = builder.expandedParams;
}
@Override /* Context */
@@ -310,7 +273,7 @@ public class UrlEncodingSerializer extends UonSerializer
implements UrlEncodingM
/**
* Serialize bean property collections/arrays as separate key/value
pairs.
*
- * @see #URLENC_expandedParams
+ * @see UrlEncodingSerializerBuilder#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>.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
index eafdd4d..4914a5c 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
@@ -12,8 +12,6 @@
//
***************************************************************************************************************************
package org.apache.juneau.urlencoding;
-import static org.apache.juneau.urlencoding.UrlEncodingSerializer.*;
-
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.nio.charset.*;
@@ -31,6 +29,8 @@ import org.apache.juneau.uon.*;
@FluentSetters
public class UrlEncodingSerializerBuilder extends UonSerializerBuilder {
+ boolean expandedParams;
+
/**
* Constructor, default settings.
*/
@@ -38,6 +38,7 @@ public class UrlEncodingSerializerBuilder extends
UonSerializerBuilder {
super();
produces("application/x-www-form-urlencoded");
type(UrlEncodingSerializer.class);
+ expandedParams = env("UrlEncoding.expandedParams", false);
}
/**
@@ -47,6 +48,7 @@ public class UrlEncodingSerializerBuilder extends
UonSerializerBuilder {
*/
protected UrlEncodingSerializerBuilder(UrlEncodingSerializer copyFrom) {
super(copyFrom);
+ expandedParams = copyFrom.expandedParams;
}
/**
@@ -56,6 +58,7 @@ public class UrlEncodingSerializerBuilder extends
UonSerializerBuilder {
*/
protected UrlEncodingSerializerBuilder(UrlEncodingSerializerBuilder
copyFrom) {
super(copyFrom);
+ expandedParams = copyFrom.expandedParams;
}
@Override /* ContextBuilder */
@@ -110,15 +113,23 @@ public class UrlEncodingSerializerBuilder extends
UonSerializerBuilder {
* String <jv>out2</jv> =
<jv>serializer2</jv>.serialize(<jk>new</jk> A()); <jc>
* </p>
*
- * <ul class='seealso'>
- * <li class='jf'>{@link
UrlEncodingSerializer#URLENC_expandedParams}
- * </ul>
- *
* @return This object (for method chaining).
*/
@FluentSetter
public UrlEncodingSerializerBuilder expandedParams() {
- return set(URLENC_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 UrlEncodingSerializerBuilder expandedParams(boolean value) {
+ expandedParams = value;
+ return this;
}
// <FluentSetters>
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
index a86acd7..0242bce 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
@@ -270,7 +270,7 @@ public class UrlEncodingSerializerSession extends
UonSerializerSession {
/**
* Configuration property: Serialize bean property collections/arrays
as separate key/value pairs.
*
- * @see UrlEncodingSerializer#URLENC_expandedParams
+ * @see UrlEncodingSerializerBuilder#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>.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncoding.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncoding.java
index 778bae8..ee450a4 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncoding.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncoding.java
@@ -44,8 +44,8 @@ public @interface UrlEncoding {
* When true, bean properties of type array or Collection will be
expanded into multiple key/value pairings.
*
* <p>
- * This annotation is identical in behavior to using the {@link
UrlEncodingSerializer#URLENC_expandedParams}
- * and {@link UrlEncodingParser#URLENC_expandedParams} properties, but
applies to only instances of this bean.
+ * This annotation is identical in behavior to using the {@link
UrlEncodingSerializerBuilder#expandedParams()}
+ * and {@link UrlEncodingParserBuilder#expandedParams()} properties,
but applies to only instances of this bean.
*/
boolean expandedParams() default false;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
index 107c038..4b79218 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
@@ -30,7 +30,7 @@ import org.apache.juneau.urlencoding.*;
@Target({TYPE,METHOD})
@Retention(RUNTIME)
@Inherited
-@ContextApply(UrlEncodingConfigAnnotation.Apply.class)
+@ContextApply({UrlEncodingConfigAnnotation.SerializerApply.class,UrlEncodingConfigAnnotation.ParserApply.class})
public @interface UrlEncodingConfig {
/**
@@ -53,7 +53,7 @@ public @interface UrlEncodingConfig {
* Configuration property: Parser bean property collections/arrays as
separate key/value pairs.
*
* <p>
- * This is the parser-side equivalent of the {@link
UrlEncodingSerializer#URLENC_expandedParams} setting.
+ * This is the parser-side equivalent of the {@link
UrlEncodingSerializerBuilder#expandedParams()} setting.
*
* <p>
* If <js>"false"</js>, serializing the array <c>[1,2,3]</c> results in
<c>?key=$a(1,2,3)</c>.
@@ -77,7 +77,7 @@ public @interface UrlEncodingConfig {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link
UrlEncodingSerializer#URLENC_expandedParams}
+ * <li class='jf'>{@link
UrlEncodingSerializerBuilder#expandedParams()}
* </ul>
*/
String expandedParams() default "";
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfigAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfigAnnotation.java
index cbcaa84..b47f343 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfigAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfigAnnotation.java
@@ -23,25 +23,46 @@ import org.apache.juneau.urlencoding.*;
public class UrlEncodingConfigAnnotation {
/**
- * Applies {@link UrlEncodingConfig} annotations to a {@link
ContextPropertiesBuilder}.
+ * Applies {@link UrlEncodingConfig} annotations to a {@link
UrlEncodingSerializerBuilder}.
*/
- public static class Apply extends
AnnotationApplier<UrlEncodingConfig,ContextPropertiesBuilder> {
+ public static class SerializerApply extends
AnnotationApplier<UrlEncodingConfig,UrlEncodingSerializerBuilder> {
/**
* Constructor.
*
* @param vr The resolver for resolving values in annotations.
*/
- public Apply(VarResolverSession vr) {
- super(UrlEncodingConfig.class,
ContextPropertiesBuilder.class, vr);
+ public SerializerApply(VarResolverSession vr) {
+ super(UrlEncodingConfig.class,
UrlEncodingSerializerBuilder.class, vr);
}
@Override
- public void apply(AnnotationInfo<UrlEncodingConfig> ai,
ContextPropertiesBuilder b) {
+ public void apply(AnnotationInfo<UrlEncodingConfig> ai,
UrlEncodingSerializerBuilder b) {
UrlEncodingConfig a = ai.getAnnotation();
- bool(a.expandedParams()).ifPresent(x ->
b.set(UrlEncodingSerializer.URLENC_expandedParams, x));
- bool(a.expandedParams()).ifPresent(x ->
b.set(UrlEncodingParser.URLENC_expandedParams, x));
+ bool(a.expandedParams()).ifPresent(x ->
b.expandedParams(x));
+ }
+ }
+
+ /**
+ * Applies {@link UrlEncodingConfig} annotations to a {@link
UrlEncodingParserBuilder}.
+ */
+ public static class ParserApply extends
AnnotationApplier<UrlEncodingConfig,UrlEncodingParserBuilder> {
+
+ /**
+ * Constructor.
+ *
+ * @param vr The resolver for resolving values in annotations.
+ */
+ public ParserApply(VarResolverSession vr) {
+ super(UrlEncodingConfig.class,
UrlEncodingParserBuilder.class, vr);
+ }
+
+ @Override
+ public void apply(AnnotationInfo<UrlEncodingConfig> ai,
UrlEncodingParserBuilder b) {
+ UrlEncodingConfig a = ai.getAnnotation();
+
+ bool(a.expandedParams()).ifPresent(x ->
b.expandedParams(x));
}
}
}
\ No newline at end of file