All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.grinder.scriptengine.java.JavaDCRInstrumenter Maven / Gradle / Ivy

The newest version!
// Copyright (C) 2009 - 2011 Philip Aston
// All rights reserved.
//
// This file is part of The Grinder software distribution. Refer to
// the file LICENSE which is part of The Grinder distribution for
// licensing details. The Grinder distribution is available on the
// Internet at http://grinder.sourceforge.net/
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE.

package net.grinder.scriptengine.java;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import net.grinder.script.NonInstrumentableTypeException;
import net.grinder.script.Test.InstrumentationFilter;
import net.grinder.scriptengine.AbstractDCRInstrumenter;
import net.grinder.scriptengine.DCRContext;
import net.grinder.scriptengine.Recorder;
import net.grinder.util.weave.Weaver.TargetSource;


/**
 * DCR instrumenter for Java.
 *
 * @author Philip Aston
 */
final class JavaDCRInstrumenter extends AbstractDCRInstrumenter {

  /**
   * Constructor.
   *
   * @param context The DCR context.
   */
  public JavaDCRInstrumenter(DCRContext context) {
    super(context);
  }

  /**
   * {@inheritDoc}
   */
  @Override public String getDescription() {
    return "byte code transforming instrumenter for Java";
  }

  /**
   * {@inheritDoc}
   */
  @Override
  protected boolean instrument(Object target,
                               Recorder recorder,
                               InstrumentationFilter filter)
    throws NonInstrumentableTypeException {

    if (target instanceof Class) {
      instrumentClass((Class)target, recorder, filter);
    }
    else if (target != null) {
      instrumentInstance(target, recorder, filter);
    }

    return true;
  }

  private void instrumentClass(Class targetClass,
                               Recorder recorder,
                               InstrumentationFilter filter)
    throws NonInstrumentableTypeException {

    if (targetClass.isArray()) {
      throw new NonInstrumentableTypeException("Can't instrument arrays");
    }

    for (Constructor constructor : targetClass.getDeclaredConstructors()) {
       getContext().add(targetClass, constructor, recorder);
    }

    // Instrument the static methods declared by the target class. Ignore
    // any parent class.
    for (Method method : targetClass.getDeclaredMethods()) {
      if (Modifier.isStatic(method.getModifiers()) &&
          filter.matches(method)) {
        getContext().add(targetClass, method, TargetSource.CLASS, recorder);
      }
    }

//    Class c = targetClass;
//
//    do {
//      for (Method method : c.getDeclaredMethods()) {
//        if (Modifier.isStatic(method.getModifiers())) {
//          instrument(c, method, recorder);
//        }
//      }
//
//      c = c.getSuperclass();
//    }
//    while (isInstrumentable(c));
  }

  private void instrumentInstance(Object target,
                                  Recorder recorder,
                                  InstrumentationFilter filter)
    throws NonInstrumentableTypeException {

    Class c = target.getClass();

    if (c.isArray()) {
      throw new NonInstrumentableTypeException("Can't instrument arrays");
    }

    do {
      for (Method method : c.getDeclaredMethods()) {
        if (!Modifier.isStatic(method.getModifiers()) &&
            filter.matches(method)) {
          getContext().add(target,
                           method,
                           TargetSource.FIRST_PARAMETER,
                           recorder);
        }
      }

      c = c.getSuperclass();
    }
    while (getContext().isInstrumentable(c));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy