src/core/net/sf/basedb/util/extensions/xml/ExtensionPointFilter.java

Code
Comments
Other
Rev Date Author Line
5598 30 Mar 11 nicklas 1 /**
5598 30 Mar 11 nicklas 2   $Id$
5598 30 Mar 11 nicklas 3
5598 30 Mar 11 nicklas 4   Copyright (C) 2011 Nicklas Nordborg
5598 30 Mar 11 nicklas 5
5598 30 Mar 11 nicklas 6   This file is part of BASE - BioArray Software Environment.
5598 30 Mar 11 nicklas 7   Available at http://base.thep.lu.se/
5598 30 Mar 11 nicklas 8
5598 30 Mar 11 nicklas 9   BASE is free software; you can redistribute it and/or
5598 30 Mar 11 nicklas 10   modify it under the terms of the GNU General Public License
5598 30 Mar 11 nicklas 11   as published by the Free Software Foundation; either version 3
5598 30 Mar 11 nicklas 12   of the License, or (at your option) any later version.
5598 30 Mar 11 nicklas 13
5598 30 Mar 11 nicklas 14   BASE is distributed in the hope that it will be useful,
5598 30 Mar 11 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
5598 30 Mar 11 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5598 30 Mar 11 nicklas 17   GNU General Public License for more details.
5598 30 Mar 11 nicklas 18
5598 30 Mar 11 nicklas 19   You should have received a copy of the GNU General Public License
5598 30 Mar 11 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5598 30 Mar 11 nicklas 21 */
5598 30 Mar 11 nicklas 22 package net.sf.basedb.util.extensions.xml;
5598 30 Mar 11 nicklas 23
5598 30 Mar 11 nicklas 24 import java.util.regex.Pattern;
5598 30 Mar 11 nicklas 25
6473 11 Jun 14 nicklas 26 import org.jdom2.Element;
5598 30 Mar 11 nicklas 27
5598 30 Mar 11 nicklas 28 import net.sf.basedb.util.Values;
5598 30 Mar 11 nicklas 29 import net.sf.basedb.util.filter.Filter;
5598 30 Mar 11 nicklas 30
5598 30 Mar 11 nicklas 31 /**
5598 30 Mar 11 nicklas 32   Filter implementation that can be used to match extension
5598 30 Mar 11 nicklas 33   points and extensions based on the ID of the extension point.
5598 30 Mar 11 nicklas 34   <p>
5598 30 Mar 11 nicklas 35   
5598 30 Mar 11 nicklas 36   Extensions points will pass the filter if their ID matches the
5598 30 Mar 11 nicklas 37   given pattern.
5598 30 Mar 11 nicklas 38   <p>
5598 30 Mar 11 nicklas 39   
5598 30 Mar 11 nicklas 40   Extensions will pass the filter if the ID of the extension point
5598 30 Mar 11 nicklas 41   they are extending matches the given pattern.
5598 30 Mar 11 nicklas 42   
5598 30 Mar 11 nicklas 43   @author Nicklas
5598 30 Mar 11 nicklas 44   @since 3.0
5598 30 Mar 11 nicklas 45   @base.modified $Date$
5598 30 Mar 11 nicklas 46 */
5598 30 Mar 11 nicklas 47 public class ExtensionPointFilter
5598 30 Mar 11 nicklas 48   implements Filter<Element>
5598 30 Mar 11 nicklas 49 {
5598 30 Mar 11 nicklas 50
7224 14 Nov 16 nicklas 51   private static final org.slf4j.Logger log = 
7224 14 Nov 16 nicklas 52     org.slf4j.LoggerFactory.getLogger(ExtensionPointFilter.class);
7224 14 Nov 16 nicklas 53   
5598 30 Mar 11 nicklas 54   private final Pattern pattern;
5598 30 Mar 11 nicklas 55   
5598 30 Mar 11 nicklas 56   /**
5598 30 Mar 11 nicklas 57     Create a new filter based on the given pattern.
5598 30 Mar 11 nicklas 58     @param pattern A pattern, null is not allowed
5598 30 Mar 11 nicklas 59   */
5598 30 Mar 11 nicklas 60   public ExtensionPointFilter(Pattern pattern)
5598 30 Mar 11 nicklas 61   {
5598 30 Mar 11 nicklas 62     if (pattern == null) throw new NullPointerException("pattern");
5598 30 Mar 11 nicklas 63     this.pattern = pattern;
5598 30 Mar 11 nicklas 64   }
5598 30 Mar 11 nicklas 65   
5598 30 Mar 11 nicklas 66   /**
5598 30 Mar 11 nicklas 67     Create a new filter based on the given pattern.
5598 30 Mar 11 nicklas 68     
5598 30 Mar 11 nicklas 69     @param pattern A pattern that will be used in {@link Pattern#compile(String)}, null is not allowed
5598 30 Mar 11 nicklas 70   */
5598 30 Mar 11 nicklas 71   public ExtensionPointFilter(String pattern)
5598 30 Mar 11 nicklas 72   {
5598 30 Mar 11 nicklas 73     this(Pattern.compile(pattern));
5598 30 Mar 11 nicklas 74   }
5598 30 Mar 11 nicklas 75   
5598 30 Mar 11 nicklas 76   /*
5598 30 Mar 11 nicklas 77     From the Filter interface
5598 30 Mar 11 nicklas 78     --------------------------
5598 30 Mar 11 nicklas 79   */
5598 30 Mar 11 nicklas 80   @Override
5598 30 Mar 11 nicklas 81   public boolean evaluate(Element tag)
5598 30 Mar 11 nicklas 82   {
5598 30 Mar 11 nicklas 83     String tagName = tag.getName();
5598 30 Mar 11 nicklas 84     String idToMatch = null;
5598 30 Mar 11 nicklas 85     if ("extension-point".equals(tagName))
5598 30 Mar 11 nicklas 86     {
5598 30 Mar 11 nicklas 87       // The ID for extension point is in "id" attribute, but...
5598 30 Mar 11 nicklas 88       idToMatch = tag.getAttributeValue("id");
5598 30 Mar 11 nicklas 89       
5598 30 Mar 11 nicklas 90       // ...it may not be the full id, check top-level "id-base" attribute and prepend it if needed
5598 30 Mar 11 nicklas 91       String idBase = Values.getStringOrNull(tag.getDocument().getRootElement().getAttributeValue("id-base"));
5598 30 Mar 11 nicklas 92       if (idBase != null) idToMatch = idBase + idToMatch;
5598 30 Mar 11 nicklas 93     }
5598 30 Mar 11 nicklas 94     else if ("extension".equals(tagName))
5598 30 Mar 11 nicklas 95     {
5598 30 Mar 11 nicklas 96       // The ID for extension point is in "extends" attribute -- no "id-base" needed here
5598 30 Mar 11 nicklas 97       idToMatch = Values.getStringOrNull(tag.getAttributeValue("extends"));
5598 30 Mar 11 nicklas 98     }
5598 30 Mar 11 nicklas 99     else if ("ref".equals(tagName))
5598 30 Mar 11 nicklas 100     {
5598 30 Mar 11 nicklas 101       // The ID for extension point is in the text node -- no "id-base" needed here
5598 30 Mar 11 nicklas 102       idToMatch = Values.getStringOrNull(tag.getText());
5598 30 Mar 11 nicklas 103     }
7224 14 Nov 16 nicklas 104     boolean matches = idToMatch != null && pattern.matcher(idToMatch).matches();
7224 14 Nov 16 nicklas 105     
7224 14 Nov 16 nicklas 106     if (log.isDebugEnabled()) 
7224 14 Nov 16 nicklas 107     {
7224 14 Nov 16 nicklas 108       if (matches)
7224 14 Nov 16 nicklas 109       {
7224 14 Nov 16 nicklas 110         log.debug(tagName + "[" + idToMatch + "] matches filter: " + pattern);
7224 14 Nov 16 nicklas 111       }
7224 14 Nov 16 nicklas 112       else
7224 14 Nov 16 nicklas 113       {
7224 14 Nov 16 nicklas 114         log.debug(tagName + "[" + idToMatch + "] doesn't match filter: " + pattern);
7224 14 Nov 16 nicklas 115       }
7224 14 Nov 16 nicklas 116     }
7224 14 Nov 16 nicklas 117
7224 14 Nov 16 nicklas 118     return matches;
5598 30 Mar 11 nicklas 119   }
5598 30 Mar 11 nicklas 120   // --------------------------
7224 14 Nov 16 nicklas 121
7224 14 Nov 16 nicklas 122   @Override
7224 14 Nov 16 nicklas 123   public String toString() 
7224 14 Nov 16 nicklas 124   {
7224 14 Nov 16 nicklas 125     return "ExtensionPointFilter["+pattern+"]";
7224 14 Nov 16 nicklas 126   }
7224 14 Nov 16 nicklas 127   
7224 14 Nov 16 nicklas 128   
7224 14 Nov 16 nicklas 129   
5598 30 Mar 11 nicklas 130 }