/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdi.internal;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import com.sun.jdi.Accessible;

/**
 * this class implements the corresponding interfaces declared by the JDI
 * specification. See the com.sun.jdi package for more information.
 *
 */
public abstract class AccessibleImpl extends MirrorImpl implements Accessible {
	/** Modifier bit flag: Is synthetic. see MODIFIER_ACC_SYNTHETIC. */
	public static final int MODIFIER_SYNTHETIC = 0xf0000000;
	/** Modifier bit flag: Is public; may be accessed from outside its package. */
	public static final int MODIFIER_ACC_PUBLIC = 0x0001;
	/** Modifier bit flag: Is private; usable only within the defining class. */
	public static final int MODIFIER_ACC_PRIVATE = 0x0002;
	/** Modifier bit flag: Is protected; may be accessed within subclasses. */
	public static final int MODIFIER_ACC_PROTECTED = 0x0004;
	/** Modifier bit flag: Is static. */
	public static final int MODIFIER_ACC_STATIC = 0x0008;
	/** Modifier bit flag: Is final; no overriding is allowed. */
	public static final int MODIFIER_ACC_FINAL = 0x0010;
	/** Modifier bit flag: Is synchronized; wrap use in monitor lock. */
	public static final int MODIFIER_ACC_SYNCHRONIZED = 0x0020;
	/** Modifier bit flag: Treat superclass methods specially in invokespecial. */
	public static final int MODIFIER_ACC_SUPER = 0x0020;
	/**
	 * Modifier bit flag: Is bridge; the method is a synthetic method created to
	 * support generic types.
	 */
	public static final int MODIFIER_ACC_BRIDGE = 0x0040;
	/** Modifier bit flag: Is volatile; cannot be reached. */
	public static final int MODIFIER_ACC_VOLITILE = 0x0040;
	/**
	 * Modifier bit flag: Is transient; not written or read by a persistent
	 * object manager.
	 */
	public static final int MODIFIER_ACC_TRANSIENT = 0x0080;
	/**
	 * Modifier bit flag: Is varargs; the method has been declared with variable
	 * number of arguments.
	 */
	public static final int MODIFIER_ACC_VARARGS = 0x0080;
	/**
	 * Modifier bit flag: Is enum; the field hold an element of an enumerated
	 * type.
	 */
	public static final int MODIFIER_ACC_ENUM = 0x0100;
	/** Modifier bit flag: Is native; implemented in a language other than Java. */
	public static final int MODIFIER_ACC_NATIVE = 0x0100;
	/** Modifier bit flag: Is abstract; no implementation is provided. */
	public static final int MODIFIER_ACC_ABSTRACT = 0x0400;
	/**
	 * Modifier bit flag: Is strict; the method floating-point mode is FP-strict
	 */
	public static final int MODIFIER_ACC_STRICT = 0x0800;
	/** Modifier bit flag: Is synthetic. see MODIFIER_SYNTHETIC. */
	public static final int MODIFIER_ACC_SYNTHETIC = 0x1000;

	/** Mapping of command codes to strings. */
	private static String[] fgModifiers = null;

	/**
	 * Creates new instance.
	 * @param description the description
	 * @param vmImpl the VM
	 */
	public AccessibleImpl(String description, VirtualMachineImpl vmImpl) {
		super(description, vmImpl);
	}

	/**
	 * @return Returns true if object is package private.
	 */
	@Override
	public boolean isPackagePrivate() {
		return !(isPrivate() || isPublic() || isProtected());
	}

	/**
	 * @return Returns true if object is private.
	 */
	@Override
	public boolean isPrivate() {
		return (modifiers() & MODIFIER_ACC_PRIVATE) != 0;
	}

	/**
	 * @return Returns true if object is public.
	 */
	@Override
	public boolean isPublic() {
		return (modifiers() & MODIFIER_ACC_PUBLIC) != 0;
	}

	/**
	 * @return Returns true if object is protected.
	 */
	@Override
	public boolean isProtected() {
		return (modifiers() & MODIFIER_ACC_PROTECTED) != 0;
	}

	/**
	 * Retrieves constant mappings.
	 */
	public static void getConstantMaps() {
		if (fgModifiers != null) {
			return;
		}

		Field[] fields = AccessibleImpl.class.getDeclaredFields();
		fgModifiers = new String[32];

		for (Field field : fields) {
			int modifiers = field.getModifiers();
			if ((modifiers & Modifier.PUBLIC) == 0
					|| (modifiers & Modifier.STATIC) == 0
					|| (modifiers & Modifier.FINAL) == 0)
				continue;

			String name = field.getName();
			if (!name.startsWith("MODIFIER_")) {//$NON-NLS-1$
				continue;
			}

			name = name.substring(9);

			try {
				int value = field.getInt(null);

				for (int j = 0; j < 32; j++) {
					if ((1 << j & value) != 0) {
						fgModifiers[j] = name;
						break;
					}
				}
			} catch (IllegalAccessException e) {
				// Will not occur for own class.
			} catch (IllegalArgumentException e) {
				// Should not occur.
				// We should take care that all public static final constants
				// in this class are numbers that are convertible to int.
			}
		}
	}

	/**
	 * @return Returns an array with string representations of tags.
	 */
	public static String[] getModifierStrings() {
		getConstantMaps();
		return fgModifiers;
	}
}
