/* 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
// ---------------------------------------------------------------------------- |