/* * #%L * P6Spy * %% * Copyright (C) 2013 P6Spy * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package com.p6spy.engine.logging; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import javax.management.StandardMBean; import com.p6spy.engine.common.P6Util; import com.p6spy.engine.spy.P6ModuleManager; import com.p6spy.engine.spy.option.P6OptionsRepository; public class P6LogOptions extends StandardMBean implements P6LogLoadableOptions { public static final String EXCLUDE = "exclude"; public static final String INCLUDE = "include"; public static final String FILTER = "filter"; public static final String EXCLUDECATEGORIES = "excludecategories"; public static final String EXCLUDEBINARY = "exludebinary"; public static final String EXECUTION_THRESHOLD = "executionThreshold"; public static final String SQLEXPRESSION = "sqlexpression"; // those set indirectly (via properties visible from outside) public static final String INCLUDE_LIST = "includeList"; public static final String EXCLUDE_LIST = "excludeList"; public static final String INCLUDE_EXCLUDE_PATTERN = "includeExcludePattern"; public static final String EXCLUDECATEGORIES_SET = "excludecategoriesSet"; public static final String SQLEXPRESSION_PATTERN = "sqlexpressionPattern"; public static final Map<String, String> defaults; static { defaults = new HashMap<String, String>(); defaults.put(FILTER, Boolean.toString(false)); defaults.put(EXCLUDECATEGORIES, "info,debug,result,resultset,batch"); defaults.put(EXCLUDEBINARY, Boolean.toString(false)); defaults.put(EXECUTION_THRESHOLD, Long.toString(0)); } private final P6OptionsRepository optionsRepository; public P6LogOptions(final P6OptionsRepository optionsRepository) { super(P6LogOptionsMBean.class, false); this.optionsRepository = optionsRepository; } @Override public void load(Map<String, String> options) { setSQLExpression(options.get(SQLEXPRESSION)); setExecutionThreshold(options.get(EXECUTION_THRESHOLD)); setExcludecategories(options.get(EXCLUDECATEGORIES)); setFilter(options.get(FILTER)); setInclude(options.get(INCLUDE)); setExclude(options.get(EXCLUDE)); setExcludebinary(options.get(EXCLUDEBINARY)); } /** * Utility method, to make accessing options from app less verbose. * * @return active instance of the {@link P6LogLoadableOptions} */ public static P6LogLoadableOptions getActiveInstance() { return P6ModuleManager.getInstance().getOptions(P6LogOptions.class); } @Override public Map<String, String> getDefaults() { return defaults; } // JMX exposed API @Override public void setExclude(String exclude) { optionsRepository.setSet(String.class, EXCLUDE_LIST, exclude); // setting effective string optionsRepository.set(String.class, EXCLUDE, P6Util.joinNullSafe(optionsRepository.getSet(String.class, EXCLUDE_LIST), ",")); optionsRepository.setOrUnSet(Pattern.class, INCLUDE_EXCLUDE_PATTERN, computeIncludeExcludePattern(), defaults.get(INCLUDE_EXCLUDE_PATTERN)); } private String computeIncludeExcludePattern() { final String excludes = P6Util.joinNullSafe(optionsRepository.getSet(String.class, EXCLUDE_LIST), "|"); final String includes = P6Util.joinNullSafe(optionsRepository.getSet(String.class, INCLUDE_LIST), "|"); if (excludes.length() == 0 && includes.length() == 0) { return null; } final StringBuilder sb = new StringBuilder("(?mis)^"); if (excludes.length() > 0 ) { sb.append("(?!.*(").append(excludes).append(").*)"); } if (includes.length() > 0 ) { sb.append("(.*(").append(includes).append(").*)"); } else { // make sure to match any string here, if no explicit includes specified sb.append("(.*)"); } return sb.append("$").toString(); } @Override public String getExclude() { return optionsRepository.get(String.class, EXCLUDE); } @Override public void setExcludebinary(boolean excludebinary) { optionsRepository.set(Boolean.class, EXCLUDEBINARY, excludebinary); } @Override public void setExcludebinary(String excludebinary) { optionsRepository.set(Boolean.class, EXCLUDEBINARY, excludebinary); } @Override public boolean getExcludebinary() { return optionsRepository.get(Boolean.class, EXCLUDEBINARY); } @Override public void setExcludecategories(String excludecategories) { optionsRepository.set(String.class, EXCLUDECATEGORIES, excludecategories); optionsRepository.setSet(Category.class, EXCLUDECATEGORIES_SET, excludecategories); } @Override public String getExcludecategories() { return optionsRepository.get(String.class, EXCLUDECATEGORIES); } @Override public void setFilter(String filter) { optionsRepository.set(Boolean.class, FILTER, filter); } @Override public void setFilter(boolean filter) { optionsRepository.set(Boolean.class, FILTER, filter); } @Override public boolean getFilter() { return optionsRepository.get(Boolean.class, FILTER); } @Override public void setInclude(String include) { optionsRepository.setSet(String.class, INCLUDE_LIST, include); // setting effective string optionsRepository.set(String.class, INCLUDE, P6Util.joinNullSafe(optionsRepository.getSet(String.class, INCLUDE_LIST), ",")); optionsRepository.setOrUnSet(Pattern.class, INCLUDE_EXCLUDE_PATTERN, computeIncludeExcludePattern(), defaults.get(INCLUDE_EXCLUDE_PATTERN)); } @Override public String getInclude() { return optionsRepository.get(String.class, INCLUDE); } @Override public String getSQLExpression() { return optionsRepository.get(String.class, SQLEXPRESSION); } @Override public Pattern getSQLExpressionPattern() { return optionsRepository.get(Pattern.class, SQLEXPRESSION_PATTERN); } @Override public void setSQLExpression(String sqlexpression) { optionsRepository.set(String.class, SQLEXPRESSION, sqlexpression); optionsRepository.set(Pattern.class, SQLEXPRESSION_PATTERN, sqlexpression); } @Override public void unSetSQLExpression() { optionsRepository.setOrUnSet(String.class, SQLEXPRESSION, null, defaults.get(SQLEXPRESSION)); optionsRepository.setOrUnSet(Pattern.class, SQLEXPRESSION_PATTERN, null, defaults.get(SQLEXPRESSION_PATTERN)); } @Override public void setExecutionThreshold(String executionThreshold) { optionsRepository.set(Long.class, EXECUTION_THRESHOLD, executionThreshold); } @Override public void setExecutionThreshold(long executionThreshold) { optionsRepository.set(Long.class, EXECUTION_THRESHOLD, executionThreshold); } @Override public long getExecutionThreshold() { return optionsRepository.get(Long.class, EXECUTION_THRESHOLD); } @Override public Set<String> getIncludeList() { return optionsRepository.getSet(String.class, INCLUDE_LIST); } @Override public Set<String> getExcludeList() { return optionsRepository.getSet(String.class, EXCLUDE_LIST); } @Override public Pattern getIncludeExcludePattern() { return optionsRepository.get(Pattern.class, INCLUDE_EXCLUDE_PATTERN); } @Override public Set<Category> getExcludeCategoriesSet() { return optionsRepository.getSet(Category.class, EXCLUDECATEGORIES_SET); } }