/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. * * This program and the accompanying materials are made available under * the terms of the Common Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/cpl-v10.html * * $Id: FilterCfg.java,v 1.2 2004/05/20 02:28:07 vlad_r Exp $ */ package com.vladium.emma.instr; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import com.vladium.util.IConstants; import com.vladium.util.Strings; import com.vladium.emma.ant.StringValue; import com.vladium.emma.ant.SuppressableTask; import com.vladium.emma.filter.IInclExclFilter; // ---------------------------------------------------------------------------- /** * @author Vlad Roubtsov, (C) 2003 */ public class FilterCfg { // public: ................................................................ public static final class filterElement extends StringValue { public filterElement (final Task task) { super (task); } public void setValue (final String value) { final String [] specs = Strings.merge (new String [] {value}, COMMA_DELIMITERS, true); for (int i = 0; i < specs.length; ++ i) { final String spec = specs [i]; if (spec.startsWith (IInclExclFilter.INCLUSION_PREFIX_STRING) || spec.startsWith (IInclExclFilter.EXCLUSION_PREFIX_STRING)) { appendValue (spec, COMMA); } else { appendValue (IInclExclFilter.INCLUSION_PREFIX + spec, COMMA); // default to inclusion } } } /** * Set the 'file' attribute. */ public void setFile (final File file) { appendValue ("@".concat (file.getAbsolutePath ()), COMMA); // actual file I/O delayed until getFilterSpecs() } public void setIncludes (final String value) { final String [] specs = Strings.merge (new String [] {value}, COMMA_DELIMITERS, true); for (int i = 0; i < specs.length; ++ i) { final String spec = specs [i]; if (spec.startsWith (IInclExclFilter.INCLUSION_PREFIX_STRING)) { appendValue (spec, COMMA); } else { if (spec.startsWith (IInclExclFilter.EXCLUSION_PREFIX_STRING)) appendValue (IInclExclFilter.INCLUSION_PREFIX + spec.substring (1), COMMA); // override else appendValue (IInclExclFilter.INCLUSION_PREFIX + spec, COMMA); } } } public void setExcludes (final String value) { final String [] specs = Strings.merge (new String [] {value}, COMMA_DELIMITERS, true); for (int i = 0; i < specs.length; ++ i) { final String spec = specs [i]; if (spec.startsWith (IInclExclFilter.EXCLUSION_PREFIX_STRING)) { appendValue (spec, COMMA); } else { if (spec.startsWith (IInclExclFilter.INCLUSION_PREFIX_STRING)) appendValue (IInclExclFilter.EXCLUSION_PREFIX + spec.substring (1), COMMA); // override else appendValue (IInclExclFilter.EXCLUSION_PREFIX + spec, COMMA); } } } } // end of nested class public FilterCfg (final Task task) { if (task == null) throw new IllegalArgumentException ("null input: task"); m_task = task; m_filterList = new ArrayList (); } // filter attribute/element: public void setFilter (final String filter) { createFilter ().appendValue (filter, COMMA); } public filterElement createFilter () { final filterElement result = new filterElement (m_task); m_filterList.add (result); return result; } // ACCESSORS: public String [] getFilterSpecs () { if (m_specs != null) return m_specs; else { if ((m_filterList == null) || m_filterList.isEmpty ()) { m_specs = IConstants.EMPTY_STRING_ARRAY; } else { final String [] values = new String [m_filterList.size ()]; int j = 0; for (Iterator i = m_filterList.iterator (); i.hasNext (); ++ j) values [j] = ((StringValue) i.next ()).getValue (); try { m_specs = Strings.mergeAT (values, COMMA_DELIMITERS, true); } catch (IOException ioe) { throw (BuildException) SuppressableTask.newBuildException (m_task.getTaskName () + ": I/O exception while processing input" , ioe, m_task.getLocation ()).fillInStackTrace (); } } return m_specs; } } // protected: ............................................................. protected static final String COMMA = ","; protected static final String COMMA_DELIMITERS = COMMA + Strings.WHITE_SPACE; protected static final String PATH_DELIMITERS = COMMA.concat (File.pathSeparator); // package: ............................................................... // private: ............................................................... private final Task m_task; // never null private final List /* filterElement */ m_filterList; // never null private transient String [] m_specs; } // end of class // ----------------------------------------------------------------------------