1   package com.atlassian.maven.plugins.amps.codegen.prompter.common.servlet;
2   
3   import java.util.ArrayList;
4   import java.util.HashMap;
5   import java.util.List;
6   import java.util.Map;
7   
8   import com.atlassian.maven.plugins.amps.codegen.annotations.ModuleCreatorClass;
9   import com.atlassian.maven.plugins.amps.codegen.prompter.AbstractModulePrompter;
10  import com.atlassian.plugins.codegen.modules.PluginModuleLocation;
11  import com.atlassian.plugins.codegen.modules.common.servlet.ServletFilterModuleCreator;
12  import com.atlassian.plugins.codegen.modules.common.servlet.ServletFilterProperties;
13  import com.atlassian.plugins.codegen.util.ClassnameUtil;
14  
15  import org.codehaus.plexus.components.interactivity.Prompter;
16  import org.codehaus.plexus.components.interactivity.PrompterException;
17  
18  /**
19   * @since 3.6
20   */
21  @ModuleCreatorClass(ServletFilterModuleCreator.class)
22  public class ServletFilterModulePrompter extends AbstractModulePrompter<ServletFilterProperties>
23  {
24  
25      public ServletFilterModulePrompter(Prompter prompter)
26      {
27          super(prompter);
28  
29      }
30  
31      @Override
32      public ServletFilterProperties promptForBasicProperties(PluginModuleLocation moduleLocation) throws PrompterException
33      {
34          String className = promptJavaClassname("Enter New Classname", "MyServletFilter");
35          String packageName = promptJavaPackagename("Enter Package Name", getDefaultBasePackage() + ".servlet.filter");
36  
37          return new ServletFilterProperties(ClassnameUtil.fullyQualifiedName(packageName, className));
38      }
39  
40      @Override
41      public void promptForAdvancedProperties(ServletFilterProperties props, PluginModuleLocation moduleLocation) throws PrompterException
42      {
43          props.setUrlPattern(getUrlPatternFromUser());
44          props.setLocation(getLocationFromUser(props.allowedLocations()));
45          props.setWeight(promptForInt("Location Weight", 100));
46  
47          List<String> dispatchers = promptForDispatchers(props.allowedDispatchers());
48          if (dispatchers.size() > 0)
49          {
50              props.setDispatchers(dispatchers);
51          }
52  
53          Map<String, String> initParams = promptForInitParams();
54          if (initParams.size() > 0)
55          {
56              props.setInitParams(initParams);
57          }
58      }
59  
60      private String getUrlPatternFromUser() throws PrompterException
61      {
62          String pattern = promptNotBlank("URL Pattern", "/*");
63  
64          return pattern;
65      }
66  
67      private String getLocationFromUser(List<String> allowedLocations) throws PrompterException
68      {
69          StringBuilder locationQuery = new StringBuilder("Choose Filter Chain Location\n");
70          List<String> indexChoices = new ArrayList<String>(allowedLocations.size());
71          int index = 1;
72          for (String location : allowedLocations)
73          {
74              String strIndex = Integer.toString(index);
75              locationQuery.append(strIndex + ": " + location + "\n");
76              indexChoices.add(strIndex);
77              index++;
78          }
79  
80          locationQuery.append("Choose a number: ");
81          String locationAnswer = prompt(locationQuery.toString(), indexChoices, "4");
82  
83          return allowedLocations.get(Integer.parseInt(locationAnswer) - 1);
84      }
85  
86      private List<String> promptForDispatchers(List<String> allowedDispatchers) throws PrompterException
87      {
88          List<String> dispatchers = new ArrayList<String>();
89          List<String> mutableValues = new ArrayList<String>(allowedDispatchers);
90  
91          promptForDispatcher(dispatchers, mutableValues);
92  
93          return dispatchers;
94      }
95  
96      private void promptForDispatcher(List<String> dispatchers, List<String> allowedDispatchers) throws PrompterException
97      {
98          boolean addDispatcher = promptForBoolean("Add Dispatcher?", "N");
99  
100         if (addDispatcher)
101         {
102             StringBuilder dispatcherQuery = new StringBuilder("Choose A Dispatcher\n");
103             List<String> indexChoices = new ArrayList<String>(allowedDispatchers.size());
104             int index = 1;
105             for (String dispatcher : allowedDispatchers)
106             {
107                 String strIndex = Integer.toString(index);
108                 dispatcherQuery.append(strIndex + ": " + dispatcher + "\n");
109                 indexChoices.add(strIndex);
110                 index++;
111             }
112 
113             dispatcherQuery.append("Choose a number: ");
114             String dispatcherAnswer = prompt(dispatcherQuery.toString(), indexChoices, "1");
115             int selectedIndex = Integer.parseInt(dispatcherAnswer) - 1;
116 
117             String selectedDispatcher = allowedDispatchers.get(selectedIndex);
118 
119             dispatchers.add(selectedDispatcher);
120             allowedDispatchers.remove(selectedIndex);
121 
122             promptForDispatcher(dispatchers, allowedDispatchers);
123         }
124     }
125 
126     private Map<String, String> promptForInitParams() throws PrompterException
127     {
128         Map<String, String> params = new HashMap<String, String>();
129         promptForInitParam(params);
130 
131         return params;
132     }
133 
134     private void promptForInitParam(Map<String, String> params) throws PrompterException
135     {
136         StringBuffer addBuffer = new StringBuffer();
137         if (params.size() > 0)
138         {
139             addBuffer.append("init-params:\n");
140             for (Map.Entry<String, String> entry : params.entrySet())
141             {
142                 addBuffer.append(entry.getKey())
143                         .append("->")
144                         .append(entry.getValue())
145                         .append("\n");
146             }
147         }
148         addBuffer.append("Add Init-Param?");
149         boolean addParam = promptForBoolean(addBuffer.toString(), "N");
150 
151         if (addParam)
152         {
153             String key = promptNotBlank("param key");
154             String value = promptNotBlank("param value");
155             params.put(key, value);
156             promptForInitParam(params);
157         }
158     }
159 }