View Javadoc
1   /*
2    * (C) Copyright 2006-2015 Nuxeo SA (http://nuxeo.com/) and contributors.
3    *
4    * All rights reserved. This program and the accompanying materials
5    * are made available under the terms of the GNU Lesser General Public License
6    * (LGPL) version 2.1 which accompanies this distribution, and is available at
7    * http://www.gnu.org/licenses/lgpl-2.1.html
8    *
9    * This library is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12   * Lesser General Public License for more details.
13   *
14   * Contributors:
15   *     bstefanescu, jcarsique, slacoin
16   */
17  package org.nuxeo.build.maven.filter;
18  
19  import java.lang.reflect.Constructor;
20  import java.lang.reflect.InvocationTargetException;
21  import java.util.ArrayList;
22  import java.util.Arrays;
23  import java.util.List;
24  
25  import org.apache.tools.ant.Project;
26  import org.eclipse.aether.util.artifact.JavaScopes;
27  
28  import org.nuxeo.build.ant.AntClient;
29  import org.nuxeo.build.maven.ArtifactDescriptor;
30  
31  /**
32   * TODO NXBT-258
33   */
34  public abstract class CompositeFilter extends AbstractFilter {
35  
36      protected List<Filter> filters = new ArrayList<>();
37  
38      public CompositeFilter() {
39      }
40  
41      public CompositeFilter(List<Filter> filters) {
42          this.filters.addAll(filters);
43      }
44  
45      public void addFilter(Filter filter) {
46          filters.add(filter);
47      }
48  
49      public void removeFilter(Filter filter) {
50          filters.remove(filter);
51      }
52  
53      public void addFilters(List<Filter> filtersToAdd) {
54          filters.addAll(filtersToAdd);
55      }
56  
57      public void addFilters(Filter... filtersToAdd) {
58          filters.addAll(Arrays.asList(filtersToAdd));
59      }
60  
61      public void removeFilters(@SuppressWarnings("hiding") List<Filter> filters) {
62          this.filters.removeAll(filters);
63      }
64  
65      public List<Filter> getFilters() {
66          return filters;
67      }
68  
69      public boolean isEmpty() {
70          return filters.isEmpty();
71      }
72  
73      public void addFiltersFromPattern(String pattern) {
74          if (pattern != null) {
75              addFiltersFromDescriptor(new ArtifactDescriptor(pattern));
76          }
77      }
78  
79      public void addFiltersFromDescriptor(ArtifactDescriptor ad) {
80          if (ad.getGroupId() != null && !ad.getGroupId().equals("*")) {
81              addFilter(GroupIdFilter.class, ad.getGroupId());
82          }
83          if (ad.getArtifactId() != null && !ad.getArtifactId().equals("*")) {
84              addFilter(ArtifactIdFilter.class, ad.getArtifactId());
85          }
86          if (ad.getVersion() != null && !ad.getVersion().equals("*")) {
87              addFilter(VersionFilter.class, ad.getVersion());
88          }
89          if (ad.getType() != null && !ad.getType().equals("*")) {
90              addFilter(TypeFilter.class, ad.getType());
91          }
92          if (ad.getClassifier() != null && !ad.getClassifier().equals("*")) {
93              addFilter(ClassifierFilter.class, ad.getClassifier());
94          }
95  
96          // Exclude test and provided scopes by default
97          boolean scopeTest = JavaScopes.TEST.equals(ad.getScope()) || "*".equals(ad.getScope());
98          boolean scopeProvided = JavaScopes.PROVIDED.equals(ad.getScope()) || "*".equals(ad.getScope());
99          if (!scopeTest) {
100             addFilter(new NotFilter(new ScopeFilter(JavaScopes.TEST)));
101         }
102         if (!scopeProvided) {
103             addFilter(new NotFilter(new ScopeFilter(JavaScopes.PROVIDED)));
104         }
105         if (ad.getScope() != null && !ad.getScope().equals("*")) {
106             addFilter(ScopeFilter.class, ad.getScope());
107         }
108     }
109 
110     public static Filter compact(CompositeFilter filter) {
111         Filter result = filter;
112         CompositeFilter cf = filter;
113         if (cf != null && cf.filters.size() == 1) {
114             result = cf.filters.get(0);
115             if (result instanceof CompositeFilter) {
116                 result = compact((CompositeFilter) result);
117             }
118         }
119         return result;
120     }
121 
122     /**
123      * Add a filter managing negation in pattern with '!'
124      *
125      * @param filterClass Filter class implementation to use
126      * @param pattern Pattern given to Filter implementation
127      */
128     public void addFilter(Class<? extends Filter> filterClass, String pattern) {
129         if (pattern == null) {
130             return;
131         }
132         Constructor<? extends Filter> filterConstructor = null;
133         try {
134             filterConstructor = filterClass.getConstructor(String.class);
135             if (pattern.startsWith("!")) {
136                 addFilter(new NotFilter(filterConstructor.newInstance(pattern.substring(1))));
137             } else {
138                 addFilter(filterConstructor.newInstance(pattern));
139             }
140         } catch (SecurityException e) {
141             AntClient.getInstance().log("Couldn't get constructor for " + filterClass, e, Project.MSG_ERR);
142         } catch (NoSuchMethodException e) {
143             AntClient.getInstance().log("Couldn't get constructor for " + filterClass, e, Project.MSG_ERR);
144         } catch (IllegalArgumentException e) {
145             AntClient.getInstance().log("Couldn't call constructor for " + filterClass, e, Project.MSG_ERR);
146         } catch (InstantiationException e) {
147             AntClient.getInstance().log("Couldn't call constructor for " + filterClass, e, Project.MSG_ERR);
148         } catch (IllegalAccessException e) {
149             AntClient.getInstance().log("Couldn't call constructor for " + filterClass, e, Project.MSG_ERR);
150         } catch (InvocationTargetException e) {
151             AntClient.getInstance().log("Couldn't call constructor for " + filterClass, e, Project.MSG_ERR);
152         }
153 
154     }
155 }