Skip to content

Commit 0808c21

Browse files
committed
core: Context API changes fix #2755
- Rename Context.attribute(String) => Context.getAttribute(String) - Rename Context.attribute(String, Object) => Context.setAttribute(String, Object) - Merge Context.multipart into Context.form. So, Context.multipart related methods will be removed and replaced with Context.form methods.
1 parent 9107335 commit 0808c21

43 files changed

Lines changed: 239 additions & 580 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

jooby/src/main/java/io/jooby/Context.java

Lines changed: 19 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public interface Context extends Registry {
7070
/**
7171
* Context attributes (a.k.a request attributes).
7272
*
73-
* @return Context attributes.
73+
* @return Mutable Context attributes.
7474
*/
7575
@NonNull Map<String, Object> getAttributes();
7676

@@ -82,7 +82,7 @@ public interface Context extends Registry {
8282
* @param <T> Attribute type.
8383
* @return Attribute value or <code>null</code>.
8484
*/
85-
@Nullable <T> T attribute(@NonNull String key);
85+
@Nullable <T> T getAttribute(@NonNull String key);
8686

8787
/**
8888
* Set an application attribute.
@@ -91,12 +91,12 @@ public interface Context extends Registry {
9191
* @param value Attribute value.
9292
* @return This router.
9393
*/
94-
@NonNull Context attribute(@NonNull String key, Object value);
94+
@NonNull Context setAttribute(@NonNull String key, Object value);
9595

9696
/**
97-
* Get the HTTP router (usually this represent an instance of {@link Jooby}.
97+
* Get the HTTP router (usually this represents an instance of {@link Jooby}.
9898
*
99-
* @return HTTP router (usually this represent an instance of {@link Jooby}.
99+
* @return HTTP router (usually this represents an instance of {@link Jooby}.
100100
*/
101101
@NonNull Router getRouter();
102102

@@ -353,19 +353,6 @@ public interface Context extends Registry {
353353
*/
354354
@NonNull Map<String, String> queryMap();
355355

356-
/**
357-
* Query string as multi-value map.
358-
*
359-
* <pre>{@code/search?q=jooby&sort=name&sort=id}</pre>
360-
*
361-
* Produces
362-
*
363-
* <pre>{q: [jooby], sort: [name, id]}</pre>
364-
*
365-
* @return Query string as map.
366-
*/
367-
@NonNull Map<String, List<String>> queryMultimap();
368-
369356
/* **********************************************************************************************
370357
* Header API
371358
* **********************************************************************************************
@@ -393,13 +380,6 @@ public interface Context extends Registry {
393380
*/
394381
@NonNull Map<String, String> headerMap();
395382

396-
/**
397-
* Header as multi-value map.
398-
*
399-
* @return Header as multi-value map.
400-
*/
401-
@NonNull Map<String, List<String>> headerMultimap();
402-
403383
/**
404384
* True if the given type matches the `Accept` header. This method returns <code>true</code> if
405385
* there is no accept header.
@@ -691,67 +671,22 @@ default boolean isPreflight() {
691671
@NonNull Context setScheme(@NonNull String scheme);
692672

693673
/* **********************************************************************************************
694-
* Form API
674+
* Form/Multipart API
695675
* **********************************************************************************************
696676
*/
697677

698678
/**
699-
* Formdata as {@link ValueNode}. This method is for <code>application/form-url-encoded</code>
700-
* request.
679+
* Get form data.
701680
*
702-
* @return Formdata as {@link ValueNode}. This method is for <code>application/form-url-encoded
703-
* </code> request.
704-
*/
705-
@NonNull Formdata form();
706-
707-
/**
708-
* Formdata as multi-value map. Only for <code>application/form-url-encoded</code> request.
709-
*
710-
* @return Formdata as multi-value map. Only for <code>application/form-url-encoded</code>
711-
* request.
712-
*/
713-
@NonNull Map<String, List<String>> formMultimap();
714-
715-
/**
716-
* Formdata as single-value map. Only for <code>application/form-url-encoded</code> request.
717-
*
718-
* @return Formdata as single-value map. Only for <code>application/form-url-encoded</code>
719-
* request.
720-
*/
721-
@NonNull Map<String, String> formMap();
722-
723-
/**
724-
* Form field that matches the given name. Only for <code>application/form-url-encoded</code>
681+
* <p>Only for <code>application/x-www-form-urlencoded</code> or <code>multipart/form-data</code>
725682
* request.
726683
*
727-
* @param name Field name.
728-
* @return Form value.
729-
*/
730-
@NonNull ValueNode form(@NonNull String name);
731-
732-
/**
733-
* Convert formdata to the given type. Only for <code>application/form-url-encoded</code> request.
734-
*
735-
* @param type Target type.
736-
* @param <T> Target type.
737-
* @return Formdata as requested type.
738-
*/
739-
@NonNull <T> T form(@NonNull Class<T> type);
740-
741-
/* **********************************************************************************************
742-
* Multipart API
743-
* **********************************************************************************************
744-
*/
745-
746-
/**
747-
* Get multipart data. Only for <code>multipart/form-data</code> request..
748-
*
749684
* @return Multipart value.
750685
*/
751-
@NonNull Multipart multipart();
686+
@NonNull Formdata form();
752687

753688
/**
754-
* Get a multipart field that matches the given name.
689+
* Get a form field that matches the given name.
755690
*
756691
* <p>File upload retrieval is available using {@link Context#file(String)}.
757692
*
@@ -760,36 +695,29 @@ default boolean isPreflight() {
760695
* @param name Field name.
761696
* @return Multipart value.
762697
*/
763-
@NonNull ValueNode multipart(@NonNull String name);
698+
@NonNull ValueNode form(@NonNull String name);
764699

765700
/**
766-
* Convert multipart data to the given type.
701+
* Convert form data to the given type.
767702
*
768-
* <p>Only for <code>multipart/form-data</code> request.
703+
* <p>Only for <code>application/x-www-form-urlencoded</code> or <code>multipart/form-data</code>
704+
* request.
769705
*
770706
* @param type Target type.
771707
* @param <T> Target type.
772708
* @return Target value.
773709
*/
774-
@NonNull <T> T multipart(@NonNull Class<T> type);
775-
776-
/**
777-
* Multipart data as multi-value map.
778-
*
779-
* <p>Only for <code>multipart/form-data</code> request.
780-
*
781-
* @return Multi-value map.
782-
*/
783-
@NonNull Map<String, List<String>> multipartMultimap();
710+
@NonNull <T> T form(@NonNull Class<T> type);
784711

785712
/**
786-
* Multipart data as single-value map.
713+
* Form data as single-value map.
787714
*
788-
* <p>Only for <code>multipart/form-data</code> request.
715+
* <p>Only for <code>application/x-www-form-urlencoded</code> or <code>multipart/form-data</code>
716+
* request.
789717
*
790718
* @return Single-value map.
791719
*/
792-
@NonNull Map<String, String> multipartMap();
720+
@NonNull Map<String, String> formMap();
793721

794722
/**
795723
* All file uploads. Only for <code>multipart/form-data</code> request.

jooby/src/main/java/io/jooby/CsrfHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
* <p>The {@link CsrfHandler} handler will read an existing token from {@link Session} (or created a
3939
* new one is necessary) and make available as a request local variable via: {@link
40-
* Context#attribute(String, Object)}.
40+
* Context#setAttribute(String, Object)}.
4141
*
4242
* <p>If the incoming request require a token verification, it will extract the token from:
4343
*
@@ -110,7 +110,7 @@ public void apply(@NonNull Context ctx) throws Exception {
110110
return newToken;
111111
});
112112

113-
ctx.attribute(name, token);
113+
ctx.setAttribute(name, token);
114114

115115
if (filter.test(ctx)) {
116116
String clientToken =

jooby/src/main/java/io/jooby/DefaultContext.java

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ default boolean matches(String pattern) {
8787
* @return Attribute value.
8888
*/
8989
@Override
90-
@Nullable default <T> T attribute(@NonNull String key) {
90+
@Nullable default <T> T getAttribute(@NonNull String key) {
9191
T attribute = (T) getAttributes().get(key);
9292
if (attribute == null) {
9393
Map<String, Object> globals = getRouter().getAttributes();
@@ -97,7 +97,7 @@ default boolean matches(String pattern) {
9797
}
9898

9999
@Override
100-
@NonNull default Context attribute(@NonNull String key, Object value) {
100+
@NonNull default Context setAttribute(@NonNull String key, Object value) {
101101
getAttributes().put(key, value);
102102
return this;
103103
}
@@ -214,11 +214,6 @@ default boolean matches(String pattern) {
214214
return query().toMap();
215215
}
216216

217-
@Override
218-
@NonNull default Map<String, List<String>> queryMultimap() {
219-
return query().toMultimap();
220-
}
221-
222217
@Override
223218
@NonNull default Value header(@NonNull String name) {
224219
return header().get(name);
@@ -229,11 +224,6 @@ default boolean matches(String pattern) {
229224
return header().toMap();
230225
}
231226

232-
@Override
233-
@NonNull default Map<String, List<String>> headerMultimap() {
234-
return header().toMultimap();
235-
}
236-
237227
@Override
238228
default boolean accept(@NonNull MediaType contentType) {
239229
return Objects.equals(accept(singletonList(contentType)), contentType);
@@ -375,16 +365,6 @@ default boolean isSecure() {
375365
return getScheme().equals("https");
376366
}
377367

378-
@Override
379-
@NonNull default Map<String, List<String>> formMultimap() {
380-
return form().toMultimap();
381-
}
382-
383-
@Override
384-
@NonNull default Map<String, String> formMap() {
385-
return form().toMap();
386-
}
387-
388368
@Override
389369
@NonNull default ValueNode form(@NonNull String name) {
390370
return form().get(name);
@@ -396,38 +376,23 @@ default boolean isSecure() {
396376
}
397377

398378
@Override
399-
@NonNull default ValueNode multipart(@NonNull String name) {
400-
return multipart().get(name);
401-
}
402-
403-
@Override
404-
@NonNull default <T> T multipart(@NonNull Class<T> type) {
405-
return multipart().to(type);
406-
}
407-
408-
@Override
409-
@NonNull default Map<String, List<String>> multipartMultimap() {
410-
return multipart().toMultimap();
411-
}
412-
413-
@Override
414-
@NonNull default Map<String, String> multipartMap() {
415-
return multipart().toMap();
379+
@NonNull default Map<String, String> formMap() {
380+
return form().toMap();
416381
}
417382

418383
@Override
419384
@NonNull default List<FileUpload> files() {
420-
return multipart().files();
385+
return form().files();
421386
}
422387

423388
@Override
424389
@NonNull default List<FileUpload> files(@NonNull String name) {
425-
return multipart().files(name);
390+
return form().files(name);
426391
}
427392

428393
@Override
429394
@NonNull default FileUpload file(@NonNull String name) {
430-
return multipart().file(name);
395+
return form().file(name);
431396
}
432397

433398
@Override

jooby/src/main/java/io/jooby/Formdata.java

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
package io.jooby;
77

88
import java.util.Collection;
9+
import java.util.List;
910

1011
import edu.umd.cs.findbugs.annotations.NonNull;
11-
import io.jooby.internal.FormdataNode;
12+
import io.jooby.internal.MultipartNode;
1213

1314
/**
14-
* Formdata class for direct MVC parameter provisioning.
15+
* Form class for direct MVC parameter provisioning.
1516
*
16-
* <p>HTTP request must be encoded as {@link MediaType#FORM_URLENCODED}.
17+
* <p>HTTP request must be encoded as {@link MediaType#FORM_URLENCODED} or {@link
18+
* MediaType#MULTIPART_FORMDATA}.
1719
*
1820
* @author edgar
1921
* @since 2.0.0
@@ -48,12 +50,47 @@ public interface Formdata extends ValueNode {
4850
void put(@NonNull String path, @NonNull Collection<String> values);
4951

5052
/**
51-
* Creates a formdata object.
53+
* Put/Add a file into this multipart request.
54+
*
55+
* @param name HTTP name.
56+
* @param file File upload.
57+
*/
58+
void put(@NonNull String name, @NonNull FileUpload file);
59+
60+
/**
61+
* All file uploads. Only for <code>multipart/form-data</code> request.
62+
*
63+
* @return All file uploads.
64+
*/
65+
@NonNull List<FileUpload> files();
66+
67+
/**
68+
* All file uploads that matches the given field name.
69+
*
70+
* <p>Only for <code>multipart/form-data</code> request.
71+
*
72+
* @param name Field name. Please note this is the form field name, not the actual file name.
73+
* @return All file uploads.
74+
*/
75+
@NonNull List<FileUpload> files(@NonNull String name);
76+
77+
/**
78+
* A file upload that matches the given field name.
79+
*
80+
* <p>Only for <code>multipart/form-data</code> request.
81+
*
82+
* @param name Field name. Please note this is the form field name, not the actual file name.
83+
* @return A file upload.
84+
*/
85+
@NonNull FileUpload file(@NonNull String name);
86+
87+
/**
88+
* Creates a new multipart object.
5289
*
5390
* @param ctx Current context.
54-
* @return Formdata.
91+
* @return Multipart instance.
5592
*/
5693
static @NonNull Formdata create(@NonNull Context ctx) {
57-
return new FormdataNode(ctx);
94+
return new MultipartNode(ctx);
5895
}
5996
}

0 commit comments

Comments
 (0)