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