001 /*--------------------------------------------------------------------------+ 002 $Id: StateflowNodeBase.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 java.util.ArrayList; 021 022 import edu.tum.cs.commons.assertion.CCSMAssert; 023 import edu.tum.cs.commons.assertion.CCSMPre; 024 import edu.tum.cs.commons.collections.CollectionUtils; 025 import edu.tum.cs.commons.collections.IdentityHashSet; 026 import edu.tum.cs.commons.collections.UnmodifiableSet; 027 028 /** 029 * Base class for Stateflow nodes (elements that can be connected by 030 * transitions). 031 * 032 * @author deissenb 033 * @author $Author: juergens $ 034 * @version $Rev: 26285 $ 035 * @levd.rating GREEN Hash: 8A2286A4B4879B5ABBDA3916C4D215E9 036 */ 037 public abstract class StateflowNodeBase extends 038 StateflowDeclContainerBase<IStateflowNodeContainer<?>> { 039 040 /** Incoming transitions. */ 041 private final IdentityHashSet<StateflowTransition> inTransitions = new IdentityHashSet<StateflowTransition>(); 042 043 /** Outgoing transitions. */ 044 private final IdentityHashSet<StateflowTransition> outTransitions = new IdentityHashSet<StateflowTransition>(); 045 046 /** Create new node. */ 047 protected StateflowNodeBase() { 048 super(); 049 } 050 051 /** Create new element from existing one (for deep cloning). */ 052 protected StateflowNodeBase(StateflowNodeBase element) { 053 super(element); 054 } 055 056 /** Add incoming transition. */ 057 /* package */void addInTransition(StateflowTransition transition) { 058 CCSMPre.isTrue(transition.getDst() == this, 059 "Transition destination element does not match"); 060 inTransitions.add(transition); 061 } 062 063 /** Add outgoing transition. */ 064 /* package */void addOutTransition(StateflowTransition transition) { 065 CCSMPre.isTrue(transition.getSrc() == this, 066 "Transition source element does not match"); 067 outTransitions.add(transition); 068 } 069 070 /** Get incoming transitions. */ 071 public UnmodifiableSet<StateflowTransition> getInTransitions() { 072 return CollectionUtils.asUnmodifiable(inTransitions); 073 } 074 075 /** Get outgoing transitions. */ 076 public UnmodifiableSet<StateflowTransition> getOutTransitions() { 077 return CollectionUtils.asUnmodifiable(outTransitions); 078 } 079 080 /** Remove this node from the model. */ 081 @Override 082 public void remove() { 083 IStateflowNodeContainer<?> parent = getParent(); 084 085 CCSMPre.isFalse(parent == null, 086 "Node has no parent to be removed from."); 087 088 // The reason for this instanceof-constrcut is the following: Java 089 // interfaces support only public methods. Therefore adding the 090 // removeNode-method to IStateFlowNodeContainr would make it visible to 091 // all clients. As we usually only make the parameterless 092 // remove()-method visible, this is undesirable. 093 if (parent instanceof StateflowChart) { 094 ((StateflowChart) parent).removeNode(this); 095 } else if (parent instanceof StateflowState) { 096 ((StateflowState) parent).removeNode(this); 097 } else { 098 CCSMAssert.fail("Unknown Stateflow container: " + parent); 099 } 100 101 for (StateflowTransition transition : new ArrayList<StateflowTransition>( 102 inTransitions)) { 103 transition.remove(); 104 } 105 106 for (StateflowTransition transition : new ArrayList<StateflowTransition>( 107 outTransitions)) { 108 transition.remove(); 109 } 110 } 111 112 /** Defines covariant returnt type. */ 113 public abstract StateflowNodeBase deepClone(); 114 115 /** Remove in transition. */ 116 /* package */void removeInTransition(StateflowTransition transition) { 117 CCSMPre.isTrue(inTransitions.contains(transition), 118 "Transition does not belong to this node."); 119 inTransitions.remove(transition); 120 } 121 122 /** Remove out transition. */ 123 /* package */void removeOutTransition(StateflowTransition transition) { 124 CCSMPre.isTrue(outTransitions.contains(transition), 125 "Transition does not belong to this node."); 126 outTransitions.remove(transition); 127 } 128 129 }