/**
* Analytica - beta version - Systems Monitoring Tool
*
* Copyright (C) 2013, KleeGroup, direction.technique@kleegroup.com (http://www.kleegroup.com)
* KleeGroup, Centre d'affaire la Boursidi�re - BP 159 - 92357 Le Plessis Robinson Cedex - France
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation;
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program;
* if not, see <http://www.gnu.org/licenses>
*
* Linking this library statically or dynamically with other modules is making a combined work based on this library.
* Thus, the terms and conditions of the GNU General Public License cover the whole combination.
*
* As a special exception, the copyright holders of this library give you permission to link this library
* with independent modules to produce an executable, regardless of the license terms of these independent modules,
* and to copy and distribute the resulting executable under terms of your choice, provided that you also meet,
* for each linked independent module, the terms and conditions of the license of that module.
* An independent module is a module which is not derived from or based on this library.
* If you modify this library, you may extend this exception to your version of the library,
* but you are not obliged to do so.
* If you do not wish to do so, delete this exception statement from your version.
*/
package io.analytica.spies.imp.javassist.matcher;
import javassist.CtClass;
import javassist.NotFoundException;
/**
* Match une class h�ritant ou impl�mentant d'une autre class.
* Exemple :
* <li>#inherits java.sql.DataSource
* <li>#inherits myproject.domain.Service
*
* @author npiedeloup
* @version $Id: GlobMatcher.java,v 1.1 2011/05/12 10:16:12 prahmoune Exp $
*/
public final class InheritClassMatcher implements Matcher<CtClass> {
private static final String OBJECT_CLASSNAME = Object.class.getName();
private final Matcher<String> superClassMatcher;
/**
* @param pattenString initializes the matcher with the glob patterm.
*/
public InheritClassMatcher(final String pattenString) {
//Assertion.notEmpty(pattenString);
//---------------------------------------------------------------------
superClassMatcher = new RegExpMatcher(pattenString);
}
/** {@inheritDoc}*/
public boolean isMatch(final CtClass input) {
//Assertion.notNull(input);
try {
return isParentMatch(input, true);
} catch (final NotFoundException e) {
System.err.println("Could not check inherit matchs of " + input.getName() + ", exception : " + e.getMessage());
throw new RuntimeException(e);
}
}
private boolean isParentMatch(final CtClass input, final boolean checkName) throws NotFoundException {
if (OBJECT_CLASSNAME.equals(input.getName())) {
return false; //le cas d'arret simple
}
if (checkName && superClassMatcher.isMatch(input.getName())) {
return true; //le cas ou ca match
}
boolean isMatch = false;
for (final CtClass ctInterface : input.getInterfaces()) {
isMatch = isMatch || isParentMatch(ctInterface, true);
}
isMatch = isMatch || isParentMatch(input.getSuperclass(), true);
return isMatch;
}
/** {@inheritDoc} */
@Override
public String toString() {
return "<inherits class=\"" + superClassMatcher + "\"/>";
}
}