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: SubsetSupersetEObjectWithInverseResolvingEList.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 SubsetSupersetEObjectWithInverseResolvingEList<E>
023                    extends SubsetSupersetEObjectWithInverseEList<E> {
024    
025            private static final long serialVersionUID = 1L;
026    
027            public static class Unsettable<E>
028                            extends SubsetSupersetEObjectWithInverseResolvingEList<E> {
029    
030                    private static final long serialVersionUID = 1L;
031    
032                    public static class ManyInverse<E>
033                                    extends Unsettable<E> {
034    
035                            private static final long serialVersionUID = 1L;
036    
037                            public ManyInverse(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 hasManyInverse() {
046                                    return true;
047                            }
048                    }
049    
050                    protected boolean isSet;
051    
052                    public Unsettable(Class<?> dataClass, InternalEObject owner,
053                                    int featureID, int[] supersetFeatureIDs,
054                                    int[] subsetFeatureIDs, int inverseFeatureID) {
055                            super(dataClass, owner, featureID, supersetFeatureIDs,
056                                    subsetFeatureIDs, inverseFeatureID);
057                    }
058    
059                    @Override
060                    protected void didChange() {
061                            isSet = true;
062                    }
063    
064                    @Override
065                    public boolean isSet() {
066                            return isSet;
067                    }
068    
069                    @Override
070                    public void unset() {
071                            super.unset();
072    
073                            if (isNotificationRequired()) {
074                                    boolean oldIsSet = isSet;
075                                    isSet = false;
076    
077                                    owner.eNotify(createNotification(Notification.UNSET, oldIsSet,
078                                            false));
079                            } else {
080                                    isSet = false;
081                            }
082                    }
083            }
084    
085            public static class ManyInverse<E>
086                            extends SubsetSupersetEObjectWithInverseResolvingEList<E> {
087    
088                    private static final long serialVersionUID = 1L;
089    
090                    public ManyInverse(Class<?> dataClass, InternalEObject owner,
091                                    int featureID, int[] supersetFeatureIDs,
092                                    int[] subsetFeatureIDs, int inverseFeatureID) {
093                            super(dataClass, owner, featureID, supersetFeatureIDs,
094                                    subsetFeatureIDs, inverseFeatureID);
095                    }
096    
097                    @Override
098                    protected boolean hasManyInverse() {
099                            return true;
100                    }
101            }
102    
103            public SubsetSupersetEObjectWithInverseResolvingEList(Class<?> dataClass,
104                            InternalEObject owner, int featureID, int[] supersetFeatureIDs,
105                            int[] subsetFeatureIDs, int inverseFeatureID) {
106                    super(dataClass, owner, featureID, supersetFeatureIDs,
107                            subsetFeatureIDs, inverseFeatureID);
108            }
109    
110            @Override
111            protected boolean hasProxies() {
112                    return true;
113            }
114    
115            @SuppressWarnings("unchecked")
116            @Override
117            protected E resolve(int index, E object) {
118                    return (E) resolve(index, (EObject) object);
119            }
120    
121    }