/** * Copyright (C) 2011 STMicroelectronics * * This file is part of "Mind Compiler" is free software: you can redistribute * it and/or modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Contact: mind@ow2.org * * Authors: Matthieu Leclercq * Contributors: */ package org.ow2.mind.target; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.objectweb.fractal.adl.ADLException; import org.objectweb.fractal.adl.Node; import org.ow2.mind.error.ErrorManager; import org.ow2.mind.target.TargetDescriptorLoader.AbstractDelegatingTargetDescriptorLoader; import org.ow2.mind.target.ast.Flag; import org.ow2.mind.target.ast.Target; import com.google.inject.Inject; public class FlagSorterLoader extends AbstractDelegatingTargetDescriptorLoader { @Inject protected ErrorManager errorManager; public Target load(final String name, final Map<Object, Object> context) throws ADLException { final Target target = clientLoader.load(name, context); for (final String nodeType : target.astGetNodeTypes()) { final Node[] subNodes = target.astGetNodes(nodeType); if (subNodes != null && subNodes.length > 0 && subNodes[0] instanceof Flag) { sortFlags(target, subNodes); } } return target; } protected void sortFlags(final Target target, final Node[] flags) throws ADLException { final TreeMap<Integer, List<Node>> sortedFlags = new TreeMap<Integer, List<Node>>(); // remove flags and use a tree-map to sort them for (final Node flag : flags) { target.astRemoveNode(flag); final int index = getIndex((Flag) flag); List<Node> l = sortedFlags.get(index); if (l == null) { l = new ArrayList<Node>(); sortedFlags.put(index, l); } l.add(flag); } // re-add flags in the ascending order of the tree-map for (final List<Node> l : sortedFlags.values()) { for (final Node flag : l) { target.astAddNode(flag); } } } protected int getIndex(final Flag flag) throws ADLException { final String index = flag.getIndex(); if (index == null) return Integer.MAX_VALUE; try { return Integer.parseInt(index); } catch (final NumberFormatException e) { errorManager.logError(TargetDescErrors.INVALID_INDEX, flag, index); return Integer.MAX_VALUE; } } }