001    /*
002     * Copyright (c) 2006 IBM Corporation and others.
003     * All rights reserved.   This program and the accompanying materials
004     * are made available under the terms of the Eclipse Public License v1.0
005     * which accompanies this distribution, and is available at
006     * http://www.eclipse.org/legal/epl-v10.html
007     *
008     * Contributors:
009     *   IBM - initial API and implementation
010     *
011     * $Id: SubsetSupersetEObjectContainmentWithInverseEList.java,v 1.3 2006/12/14 15:47:33 khussey Exp $
012     */
013    package org.eclipse.uml2.common.util;
014    
015    import org.eclipse.emf.common.notify.Notification;
016    import org.eclipse.emf.ecore.EObject;
017    import org.eclipse.emf.ecore.InternalEObject;
018    
019    /**
020     * @since 1.2
021     */
022    public class SubsetSupersetEObjectContainmentWithInverseEList<E>
023                    extends SubsetSupersetEObjectContainmentEList<E> {
024    
025            private static final long serialVersionUID = 1L;
026    
027            public static class Unsettable<E>
028                            extends SubsetSupersetEObjectContainmentWithInverseEList<E> {
029    
030                    private static final long serialVersionUID = 1L;
031    
032                    public static class Resolving<E>
033                                    extends Unsettable<E> {
034    
035                            private static final long serialVersionUID = 1L;
036    
037                            public Resolving(Class<?> dataClass, InternalEObject owner,
038                                            int featureID, int[] supersetFeatureIDs,
039                                            int[] subsetFeatureIDs, int inverseFeatureID) {
040                                    super(dataClass, owner, featureID, supersetFeatureIDs,
041                                            subsetFeatureIDs, inverseFeatureID);
042                            }
043    
044                            @Override
045                            protected boolean hasProxies() {
046                                    return true;
047                            }
048    
049                            @SuppressWarnings("unchecked")
050                            @Override
051                            protected E resolve(int index, E object) {
052                                    return (E) resolve(index, (EObject) object);
053                            }
054                    }
055    
056                    protected boolean isSet;
057    
058                    public Unsettable(Class<?> dataClass, InternalEObject owner,
059                                    int featureID, int[] supersetFeatureIDs,
060                                    int[] subsetFeatureIDs, int inverseFeatureID) {
061                            super(dataClass, owner, featureID, supersetFeatureIDs,
062                                    subsetFeatureIDs, inverseFeatureID);
063                    }
064    
065                    @Override
066                    protected void didChange() {
067                            isSet = true;
068                    }
069    
070                    @Override
071                    public boolean isSet() {
072                            return isSet;
073                    }
074    
075                    @Override
076                    public void unset() {
077                            super.unset();
078    
079                            if (isNotificationRequired()) {
080                                    boolean oldIsSet = isSet;
081                                    isSet = false;
082    
083                                    owner.eNotify(createNotification(Notification.UNSET, oldIsSet,
084                                            false));
085                            } else {
086                                    isSet = false;
087                            }
088                    }
089            }
090    
091            public static class Resolving<E>
092                            extends SubsetSupersetEObjectContainmentWithInverseEList<E> {
093    
094                    private static final long serialVersionUID = 1L;
095    
096                    public Resolving(Class<?> dataClass, InternalEObject owner,
097                                    int featureID, int[] supersetFeatureIDs,
098                                    int[] subsetFeatureIDs, int inverseFeatureID) {
099                            super(dataClass, owner, featureID, supersetFeatureIDs,
100                                    subsetFeatureIDs, inverseFeatureID);
101                    }
102    
103                    @Override
104                    protected boolean hasProxies() {
105                            return true;
106                    }
107    
108                    @SuppressWarnings("unchecked")
109                    @Override
110                    protected E resolve(int index, E object) {
111                            return (E) resolve(index, (EObject) object);
112                    }
113            }
114    
115            protected final int inverseFeatureID;
116    
117            public SubsetSupersetEObjectContainmentWithInverseEList(Class<?> dataClass,
118                            InternalEObject owner, int featureID, int[] supersetFeatureIDs,
119                            int[] subsetFeatureIDs, int inverseFeatureID) {
120                    super(dataClass, owner, featureID, supersetFeatureIDs, subsetFeatureIDs);
121    
122                    this.inverseFeatureID = inverseFeatureID;
123            }
124    
125            @Override
126            protected boolean hasNavigableInverse() {
127                    return true;
128            }
129    
130            @Override
131            public int getInverseFeatureID() {
132                    return inverseFeatureID;
133            }
134    
135            @Override
136            public Class<?> getInverseFeatureClass() {
137                    return dataClass;
138            }
139    
140    }