| /******************************************************************************* |
| * 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); |
| } |
| } |