001 /*--------------------------------------------------------------------------+ 002 $Id: StateflowChart.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.CCSMPre; 023 import edu.tum.cs.commons.collections.CollectionUtils; 024 import edu.tum.cs.commons.collections.IdentityHashSet; 025 import edu.tum.cs.commons.collections.UnmodifiableSet; 026 import edu.tum.cs.simulink.model.SimulinkConstants; 027 028 /** 029 * This class represents Stateflow charts. There is a one-to-one association 030 * between {@link StateflowBlock}s and {@link StateflowChart}s. 031 * 032 * @author deissenb 033 * @author $Author: juergens $ 034 * @version $Rev: 26285 $ 035 * @levd.rating GREEN Hash: FA7533BD5DCDE2CA69B9515DC8600D67 036 */ 037 public class StateflowChart extends 038 StateflowDeclContainerBase<StateflowMachine> implements 039 IStateflowNodeContainer<StateflowMachine> { 040 041 /** The Stateflow block associated with this chart. */ 042 private StateflowBlock stateflowBlock; 043 044 /** List of top level nodes. */ 045 private final IdentityHashSet<StateflowNodeBase> nodes = new IdentityHashSet<StateflowNodeBase>(); 046 047 /** Create new Stateflow block. */ 048 public StateflowChart() { 049 super(); 050 } 051 052 /** 053 * Create new Stateflow chart from existing chart (for deep cloning). 054 */ 055 /* package */StateflowChart(StateflowChart origChart) { 056 super(origChart); 057 058 for (StateflowNodeBase element : origChart.getNodes()) { 059 addNode(element.deepClone()); 060 } 061 062 TransitionCloneUtils.cloneTransitions(origChart, this); 063 } 064 065 /** 066 * Add node. 067 */ 068 public void addNode(StateflowNodeBase node) { 069 nodes.add(node); 070 node.setParent(this); 071 } 072 073 /** 074 * Deep clone this chart. 075 */ 076 public StateflowChart deepClone() { 077 return new StateflowChart(this); 078 } 079 080 /** Get the Stateflow machine this chart belongs to. */ 081 public StateflowMachine getMachine() { 082 return getParent(); 083 } 084 085 /** Returns the name of the chart. */ 086 public String getName() { 087 return getParameter(SimulinkConstants.PARAM_name); 088 } 089 090 /** Returns the nodes of this chart. */ 091 public UnmodifiableSet<StateflowNodeBase> getNodes() { 092 return CollectionUtils.asUnmodifiable(nodes); 093 } 094 095 /** Get Stateflow block this chart belongs to. */ 096 public StateflowBlock getStateflowBlock() { 097 return stateflowBlock; 098 } 099 100 /** 101 * This method throws an {@link UnsupportedOperationException}. You must 102 * remove the associated {@link StateflowBlock} to remove a chart. 103 */ 104 @Override 105 public void remove() { 106 throw new UnsupportedOperationException( 107 "Cannot remove chart without removing Stateflow block!"); 108 } 109 110 /** Returns the name of the chart. */ 111 @Override 112 public String toString() { 113 return getName(); 114 } 115 116 /** 117 * Remove all nodes from this chart. 118 */ 119 /* package */void removeNodes() { 120 for (StateflowNodeBase node : new ArrayList<StateflowNodeBase>(nodes)) { 121 node.remove(); 122 } 123 } 124 125 /** Remove node. */ 126 /* package */void removeNode(StateflowNodeBase node) { 127 CCSMPre.isTrue(node.getParent() == this, 128 "Node does not belong to this chart."); 129 nodes.remove(node); 130 node.setParent(null); 131 } 132 133 /** Set Stateflow block this chart belongs to. */ 134 /* package */void setStateflowBlock(StateflowBlock stateflowBlock) { 135 if (stateflowBlock != null) { 136 CCSMPre.isTrue(this.stateflowBlock == null, 137 "Cannot set new Stateflow block."); 138 } 139 this.stateflowBlock = stateflowBlock; 140 } 141 }