001 /*--------------------------------------------------------------------------+
002 $Id: SimulinkModelWalker.java 26277 2010-02-18 10:46:58Z 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.util;
019
020 import java.util.Collection;
021
022 import edu.tum.cs.commons.assertion.CCSMAssert;
023 import edu.tum.cs.commons.collections.IdentityHashSet;
024 import edu.tum.cs.commons.error.NeverThrownRuntimeException;
025 import edu.tum.cs.commons.visitor.IMeshWalker;
026 import edu.tum.cs.simulink.model.SimulinkBlock;
027 import edu.tum.cs.simulink.model.SimulinkElementBase;
028 import edu.tum.cs.simulink.model.SimulinkInPort;
029 import edu.tum.cs.simulink.model.SimulinkLine;
030 import edu.tum.cs.simulink.model.SimulinkModel;
031 import edu.tum.cs.simulink.model.SimulinkOutPort;
032 import edu.tum.cs.simulink.model.SimulinkPortBase;
033 import edu.tum.cs.simulink.model.stateflow.IStateflowNodeContainer;
034 import edu.tum.cs.simulink.model.stateflow.StateflowBlock;
035 import edu.tum.cs.simulink.model.stateflow.StateflowDeclContainerBase;
036 import edu.tum.cs.simulink.model.stateflow.StateflowElementBase;
037 import edu.tum.cs.simulink.model.stateflow.StateflowMachine;
038 import edu.tum.cs.simulink.model.stateflow.StateflowNodeBase;
039 import edu.tum.cs.simulink.model.stateflow.StateflowTransition;
040
041 /**
042 * Mesh walker for Simulink/Stateflow models.
043 *
044 * @author deissenb
045 * @author $Author: juergens $
046 * @version $Rev: 26277 $
047 * @levd.rating GREEN Hash: C5315C6EABEB791C7A6B433386A4751A
048 */
049 public class SimulinkModelWalker implements
050 IMeshWalker<Object, NeverThrownRuntimeException> {
051
052 /** Gets adjacent elements for all elements of Simulink/Stateflow elements. */
053 public Collection<Object> getAdjacentElements(Object element) {
054
055 IdentityHashSet<Object> elements = new IdentityHashSet<Object>();
056
057 if (element instanceof SimulinkElementBase) {
058 SimulinkElementBase simulinkElement = (SimulinkElementBase) element;
059 if (simulinkElement.getParent() != null) {
060 elements.add(simulinkElement.getParent());
061 }
062 elements.add(simulinkElement.getModel());
063 }
064
065 if (element instanceof StateflowBlock) {
066 StateflowBlock block = (StateflowBlock) element;
067 elements.add(block.getChart());
068 }
069
070 if (element instanceof SimulinkModel) {
071 SimulinkModel model = (SimulinkModel) element;
072 if (model.getStateflowMachine() != null) {
073 elements.add(model.getStateflowMachine());
074 }
075 }
076 if (element instanceof SimulinkBlock) {
077 SimulinkBlock block = (SimulinkBlock) element;
078 elements.addAll(block.getSubBlocks());
079 elements.addAll(block.getInPorts());
080 elements.addAll(block.getOutPorts());
081 elements.addAll(block.getAnnotations());
082 }
083 if (element instanceof StateflowBlock) {
084 SimulinkBlock block = (SimulinkBlock) element;
085 elements.addAll(block.getSubBlocks());
086 elements.addAll(block.getInPorts());
087 elements.addAll(block.getOutPorts());
088 }
089 if (element instanceof SimulinkPortBase) {
090 SimulinkPortBase port = (SimulinkPortBase) element;
091 elements.add(port.getBlock());
092 }
093 if (element instanceof SimulinkInPort) {
094 SimulinkInPort inPort = (SimulinkInPort) element;
095 if (inPort.getLine() != null) {
096 elements.add(inPort.getLine());
097 }
098 }
099 if (element instanceof SimulinkOutPort) {
100 SimulinkOutPort inPort = (SimulinkOutPort) element;
101 elements.addAll(inPort.getLines());
102 }
103 if (element instanceof SimulinkLine) {
104 SimulinkLine line = (SimulinkLine) element;
105 elements.add(line.getSrcPort());
106 elements.add(line.getDstPort());
107 }
108
109 if (element instanceof StateflowElementBase<?>) {
110 StateflowElementBase<?> stateflowElement = (StateflowElementBase<?>) element;
111 if (stateflowElement.getParent() != null) {
112 elements.add(stateflowElement.getParent());
113 }
114 }
115
116 if (element instanceof StateflowDeclContainerBase<?>) {
117 StateflowDeclContainerBase<?> declContainer = (StateflowDeclContainerBase<?>) element;
118 elements.addAll(declContainer.getData());
119 elements.addAll(declContainer.getEvents());
120 }
121
122 if (element instanceof IStateflowNodeContainer<?>) {
123 IStateflowNodeContainer<?> nodeContainer = (IStateflowNodeContainer<?>) element;
124 elements.addAll(nodeContainer.getNodes());
125 }
126
127 if (element instanceof StateflowNodeBase) {
128 StateflowNodeBase node = (StateflowNodeBase) element;
129 elements.addAll(node.getInTransitions());
130 elements.addAll(node.getOutTransitions());
131 }
132
133 if (element instanceof StateflowMachine) {
134 StateflowMachine machine = (StateflowMachine) element;
135 elements.addAll(machine.getTargets());
136 }
137 if (element instanceof StateflowTransition) {
138 StateflowTransition transition = (StateflowTransition) element;
139 if (transition.getSrc() != null) {
140 elements.add(transition.getSrc());
141 }
142 elements.add(transition.getDst());
143 }
144
145 CCSMAssert.isFalse(elements.contains(null), "Element " + element
146 + " has a null adjancency.");
147
148 return elements;
149 }
150 }