1 package com.atlassian.plugin.servlet.descriptors;
2
3 import com.atlassian.plugin.Plugin;
4 import com.atlassian.plugin.module.ModuleFactory;
5 import com.atlassian.plugin.module.PrefixDelegatingModuleFactory;
6 import com.atlassian.plugin.servlet.ObjectFactories;
7 import com.atlassian.plugin.servlet.ObjectFactory;
8 import com.atlassian.plugin.servlet.PluginBuilder;
9 import com.atlassian.plugin.servlet.ServletModuleManager;
10
11 import javax.servlet.http.HttpServlet;
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.HashMap;
15 import java.util.LinkedList;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Optional;
19
20 import static java.util.Collections.emptySet;
21 import static org.mockito.Mockito.mock;
22
23 public class ServletModuleDescriptorBuilder {
24 private Plugin plugin = new PluginBuilder().build();
25 private String key = "test.servlet";
26 private Optional<String> scopeKey = Optional.empty();
27 private List<String> paths = new LinkedList<>();
28 private ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
29 private Map<String, String> initParams = new HashMap<>();
30 private ObjectFactory<HttpServlet> servletFactory;
31
32 public ServletModuleDescriptorBuilder with(Plugin plugin) {
33 this.plugin = plugin;
34 return this;
35 }
36
37 public ServletModuleDescriptorBuilder withKey(String key) {
38 this.key = key;
39 return this;
40 }
41
42 public ServletModuleDescriptorBuilder with(final HttpServlet servlet) {
43 this.servletFactory = ObjectFactories.createSingleton(servlet);
44 return this;
45 }
46
47 public ServletModuleDescriptorBuilder withFactory(ObjectFactory<HttpServlet> servlet) {
48 this.servletFactory = servlet;
49 return this;
50 }
51
52 public ServletModuleDescriptorBuilder withPath(String path) {
53 paths.add(path);
54 return this;
55 }
56
57 public ServletModuleDescriptorBuilder with(ServletModuleManager servletModuleManager) {
58 this.servletModuleManager = servletModuleManager;
59 return this;
60 }
61
62 public ServletModuleDescriptorBuilder withInitParam(String name, String value) {
63 initParams.put(name, value);
64 return this;
65 }
66
67 public ServletModuleDescriptorBuilder withScopeKey(Optional<String> scopeKey) {
68 this.scopeKey = scopeKey;
69 return this;
70 }
71
72
73 public ServletModuleDescriptor build() {
74 Descriptor d = new Descriptor(plugin, key, scopeKey, servletFactory, immutableList(paths), immutableMap(initParams),
75 servletModuleManager, new PrefixDelegatingModuleFactory(emptySet()));
76 plugin.addModuleDescriptor(d);
77 return d;
78 }
79
80 static <K, V> Map<K, V> immutableMap(Map<K, V> initParams) {
81 return Collections.unmodifiableMap(new HashMap<K, V>(initParams));
82 }
83
84 <T> List<T> immutableList(List<T> list) {
85 List<T> copy = new ArrayList<T>(list.size());
86 copy.addAll(list);
87 return Collections.unmodifiableList(copy);
88 }
89
90 static final class Descriptor extends ServletModuleDescriptor {
91 final String key;
92 final ObjectFactory<HttpServlet> servletFactory;
93 final List<String> paths;
94 final ServletModuleManager servletModuleManager;
95 final Map<String, String> initParams;
96 final Optional<String> scopeKey;
97
98 public Descriptor(
99 Plugin plugin,
100 String key,
101 Optional<String> scopeKey,
102 ObjectFactory<HttpServlet> servletFactory,
103 List<String> paths,
104 Map<String, String> initParams,
105 ServletModuleManager servletModuleManager,
106 ModuleFactory moduleFactory) {
107 super(moduleFactory, servletModuleManager);
108 this.plugin = plugin;
109 this.key = key;
110 this.scopeKey = scopeKey;
111 this.servletFactory = servletFactory;
112 this.paths = paths;
113 this.initParams = initParams;
114 this.servletModuleManager = servletModuleManager;
115 }
116
117 @Override
118 public Plugin getPlugin() {
119 return plugin;
120 }
121
122 @Override
123 public String getCompleteKey() {
124 return getPluginKey() + ":" + key;
125 }
126
127 @Override
128 public String getKey() {
129 return key;
130 }
131
132 @Override
133 public HttpServlet getModule() {
134 return servletFactory.create();
135 }
136
137
138 @Override
139 public Optional<String> getScopeKey() {
140 return scopeKey;
141 }
142
143 @Override
144 public List<String> getPaths() {
145 return paths;
146 }
147
148 @Override
149 public Map<String, String> getInitParams() {
150 return initParams;
151 }
152
153 }
154
155 }