001    /*--------------------------------------------------------------------------+
002    $Id: SimulinkElementBase.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 edu.tum.cs.commons.assertion.CCSMPre;
021    import edu.tum.cs.commons.assertion.PreconditionException;
022    import edu.tum.cs.commons.clone.IDeepCloneable;
023    import edu.tum.cs.simulink.util.SimulinkUtils;
024    
025    /**
026     * Base class for Simulink elements. This is either a {@link SimulinkAnnotation}
027     * or a {@link SimulinkBlock}. The common aspect is that they have a name and a
028     * parent.
029     * 
030     * @author deissenb
031     * @author $Author: juergens $
032     * @version $Rev: 26285 $
033     * @levd.rating GREEN Hash: DF68AF5E130219CB5B908EAEB9AC1DAB
034     */
035    public abstract class SimulinkElementBase extends ParameterizedElement
036                    implements IDeepCloneable {
037    
038            /** The parent of this block. */
039            private SimulinkBlock parent;
040    
041            /** Create element. */
042            protected SimulinkElementBase() {
043                    super();
044            }
045    
046            /**
047             * Create element from other element (for deep cloning).
048             */
049            protected SimulinkElementBase(SimulinkElementBase other) {
050                    super(other);
051            }
052    
053            /**
054             * Get id of this element.
055             */
056            public String getId() {
057                    if (parent != null) {
058                            return parent.getId() + "/" + SimulinkUtils.escape(getName());
059                    }
060                    return SimulinkUtils.escape(getName());
061            }
062    
063            /** Get the model this element belongs to. */
064            public SimulinkModel getModel() {
065                    if (parent == null) {
066                            return null;
067                    }
068                    return parent.getModel();
069            }
070    
071            /** Returns the name. */
072            public String getName() {
073                    return getParameter(SimulinkConstants.PARAM_Name);
074            }
075    
076            /** Returns the parent block (may be null). */
077            public SimulinkBlock getParent() {
078                    return parent;
079            }
080    
081            /** Remove this element from the model. */
082            public void remove() {
083                    if (parent != null) {
084                            parent.removeElement(this);
085                            parent = null;
086                    }
087            }
088    
089            /** Get string representation of this block. */
090            @Override
091            public String toString() {
092                    return getName();
093            }
094    
095            /**
096             * Sets the parent for this block.
097             * 
098             * @throws PreconditionException
099             *             if element already has parent or the new parent is
100             *             <code>null</code>.
101             */
102            protected void setParent(SimulinkBlock parent) {
103                    CCSMPre.isTrue(this.parent == null, "Element already has a parent!");
104                    CCSMPre.isFalse(parent == null, "Parent cannot be null!");
105                    this.parent = parent;
106            }
107    }