package org.datadog.jmxfetch; import java.util.ArrayList; import java.util.HashMap; import java.util.Set; import java.util.regex.Pattern; class Filter { HashMap<String, Object> filter; Pattern domainRegex; ArrayList<Pattern> beanRegexes = null; ArrayList<String> excludeTags = null; HashMap<String, String> additionalTags = null; /** * A simple class to manipulate include/exclude filter elements more easily * A filter may contain: * - A domain (key: 'domain') or a domain regex (key: 'domain_regex') * - Bean names (key: 'bean' or 'bean_name') or bean regexes (key: 'bean_regex') * - Attributes (key: 'attribute') * - Additional bean parameters (other keys) */ @SuppressWarnings("unchecked") public Filter(Object filter) { HashMap<String, Object> castFilter; if (filter != null) { castFilter = (HashMap<String, Object>) filter; } else { castFilter = new HashMap<String, Object>(); } this.filter = castFilter; } public String toString() { return this.filter.toString(); } public Set<String> keySet() { return filter.keySet(); } @SuppressWarnings({ "unchecked", "serial" }) private static ArrayList<String> toStringArrayList(final Object toCast) { // Return object as an ArrayList wherever it's defined as // list or not // // ### Example // object: // - firstValue // - secondValue // ### OR // object: singleValue // ### try{ return (ArrayList<String>) toCast; } catch (ClassCastException e){ return new ArrayList<String>() {{ add(((String) toCast)); }}; } } public ArrayList<String> getBeanNames() { if (isEmptyBeanName()){ return new ArrayList<String>(); } final Object beanNames = (filter.get("bean") != null) ? filter.get("bean") : filter.get("bean_name"); // Return bean names as an ArrayList wherever it's defined as // list or not // // ### Example // bean: // - org.apache.cassandra.db:type=Caches,keyspace=system,cache=HintsColumnFamilyKeyCache // - org.datadog.jmxfetch.test:type=type=SimpleTestJavaApp // ### OR // bean: org.datadog.jmxfetch.test:type=type=SimpleTestJavaApp // ### return toStringArrayList(beanNames); } private static ArrayList<Pattern> toPatternArrayList(final Object toCast) { ArrayList<Pattern> patternArrayList = new ArrayList<Pattern>(); ArrayList<String> stringArrayList = toStringArrayList(toCast); for (String string : stringArrayList) { patternArrayList.add(Pattern.compile(string)); } return patternArrayList; } public ArrayList<Pattern> getBeanRegexes() { // Return bean regexes as an ArrayList of Pattern whether it's defined as // a list or not if (this.beanRegexes == null) { if (filter.get("bean_regex") == null){ this.beanRegexes = new ArrayList<Pattern>(); } else { final Object beanRegexNames = filter.get("bean_regex"); this.beanRegexes = toPatternArrayList(beanRegexNames); } } return this.beanRegexes; } public ArrayList<String> getExcludeTags() { // Return excluded tags as an ArrayList whether it's defined as a list or not if (this.excludeTags == null) { if (filter.get("exclude_tags") == null){ this.excludeTags = new ArrayList<String>(); } else { final Object exclude_tags = filter.get("exclude_tags"); this.excludeTags = toStringArrayList(exclude_tags); } } return this.excludeTags; } public HashMap<String, String> getAdditionalTags() { // Return additional tags if (this.additionalTags == null) { if (filter.get("tags") == null){ this.additionalTags = new HashMap<String, String>(); } else { this.additionalTags = (HashMap<String, String>)filter.get("tags"); } } return this.additionalTags; } public String getDomain() { return (String) filter.get("domain"); } public Pattern getDomainRegex() { if (this.filter.get("domain_regex") == null) { return null; } if (this.domainRegex == null) { this.domainRegex = Pattern.compile((String) this.filter.get("domain_regex")); } return this.domainRegex; } public Object getAttribute() { return filter.get("attribute"); } public ArrayList<String> getParameterValues(String parameterName) { // Return bean attributes values as an ArrayList wherever it's defined as // list or not // // ### Example // bean_parameter: // - exampleType1 // - exampleType2 // ### OR // bean_parameter: onlyOneType // ### final Object beanValues = filter.get(parameterName); return toStringArrayList(beanValues); } public boolean isEmptyBeanName() { return (filter.get("bean") == null && filter.get("bean_name") == null); } }