From 61d029996fe89b21f0b4f8a2934b3ae0bcc414f3 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Thu, 29 Mar 2012 20:24:59 -0700 Subject: Small tool to print the target graph of Ant builds. Change-Id: I3ac594477aae6db08178b4def14f8da587ed06d1 --- .../android/anttargetprint/BuildXmlHandler.java | 108 +++++++++++++++++++++ .../src/com/android/anttargetprint/Main.java | 61 ++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 anttargetprint/src/com/android/anttargetprint/BuildXmlHandler.java create mode 100644 anttargetprint/src/com/android/anttargetprint/Main.java (limited to 'anttargetprint/src/com/android') diff --git a/anttargetprint/src/com/android/anttargetprint/BuildXmlHandler.java b/anttargetprint/src/com/android/anttargetprint/BuildXmlHandler.java new file mode 100644 index 0000000..e9bc4f3 --- /dev/null +++ b/anttargetprint/src/com/android/anttargetprint/BuildXmlHandler.java @@ -0,0 +1,108 @@ +/* + * 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 mTargets = new HashMap(); + 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> processTargets() { + HashMap> result = new HashMap>(); + + for (Entry entry : mTargets.entrySet()) { + process(entry.getKey(), entry.getValue(), result); + } + + return result; + } + + private List process(String targetName, String targetDepends, + Map> resultMap) { + + // first check if this was already processed. + List resultList = resultMap.get(targetName); + if (resultList != null) { + return resultList; + } + + resultList = new ArrayList(); + + if (targetDepends.length() > 0) { + String[] dependencies = targetDepends.split(","); + + for (String dependency : dependencies) { + String dependencyTrim = dependency.trim(); + // get all the dependencies for this targets. + List 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; + } + +} diff --git a/anttargetprint/src/com/android/anttargetprint/Main.java b/anttargetprint/src/com/android/anttargetprint/Main.java new file mode 100644 index 0000000..e270d97 --- /dev/null +++ b/anttargetprint/src/com/android/anttargetprint/Main.java @@ -0,0 +1,61 @@ +/* + * 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 java.io.File; +import java.util.List; +import java.util.Map.Entry; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + + +public class Main { + + /** + * @param args + */ + public static void main(String[] args) { + + if (args.length != 1) { + System.err.println("USAGE: [FILE]"); + System.exit(1); + } + + try { + SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); + BuildXmlHandler handler = new BuildXmlHandler(); + parser.parse(new File(args[0]), handler); + + for (Entry> entry : handler.processTargets().entrySet()) { + String name = entry.getKey(); + if (name.charAt(0) != '-') { + System.out.print(entry.getKey()); + System.out.print(" : "); + for (String v : entry.getValue()) { + System.out.print(v); + System.out.print(" > "); + } + System.out.println(); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } +} -- cgit v1.1