001    /*--------------------------------------------------------------------------+
002    $Id: StateflowDeclContainerBase.java 26285 2010-02-18 11:22:54Z juergens $
003    |                                                                          |
004    | Copyright 2005-2010 Technische Universitaet Muenchen                     |
005    |                                                                          |
006    | Licensed under the Apache License, Version 2.0 (the "License");          |
007    | you may not use this file except in compliance with the License.         |
008    | You may obtain a copy of the License at                                  |
009    |                                                                          |
010    |    http://www.apache.org/licenses/LICENSE-2.0                            |
011    |                                                                          |
012    | Unless required by applicable law or agreed to in writing, software      |
013    | distributed under the License is distributed on an "AS IS" BASIS,        |
014    | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
015    | See the License for the specific language governing permissions and      |
016    | limitations under the License.                                           |
017    +--------------------------------------------------------------------------*/
018    package edu.tum.cs.simulink.model.stateflow;
019    
020    import edu.tum.cs.commons.assertion.CCSMPre;
021    import edu.tum.cs.commons.collections.CollectionUtils;
022    import edu.tum.cs.commons.collections.IdentityHashSet;
023    import edu.tum.cs.commons.collections.UnmodifiableSet;
024    
025    /**
026     * Base class for classes that contain Stateflow declarations.
027     * 
028     * @param
029     * <P>
030     * Type of the parent of this node.
031     * 
032     * @author deissenb
033     * @author $Author: juergens $
034     * @version $Rev: 26285 $
035     * @levd.rating GREEN Hash: 3EE8464273E894EAEFF063776FC39642
036     */
037    public abstract class StateflowDeclContainerBase<P extends IStateflowElement<?>>
038                    extends StateflowElementBase<P> {
039    
040            /** Set of Stateflow dates. */
041            private final IdentityHashSet<StateflowData> dates = new IdentityHashSet<StateflowData>();
042    
043            /** Set of Stateflow events. */
044            private final IdentityHashSet<StateflowEvent> events = new IdentityHashSet<StateflowEvent>();
045    
046            /** Create new declaration container. */
047            /* package */StateflowDeclContainerBase() {
048                    super();
049            }
050    
051            /** Copy constructor for deep cloning. */
052            /* package */StateflowDeclContainerBase(
053                            StateflowDeclContainerBase<? extends P> orig) {
054                    super(orig);
055    
056                    for (StateflowData data : orig.dates) {
057                            addData(data.deepClone());
058                    }
059    
060                    for (StateflowEvent event : orig.events) {
061                            addEvent(event.deepClone());
062                    }
063            }
064    
065            /** Add Stateflow data. */
066            public void addData(StateflowData data) {
067                    dates.add(data);
068                    data.setParent(this);
069            }
070    
071            /** Add Stateflow event. */
072            public void addEvent(StateflowEvent event) {
073                    events.add(event);
074                    event.setParent(this);
075            }
076    
077            /** Get Stateflow data objects. */
078            public UnmodifiableSet<StateflowData> getData() {
079                    return CollectionUtils.asUnmodifiable(dates);
080            }
081    
082            /** Get Stateflow events objects. */
083            public UnmodifiableSet<StateflowEvent> getEvents() {
084                    return CollectionUtils.asUnmodifiable(events);
085            }
086    
087            /** Remove Stateflow data object. */
088            /* package */void removeData(StateflowData data) {
089                    CCSMPre.isTrue(data.getParent() == this,
090                                    "Data object must belong to container to be removed.");
091                    dates.remove(data);
092                    data.setParent(null);
093            }
094    
095            /** Remove Stateflow event object. */
096            /* package */void removeEvent(StateflowEvent event) {
097                    CCSMPre.isTrue(event.getParent() == this,
098                                    "Event must belong to container to be removed.");
099                    events.remove(event);
100                    event.setParent(null);
101            }
102    }