/* * Copyright 2016 NAVER Corp. * 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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. */ package com.navercorp.pinpoint.plugin.spring.beans; import com.navercorp.pinpoint.bootstrap.util.AntPathMatcher; import com.navercorp.pinpoint.bootstrap.util.PathMatcher; import com.navercorp.pinpoint.bootstrap.util.RegexPathMatcher; import com.navercorp.pinpoint.common.util.CollectionUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.regex.Pattern; /** * @author jaehong.kim */ public class SpringBeansTarget { public static final String ANT_STYLE_PATTERN_PREFIX = "antstyle"; public static final String REGEX_PATTERN_PREFIX = "regex"; private SpringBeansTargetScope scope = SpringBeansTargetScope.COMPONENT_SCAN; private List<String> basePackages; private List<PathMatcher> namePatterns; private List<PathMatcher> classPatterns; private List<String> annotations; public boolean isValid() { if (CollectionUtils.isNotEmpty(basePackages)) { return true; } if (CollectionUtils.isNotEmpty(namePatterns)) { return true; } if (CollectionUtils.isNotEmpty(classPatterns)) { return true; } if (CollectionUtils.isNotEmpty(annotations)) { return true; } return false; } public void setScope(final String scope) { this.scope = SpringBeansTargetScope.get(scope); } public SpringBeansTargetScope getScope() { return scope; } public void setBasePackages(final String basePackages) { this.basePackages = split(basePackages); } public List<String> getBasePackages() { return basePackages; } public void setNamePatterns(final String namePatternRegex) { this.namePatterns = compilePattern(split(namePatternRegex), "/"); } public List<PathMatcher> getNamePatterns() { return namePatterns; } public void setClassPatterns(final String classPatternRegex) { this.classPatterns = compilePattern(split(classPatternRegex), "."); } public List<PathMatcher> getClassPatterns() { return classPatterns; } public void setAnnotations(final String annotations) { this.annotations = split(annotations); } public List<String> getAnnotations() { return annotations; } List<String> split(final String values) { if (values == null) { return Collections.emptyList(); } final String[] tokens = values.split(","); final List<String> result = new ArrayList<String>(tokens.length); for (String token : tokens) { final String trimmed = token.trim(); if (!trimmed.isEmpty()) { result.add(trimmed); } } return result; } List<PathMatcher> compilePattern(List<String> patternStrings, final String separator) { if (CollectionUtils.isEmpty(patternStrings)) { return null; } final List<PathMatcher> pathMatchers = new ArrayList<PathMatcher>(patternStrings.size()); for (String patternString : patternStrings) { final int prefixEnd = patternString.indexOf(":"); if (prefixEnd != -1) { final String prefix = patternString.substring(0, prefixEnd).trim(); if (prefix.equals(ANT_STYLE_PATTERN_PREFIX)) { final String trimmed = patternString.substring(prefixEnd + 1).trim(); if (!trimmed.isEmpty()) { pathMatchers.add(new AntPathMatcher(trimmed, separator)); } continue; } else if (prefix.equals(REGEX_PATTERN_PREFIX)) { final String trimmed = patternString.substring(prefixEnd + 1).trim(); if (!trimmed.isEmpty()) { final Pattern pattern = Pattern.compile(trimmed); pathMatchers.add(new RegexPathMatcher(pattern)); } continue; } } final Pattern pattern = Pattern.compile(patternString); pathMatchers.add(new RegexPathMatcher(pattern)); } return pathMatchers; } @Override public String toString() { final StringBuilder sb = new StringBuilder("{"); sb.append("scope=").append(scope); sb.append(", basePackages=").append(basePackages); sb.append(", namePatterns=").append(namePatterns); sb.append(", classPatterns=").append(classPatterns); sb.append(", annotations=").append(annotations); sb.append('}'); return sb.toString(); } }