| /* |
| * Copyright (C) 2009 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 signature.compare; |
| |
| import signature.UsageException; |
| import signature.compare.model.IApiDelta; |
| import signature.compare.model.IPackageDelta; |
| import signature.compare.model.impl.SigDelta; |
| import signature.converter.Visibility; |
| import signature.converter.dex.DexFactory; |
| import signature.converter.doclet.DocletFactory; |
| import signature.io.IApiDeltaExternalizer; |
| import signature.io.IApiLoader; |
| import signature.io.html.HtmlDeltaExternalizer; |
| import signature.io.impl.BinaryApi; |
| import signature.model.IApi; |
| |
| import java.io.IOException; |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| /** |
| * Driver class for the --compare option. |
| */ |
| public class Main { |
| |
| /** |
| * <pre> |
| * --from=(doclet | dex | sig) <sourcefiles> |
| * --name <name> |
| * --to=(doclet | dex | sig) <sourcefiles> |
| * --name <name> |
| * --out directory |
| * --packages packageName{ packageName} |
| * </pre> |
| */ |
| public static void main(String[] args) throws IOException { |
| int at = 0; |
| |
| if (!"--from".equals(args[at])) { |
| throw new UsageException(); |
| } |
| String fromType = args[++at]; |
| |
| boolean hasName = false; |
| Set<String> fromFiles = new HashSet<String>(); |
| ++at; |
| for (/* at */; at < args.length; at++) { |
| if ("--name".equals(args[at])) { |
| hasName = true; |
| break; |
| } |
| if ("--to".equals(args[at])) { |
| break; |
| } |
| fromFiles.add(args[at]); |
| } |
| |
| String nameFrom = null; |
| if (hasName) { |
| nameFrom = ""; |
| if (!"--name".equals(args[at])) { |
| throw new UsageException(); |
| } |
| ++at; |
| for (/* at */; at < args.length; at++) { |
| if ("--to".equals(args[at])) { |
| break; |
| } |
| nameFrom += args[at]; |
| nameFrom += " "; |
| } |
| nameFrom = nameFrom.trim(); |
| } |
| |
| if (!"--to".equals(args[at])) { |
| throw new UsageException(); |
| } |
| String toType = args[++at]; |
| |
| hasName = false; |
| Set<String> toFiles = new HashSet<String>(); |
| ++at; |
| for (/* at */; at < args.length; at++) { |
| if ("--name".equals(args[at])) { |
| hasName = true; |
| break; |
| } |
| if ("--out".equals(args[at])) { |
| break; |
| } |
| toFiles.add(args[at]); |
| } |
| |
| String nameTo = null; |
| if (hasName) { |
| nameTo = ""; |
| if (!"--name".equals(args[at])) { |
| throw new UsageException(); |
| } |
| ++at; |
| for (/* at */; at < args.length; at++) { |
| if ("--out".equals(args[at])) { |
| break; |
| } |
| nameTo += args[at]; |
| nameTo += " "; |
| } |
| nameTo = nameTo.trim(); |
| } |
| |
| if (!"--out".equals(args[at])) { |
| throw new UsageException(); |
| } |
| String output = args[++at]; |
| |
| if (!"--packages".equals(args[++at])) { |
| throw new UsageException(); |
| } |
| Set<String> packages = new HashSet<String>(); |
| ++at; |
| for (/* at */; at < args.length; at++) { |
| packages.add(args[at]); |
| } |
| |
| IApiComparator comparator = new ApiComparator(); |
| IApi fromApi = getApi(fromType, nameFrom, fromFiles, packages); |
| IApi toApi = getApi(toType, nameTo, toFiles, packages); |
| |
| IApiDeltaExternalizer externalizer = new HtmlDeltaExternalizer(); |
| System.out.println("Writing delta report to " + output); |
| IApiDelta delta = comparator.compare(fromApi, toApi); |
| if (delta == null) { |
| delta = new EmptyDelta(fromApi, toApi); |
| } |
| |
| externalizer.externalize(output, delta); |
| } |
| |
| private static class EmptyDelta extends SigDelta<IApi> implements |
| IApiDelta { |
| public EmptyDelta(IApi from, IApi to) { |
| super(from, to); |
| } |
| |
| public Set<IPackageDelta> getPackageDeltas() { |
| return Collections.emptySet(); |
| } |
| } |
| |
| private static IApi getApi(String specType, String name, |
| Set<String> fileNames, Set<String> packageNames) throws |
| IOException { |
| System.out.println("Loading " + name + " of type " + specType |
| + " from " + fileNames); |
| IApiLoader factory = null; |
| if ("doclet".equals(specType)) { |
| checkName(name); |
| factory = new DocletFactory(); |
| } else if ("dex".equals(specType)) { |
| checkName(name); |
| factory = new DexFactory(); |
| } else if ("sig".equals(specType)) { |
| factory = new BinaryApi(); |
| } else { |
| throw new UsageException(); |
| } |
| return factory.loadApi(name, Visibility.PROTECTED, fileNames, |
| packageNames); |
| } |
| |
| private static void checkName(String name) { |
| if (name == null) { |
| throw new UsageException(); |
| } |
| } |
| } |