/* MemoryUsage.java - Information on the usage of a memory pool.
   Copyright (C) 2006 Free Software Foundation

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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 for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package java.lang.management;

import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.SimpleType;
/**
 * <p>
 * Retains information on the usage of a particular memory
 * pool, or heap/non-heap memory as a whole.  Memory usage
 * is represented by four values (all in bytes):
 * </p>
 * <ul>
 * <li><strong>Initial Level</strong>: This is the initial
 * amount of memory allocated for the pool by the operating
 * system.  This value may be undefined.</li>
 * <li><strong>Used Level</strong>: This is the amount of
 * memory currently in use.</li>
 * <li><strong>Committed Level</strong>: This is the current
 * amount of memory allocated for the pool by the operating
 * system.  This value will always be equal to or greater than
 * the current amount of memory in use.  It may drop below
 * the initial amount, if the virtual machine judges this to
 * be practical.</li>
 * <li><strong>Maximum Level</strong>: This is the maximum
 * amount of memory that may be allocated for the pool by
 * the operating system.  Like the initial amount, it may
 * be undefined.  If it is defined, it will be greater than
 * or equal to the used and committed amounts and may change
 * over time.  It is not guaranteed that the maximum amount
 * of memory may actually be allocated to the pool.  For
 * example, a request for an amount of memory greater than
 * the current committed level, but less than the maximum,
 * may still fail due to resources at the operating system
 * level not being sufficient to fulfill the demand.</li>
 * </ul>
 *
 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
 * @since 1.5
 * @see MemoryMXBean
 * @see MemoryPoolMXBean
 */
public class MemoryUsage
{

  /**
   * The initial amount of memory allocated.
   */
  private long init;

  /**
   * The amount of memory used.
   */
  private long used;

  /**
   * The amount of memory committed for use.
   */
  private long committed;

  /**
   * The maximum amount of memory available.
   */
  private long maximum;

  /**
   * Constructs a new {@link MemoryUsage} object with
   * the specified allocation levels.
   *
   * @param init the initial amount of memory allocated,
   *             or -1 if this value is undefined.  Must
   *             be >= -1.
   * @param used the amount of memory used.  Must be >= 0,
   *             and <= committed.
   * @param committed the amount of memory committed for use
   *                  at present.  Must be >= 0 and <=
   *                  maximum (if defined).
   * @param maximum the maximum amount of memory that may be
   *                used, or -1 if this value is undefined.
   *                Must be >= -1.
   * @throws IllegalArgumentException if the values break any
   *                                  of the limits specified
   *                                  above.
   */
  public MemoryUsage(long init, long used, long committed,
		     long maximum)
  {
    if (init < -1)
      throw new IllegalArgumentException("Initial value of "
					 + init + " is too small.");
    if (used < 0)
      throw new IllegalArgumentException("Used value of "
					 + used + " is too small.");
    if (committed < 0)
      throw new IllegalArgumentException("Committed value of "
					 + committed + " is too small.");
    if (committed < used)
      throw new IllegalArgumentException("Committed value of "
					 + committed + " is below "
					 + used + ", the amount used.");
    if (maximum < -1)
      throw new IllegalArgumentException("Maximum value of "
					 + maximum + " is too small.");
    if (maximum != -1 && maximum < committed)
      throw new IllegalArgumentException("Maximum value of " 
					 + maximum + " is below "
					 + committed + ", the amount "
					 + "committed.");
    this.init = init;
    this.used = used;
    this.committed = committed;
    this.maximum = maximum;
  }

  /**
   * <p>
   * Returns a {@link MemoryUsage} instance using the values
   * given in the supplied
   * {@link javax.management.openmbean.CompositeData} object.
   * The composite data instance should contain the following
   * attributes:
   * </p>
   * <ul>
   * <li>init</li>
   * <li>used</li>
   * <li>committed</li>
   * <li>max</li>
   * </ul>
   * <p>
   * All should have the type, <code>java.lang.Long</code>.
   * </p>
   * 
   * @param data the composite data structure to take values from.
   * @return a new instance containing the values from the 
   *         composite data structure, or <code>null</code>
   *         if the data structure was also <code>null</code>.
   * @throws IllegalArgumentException if the composite data structure
   *                                  does not match the structure
   *                                  outlined above, or the values
   *                                  are invalid.
   */
  public static MemoryUsage from(CompositeData data)
  {
    if (data == null)
      return null;
    CompositeType type = data.getCompositeType();
    ThreadInfo.checkAttribute(type, "init", SimpleType.LONG);
    ThreadInfo.checkAttribute(type, "used", SimpleType.LONG);
    ThreadInfo.checkAttribute(type, "committed", SimpleType.LONG);
    ThreadInfo.checkAttribute(type, "max", SimpleType.LONG);
    return new MemoryUsage(((Long) data.get("init")).longValue(),
			   ((Long) data.get("used")).longValue(),
			   ((Long) data.get("committed")).longValue(),
			   ((Long) data.get("max")).longValue());
  }

  /**
   * Returns the amount of memory committed for use by this
   * memory pool (in bytes).  This amount is guaranteed to
   * be available, unlike the maximum.
   *
   * @return the committed amount of memory.
   */
  public long getCommitted()
  {
    return committed;
  }

  /**
   * Returns the initial amount of memory allocated to the
   * pool (in bytes).  This method may return -1, if the
   * value is undefined.
   *
   * @return the initial amount of memory allocated, or -1
   *         if this value is undefined.
   */
  public long getInit()
  {
    return init;
  }

  /**
   * Returns the maximum amount of memory available for this
   * pool (in bytes).  This amount is not guaranteed to 
   * actually be usable.  This method may return -1, if the
   * value is undefined.
   *
   * @return the maximum amount of memory available, or -1
   *         if this value is undefined.
   */
  public long getMax()
  {
    return maximum;
  }

  /**
   * Returns the amount of memory used (in bytes).
   *
   * @return the amount of used memory.
   */
  public long getUsed()
  {
    return used;
  }

  /**
   * Returns a {@link java.lang.String} representation of
   * this {@link MemoryUsage} object.  This takes the form
   * <code>java.lang.management.MemoryUsage[init=i, used=u,
   * committed=c, maximum=m]</code>, where <code>i</code>
   * is the initial level, <code>u</code> is the used level,
   * <code>c</code> is the committed level and <code>m</code>
   * is the maximum level.
   *
   * @return the string specified above.
   */
  public String toString()
  {
    int megabyte = 1024 * 1024;
    return getClass().getName() +
      "[init=" + init + " bytes (~" + (init / megabyte) +
      "MB), used=" + used + " bytes (~" + (used / megabyte) +
      "MB), committed=" + committed + " bytes (~" + (committed / megabyte) +
      "MB), maximum=" + maximum + " bytes (~" + (maximum / megabyte) +
      "MB)]";
  }

}
  
