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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
use std::any::TypeId;
use std::sync::Arc;
use indexmap::IndexMap;
use crate::ExecutionAttributeValue;
use crate::cache::ICacheManager;
use crate::cdatasection::ICDATASectionProcessor;
use crate::comment::ICommentProcessor;
use crate::context::IEngineContextFactory;
use crate::decoupled::IDecoupledTemplateLogicResolver;
use crate::dialect::IDialect;
use crate::doctype::IDocTypeProcessor;
use crate::element::IElementProcessor;
use crate::engine::{AttributeDefinitions, ElementDefinitions, ITemplateManager};
use crate::expression::IExpressionObjectFactory;
use crate::linkbuilder::ILinkBuilder;
use crate::messageresolver::IMessageResolver;
use crate::model::IModelFactory;
use crate::postprocessor::IPostProcessor;
use crate::preprocessor::IPreProcessor;
use crate::processinginstruction::IProcessingInstructionProcessor;
use crate::templateboundaries::ITemplateBoundariesProcessor;
use crate::templateresolver::ITemplateResolver;
use crate::text::ITextProcessor;
use crate::util::Utf16String;
use crate::xmldeclaration::IXMLDeclarationProcessor;
use crate::{DialectConfiguration, TemplateMode};
/// 决定 TemplateEngine 全部解析、处理、表达式及缓存行为的配置合同。
///
/// 实现必须可在线程间安全共享。返回的集合是初始化完成后的稳定、只读执行快照;
/// 调用方不能借这些返回值修改引擎配置。
///
/// 对应 Java: `org.thymeleaf.IEngineConfiguration`。
///
/// # 另请参阅
///
/// [`crate::EngineConfiguration`]。
///
/// # 起始版本
///
/// 上游自 Thymeleaf 3.0.0 起提供该接口。
pub trait IEngineConfiguration: Send + Sync {
/// 返回按执行顺序排列的模板 Resolver。
///
/// 对应 Java: `IEngineConfiguration#getTemplateResolvers()`。
///
/// # 返回值
///
/// 返回稳定排序、不可变配置对应的借用快照;未设置 order 的 Resolver 排在最后。
fn get_template_resolvers(&self) -> Vec<&dyn ITemplateResolver>;
/// 返回按执行顺序排列的消息 Resolver。
///
/// 对应 Java: `IEngineConfiguration#getMessageResolvers()`。
///
/// # 返回值
///
/// 返回稳定排序的消息 Resolver 借用快照。
fn get_message_resolvers(&self) -> Vec<&dyn IMessageResolver>;
/// 返回按执行顺序排列的 LinkBuilder。
///
/// 对应 Java: `IEngineConfiguration#getLinkBuilders()`。
///
/// # 返回值
///
/// 返回稳定排序的链接构建器借用快照。
fn get_link_builders(&self) -> Vec<&dyn ILinkBuilder>;
/// 返回配置的缓存管理器。
///
/// 对应 Java: `IEngineConfiguration#getCacheManager()`。
///
/// # 返回值
///
/// 缓存启用时返回共享管理器;`None` 对应 Java `null`,表示没有缓存。
fn get_cache_manager(&self) -> Option<&dyn ICacheManager>;
/// 返回 EngineContext 工厂。
///
/// 对应 Java: `IEngineConfiguration#getEngineContextFactory()`。
///
/// # 返回值
///
/// 返回初始化时冻结的同一工厂实例。
fn get_engine_context_factory(&self) -> &dyn IEngineContextFactory;
/// 返回解耦模板逻辑 Resolver。
///
/// 对应 Java: `IEngineConfiguration#getDecoupledTemplateLogicResolver()`。
///
/// # 返回值
///
/// 返回初始化时冻结的同一 Resolver 实例。
fn get_decoupled_template_logic_resolver(&self) -> &dyn IDecoupledTemplateLogicResolver;
/// 返回全部方言配置。
///
/// 对应 Java: `IEngineConfiguration#getDialectConfigurations()`。
///
/// # 返回值
///
/// 返回保留配置顺序和显式前缀状态的借用快照。
fn get_dialect_configurations(&self) -> Vec<&DialectConfiguration>;
/// 返回去重后的全部方言实例。
///
/// 对应 Java: `IEngineConfiguration#getDialects()`。
///
/// # 返回值
///
/// 返回按方言配置顺序排列的身份去重借用快照。
fn get_dialects(&self) -> Vec<&dyn IDialect>;
/// 按运行时具体类或方言能力接口筛选方言。
///
/// 对应 Java: `IEngineConfiguration#getDialectsOfType(Class<T>)`。
///
/// # 参数
///
/// - `type_id`:具体方言类型,或 `dyn IProcessorDialect` 等已知能力接口的
/// [`TypeId`]。
///
/// # 返回值
///
/// 返回满足 Java `Class#isInstance` 等价判断的方言,保持原配置顺序。
fn get_dialects_of_type(&self, type_id: TypeId) -> Vec<&dyn IDialect>;
/// 判断 StandardDialect 是否存在。
///
/// 对应 Java: `IEngineConfiguration#isStandardDialectPresent()`。
///
/// # 返回值
///
/// 配置包含 StandardDialect 时返回 `true`。
fn is_standard_dialect_present(&self) -> bool;
/// 返回 StandardDialect 的生效前缀。
///
/// 对应 Java: `IEngineConfiguration#getStandardDialectPrefix()`。
///
/// # 返回值
///
/// 返回显式或默认前缀;无 StandardDialect 或无前缀时返回 `None`。
fn get_standard_dialect_prefix(&self) -> Option<&Utf16String>;
/// 返回全局元素定义仓库。
///
/// 对应 Java: `IEngineConfiguration#getElementDefinitions()`。
///
/// # 返回值
///
/// 返回方言聚合阶段构建并冻结的元素定义。
fn get_element_definitions(&self) -> &ElementDefinitions;
/// 返回全局属性定义仓库。
///
/// 对应 Java: `IEngineConfiguration#getAttributeDefinitions()`。
///
/// # 返回值
///
/// 返回方言聚合阶段构建并冻结的属性定义。
fn get_attribute_definitions(&self) -> &AttributeDefinitions;
/// 返回指定模式的模板边界 Processor。
///
/// 对应 Java: `IEngineConfiguration#getTemplateBoundariesProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回按方言和 Processor precedence 排序的借用快照。
fn get_template_boundaries_processors(
&self,
template_mode: TemplateMode,
) -> Vec<&dyn ITemplateBoundariesProcessor>;
/// 返回指定模式的 CDATA Processor。
///
/// 对应 Java: `IEngineConfiguration#getCDATASectionProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回稳定排序的 CDATA Processor。
fn get_cdata_section_processors(
&self,
template_mode: TemplateMode,
) -> Vec<&dyn ICDATASectionProcessor>;
/// 返回指定模式的 Comment Processor。
///
/// 对应 Java: `IEngineConfiguration#getCommentProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回稳定排序的 Comment Processor。
fn get_comment_processors(&self, template_mode: TemplateMode) -> Vec<&dyn ICommentProcessor>;
/// 返回指定模式的 DOCTYPE Processor。
///
/// 对应 Java: `IEngineConfiguration#getDocTypeProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回稳定排序的 DOCTYPE Processor。
fn get_doc_type_processors(&self, template_mode: TemplateMode) -> Vec<&dyn IDocTypeProcessor>;
/// 返回指定模式的 Element Processor。
///
/// 对应 Java: `IEngineConfiguration#getElementProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回 Tag 与 Model Element Processor 的统一稳定序列。
fn get_element_processors(&self, template_mode: TemplateMode) -> Vec<&dyn IElementProcessor>;
/// 返回指定模式的 Text Processor。
///
/// 对应 Java: `IEngineConfiguration#getTextProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回稳定排序的 Text Processor。
fn get_text_processors(&self, template_mode: TemplateMode) -> Vec<&dyn ITextProcessor>;
/// 返回指定模式的 ProcessingInstruction Processor。
///
/// 对应 Java:
/// `IEngineConfiguration#getProcessingInstructionProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回稳定排序的 ProcessingInstruction Processor。
fn get_processing_instruction_processors(
&self,
template_mode: TemplateMode,
) -> Vec<&dyn IProcessingInstructionProcessor>;
/// 返回指定模式的 XMLDeclaration Processor。
///
/// 对应 Java: `IEngineConfiguration#getXMLDeclarationProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回稳定排序的 XMLDeclaration Processor。
fn get_xml_declaration_processors(
&self,
template_mode: TemplateMode,
) -> Vec<&dyn IXMLDeclarationProcessor>;
/// 返回指定模式的 PreProcessor。
///
/// 对应 Java: `IEngineConfiguration#getPreProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回方言级与对象级 precedence 排序后的 PreProcessor。
fn get_pre_processors(&self, template_mode: TemplateMode) -> Vec<&dyn IPreProcessor>;
/// 返回指定模式的 PostProcessor。
///
/// 对应 Java: `IEngineConfiguration#getPostProcessors(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:待查询的非空模板模式。
///
/// # 返回值
///
/// 返回方言级与对象级 precedence 排序后的 PostProcessor。
fn get_post_processors(&self, template_mode: TemplateMode) -> Vec<&dyn IPostProcessor>;
/// 返回不可修改的执行属性。
///
/// 对应 Java: `IEngineConfiguration#getExecutionAttributes()`。
///
/// # 返回值
///
/// 返回保留可空键、可空值和方言聚合顺序的同一只读映射。
fn get_execution_attributes(
&self,
) -> &IndexMap<Option<Utf16String>, Option<Arc<ExecutionAttributeValue>>>;
/// 返回聚合表达式对象工厂。
///
/// 对应 Java: `IEngineConfiguration#getExpressionObjectFactory()`。
///
/// # 返回值
///
/// 返回按方言顺序委派名称、构建和缓存判断的共享工厂。
fn get_expression_object_factory(&self) -> Arc<dyn IExpressionObjectFactory>;
/// 返回模板管理器。
///
/// 对应 Java: `IEngineConfiguration#getTemplateManager()`。
///
/// # 返回值
///
/// 返回二阶段初始化时创建、持有当前配置身份的唯一模板管理器。
fn get_template_manager(&self) -> &dyn ITemplateManager;
/// 返回指定模式的唯一模型工厂。
///
/// 对应 Java: `IEngineConfiguration#getModelFactory(TemplateMode)`。
///
/// # 参数
///
/// - `template_mode`:模型适用的非空模板模式。
///
/// # 返回值
///
/// 首次访问时并发安全地创建工厂;同一模式后续始终返回同一实例。
fn get_model_factory(&self, template_mode: TemplateMode) -> &dyn IModelFactory;
}