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: SubsetSupersetEObjectWithInverseEList.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.InternalEObject;
017    
018    /**
019     * @since 1.2
020     */
021    public class SubsetSupersetEObjectWithInverseEList<E>
022                    extends SubsetSupersetEObjectEList<E> {
023    
024            private static final long serialVersionUID = 1L;
025    
026            public static class Unsettable<E>
027                            extends SubsetSupersetEObjectWithInverseEList<E> {
028    
029                    private static final long serialVersionUID = 1L;
030    
031                    public static class ManyInverse<E>
032                                    extends Unsettable<E> {
033    
034                            private static final long serialVersionUID = 1L;
035    
036                            public ManyInverse(Class<?> dataClass, InternalEObject owner,
037                                            int featureID, int[] supersetFeatureIDs,
038                                            int[] subsetFeatureIDs, int inverseFeatureID) {
039                                    super(dataClass, owner, featureID, supersetFeatureIDs,
040                                            subsetFeatureIDs, inverseFeatureID);
041                            }
042    
043                            @Override
044                            protected boolean hasManyInverse() {
045                                    return true;
046                            }
047                    }
048    
049                    protected boolean isSet;
050    
051                    public Unsettable(Class<?> dataClass, InternalEObject owner,
052                                    int featureID, int[] supersetFeatureIDs,
053                                    int[] subsetFeatureIDs, int inverseFeatureID) {
054                            super(dataClass, owner, featureID, supersetFeatureIDs,
055                                    subsetFeatureIDs, inverseFeatureID);
056                    }
057    
058                    @Override
059                    protected void didChange() {
060                            isSet = true;
061                    }
062    
063                    @Override
064                    public boolean isSet() {
065                            return isSet;
066                    }
067    
068                    @Override
069                    public void unset() {
070                            super.unset();
071    
072                            if (isNotificationRequired()) {
073                                    boolean oldIsSet = isSet;
074                                    isSet = false;
075    
076                                    owner.eNotify(createNotification(Notification.UNSET, oldIsSet,
077                                            false));
078                            } else {
079                                    isSet = false;
080                            }
081                    }
082            }
083    
084            public static class ManyInverse<E>
085                            extends SubsetSupersetEObjectWithInverseEList<E> {
086    
087                    private static final long serialVersionUID = 1L;
088    
089                    public ManyInverse(Class<?> dataClass, InternalEObject owner,
090                                    int featureID, int[] supersetFeatureIDs,
091                                    int[] subsetFeatureIDs, int inverseFeatureID) {
092                            super(dataClass, owner, featureID, supersetFeatureIDs,
093                                    subsetFeatureIDs, inverseFeatureID);
094                    }
095    
096                    @Override
097                    protected boolean hasManyInverse() {
098                            return true;
099                    }
100            }
101    
102            protected final int inverseFeatureID;
103    
104            public SubsetSupersetEObjectWithInverseEList(Class<?> dataClass,
105                            InternalEObject owner, int featureID, int[] supersetFeatureIDs,
106                            int[] subsetFeatureIDs, int inverseFeatureID) {
107                    super(dataClass, owner, featureID, supersetFeatureIDs, subsetFeatureIDs);
108    
109                    this.inverseFeatureID = inverseFeatureID;
110            }
111    
112            @Override
113            protected boolean hasInverse() {
114                    return true;
115            }
116    
117            @Override
118            protected boolean hasNavigableInverse() {
119                    return true;
120            }
121    
122            @Override
123            public int getInverseFeatureID() {
124                    return inverseFeatureID;
125            }
126    
127            @Override
128            public Class<?> getInverseFeatureClass() {
129                    return dataClass;
130            }
131    
132    }