/*
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional information regarding
 * copyright ownership. The ASF licenses this file to You 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 org.apache.geode.admin.jmx.internal;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.modeler.AttributeInfo;
import org.apache.commons.modeler.ManagedBean;
import org.apache.commons.modeler.OperationInfo;

/**
 * Extends ManagedBean to allow for dynamically creating new instances of ManagedBean based on an
 * existing instance of ManagedBean.
 *
 * @since GemFire 5.0.1
 */
public class DynamicManagedBean extends org.apache.commons.modeler.ManagedBean {
  private static final long serialVersionUID = 4051924500150228160L;

  public DynamicManagedBean(ManagedBean managed) {
    super();

    this.attributes = managed.getAttributes();
    this.className = managed.getClassName();
    this.constructors = managed.getConstructors();
    this.description = managed.getDescription();
    this.domain = managed.getDomain();
    this.group = managed.getGroup();
    this.name = managed.getName();
    this.fields = managed.getFields();
    this.notifications = managed.getNotifications();
    this.operations = managed.getOperations();
    this.type = managed.getType();

    /*
     * we don't use modelerType and it's nice to remove it to keep the list of attributes cleaned
     * up...
     */
    removeAttribute("modelerType");
  }

  /**
   * Removes an attribute from this ManagedBean's attribute descriptor list.
   *
   * @param name the attribute to be removed
   */
  public void removeAttribute(String name) {
    if (name == null || name.length() < 1) {
      return;
    }
    synchronized (this.attributes) {
      List attributesList = new ArrayList(this.attributes.length);
      for (int i = 0; i < this.attributes.length; i++) {
        if (!name.equals(this.attributes[i].getName())) {
          attributesList.add(this.attributes[i]);
        }
      }
      this.attributes =
          (AttributeInfo[]) attributesList.toArray(new AttributeInfo[attributesList.size()]);

      /*
       * super.info should be nulled out anytime the structure is changed, such as altering the
       * attributes, operations, or notifications
       *
       * however super.info is private, so we need the following hack to cause the super class to
       * null it out for us...
       */
      setType(this.type); // causes this in super: "this.info = null;"
    }
  }

  /**
   * Removes the operation with the given name from thie <code>ManageBean</code>'s operation
   * descriptor list.
   *
   * @since GemFire 4.0
   */
  public void removeOperation(String name) {
    if (name == null || name.length() < 1) {
      return;
    }

    synchronized (operations) {
      List operationsList = new ArrayList(this.operations.length);
      for (int i = 0; i < this.operations.length; i++) {
        if (!name.equals(this.operations[i].getName())) {
          operationsList.add(this.operations[i]);
        }
      }
      this.operations =
          (OperationInfo[]) operationsList.toArray(new OperationInfo[operationsList.size()]);

      /*
       * super.info should be nulled out anytime the structure is changed, such as altering the
       * operations, operations, or notifications
       *
       * however super.info is private, so we need the following hack to cause the super class to
       * null it out for us...
       */
      setType(this.type); // causes this in super: "this.info = null;"
    }
  }

  /**
   * Return a string representation of this managed bean.
   */
  @Override
  public String toString() {
    StringBuffer sb = new StringBuffer("DynamicManagedBean[");
    sb.append("name=");
    sb.append(name);
    sb.append(", className=");
    sb.append(className);
    sb.append(", description=");
    sb.append(description);
    if (group != null) {
      sb.append(", group=");
      sb.append(group);
    }
    sb.append(", type=");
    sb.append(type);
    sb.append(", attributes=");
    sb.append(Arrays.asList(attributes));
    sb.append("]");
    return (sb.toString());
  }
}
