/*******************************************************************************
 * Copyright (c) 2003, 2005 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.jem.internal.java.adapters.jdk;
/*


 */
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jem.java.*;
import org.eclipse.jem.internal.java.adapters.ReadAdaptor;
/**
 * Insert the type's description here.
 * Creation date: (6/6/2000 4:42:50 PM)
 * @author: Administrator
 */
public class JavaFieldJDKAdaptor extends JDKAdaptor {
	protected java.lang.reflect.Field sourceField = null;
	protected Class parentType = null;
	public JavaFieldJDKAdaptor(Notifier target, JavaJDKAdapterFactory anAdapterFactory) {
		super(target, anAdapterFactory);
	}
	/**
	 * getParentType - return the Class which corresponds to our parent JavaClass
	 * we're going to do this a lot, so cache it.
	 */
	protected Class getParentType() {
		if (parentType == null) {
			Field targetField = (Field) getTarget();
			JavaClass parentJavaClass = targetField.getJavaClass();
			JavaClassJDKAdaptor pa = (JavaClassJDKAdaptor) EcoreUtil.getAdapter(parentJavaClass.eAdapters(), ReadAdaptor.TYPE_KEY);
			if (pa != null)
				parentType = pa.getSourceType();
		}
		return parentType;
	}
	public Object getReflectionSource() {
		return getSourceField();
	}
	
    /* (non-Javadoc)
     * @see org.eclipse.jem.internal.java.adapters.JavaReflectionAdaptor#hasReflectionSource()
     */
    public boolean hasCachedReflectionSource() {
        return sourceField != null;
    }
	/**
	 * getSourceField - return the java.lang.reflect.Field which describes our implementing field
	 */
	protected java.lang.reflect.Field getSourceField() {
		if (sourceField == null) {
			Class parent = this.getParentType();
			if (parent != null) {
				try {
					sourceField = parent.getDeclaredField(((Field) getTarget()).getName());
				} catch (NoSuchFieldException e) {
					// OK, carry on
				}
			}
		}
		return sourceField;
	}
	public Field getTargetField() {
		return (Field) getTarget();
	}
	/**
	 * getValueIn method comment.
	 */
	public Object getValueIn(EObject object, EObject attribute) {
		// At this point, this adapter does not dynamically compute any values,
		// all values are pushed back into the target on the initial call.
		return super.getValueIn(object, attribute);
	}
	/**
	 * reflectValues - template method, subclasses override to pump values into target.
	 * on entry: name, containing package (and qualified name), and document must be set.
	 * JavaClass adaptor:
	 *	- set modifiers
	 *	- set name
	 * 	- set type
	 */
	public boolean reflectValues() {
		if (getSourceField() != null) {
			setModifiers();
			setType();
			setInitializerIfPossible();
			return true;
		}
		return false;
	}
	/**
	 * Used for the very narrow case of final static Strings
	 */
	protected void setInitializerIfPossible() {
		if (!(getTargetField().isStatic() && getTargetField().isFinal() && "java.lang.String".equals(((JavaHelpers) getTargetField().getEType()).getQualifiedName()))) //$NON-NLS-1$
			return;

		String value = null;
		try {
			value = (String) getSourceField().get(null);
		} catch (IllegalAccessException ex) {
			return;
		}

		if (value == null)
			return;
		else
			value = "\"".concat(value).concat("\""); //$NON-NLS-2$//$NON-NLS-1$

		Block aBlock = createBlock(getTargetField().getName(), value);
		getTargetField().setInitializer(aBlock);
	}
	/**
	 * setModifiers - set the attribute values related to modifiers here
	 */
	protected void setModifiers() {
		Field javaFieldTarget = (Field) getTarget();
		// For JDK reflection, I don't think we can set the initializer
		int modifiers = getSourceField().getModifiers();
		javaFieldTarget.setStatic(java.lang.reflect.Modifier.isStatic(modifiers));
		javaFieldTarget.setTransient(java.lang.reflect.Modifier.isTransient(modifiers));
		javaFieldTarget.setVolatile(java.lang.reflect.Modifier.isVolatile(modifiers));
		javaFieldTarget.setFinal(java.lang.reflect.Modifier.isFinal(modifiers));
		// Set visibility
		if (java.lang.reflect.Modifier.isPublic(modifiers))
			javaFieldTarget.setJavaVisibility(JavaVisibilityKind.PUBLIC_LITERAL);
		else if (java.lang.reflect.Modifier.isPrivate(modifiers))
			javaFieldTarget.setJavaVisibility(JavaVisibilityKind.PRIVATE_LITERAL);
		else if (java.lang.reflect.Modifier.isProtected(modifiers))
			javaFieldTarget.setJavaVisibility(JavaVisibilityKind.PROTECTED_LITERAL);
		else
			javaFieldTarget.setJavaVisibility(JavaVisibilityKind.PACKAGE_LITERAL);
	}
	/**
	 * setType - set our type here
	 */
	protected void setType() {
		String typeName = getTypeName(getSourceField().getType());
		setFieldType(getTargetField(), typeName);
	}
}
