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