/* * Copyright 2014 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 * * 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. */ package com.navercorp.pinpoint.profiler.plugin.xml.transformer; import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; import com.navercorp.pinpoint.bootstrap.instrument.InstrumentContext; /** * @author Jongho Moon * */ public class ClassConditions { public static ClassCondition hasField(String name) { return new HasField(name); } public static ClassCondition hasField(String name, String type) { return new HasField(name, type); } public static ClassCondition hasMethod(String name, String... paramTypes) { return new HasMethod(name, paramTypes); } public static ClassCondition hasDeclaredMethod(String name, String... paramTypes) { return new HasDeclaredMethod(name, paramTypes); } public static ClassCondition hasConstructor(String... paramTypes) { return new HasConstructor(paramTypes); } public static ClassCondition hasClass(String name) { return new HasClass(name); } public static ClassCondition hasNotDeclaredMethod(String name, String... paramTypes) { return new HasNotDeclaredMethod(name, paramTypes); } private static class HasField implements ClassCondition { private final String name; private final String type; public HasField(String name) { this(name, null); } public HasField(String name, String type) { this.name = name; this.type = type; } @Override public boolean check(InstrumentContext context, ClassLoader classLoader, InstrumentClass target) { return target.hasField(name, type); } @Override public String toString() { return "HasField[" + type + " " + name + "]"; } } private static class HasMethod implements ClassCondition { private final String name; private final String[] paramTypes; public HasMethod(String name, String... paramTypes) { this.name = name; this.paramTypes = paramTypes; } @Override public boolean check(InstrumentContext context, ClassLoader classLoader, InstrumentClass target) { return target.hasMethod(name, paramTypes); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("HasMethod["); builder.append(name); builder.append('('); for (String p : paramTypes) { builder.append(p); } builder.append(")]"); return builder.toString(); } } private static class HasDeclaredMethod implements ClassCondition { private final String name; private final String[] paramTypes; public HasDeclaredMethod(String name, String[] paramTypes) { this.name = name; this.paramTypes = paramTypes; } @Override public boolean check(InstrumentContext context, ClassLoader classLoader, InstrumentClass target) { return target.hasDeclaredMethod(name, paramTypes); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("HasMethod["); builder.append(name); builder.append('('); for (String p : paramTypes) { builder.append(p); } builder.append(")]"); return builder.toString(); } } private static class HasNotDeclaredMethod extends HasDeclaredMethod { public HasNotDeclaredMethod(String name, String[] paramTypes) { super(name, paramTypes); } @Override public boolean check(InstrumentContext context, ClassLoader classLoader, InstrumentClass target) { return !super.check(context, classLoader, target); } } private static class HasConstructor implements ClassCondition { private final String[] paramTypes; public HasConstructor(String[] paramTypes) { this.paramTypes = paramTypes; } @Override public boolean check(InstrumentContext context, ClassLoader classLoader, InstrumentClass target) { return target.hasConstructor(paramTypes); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("HasConstructor["); for (String p : paramTypes) { builder.append(p); } builder.append(")]"); return builder.toString(); } } private static class HasClass implements ClassCondition { private final String name; public HasClass(String name) { this.name = name; } @Override public boolean check(InstrumentContext context, ClassLoader classLoader, InstrumentClass target) { return context.exist(classLoader, name); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("{name="); builder.append(name); builder.append("}"); return builder.toString(); } } }