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 }