View Javadoc

1   package com.atlassian.plugin.main;
2   
3   import static java.util.Collections.unmodifiableList;
4   import static java.util.Collections.unmodifiableMap;
5   
6   import com.atlassian.plugin.osgi.container.PackageScannerConfiguration;
7   import com.atlassian.plugin.osgi.container.impl.DefaultPackageScannerConfiguration;
8   
9   import java.util.ArrayList;
10  import java.util.Arrays;
11  import java.util.HashMap;
12  import java.util.List;
13  import java.util.Map;
14  
15  import javax.servlet.ServletContext;
16  
17  /**
18   * The builder for {@link PackageScannerConfiguration} instances that additionally performs validation and default creation.
19   * For a usage example, see the package javadocs.
20   * <p>
21   * Not thread-safe. Instances of this class should be thread and preferably method local.
22   * 
23   * @since 2.2
24   */
25  public class PackageScannerConfigurationBuilder
26  {
27      /**
28       * Static factory for creating a new builder.
29       * @return a new builder.
30       */
31      public static PackageScannerConfigurationBuilder packageScannerConfiguration()
32      {
33          return new PackageScannerConfigurationBuilder();
34      }
35  
36      private String hostVersion;
37      private final List<String> jarIncludes = new ArrayList<String>();
38      private final List<String> jarExcludes = new ArrayList<String>();
39      private final List<String> packageIncludes = new ArrayList<String>();
40      private final List<String> packageExcludes = new ArrayList<String>();
41      private final Map<String, String> packageVersions = new HashMap<String, String>();
42      private ServletContext servletContext;
43  
44      /**
45       * Default constructor. Uses a DefaultPackageScannerConfiguration as the template.
46       */
47      public PackageScannerConfigurationBuilder()
48      {
49          copy(new DefaultPackageScannerConfiguration());
50      }
51  
52      /**
53       * Copy constructor. Use the supplied PackageScannerConfiguration as a template.
54       * 
55       * @param packageScannerConfiguration
56       */
57      public PackageScannerConfigurationBuilder(final PackageScannerConfiguration packageScannerConfiguration)
58      {
59          copy(packageScannerConfiguration);
60      }
61  
62      private void copy(final PackageScannerConfiguration config)
63      {
64          hostVersion = config.getCurrentHostVersion();
65          packageIncludes.addAll(config.getPackageIncludes());
66          packageExcludes.addAll(config.getPackageExcludes());
67          jarIncludes.addAll(config.getJarIncludes());
68          jarExcludes.addAll(config.getJarExcludes());
69          packageVersions.putAll(config.getPackageVersions());
70          servletContext = config.getServletContext();
71      }
72  
73      /**
74       * Sets the current host version.
75       *
76       * @see PackageScannerConfiguration#getCurrentHostVersion()
77       * @param pkgs A list of package expressions, where the '*' character matches any character including subpackages
78       * @return this
79       */
80      public PackageScannerConfigurationBuilder hostVersion(final String... pkgs)
81      {
82          packageIncludes.addAll(Arrays.asList(pkgs));
83          return this;
84      }
85  
86      /**
87       * Sets the {@link ServletContext} used to lookup jars as some application servers need it to lookup jar files.
88       *
89       * @see PackageScannerConfiguration#getS()
90       * @param pkgs A list of package expressions, where the '*' character matches any character including subpackages
91       * @return this
92       */
93      public PackageScannerConfigurationBuilder servletContext(final ServletContext servletContext)
94      {
95          this.servletContext = servletContext;
96          return this;
97      }
98  
99      /**
100      * Sets a list of package expressions to expose to plugins.
101      *
102      * @see PackageScannerConfiguration#getPackageIncludes()
103      * @param pkgs A list of package expressions, where the '*' character matches any character including subpackages
104      * @return this
105      */
106     public PackageScannerConfigurationBuilder packagesToInclude(final String... pkgs)
107     {
108         packageIncludes.addAll(Arrays.asList(pkgs));
109         return this;
110     }
111 
112     /**
113      * Sets a list of package expressions to hide from plugins.
114      *
115      * @see PackageScannerConfiguration#getPackageExcludes()
116      * @param pkgs A list of package expressions, where the '*' character matches any character including subpackages
117      * @return this
118      */
119     public PackageScannerConfigurationBuilder packagesToExclude(final String... pkgs)
120     {
121         packageExcludes.addAll(Arrays.asList(pkgs));
122         return this;
123     }
124 
125     /**
126      * Sets which packages should be exposed as which versions.
127      *
128      * @see PackageScannerConfiguration#getPackageVersions()
129      * @param packageToVersion A map of package names to version names.  No wildcards allowed, and the version names
130      * must match the expected OSGi versioning scheme.
131      * @return this
132      */
133     public PackageScannerConfigurationBuilder packagesVersions(final Map<String, String> packageToVersion)
134     {
135         packageVersions.putAll(packageToVersion);
136         return this;
137     }
138 
139     /**
140      * Sets a list of jar expressions to expose to plugins.
141      *
142      * @see PackageScannerConfiguration#getJarIncludes()
143      * @param pkgs A list of package expressions, where the '*' character matches any character including subpackages
144      * @return this
145      */
146     public PackageScannerConfigurationBuilder jarsToInclude(final String... jars)
147     {
148         jarIncludes.addAll(Arrays.asList(jars));
149         return this;
150     }
151 
152     /**
153      * Sets a list of jar expressions to hide from plugins.
154      *
155      * @see PackageScannerConfiguration#getPackageExcludes()
156      * @param pkgs A list of package expressions, where the '*' character matches any character including subpackages
157      * @return this
158      */
159     public PackageScannerConfigurationBuilder jarsToExclude(final String... jars)
160     {
161         jarExcludes.addAll(Arrays.asList(jars));
162         return this;
163     }
164 
165     /**
166      * Builds a {@link PackageScannerConfiguration} instance by processing the configuration that
167      * was previously set and setting any defaults where not explicitly specified.
168      *
169      * @return A valid {@link PackageScannerConfiguration} instance to pass to {@link AtlassianPlugins}
170      */
171     public PackageScannerConfiguration build()
172     {
173         return new ImmutablePackageScannerConfiguration(this);
174     }
175 
176     //
177     // inner classes
178     //
179 
180     /**
181      * Immutable and thread-safe implementation of the {@link PackageScannerConfiguration} returned by a 
182      * {@link PackageScannerConfigurationBuilder}
183      */
184     private static final class ImmutablePackageScannerConfiguration implements PackageScannerConfiguration
185     {
186         private final String hostVersion;
187         private final List<String> jarIncludes;
188         private final List<String> jarExcludes;
189         private final List<String> packageIncludes;
190         private final List<String> packageExcludes;
191         private final Map<String, String> packageVersions;
192         private final ServletContext servletContext;
193 
194         ImmutablePackageScannerConfiguration(final PackageScannerConfigurationBuilder builder)
195         {
196             hostVersion = builder.hostVersion;
197             jarIncludes = unmodifiableList(new ArrayList<String>(builder.jarIncludes));
198             jarExcludes = unmodifiableList(new ArrayList<String>(builder.jarExcludes));
199             packageIncludes = unmodifiableList(new ArrayList<String>(builder.packageIncludes));
200             packageExcludes = unmodifiableList(new ArrayList<String>(builder.packageExcludes));
201             packageVersions = unmodifiableMap(new HashMap<String, String>(builder.packageVersions));
202             servletContext = builder.servletContext;
203         }
204 
205         public List<String> getJarIncludes()
206         {
207             return jarIncludes;
208         }
209 
210         public List<String> getJarExcludes()
211         {
212             return jarExcludes;
213         }
214 
215         public List<String> getPackageIncludes()
216         {
217             return packageIncludes;
218         }
219 
220         public List<String> getPackageExcludes()
221         {
222             return packageExcludes;
223         }
224 
225         public Map<String, String> getPackageVersions()
226         {
227             return packageVersions;
228         }
229 
230         public String getCurrentHostVersion()
231         {
232             return hostVersion;
233         }
234 
235         public ServletContext getServletContext()
236         {
237             return servletContext;
238         }
239     }
240 }