package org.hibernate.cfg.reveng; import java.util.Map; /** * * A tablefilter that can tell if a TableIdentifier is included or excluded. * Note that all matching is case sensitive since many db's are. * * @author max * */ public class TableFilter { // TODO: very basic substring matching. Possibly include regex functionallity ? (jdk 1.4 dep) public static class Matcher { private static final int EQUALS = 1; private static final int ENDSWITH = 2; private static final int STARTSWITH = 3; private static final int SUBSTRING = 4; private static final int ANY = 5; final int mode; final String value; final String matchValue; Matcher(String match) { matchValue = match; if(".*".equals(match) ) { mode = ANY; value = null; } else if(match.length()>4 && match.startsWith(".*") && match.endsWith(".*") ) { mode = SUBSTRING; value = match.substring(2, match.length()-2); } else if(match.endsWith(".*") ) { mode = STARTSWITH; value = match.substring(0, match.length()-2); } else if (match.startsWith(".*") ){ mode = ENDSWITH; value = match.substring(2); } else { mode = EQUALS; value = match; } } boolean match(String matchEnum) { switch (mode) { case ANY: return true; case EQUALS: return this.value.equals(matchEnum); case ENDSWITH: return matchEnum.endsWith(this.value); case STARTSWITH: return matchEnum.startsWith(this.value); case SUBSTRING: return matchEnum.indexOf(this.value)>=0; default: throw new IllegalStateException(); } } public String toString() { return matchValue; } } private Boolean exclude; private String packageName; private Matcher catalogMatcher; private Matcher schemaMatcher; private Matcher nameMatcher; private Map<?,?> metaAttributes; public TableFilter() { setMatchCatalog(".*"); setMatchSchema(".*"); setMatchName(".*"); setExclude(null); } public void setMatchCatalog(String matchCatalog) { this.catalogMatcher = new Matcher(matchCatalog); } public void setMatchSchema(String matchSchema) { this.schemaMatcher = new Matcher(matchSchema); } public void setMatchName(String matchName) { this.nameMatcher = new Matcher(matchName); } /** * * @return null if filter does not affect this identifier, true/false if it does. */ public Boolean exclude(TableIdentifier identifier) { return isRelevantFor(identifier) ? exclude : null; } public void setExclude(Boolean bool) { exclude = bool; } public String getPackage(TableIdentifier identifier) { return isRelevantFor(identifier) ? packageName : null; } private boolean isRelevantFor(TableIdentifier identifier) { if(catalogMatcher.match(identifier.getCatalog() ) ) { if(schemaMatcher.match(identifier.getSchema() ) ) { if(nameMatcher.match(identifier.getName() ) ) { return true; } } } return false; } public void setPackage(String string) { packageName = string; } public String toString() { return catalogMatcher + " " + schemaMatcher + " " + nameMatcher + " " + exclude; } public String getMatchCatalog() { return catalogMatcher.matchValue; } public String getMatchSchema() { return schemaMatcher.matchValue; } public String getMatchName() { return nameMatcher.matchValue; } public Boolean getExclude() { return exclude; } public Map<?,?> getMetaAttributes(TableIdentifier identifier) { return isRelevantFor(identifier) ? metaAttributes : null; } public void setMetaAttributes(Map<?,?> metaAttributes) { this.metaAttributes = metaAttributes; } }