/* 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: IInclExclFilter.java,v 1.1.1.1 2004/05/09 16:57:33 vlad_r Exp $ */ package com.vladium.emma.filter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import com.vladium.util.WCMatcher; // ---------------------------------------------------------------------------- /** * @author Vlad Roubtsov, 2003 */ public interface IInclExclFilter { // public: ................................................................ // TODO: move this into util pkg char INCLUSION_PREFIX = '+'; String INCLUSION_PREFIX_STRING = "+"; char EXCLUSION_PREFIX = '-'; String EXCLUSION_PREFIX_STRING = "-"; boolean included (final String s); abstract class Factory { public static IInclExclFilter create (final String specs1, final String separators, final String [] specs2) { if ((specs1 == null) || (specs1.trim ().length () == 0)) return create (specs2); else { final List /* String */ _specs = new ArrayList (); if (specs2 != null) { for (int s = 0; s < specs2.length; ++ s) { _specs.add (specs2 [s]); } } for (StringTokenizer tokenizer = new StringTokenizer (specs1, separators); tokenizer.hasMoreTokens (); ) { _specs.add (tokenizer.nextToken ()); } final String [] specs = new String [_specs.size ()]; _specs.toArray (specs); return create (specs); } } public static IInclExclFilter create (final String [] specs) { if ((specs == null) || (specs.length == 0)) return new WCInclExclFilter ((String []) null, (String []) null); final List inclusions = new ArrayList (); final List exclusions = new ArrayList (); for (int i = 0, iLimit = specs.length; i < iLimit; ++ i) { final String spec = specs [i]; if (spec.length () > 0) { if (spec.charAt (0) == EXCLUSION_PREFIX) exclusions.add (spec.substring (1)); else { // [inclusion prefix is optional] if (spec.charAt (0) == INCLUSION_PREFIX) inclusions.add (spec.substring (1)); else inclusions.add (spec); } } } return new WCInclExclFilter (inclusions, exclusions); } public static IInclExclFilter create (final String [] inclusions, final String [] exclusions) { return new WCInclExclFilter (inclusions, exclusions); } public static IInclExclFilter create (final List /* String */ inclusions, final List /* String */ exclusions) { return new WCInclExclFilter (inclusions, exclusions); } private static final class WCInclExclFilter implements IInclExclFilter { public boolean included (final String s) { if (s == null) return false; final char [] chars = s.toCharArray (); // included set is (inclusions - exclusions), where null inclusions // mean 'everything' and null exclusions mean 'nothing': final WCMatcher [] inclusions = m_inclusions; final WCMatcher [] exclusions = m_exclusions; if (inclusions != null) { boolean included = false; for (int i = 0, iLimit = inclusions.length; i < iLimit; ++ i) { if (inclusions [i].matches (chars)) { included = true; break; } } if (! included) return false; } if (exclusions != null) { for (int x = 0, xLimit = exclusions.length; x < xLimit; ++ x) { if (exclusions [x].matches (chars)) return false; } } return true; } WCInclExclFilter (final String [] inclusions, final String [] exclusions) { if ((inclusions == null) || (inclusions.length == 0)) m_inclusions = null; else { m_inclusions = new WCMatcher [inclusions.length]; for (int i = 0; i < inclusions.length; ++ i) { m_inclusions [i] = WCMatcher.compile (inclusions [i]); } } if ((exclusions == null) || (exclusions.length == 0)) m_exclusions = null; else { m_exclusions = new WCMatcher [exclusions.length]; for (int i = 0; i < exclusions.length; ++ i) { m_exclusions [i] = WCMatcher.compile (exclusions [i]); } } } WCInclExclFilter (final List /* String */ inclusions, final List /* String */ exclusions) { if ((inclusions == null) || inclusions.isEmpty ()) m_inclusions = null; else { m_inclusions = new WCMatcher [inclusions.size ()]; int ii = 0; for (Iterator i = inclusions.iterator (); i.hasNext (); ++ ii) { final String pattern = (String) i.next (); m_inclusions [ii] = WCMatcher.compile (pattern); } } if ((exclusions == null) || exclusions.isEmpty ()) m_exclusions = null; else { m_exclusions = new WCMatcher [exclusions.size ()]; int ii = 0; for (Iterator i = exclusions.iterator (); i.hasNext (); ++ ii) { final String pattern = (String) i.next (); m_exclusions [ii] = WCMatcher.compile (pattern); } } } private final WCMatcher [] m_inclusions, m_exclusions; } // end of nested class } // end of nested class } // end of interface // ----------------------------------------------------------------------------