forked from jooby-project/jooby
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathView.java
More file actions
136 lines (119 loc) · 3.57 KB
/
Copy pathView.java
File metadata and controls
136 lines (119 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
* 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.jooby;
import static java.util.Objects.requireNonNull;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
/**
* Special result that hold view name and model. It will be processed by a {@link View.Engine}.
*
* @author edgar
* @since 0.1.0
*/
public class View extends Result {
/**
* Special body serializer for dealing with {@link View}.
*
* Multiples view engine are supported too.
*
* In order to support multiples view engine, a view engine is allowed to throw a
* {@link FileNotFoundException} when a template can't be resolved it.
* This gives the chance to the next view resolver to load the template.
*
* @author edgar
* @since 0.1.0
*/
public interface Engine extends Renderer {
@Override
default void render(final Object value, final Renderer.Context ctx) throws Exception {
if (value instanceof View) {
View view = (View) value;
ctx.type(MediaType.html);
render(view, ctx);
}
}
/**
* Render a view or throw a {@link FileNotFoundException} when template can't be resolved it..
*
* @param viewable View to render.
* @param ctx A rendering context.
* @throws FileNotFoundException If template can't be resolved.
* @throws Exception If view rendering fails.
*/
void render(final View viewable, final Renderer.Context ctx) throws FileNotFoundException,
Exception;
}
/** View's name. */
private final String name;
/** View's model. */
private final Map<String, Object> model = new HashMap<>();
/**
* Creates a new {@link View}.
*
* @param name View's name.
*/
protected View(final String name) {
this.name = requireNonNull(name, "View name is required.");
type(MediaType.html);
super.set(this);
}
/**
* @return View's name.
*/
public String name() {
return name;
}
/**
* Set a model attribute and override existing attribute.
*
* @param name Attribute's name.
* @param value Attribute's value.
* @return This view.
*/
public View put(final String name, final Object value) {
requireNonNull(name, "Model name is required.");
model.put(name, value);
return this;
}
/**
* Set model attributes and override existing values.
*
* @param values Attribute's value.
* @return This view.
*/
public View put(final Map<String, ?> values) {
values.forEach((k, v) -> model.put(k, v));
return this;
}
/**
* @return View's model.
*/
public Map<String, ?> model() {
return model;
}
@Override
public Result set(final Object content) {
throw new UnsupportedOperationException("Not allowed in views, use one of the put methods.");
}
@Override
public String toString() {
return name + ": " + model;
}
}