刘光辉
13 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
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
package jnpf.limsService.print;
 
import jnpf.exception.DataException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * Spring 启动时收集所有 {@link PrintTemplateRenderer} 实现,按 templateId 索引。
 * Controller 通过 {@link #get(String)} 路由到具体 renderer。
 */
@Component
public class PrintRendererRegistry {
 
    private final Map<String, PrintTemplateRenderer> renderers;
 
    @Autowired
    public PrintRendererRegistry(List<PrintTemplateRenderer> rendererList) {
        Map<String, PrintTemplateRenderer> map = new HashMap<>();
        for (PrintTemplateRenderer r : rendererList) {
            String key = r.getTemplateId();
            if (key == null || key.isEmpty()) {
                continue;
            }
            PrintTemplateRenderer existed = map.put(key, r);
            if (existed != null) {
                throw new IllegalStateException(
                        "重复的 PrintTemplateRenderer template_id=" + key
                                + ",冲突类: " + existed.getClass().getName()
                                + " vs " + r.getClass().getName());
            }
        }
        this.renderers = Collections.unmodifiableMap(map);
    }
 
    public PrintTemplateRenderer get(String templateId) {
        PrintTemplateRenderer r = renderers.get(templateId);
        if (r == null) {
            throw new DataException("找不到打印模板的渲染器: " + templateId);
        }
        return r;
    }
}