/*
 * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the Classpath exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package org.openjdk.btrace.instr;

import java.util.Collection;
import java.util.HashSet;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;

/**
 * This class is used to store data of the annotation OnProbe. We can not read the OnMethod
 * annotation using reflection API [because we strip {@code @OnProbe} annotated methods before
 * defineClass]. Instead, we read OnProbe annotation while parsing the BTrace class and store the
 * data in an instance of this class. Please note that the get/set methods have to be in sync with
 * OnProbe annotation.
 *
 * @author A. Sundararajan
 */
public final class OnProbe extends SpecialParameterHolder {
  private String namespace;
  private String name;
  // target method name on which this annotation is specified
  private String targetName;
  // target method descriptor on which this annotation is specified
  private String targetDescriptor;
  private Collection<OnMethod> onMethods;
  private BTraceMethodNode bmn;

  public OnProbe(BTraceMethodNode bmn) {
    this.bmn = bmn;
  }

  public OnProbe() {
    // need this to deserialize from the probe descriptor
  }

  @XmlAttribute
  public String getNamespace() {
    return namespace;
  }

  public void setNamespace(String namespace) {
    this.namespace = namespace;
  }

  @XmlAttribute
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getTargetName() {
    return targetName;
  }

  public void setTargetName(String name) {
    targetName = name;
  }

  public String getTargetDescriptor() {
    return targetDescriptor;
  }

  public void setTargetDescriptor(String desc) {
    targetDescriptor = desc;
  }

  @XmlElement(name = "map")
  public Collection<OnMethod> getOnMethods() {
    return onMethods;
  }

  public void setOnMethods(Collection<OnMethod> om) {
    onMethods = om;
  }

  public void copyFrom(OnProbe other) {
    super.copyFrom(other);
    namespace = other.namespace;
    name = other.name;
    targetName = other.targetName;
    targetDescriptor = other.targetDescriptor;
    onMethods = new HashSet<>(other.onMethods);
  }

  public BTraceMethodNode getMethodNode() {
    return bmn;
  }

  void setMethodNode(BTraceMethodNode bmn) {
    this.bmn = bmn;
  }
}
