View Javadoc
1   package com.atlassian.plugin.servlet.descriptors;
2   
3   import com.atlassian.plugin.Permissions;
4   import com.atlassian.plugin.Plugin;
5   import com.atlassian.plugin.PluginParseException;
6   import com.atlassian.plugin.RequirePermission;
7   import com.atlassian.plugin.descriptors.AbstractModuleDescriptor;
8   import com.atlassian.plugin.module.ModuleFactory;
9   import com.atlassian.plugin.util.validation.ValidationPattern;
10  import org.dom4j.Element;
11  import org.slf4j.Logger;
12  import org.slf4j.LoggerFactory;
13  
14  import java.util.ArrayList;
15  import java.util.HashMap;
16  import java.util.List;
17  import java.util.Map;
18  
19  import static com.atlassian.plugin.util.validation.ValidationPattern.test;
20  
21  /**
22   * Acts as a base for other servlet type module descriptors to inherit. It adds parsing and retrieval of any paths
23   * declared in the descriptor with <url-pattern> as well as <init-param>s.
24   *
25   * @since 2.1.0
26   */
27  @RequirePermission(Permissions.EXECUTE_JAVA)
28  public abstract class BaseServletModuleDescriptor<T> extends AbstractModuleDescriptor<T> {
29      protected static final Logger log = LoggerFactory.getLogger(BaseServletModuleDescriptor.class);
30  
31      private List<String> paths;
32      private Map<String, String> initParams;
33      private boolean asyncSupported;
34  
35      /**
36       * @param moduleCreator
37       * @since 2.5.0
38       */
39      public BaseServletModuleDescriptor(ModuleFactory moduleCreator) {
40          super(moduleCreator);
41      }
42  
43      public void init(Plugin plugin, Element element) throws PluginParseException {
44          super.init(plugin, element);
45  
46          checkPermissions(); // do that early
47  
48          List<Element> urlPatterns = element.elements("url-pattern");
49          paths = new ArrayList<>(urlPatterns.size());
50  
51          for (Element urlPattern : urlPatterns) {
52              paths.add(urlPattern.getTextTrim());
53          }
54  
55          initParams = new HashMap<>();
56          List<Element> paramsList = element.elements("init-param");
57          for (Element initParamEl : paramsList) {
58              Element paramNameEl = initParamEl.element("param-name");
59              Element paramValueEl = initParamEl.element("param-value");
60              initParams.put(paramNameEl.getTextTrim(), paramValueEl.getTextTrim());
61          }
62          Element async = element.element("async-supported");
63          if (async != null) {
64              asyncSupported = Boolean.valueOf(async.getTextTrim());
65          } else {
66              asyncSupported = false;
67          }
68      }
69  
70      @Override
71      protected void provideValidationRules(ValidationPattern pattern) {
72          super.provideValidationRules(pattern);
73          pattern.
74                  rule(
75                          test("url-pattern").withError("There must be at least one path specified")).
76                  rule("init-param",
77                          test("param-name").withError("Parameter name is required"),
78                          test("param-value").withError("Parameter value is required"));
79      }
80  
81      public List<String> getPaths() {
82          return paths;
83      }
84  
85      public Map<String, String> getInitParams() {
86          return initParams;
87      }
88  
89      /**
90       * @since 4.6.0
91       */
92      public boolean isAsyncSupported() {
93          return asyncSupported;
94      }
95  }