/* * 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 java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain; import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; import com.navercorp.pinpoint.bootstrap.instrument.InstrumentContext; import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; import com.navercorp.pinpoint.exception.PinpointException; import com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformer; import com.navercorp.pinpoint.profiler.util.JavaAssistUtils; public class DedicatedClassFileTransformer implements MatchableClassFileTransformer { private final InstrumentContext context; private final String targetClassName; private final ClassRecipe recipe; public DedicatedClassFileTransformer(InstrumentContext context, String targetClassName, ClassRecipe recipe) { this.context = context; this.targetClassName = targetClassName; this.recipe = recipe; } @Override public byte[] transform(ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { try { InstrumentClass target = context.getInstrumentClass(classLoader, className, classfileBuffer); recipe.edit(classLoader, target); return target.toBytecode(); } catch (PinpointException e) { throw e; } catch (Throwable e) { String msg = "Fail to invoke plugin class recipe: " + toString(); throw new PinpointException(msg, e); } } @Override public Matcher getMatcher() { return Matchers.newClassNameMatcher(JavaAssistUtils.javaNameToJvmName(targetClassName)); } @Override public String toString() { return "ClassEditor[target=" + targetClassName + ", subEditors=" + recipe + "]"; } }