001    /*
002      GRANITE DATA SERVICES
003      Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004    
005      This file is part of Granite Data Services.
006    
007      Granite Data Services is free software; you can redistribute it and/or modify
008      it under the terms of the GNU Library General Public License as published by
009      the Free Software Foundation; either version 2 of the License, or (at your
010      option) any later version.
011    
012      Granite Data Services is distributed in the hope that it will be useful, but
013      WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014      FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015      for more details.
016    
017      You should have received a copy of the GNU Library General Public License
018      along with this library; if not, see <http://www.gnu.org/licenses/>.
019    */
020    
021    package org.granite.config;
022    
023    import java.util.List;
024    import java.util.Map;
025    import java.util.Set;
026    
027    import org.granite.messaging.service.tide.TideComponentAnnotatedWithMatcher;
028    import org.granite.messaging.service.tide.TideComponentInstanceOfMatcher;
029    import org.granite.messaging.service.tide.TideComponentMatcher;
030    import org.granite.messaging.service.tide.TideComponentNameMatcher;
031    import org.granite.messaging.service.tide.TideComponentTypeMatcher;
032    
033    /**
034     * @author Franck WOLFF
035     */
036    public class TideComponentMatcherFactory {
037    
038        public TideComponentMatcher getTypeMatcher(String type, boolean disabled) throws GraniteConfigException {
039            try {
040                return new TideComponentTypeMatcher(type, disabled);
041            } catch (Exception e) {
042                throw new GraniteConfigException("Could not instantiate Tide component matcher for type: " + type, e);
043            }
044        }
045        
046        public TideComponentMatcher getNameMatcher(String name, boolean disabled) throws GraniteConfigException {
047            try {
048                return new TideComponentNameMatcher(name, disabled);
049            } catch (Exception e) {
050                throw new GraniteConfigException("Could not instantiate Tide component matcher for name: " + name, e);
051            }
052        }
053        
054        public TideComponentMatcher getInstanceOfMatcher(String type, boolean disabled) throws GraniteConfigException {
055            try {
056                return new TideComponentInstanceOfMatcher(type, disabled);
057            } catch (Exception e) {
058                throw new GraniteConfigException("Could not instantiate Tide component matcher for instance of: " + type, e);
059            }
060        }
061        
062        public TideComponentMatcher getAnnotatedWithMatcher(String type, boolean disabled) throws GraniteConfigException {
063            try {
064                return new TideComponentAnnotatedWithMatcher(type, disabled);
065            } catch (Exception e) {
066                throw new GraniteConfigException("Could not instantiate Tide component matcher for annotated with: " + type, e);
067            }
068        }
069    
070        
071        public static boolean isComponentTideEnabled(
072            Map<String, Object[]> tideComponentsByName,
073            List<TideComponentMatcher> tideComponentMatchers,
074            String componentName, Set<Class<?>> componentClasses, Object componentInstance) throws GraniteConfigException {
075            
076            String key = componentName != null ? componentName : componentClasses.toString();
077            if (tideComponentsByName.containsKey(key)) {
078                    if ((Integer)tideComponentsByName.get(key)[1] == componentClasses.hashCode())
079                            return (Boolean)tideComponentsByName.get(key)[0];
080            }
081    
082            boolean enabled = false;
083            for (TideComponentMatcher matcher : tideComponentMatchers) {
084                if (matcher.matches(componentName, componentClasses, componentInstance, false)) {
085                    enabled = true;
086                    break;
087                }
088            }
089            
090            tideComponentsByName.put(key, new Object[] { enabled, componentClasses.hashCode()});
091            return enabled;
092        }
093        
094        public static boolean isComponentTideDisabled(
095            Map<String, Object[]> tideComponentsByName,
096            List<TideComponentMatcher> tideComponentMatchers,
097            String componentName, Set<Class<?>> componentClasses, Object componentInstance) throws GraniteConfigException {
098            
099            String key = componentName != null ? componentName : componentClasses.toString();
100            if (tideComponentsByName.containsKey(key)) {
101                    if ((Integer)tideComponentsByName.get(key)[1] == componentClasses.hashCode())
102                            return (Boolean)tideComponentsByName.get(key)[0];
103            }
104    
105            boolean disabled = false;
106            for (TideComponentMatcher matcher : tideComponentMatchers) {
107                if (matcher.matches(componentName, componentClasses, componentInstance, true)) {
108                    disabled = true;
109                    break;
110                }
111            }
112            
113            tideComponentsByName.put(key, new Object[] { disabled, componentClasses.hashCode()});
114            return disabled;
115        }
116    }