001 /*--------------------------------------------------------------------------+
002 $Id: TargetLinkDataResolver.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.targetlink;
019
020 import java.io.StringReader;
021 import java.util.Map;
022
023 import java_cup.runtime.Symbol;
024 import edu.tum.cs.commons.visitor.IVisitor;
025 import edu.tum.cs.simulink.builder.SimulinkModelBuildingException;
026 import edu.tum.cs.simulink.model.SimulinkBlock;
027 import edu.tum.cs.simulink.model.SimulinkConstants;
028 import edu.tum.cs.simulink.util.SimulinkUtils;
029
030 /**
031 * This visitor identifies Targetlink blocks, parses their data, unfolds it and
032 * stores it as normal parameters at the block. The parameter names of nestes
033 * Targetlink structs are separated by {@value #PARAMETER_SEPARATOR}.
034 *
035 * @author deissenb
036 * @author $Author: juergens $
037 * @version $Rev: 26285 $
038 * @levd.rating GREEN Hash: 5B2683922D6EF98C76A91BAD9B4EAEAD
039 */
040 public class TargetLinkDataResolver implements
041 IVisitor<SimulinkBlock, SimulinkModelBuildingException> {
042
043 /** Separator for Targetlink parameter names. */
044 public static final String PARAMETER_SEPARATOR = "/";
045
046 /**
047 * If this is a Targetlink block, parse Targetlink data, resolve the structs
048 * and stores parameters at the block.
049 */
050 public void visit(SimulinkBlock block)
051 throws SimulinkModelBuildingException {
052 if (SimulinkUtils.isTargetlinkBlock(block)) {
053 unfoldTargetlinkData(block);
054 }
055 }
056
057 /**
058 * Parse Targetlink data, resolve the structs and store parameters at the
059 * block. Currently this only analyzes Targetlink data stored at parameter
060 * {@link SimulinkConstants#PARAM_TARGETLINK_DATA}.
061 */
062 private void unfoldTargetlinkData(SimulinkBlock block)
063 throws SimulinkModelBuildingException {
064 String data = block
065 .getParameter(SimulinkConstants.PARAM_TARGETLINK_DATA);
066 if (data == null) {
067 return;
068 }
069
070 TargetlinkStruct struct = parseTargetlinkdata(block, data);
071 Map<String, String> values = struct.getParameters();
072 for (String key : values.keySet()) {
073 block.setParameter(SimulinkConstants.PARAM_TARGETLINK_DATA + key,
074 values.get(key));
075 }
076 }
077
078 /** Parse Targetlink data. */
079 private TargetlinkStruct parseTargetlinkdata(SimulinkBlock block,
080 String data) throws SimulinkModelBuildingException {
081 TargetlinkDataScanner scanner = new TargetlinkDataScanner(
082 new StringReader(data));
083 TargetlinkDataParser parser = new TargetlinkDataParser(scanner);
084 Symbol sym;
085 try {
086 sym = parser.parse();
087 } catch (Exception ex) {
088 throw new SimulinkModelBuildingException(ex + " in block "
089 + block.getId());
090 }
091
092 TargetlinkStruct struct = (TargetlinkStruct) sym.value;
093 return struct;
094 }
095 }