• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2  *
3  * This program and the accompanying materials are made available under
4  * the terms of the Common Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
6  *
7  * $Id: FilterCfg.java,v 1.2 2004/05/20 02:28:07 vlad_r Exp $
8  */
9 package com.vladium.emma.instr;
10 
11 import java.io.File;
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.Iterator;
15 import java.util.List;
16 
17 import org.apache.tools.ant.BuildException;
18 import org.apache.tools.ant.Task;
19 
20 import com.vladium.util.IConstants;
21 import com.vladium.util.Strings;
22 import com.vladium.emma.ant.StringValue;
23 import com.vladium.emma.ant.SuppressableTask;
24 import com.vladium.emma.filter.IInclExclFilter;
25 
26 // ----------------------------------------------------------------------------
27 /**
28  * @author Vlad Roubtsov, (C) 2003
29  */
30 public
31 class FilterCfg
32 {
33     // public: ................................................................
34 
35 
36     public static final class filterElement extends StringValue
37     {
filterElement(final Task task)38         public filterElement (final Task task)
39         {
40             super (task);
41         }
42 
setValue(final String value)43         public void setValue (final String value)
44         {
45             final String [] specs = Strings.merge (new String [] {value}, COMMA_DELIMITERS, true);
46 
47             for (int i = 0; i < specs.length; ++ i)
48             {
49                 final String spec = specs [i];
50 
51                 if (spec.startsWith (IInclExclFilter.INCLUSION_PREFIX_STRING) ||
52                     spec.startsWith (IInclExclFilter.EXCLUSION_PREFIX_STRING))
53                 {
54                     appendValue (spec, COMMA);
55                 }
56                 else
57                 {
58                     appendValue (IInclExclFilter.INCLUSION_PREFIX + spec, COMMA); // default to inclusion
59                 }
60             }
61         }
62 
63         /**
64          * Set the 'file' attribute.
65          */
setFile(final File file)66         public void setFile (final File file)
67         {
68             appendValue ("@".concat (file.getAbsolutePath ()), COMMA); // actual file I/O delayed until getFilterSpecs()
69         }
70 
setIncludes(final String value)71         public void setIncludes (final String value)
72         {
73             final String [] specs = Strings.merge (new String [] {value}, COMMA_DELIMITERS, true);
74 
75             for (int i = 0; i < specs.length; ++ i)
76             {
77                 final String spec = specs [i];
78 
79                 if (spec.startsWith (IInclExclFilter.INCLUSION_PREFIX_STRING))
80                 {
81                     appendValue (spec, COMMA);
82                 }
83                 else
84                 {
85                     if (spec.startsWith (IInclExclFilter.EXCLUSION_PREFIX_STRING))
86                         appendValue (IInclExclFilter.INCLUSION_PREFIX + spec.substring (1), COMMA); // override
87                     else
88                         appendValue (IInclExclFilter.INCLUSION_PREFIX + spec, COMMA);
89                 }
90             }
91         }
92 
setExcludes(final String value)93         public void setExcludes (final String value)
94         {
95             final String [] specs = Strings.merge (new String [] {value}, COMMA_DELIMITERS, true);
96 
97             for (int i = 0; i < specs.length; ++ i)
98             {
99                 final String spec = specs [i];
100 
101                 if (spec.startsWith (IInclExclFilter.EXCLUSION_PREFIX_STRING))
102                 {
103                     appendValue (spec, COMMA);
104                 }
105                 else
106                 {
107                     if (spec.startsWith (IInclExclFilter.INCLUSION_PREFIX_STRING))
108                         appendValue (IInclExclFilter.EXCLUSION_PREFIX + spec.substring (1), COMMA); // override
109                     else
110                         appendValue (IInclExclFilter.EXCLUSION_PREFIX + spec, COMMA);
111                 }
112             }
113         }
114 
115     } // end of nested class
116 
117 
FilterCfg(final Task task)118     public FilterCfg (final Task task)
119     {
120         if (task == null) throw new IllegalArgumentException ("null input: task");
121 
122         m_task = task;
123         m_filterList = new ArrayList ();
124     }
125 
126 
127     // filter attribute/element:
128 
setFilter(final String filter)129     public void setFilter (final String filter)
130     {
131         createFilter ().appendValue (filter, COMMA);
132     }
133 
createFilter()134     public filterElement createFilter ()
135     {
136         final filterElement result = new filterElement (m_task);
137         m_filterList.add (result);
138 
139         return result;
140     }
141 
142     // ACCESSORS:
143 
getFilterSpecs()144     public String [] getFilterSpecs ()
145     {
146         if (m_specs != null)
147             return m_specs;
148         else
149         {
150             if ((m_filterList == null) || m_filterList.isEmpty ())
151             {
152                 m_specs = IConstants.EMPTY_STRING_ARRAY;
153             }
154             else
155             {
156                 final String [] values = new String [m_filterList.size ()];
157 
158                 int j = 0;
159                 for (Iterator i = m_filterList.iterator (); i.hasNext (); ++ j)
160                     values [j] = ((StringValue) i.next ()).getValue ();
161 
162                 try
163                 {
164                     m_specs = Strings.mergeAT (values, COMMA_DELIMITERS, true);
165                 }
166                 catch (IOException ioe)
167                 {
168                     throw (BuildException) SuppressableTask.newBuildException (m_task.getTaskName ()
169                         + ": I/O exception while processing input" , ioe, m_task.getLocation ()).fillInStackTrace ();
170                 }
171             }
172 
173             return m_specs;
174         }
175     }
176 
177     // protected: .............................................................
178 
179 
180     protected static final String COMMA               = ",";
181     protected static final String COMMA_DELIMITERS    = COMMA + Strings.WHITE_SPACE;
182     protected static final String PATH_DELIMITERS     = COMMA.concat (File.pathSeparator);
183 
184     // package: ...............................................................
185 
186     // private: ...............................................................
187 
188 
189     private final Task m_task; // never null
190     private final List /* filterElement */ m_filterList; // never null
191 
192     private transient String [] m_specs;
193 
194 } // end of class
195 // ----------------------------------------------------------------------------