| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.anttargetprint; |
| |
| import org.xml.sax.Attributes; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.helpers.DefaultHandler; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| |
| public class BuildXmlHandler extends DefaultHandler { |
| |
| private Map<String, String> mTargets = new HashMap<String, String>(); |
| private int mLevel = 0; |
| |
| @Override |
| public void startElement(String uri, String localName, String qName, Attributes attributes) |
| throws SAXException { |
| |
| mLevel++; |
| |
| if (mLevel == 2 && "target".equals(qName)) { |
| String name = attributes.getValue("name"); |
| String depends = attributes.getValue("depends"); |
| |
| if (name != null) { |
| if (depends == null) { |
| depends = ""; |
| } |
| |
| mTargets.put(name, depends); |
| } |
| } |
| |
| super.startElement(uri, localName, qName, attributes); |
| } |
| |
| @Override |
| public void endElement(String uri, String localName, String qName) throws SAXException { |
| mLevel--; |
| super.endElement(uri, localName, qName); |
| } |
| |
| Map<String, List<String>> processTargets() { |
| HashMap<String, List<String>> result = new HashMap<String, List<String>>(); |
| |
| for (Entry<String, String> entry : mTargets.entrySet()) { |
| process(entry.getKey(), entry.getValue(), result); |
| } |
| |
| return result; |
| } |
| |
| private List<String> process(String targetName, String targetDepends, |
| Map<String, List<String>> resultMap) { |
| |
| // first check if this was already processed. |
| List<String> resultList = resultMap.get(targetName); |
| if (resultList != null) { |
| return resultList; |
| } |
| |
| resultList = new ArrayList<String>(); |
| |
| if (targetDepends.length() > 0) { |
| String[] dependencies = targetDepends.split(","); |
| |
| for (String dependency : dependencies) { |
| String dependencyTrim = dependency.trim(); |
| // get all the dependencies for this targets. |
| List<String> dependencyList = resultMap.get(dependencyTrim); |
| if (dependencyList == null) { |
| dependencyList = process(dependencyTrim, mTargets.get(dependencyTrim), |
| resultMap); |
| } |
| |
| // add those to the new result list |
| resultList.addAll(dependencyList); |
| |
| // and add this dependency as well |
| resultList.add(dependencyTrim); |
| } |
| } |
| |
| resultMap.put(targetName, resultList); |
| |
| return resultList; |
| } |
| |
| } |