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    }