/**
* Copyright (c) 2002-2006 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 - Initial API and implementation
*/
package org.eclipse.emf.java.impl;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.jdt.core.Flags;
import org.eclipse.emf.codegen.merge.java.facade.FacadeVisitor;
import org.eclipse.emf.codegen.merge.java.facade.JAbstractType;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.emf.java.JClass;
import org.eclipse.emf.java.JCompilationUnit;
import org.eclipse.emf.java.JField;
import org.eclipse.emf.java.JInitializer;
import org.eclipse.emf.java.JMember;
import org.eclipse.emf.java.JMethod;
import org.eclipse.emf.java.JPackage;
import org.eclipse.emf.java.JavaFactory;
import org.eclipse.emf.java.JavaPackage;
import org.eclipse.emf.java.util.JavaUtil;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>JClass</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#isAbstract <em>Abstract</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#isFinal <em>Final</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#isInterface <em>Interface</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#isThrowable <em>Throwable</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getJavaClass <em>Java Class</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getFields <em>Fields</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getMethods <em>Methods</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getSuperTypes <em>Super Types</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getAllSuperTypes <em>All Super Types</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getMembers <em>Members</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getComponentType <em>Component Type</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getArrayType <em>Array Type</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getUnit <em>Unit</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getAllMethods <em>All Methods</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getAllFields <em>All Fields</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getPackage <em>Package</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getTypes <em>Types</em>}</li>
* <li>{@link org.eclipse.emf.java.impl.JClassImpl#getAllTypes <em>All Types</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class JClassImpl extends JMemberImpl implements JClass
{
/**
* The default value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isAbstract()
* @generated
* @ordered
*/
protected static final boolean ABSTRACT_EDEFAULT = false;
/**
* The cached value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isAbstract()
* @generated
* @ordered
*/
protected boolean abstract_ = ABSTRACT_EDEFAULT;
/**
* The default value of the '{@link #isFinal() <em>Final</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isFinal()
* @generated
* @ordered
*/
protected static final boolean FINAL_EDEFAULT = false;
/**
* The cached value of the '{@link #isFinal() <em>Final</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isFinal()
* @generated
* @ordered
*/
protected boolean final_ = FINAL_EDEFAULT;
/**
* The default value of the '{@link #isInterface() <em>Interface</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isInterface()
* @generated
* @ordered
*/
protected static final boolean INTERFACE_EDEFAULT = false;
/**
* The cached value of the '{@link #isInterface() <em>Interface</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isInterface()
* @generated
* @ordered
*/
protected boolean interface_ = INTERFACE_EDEFAULT;
/**
* The default value of the '{@link #isThrowable() <em>Throwable</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isThrowable()
* @generated
* @ordered
*/
protected static final boolean THROWABLE_EDEFAULT = false;
/**
* The cached value of the '{@link #isThrowable() <em>Throwable</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isThrowable()
* @generated
* @ordered
*/
protected boolean throwable = THROWABLE_EDEFAULT;
/**
* The cached value of the '{@link #getJavaClass() <em>Java Class</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getJavaClass()
* @generated
* @ordered
*/
protected Class<?> javaClass;
/**
* The cached value of the '{@link #getSuperTypes() <em>Super Types</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSuperTypes()
* @generated
* @ordered
*/
protected EList<JClass> superTypes;
/**
* The cached value of the '{@link #getMembers() <em>Members</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getMembers()
* @generated
* @ordered
*/
protected EList<JMember> members;
/**
* The cached value of the '{@link #getArrayType() <em>Array Type</em>}' containment reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getArrayType()
* @generated
* @ordered
*/
protected JClass arrayType;
/**
* The cached value of the '{@link #getPackage() <em>Package</em>}' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getPackage()
* @generated
* @ordered
*/
protected JPackage package_;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected JClassImpl()
{
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass()
{
return JavaPackage.Literals.JCLASS;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isAbstract()
{
return abstract_;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setAbstract(boolean newAbstract)
{
boolean oldAbstract = abstract_;
abstract_ = newAbstract;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__ABSTRACT, oldAbstract, abstract_));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isFinal()
{
return final_;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setFinal(boolean newFinal)
{
boolean oldFinal = final_;
final_ = newFinal;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__FINAL, oldFinal, final_));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isInterface()
{
return interface_;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setInterface(boolean newInterface)
{
boolean oldInterface = interface_;
interface_ = newInterface;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__INTERFACE, oldInterface, interface_));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isThrowable()
{
return throwable;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setThrowable(boolean newThrowable)
{
boolean oldThrowable = throwable;
throwable = newThrowable;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__THROWABLE, oldThrowable, throwable));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Class<?> getJavaClass()
{
return javaClass;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setJavaClass(Class<?> newJavaClass)
{
Class<?> oldJavaClass = javaClass;
javaClass = newJavaClass;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__JAVA_CLASS, oldJavaClass, javaClass));
}
EList<JField> fields;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated EATM
*/
public EList<JField> getFields()
{
if (fields == null)
{
fields = new EObjectResolvingEList<JField>(JField.class, this, JavaPackage.JCLASS__FIELDS);
@SuppressWarnings("unchecked")
List<JField> list = (List<JField>)(List<?>)EcoreUtil.getObjectsByType(getMembers(), JavaPackage.eINSTANCE.getJField());
fields.addAll(list);
}
return fields;
}
EList<JMethod> methods;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated EATM
*/
public EList<JMethod> getMethods()
{
if (methods == null)
{
methods = new EObjectResolvingEList<JMethod>(JMethod.class, this, JavaPackage.JCLASS__METHODS);
@SuppressWarnings("unchecked")
List<JMethod> list = (List<JMethod>)(List<?>)EcoreUtil.getObjectsByType(getMembers(), JavaPackage.eINSTANCE.getJMethod());
methods.addAll(list);
}
return methods;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<JClass> getSuperTypes()
{
if (superTypes == null)
{
superTypes = new EObjectResolvingEList<JClass>(JClass.class, this, JavaPackage.JCLASS__SUPER_TYPES);
}
return superTypes;
}
EList<JClass> allSuperTypes;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated EATM
*/
public EList<JClass> getAllSuperTypes()
{
if (allSuperTypes == null)
{
allSuperTypes = new EObjectResolvingEList<JClass>(JClass.class, this, JavaPackage.JCLASS__ALL_SUPER_TYPES);
collectAll(JavaPackage.eINSTANCE.getJClass_AllSuperTypes(), allSuperTypes);
allSuperTypes.addAll(getSuperTypes());
}
return allSuperTypes;
}
protected <T> void collectAll(EStructuralFeature eStructuralFeature, EList<T> target)
{
for (JClass jClass : getSuperTypes())
{
@SuppressWarnings("unchecked")
EList<T> list = (EList<T>)jClass.eGet(eStructuralFeature);
target.addAll(list);
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<JMember> getMembers()
{
if (members == null)
{
members = new EObjectContainmentWithInverseEList<JMember>(JMember.class, this, JavaPackage.JCLASS__MEMBERS, JavaPackage.JMEMBER__CONTAINING_TYPE);
}
return members;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public JClass getComponentType()
{
if (eContainerFeatureID() != JavaPackage.JCLASS__COMPONENT_TYPE) return null;
return (JClass)eContainer();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetComponentType(JClass newComponentType, NotificationChain msgs)
{
msgs = eBasicSetContainer((InternalEObject)newComponentType, JavaPackage.JCLASS__COMPONENT_TYPE, msgs);
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setComponentType(JClass newComponentType)
{
if (newComponentType != eInternalContainer() || (eContainerFeatureID() != JavaPackage.JCLASS__COMPONENT_TYPE && newComponentType != null))
{
if (EcoreUtil.isAncestor(this, newComponentType))
throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
NotificationChain msgs = null;
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
if (newComponentType != null)
msgs = ((InternalEObject)newComponentType).eInverseAdd(this, JavaPackage.JCLASS__ARRAY_TYPE, JClass.class, msgs);
msgs = basicSetComponentType(newComponentType, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__COMPONENT_TYPE, newComponentType, newComponentType));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public JClass getArrayType()
{
return arrayType;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetArrayType(JClass newArrayType, NotificationChain msgs)
{
JClass oldArrayType = arrayType;
arrayType = newArrayType;
if (eNotificationRequired())
{
ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__ARRAY_TYPE, oldArrayType, newArrayType);
if (msgs == null) msgs = notification; else msgs.add(notification);
}
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setArrayType(JClass newArrayType)
{
if (newArrayType != arrayType)
{
NotificationChain msgs = null;
if (arrayType != null)
msgs = ((InternalEObject)arrayType).eInverseRemove(this, JavaPackage.JCLASS__COMPONENT_TYPE, JClass.class, msgs);
if (newArrayType != null)
msgs = ((InternalEObject)newArrayType).eInverseAdd(this, JavaPackage.JCLASS__COMPONENT_TYPE, JClass.class, msgs);
msgs = basicSetArrayType(newArrayType, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__ARRAY_TYPE, newArrayType, newArrayType));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public JCompilationUnit getUnit()
{
if (eContainerFeatureID() != JavaPackage.JCLASS__UNIT) return null;
return (JCompilationUnit)eContainer();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetUnit(JCompilationUnit newUnit, NotificationChain msgs)
{
msgs = eBasicSetContainer((InternalEObject)newUnit, JavaPackage.JCLASS__UNIT, msgs);
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setUnit(JCompilationUnit newUnit)
{
if (newUnit != eInternalContainer() || (eContainerFeatureID() != JavaPackage.JCLASS__UNIT && newUnit != null))
{
if (EcoreUtil.isAncestor(this, newUnit))
throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
NotificationChain msgs = null;
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
if (newUnit != null)
msgs = ((InternalEObject)newUnit).eInverseAdd(this, JavaPackage.JCOMPILATION_UNIT__TYPES, JCompilationUnit.class, msgs);
msgs = basicSetUnit(newUnit, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__UNIT, newUnit, newUnit));
}
EList<JMethod> allMethods;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated EATM
*/
public EList<JMethod> getAllMethods()
{
if (allMethods == null)
{
allMethods = new EObjectResolvingEList<JMethod>(JMethod.class, this, JavaPackage.JCLASS__ALL_METHODS);
collectAll(JavaPackage.eINSTANCE.getJClass_AllMethods(), allMethods);
allMethods.addAll(getMethods());
}
return allMethods;
}
EList<JField> allFields;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated EATM
*/
public EList<JField> getAllFields()
{
if (allFields == null)
{
allFields = new EObjectResolvingEList<JField>(JField.class, this, JavaPackage.JCLASS__ALL_FIELDS);
collectAll(JavaPackage.eINSTANCE.getJClass_AllFields(), allFields);
allFields.addAll(getFields());
}
return allFields;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public JPackage getPackage()
{
if (package_ != null && package_.eIsProxy())
{
InternalEObject oldPackage = (InternalEObject)package_;
package_ = (JPackage)eResolveProxy(oldPackage);
if (package_ != oldPackage)
{
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, JavaPackage.JCLASS__PACKAGE, oldPackage, package_));
}
}
return package_;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public JPackage basicGetPackage()
{
return package_;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetPackage(JPackage newPackage, NotificationChain msgs)
{
JPackage oldPackage = package_;
package_ = newPackage;
if (eNotificationRequired())
{
ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__PACKAGE, oldPackage, newPackage);
if (msgs == null) msgs = notification; else msgs.add(notification);
}
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setPackage(JPackage newPackage)
{
if (newPackage != package_)
{
NotificationChain msgs = null;
if (package_ != null)
msgs = ((InternalEObject)package_).eInverseRemove(this, JavaPackage.JPACKAGE__TYPES, JPackage.class, msgs);
if (newPackage != null)
msgs = ((InternalEObject)newPackage).eInverseAdd(this, JavaPackage.JPACKAGE__TYPES, JPackage.class, msgs);
msgs = basicSetPackage(newPackage, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JavaPackage.JCLASS__PACKAGE, newPackage, newPackage));
}
protected EList<JClass> types;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated EATM
*/
public EList<JClass> getTypes()
{
if (types == null)
{
types = new EObjectResolvingEList<JClass>(JClass.class, this, JavaPackage.JCLASS__TYPES);
@SuppressWarnings("unchecked")
List<JClass> list = (List<JClass>)(List<?>)EcoreUtil.getObjectsByType(getMembers(), JavaPackage.eINSTANCE.getJClass());
types.addAll(list);
}
return types;
}
protected EList<JClass> allTypes;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated EATM
*/
public EList<JClass> getAllTypes()
{
if (allTypes == null)
{
allTypes = new EObjectResolvingEList<JClass>(JClass.class, this, JavaPackage.JCLASS__ALL_TYPES);
collectAll(JavaPackage.eINSTANCE.getJClass_AllTypes(), allTypes);
allTypes.addAll(getTypes());
}
return allTypes;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
{
switch (featureID)
{
case JavaPackage.JCLASS__MEMBERS:
return ((InternalEList<InternalEObject>)(InternalEList<?>)getMembers()).basicAdd(otherEnd, msgs);
case JavaPackage.JCLASS__COMPONENT_TYPE:
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
return basicSetComponentType((JClass)otherEnd, msgs);
case JavaPackage.JCLASS__ARRAY_TYPE:
if (arrayType != null)
msgs = ((InternalEObject)arrayType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - JavaPackage.JCLASS__ARRAY_TYPE, null, msgs);
return basicSetArrayType((JClass)otherEnd, msgs);
case JavaPackage.JCLASS__UNIT:
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
return basicSetUnit((JCompilationUnit)otherEnd, msgs);
case JavaPackage.JCLASS__PACKAGE:
if (package_ != null)
msgs = ((InternalEObject)package_).eInverseRemove(this, JavaPackage.JPACKAGE__TYPES, JPackage.class, msgs);
return basicSetPackage((JPackage)otherEnd, msgs);
}
return super.eInverseAdd(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
{
switch (featureID)
{
case JavaPackage.JCLASS__MEMBERS:
return ((InternalEList<?>)getMembers()).basicRemove(otherEnd, msgs);
case JavaPackage.JCLASS__COMPONENT_TYPE:
return basicSetComponentType(null, msgs);
case JavaPackage.JCLASS__ARRAY_TYPE:
return basicSetArrayType(null, msgs);
case JavaPackage.JCLASS__UNIT:
return basicSetUnit(null, msgs);
case JavaPackage.JCLASS__PACKAGE:
return basicSetPackage(null, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
{
switch (eContainerFeatureID())
{
case JavaPackage.JCLASS__COMPONENT_TYPE:
return eInternalContainer().eInverseRemove(this, JavaPackage.JCLASS__ARRAY_TYPE, JClass.class, msgs);
case JavaPackage.JCLASS__UNIT:
return eInternalContainer().eInverseRemove(this, JavaPackage.JCOMPILATION_UNIT__TYPES, JCompilationUnit.class, msgs);
}
return super.eBasicRemoveFromContainerFeature(msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType)
{
switch (featureID)
{
case JavaPackage.JCLASS__ABSTRACT:
return isAbstract();
case JavaPackage.JCLASS__FINAL:
return isFinal();
case JavaPackage.JCLASS__INTERFACE:
return isInterface();
case JavaPackage.JCLASS__THROWABLE:
return isThrowable();
case JavaPackage.JCLASS__JAVA_CLASS:
return getJavaClass();
case JavaPackage.JCLASS__FIELDS:
return getFields();
case JavaPackage.JCLASS__METHODS:
return getMethods();
case JavaPackage.JCLASS__SUPER_TYPES:
return getSuperTypes();
case JavaPackage.JCLASS__ALL_SUPER_TYPES:
return getAllSuperTypes();
case JavaPackage.JCLASS__MEMBERS:
return getMembers();
case JavaPackage.JCLASS__COMPONENT_TYPE:
return getComponentType();
case JavaPackage.JCLASS__ARRAY_TYPE:
return getArrayType();
case JavaPackage.JCLASS__UNIT:
return getUnit();
case JavaPackage.JCLASS__ALL_METHODS:
return getAllMethods();
case JavaPackage.JCLASS__ALL_FIELDS:
return getAllFields();
case JavaPackage.JCLASS__PACKAGE:
if (resolve) return getPackage();
return basicGetPackage();
case JavaPackage.JCLASS__TYPES:
return getTypes();
case JavaPackage.JCLASS__ALL_TYPES:
return getAllTypes();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue)
{
switch (featureID)
{
case JavaPackage.JCLASS__ABSTRACT:
setAbstract((Boolean)newValue);
return;
case JavaPackage.JCLASS__FINAL:
setFinal((Boolean)newValue);
return;
case JavaPackage.JCLASS__INTERFACE:
setInterface((Boolean)newValue);
return;
case JavaPackage.JCLASS__THROWABLE:
setThrowable((Boolean)newValue);
return;
case JavaPackage.JCLASS__JAVA_CLASS:
setJavaClass((Class<?>)newValue);
return;
case JavaPackage.JCLASS__FIELDS:
getFields().clear();
getFields().addAll((Collection<? extends JField>)newValue);
return;
case JavaPackage.JCLASS__METHODS:
getMethods().clear();
getMethods().addAll((Collection<? extends JMethod>)newValue);
return;
case JavaPackage.JCLASS__SUPER_TYPES:
getSuperTypes().clear();
getSuperTypes().addAll((Collection<? extends JClass>)newValue);
return;
case JavaPackage.JCLASS__ALL_SUPER_TYPES:
getAllSuperTypes().clear();
getAllSuperTypes().addAll((Collection<? extends JClass>)newValue);
return;
case JavaPackage.JCLASS__MEMBERS:
getMembers().clear();
getMembers().addAll((Collection<? extends JMember>)newValue);
return;
case JavaPackage.JCLASS__COMPONENT_TYPE:
setComponentType((JClass)newValue);
return;
case JavaPackage.JCLASS__ARRAY_TYPE:
setArrayType((JClass)newValue);
return;
case JavaPackage.JCLASS__UNIT:
setUnit((JCompilationUnit)newValue);
return;
case JavaPackage.JCLASS__ALL_METHODS:
getAllMethods().clear();
getAllMethods().addAll((Collection<? extends JMethod>)newValue);
return;
case JavaPackage.JCLASS__ALL_FIELDS:
getAllFields().clear();
getAllFields().addAll((Collection<? extends JField>)newValue);
return;
case JavaPackage.JCLASS__PACKAGE:
setPackage((JPackage)newValue);
return;
case JavaPackage.JCLASS__TYPES:
getTypes().clear();
getTypes().addAll((Collection<? extends JClass>)newValue);
return;
case JavaPackage.JCLASS__ALL_TYPES:
getAllTypes().clear();
getAllTypes().addAll((Collection<? extends JClass>)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID)
{
switch (featureID)
{
case JavaPackage.JCLASS__ABSTRACT:
setAbstract(ABSTRACT_EDEFAULT);
return;
case JavaPackage.JCLASS__FINAL:
setFinal(FINAL_EDEFAULT);
return;
case JavaPackage.JCLASS__INTERFACE:
setInterface(INTERFACE_EDEFAULT);
return;
case JavaPackage.JCLASS__THROWABLE:
setThrowable(THROWABLE_EDEFAULT);
return;
case JavaPackage.JCLASS__JAVA_CLASS:
setJavaClass((Class<?>)null);
return;
case JavaPackage.JCLASS__FIELDS:
getFields().clear();
return;
case JavaPackage.JCLASS__METHODS:
getMethods().clear();
return;
case JavaPackage.JCLASS__SUPER_TYPES:
getSuperTypes().clear();
return;
case JavaPackage.JCLASS__ALL_SUPER_TYPES:
getAllSuperTypes().clear();
return;
case JavaPackage.JCLASS__MEMBERS:
getMembers().clear();
return;
case JavaPackage.JCLASS__COMPONENT_TYPE:
setComponentType((JClass)null);
return;
case JavaPackage.JCLASS__ARRAY_TYPE:
setArrayType((JClass)null);
return;
case JavaPackage.JCLASS__UNIT:
setUnit((JCompilationUnit)null);
return;
case JavaPackage.JCLASS__ALL_METHODS:
getAllMethods().clear();
return;
case JavaPackage.JCLASS__ALL_FIELDS:
getAllFields().clear();
return;
case JavaPackage.JCLASS__PACKAGE:
setPackage((JPackage)null);
return;
case JavaPackage.JCLASS__TYPES:
getTypes().clear();
return;
case JavaPackage.JCLASS__ALL_TYPES:
getAllTypes().clear();
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID)
{
switch (featureID)
{
case JavaPackage.JCLASS__ABSTRACT:
return abstract_ != ABSTRACT_EDEFAULT;
case JavaPackage.JCLASS__FINAL:
return final_ != FINAL_EDEFAULT;
case JavaPackage.JCLASS__INTERFACE:
return interface_ != INTERFACE_EDEFAULT;
case JavaPackage.JCLASS__THROWABLE:
return throwable != THROWABLE_EDEFAULT;
case JavaPackage.JCLASS__JAVA_CLASS:
return javaClass != null;
case JavaPackage.JCLASS__FIELDS:
return !getFields().isEmpty();
case JavaPackage.JCLASS__METHODS:
return !getMethods().isEmpty();
case JavaPackage.JCLASS__SUPER_TYPES:
return superTypes != null && !superTypes.isEmpty();
case JavaPackage.JCLASS__ALL_SUPER_TYPES:
return !getAllSuperTypes().isEmpty();
case JavaPackage.JCLASS__MEMBERS:
return members != null && !members.isEmpty();
case JavaPackage.JCLASS__COMPONENT_TYPE:
return getComponentType() != null;
case JavaPackage.JCLASS__ARRAY_TYPE:
return arrayType != null;
case JavaPackage.JCLASS__UNIT:
return getUnit() != null;
case JavaPackage.JCLASS__ALL_METHODS:
return !getAllMethods().isEmpty();
case JavaPackage.JCLASS__ALL_FIELDS:
return !getAllFields().isEmpty();
case JavaPackage.JCLASS__PACKAGE:
return package_ != null;
case JavaPackage.JCLASS__TYPES:
return types != null && !types.isEmpty();
case JavaPackage.JCLASS__ALL_TYPES:
return allTypes != null && !allTypes.isEmpty();
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String toString()
{
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (abstract: ");
result.append(abstract_);
result.append(", final: ");
result.append(final_);
result.append(", interface: ");
result.append(interface_);
result.append(", throwable: ");
result.append(throwable);
result.append(", javaClass: ");
result.append(javaClass);
result.append(')');
return result.toString();
}
@Override
protected void changeAttribute(Notification notification)
{
switch (notification.getFeatureID(JClass.class))
{
case JavaPackage.JCLASS__JNODE:
{
JHelper.handleJNode(this);
break;
}
case JavaPackage.JCLASS__JAVA_CLASS:
{
Class<?> theJavaClass = getJavaClass();
if (theJavaClass != null)
{
String uri = JavaUtil.createJClassProxyURI(theJavaClass).fragment();
setName(uri.substring(uri.lastIndexOf("/") + 1));
Collection<JMember> theMembers = new ArrayList<JMember>();
try
{
Field [] memberFields = theJavaClass.getDeclaredFields();
for (int i = 0; i < memberFields.length; ++i)
{
JField memberJField = JavaFactory.eINSTANCE.createJField();
theMembers.add(memberJField);
memberJField.setJavaField(memberFields[i]);
}
Method [] memberMethods = theJavaClass.getDeclaredMethods();
for (int i = 0; i < memberMethods.length; ++i)
{
JMethod memberJMethod = JavaFactory.eINSTANCE.createJMethod();
theMembers.add(memberJMethod);
memberJMethod.setJavaMethod(memberMethods[i]);
}
Constructor<?> [] constructors = theJavaClass.getConstructors();
for (int i = 0; i < constructors.length; ++i)
{
JMethod memberJMethod = JavaFactory.eINSTANCE.createJMethod();
theMembers.add(memberJMethod);
memberJMethod.setJavaConstructor(constructors[i]);
}
Class<?> [] memberTypes = theJavaClass.getDeclaredClasses();
for (int i = 0; i < memberTypes.length; ++i)
{
JClass memberJClass = JavaFactory.eINSTANCE.createJClass();
theMembers.add(memberJClass);
memberJClass.setJavaClass(memberTypes[i]);
}
getMembers().addAll(theMembers);
Collection<JClass> theSuperTypes = new ArrayList<JClass>();
if (theJavaClass.getSuperclass() != null)
{
theSuperTypes.add(JavaUtil.createJClassProxy(theJavaClass.getSuperclass()));
}
Class<?> [] interfaces = theJavaClass.getInterfaces();
for (int i = 0; i < interfaces.length; ++i)
{
theSuperTypes.add(JavaUtil.createJClassProxy(interfaces[i]));
}
getSuperTypes().addAll(theSuperTypes);
}
catch (NoClassDefFoundError exception)
{
// Ignore
}
if (theJavaClass.getComponentType() != null)
{
setComponentType(JavaUtil.createJClassProxy(theJavaClass.getComponentType()));
}
int modifiers = theJavaClass.getModifiers();
setInterface(Modifier.isInterface(modifiers));
setFinal(Modifier.isInterface(modifiers));
setAbstract(Modifier.isAbstract(modifiers));
setStatic(Modifier.isStatic(modifiers));
setVisibility(JavaUtil.getModifierVisibility(modifiers));
}
break;
}
}
}
protected static class JHelper
{
protected static void handleJNode(JClass cls)
{
org.eclipse.emf.codegen.merge.java.facade.JType jType = (org.eclipse.emf.codegen.merge.java.facade.JType)cls.getJNode();
if (jType != null)
{
cls.setName(JavaUtil.separateTypeArgument(jType.getName())[0]);
cls.setComment(jType.getComment());
int flags = jType.getFlags();
cls.setInterface((flags & Flags.AccInterface) != 0);
cls.setFinal((flags & Flags.AccFinal) != 0);
cls.setAbstract((flags & Flags.AccAbstract) != 0);
cls.setStatic((flags & Flags.AccStatic) != 0);
cls.setVisibility(JavaUtil.getFlagVisibility(flags));
final Collection<JMember> theMembers = cls.getMembers();
FacadeVisitor facadeVisitor = new FacadeVisitor()
{
@Override
protected boolean visit(org.eclipse.emf.codegen.merge.java.facade.JField jField)
{
JField field = JavaFactory.eINSTANCE.createJField();
field.setJNode(jField);
theMembers.add(field);
return false;
}
@Override
protected boolean visit(org.eclipse.emf.codegen.merge.java.facade.JMethod jMethod)
{
JMethod method = JavaFactory.eINSTANCE.createJMethod();
method.setJNode(jMethod);
theMembers.add(method);
return false;
}
@Override
protected boolean visit(org.eclipse.emf.codegen.merge.java.facade.JInitializer jInitializer)
{
JInitializer initializer = JavaFactory.eINSTANCE.createJInitializer();
initializer.setJNode(jInitializer);
theMembers.add(initializer);
return false;
}
@Override
protected boolean visit(JAbstractType jAbstractType)
{
if (jAbstractType == getRootNode())
{
return true;
}
else
{
if (jAbstractType instanceof org.eclipse.emf.codegen.merge.java.facade.JType)
{
JClass nestedClass = JavaFactory.eINSTANCE.createJClass();
nestedClass.setJNode(jAbstractType);
theMembers.add(nestedClass);
}
return false;
}
}
};
facadeVisitor.start(jType);
}
}
}
@Override
protected void resolveIdentifiers()
{
if (jNode != null)
{
List<JClass> theSuperTypes = new ArrayList<JClass>();
org.eclipse.emf.codegen.merge.java.facade.JType jType = (org.eclipse.emf.codegen.merge.java.facade.JType)jNode;
String superClass = jType.getSuperclass();
if (superClass != null)
{
superClass = JavaUtil.separateTypeArgument(jType.getSuperclass())[0];
JClass jClass =
getUnit() != null ?
getUnit().resolveJClass(superClass.trim()) :
getContainingType().resolveJClass(superClass.trim());
if (jClass != null)
{
theSuperTypes.add(jClass);
}
}
String superInterfaces[] = jType.getSuperInterfaces();
if (superInterfaces != null)
{
for (int i = 0; i < superInterfaces.length; ++i)
{
String superInterface = JavaUtil.separateTypeArgument(superInterfaces[i])[0];
JClass jClass =
getUnit() != null ?
getUnit().resolveJClass(superInterface) :
getContainingType().resolveJClass(superInterface);
if (jClass != null)
{
theSuperTypes.add(jClass);
}
}
}
ECollections.setEList(getSuperTypes(), theSuperTypes);
}
for (JMember jMember : getMembers())
{
JModelElementImpl jModelElement = (JModelElementImpl)jMember;
jModelElement.resolveIdentifiers();
}
}
public JClass resolveJClass(String fullName)
{
for (JClass jClass : getAllTypes())
{
if (JavaUtil.isPrefixOf(jClass.getName(), fullName))
{
if (fullName.length() > jClass.getName().length())
{
return jClass.resolveJClass(fullName.substring(jClass.getName().length() + 1));
}
else
{
return jClass;
}
}
}
if (getContainingType() != null)
{
return getContainingType().resolveJClass(fullName);
}
else if (getUnit() != null)
{
return getUnit().resolveJClass(fullName);
}
else
{
return null;
}
}
@Override
public EObject eObjectForURIFragmentSegment(String uriFragmentSegment)
{
if (uriFragmentSegment.startsWith("@"))
{
return super.eObjectForURIFragmentSegment(uriFragmentSegment);
}
else if (uriFragmentSegment.equals("[]"))
{
JClass result = getArrayType();
if (result == null)
{
result = JavaFactory.eINSTANCE.createJClass();
result.setName(getName() + "[]");
setArrayType(result);
}
return result;
}
else
{
for (JMember jMember : getMembers())
{
if (uriFragmentSegment.equals(jMember.getName()) && jMember instanceof JClass)
{
return jMember;
}
}
return null;
}
}
@Override
public String getQualifiedName()
{
if (getComponentType() != null)
{
return getComponentType().getQualifiedName() + "[]";
}
else if (getContainingType() != null)
{
return getContainingType().getQualifiedName() + "." + getName();
}
else if (getPackage() != null)
{
String containerQualifiedName = getPackage().getQualifiedName();
if (containerQualifiedName.length() > 0)
{
return containerQualifiedName + "." + getName();
}
}
return getName();
}
} //JClassImpl