/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-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 volitile; 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.
	 */
	public AccessibleImpl(String description, VirtualMachineImpl vmImpl) {
		super(description, vmImpl);
	}

	/** 
	 * @return Returns true if object is package private.
	 */
	public boolean isPackagePrivate() {
		return !(isPrivate() || isPublic() || isProtected());
	}
		
	/** 
	 * @return Returns true if object is private.
	 */
	public boolean isPrivate() {
		return (modifiers() & MODIFIER_ACC_PRIVATE) != 0;
	}
	
	/** 
	 * @return Returns true if object is pubic.
	 */
	public boolean isPublic() {
		return (modifiers() & MODIFIER_ACC_PUBLIC) != 0;
	}
	
	/** 
	 * @return Returns true if object is protected.
	 */
	public boolean isProtected() {
		return (modifiers() & MODIFIER_ACC_PROTECTED) != 0;
	}
	
	/**
	 * @return Returns modifier bits.
	 */
	public abstract int modifiers();

	/**
	 * Retrieves constant mappings.
	 */
	public static void getConstantMaps() {
		if (fgModifiers != null) {
			return;
		}
		
		Field[] fields = AccessibleImpl.class.getDeclaredFields();
		fgModifiers = new String[32];
		
		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			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;
	 }
}
