001 /*--------------------------------------------------------------------------+
002 $Id: SimulinkOutPort.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;
019
020 import java.util.ArrayList;
021 import java.util.Set;
022
023 import edu.tum.cs.commons.assertion.CCSMPre;
024 import edu.tum.cs.commons.assertion.PreconditionException;
025 import edu.tum.cs.commons.collections.CollectionUtils;
026 import edu.tum.cs.commons.collections.IdentityHashSet;
027 import edu.tum.cs.commons.collections.UnmodifiableSet;
028
029 /**
030 * A Simulink inport. An outport can be connected to multiple
031 * {@link SimulinkLine}s.
032 *
033 * @author deissenb
034 * @author $Author: juergens $
035 * @version $Rev: 26285 $
036 * @levd.rating GREEN Hash: 879597C4C4DBC4EBFA19F2BE4A419CCC
037 */
038 public class SimulinkOutPort extends SimulinkPortBase {
039
040 /** The lines connected to this port. */
041 private final Set<SimulinkLine> lines = new IdentityHashSet<SimulinkLine>();
042
043 /**
044 * Create simulink outport.
045 *
046 * @param block
047 * The block this port belongs to.
048 * @param index
049 * The port index. This may be a number or a string like 'enable'
050 */
051 public SimulinkOutPort(SimulinkBlock block, String index) {
052 super(block, index);
053 block.addOutPort(this);
054 }
055
056 /**
057 * Add line connected to this port. This is only called from the
058 * {@link SimulinkLine}.
059 *
060 * @throws PreconditionException
061 * if this port is already connected to the line or the line's
062 * source port does not match this port.
063 */
064 /* package */void addLine(SimulinkLine line)
065 throws IllegalArgumentException {
066 CCSMPre.isFalse(lines.contains(line),
067 "Line is already connected to this port.");
068 CCSMPre
069 .isTrue(line.getSrcPort() == this,
070 "Line's port does not match.");
071
072 lines.add(line);
073 }
074
075 /**
076 * Get lines connected to this port.
077 */
078 public UnmodifiableSet<SimulinkLine> getLines() {
079 return CollectionUtils.asUnmodifiable(lines);
080 }
081
082 /**
083 * Remove line. This is only called from the {@link SimulinkLine}.
084 *
085 * @throws PreconditionException
086 * if the provided line is not connected to this port
087 */
088 /* package */void removeLine(SimulinkLine line)
089 throws IllegalArgumentException {
090 CCSMPre.isTrue(lines.contains(line), "Line is not connected to port.");
091 lines.remove(line);
092 }
093
094 /** {@inheritDoc} */
095 @Override
096 public void remove() {
097 getBlock().removeOutPort(this);
098 for (SimulinkLine line : new ArrayList<SimulinkLine>(lines)) {
099 line.remove();
100 }
101 super.remove();
102 }
103
104 }