Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7b00880 authored by Bob Badour's avatar Bob Badour Committed by Automerger Merge Worker
Browse files

Merge "Add support for library names." am: 11f3b36c

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1966151

Change-Id: Id7726397f0d9c4ea7eb7b95df2a9c95ee4737bea
parents 608c0d8e 11f3b36c
Loading
Loading
Loading
Loading
+119 −40
Original line number Original line Diff line number Diff line
@@ -39,6 +39,8 @@ import java.util.HashSet;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Set;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPInputStream;


/**
/**
@@ -54,6 +56,7 @@ class LicenseHtmlGeneratorFromXml {
    private static final String TAG_FILE_NAME = "file-name";
    private static final String TAG_FILE_NAME = "file-name";
    private static final String TAG_FILE_CONTENT = "file-content";
    private static final String TAG_FILE_CONTENT = "file-content";
    private static final String ATTR_CONTENT_ID = "contentId";
    private static final String ATTR_CONTENT_ID = "contentId";
    private static final String ATTR_LIBRARY_NAME = "lib";


    private static final String HTML_HEAD_STRING =
    private static final String HTML_HEAD_STRING =
            "<html><head>\n"
            "<html><head>\n"
@@ -67,8 +70,12 @@ class LicenseHtmlGeneratorFromXml {
            + "</style>\n"
            + "</style>\n"
            + "</head>"
            + "</head>"
            + "<body topmargin=\"0\" leftmargin=\"0\" rightmargin=\"0\" bottommargin=\"0\">\n"
            + "<body topmargin=\"0\" leftmargin=\"0\" rightmargin=\"0\" bottommargin=\"0\">\n"
            + "<div class=\"toc\">\n"
            + "<div class=\"toc\">\n";
            + "<ul>";
    private static final String LIBRARY_HEAD_STRING =
            "<strong>Libraries</strong>\n<ul class=\"libraries\">";
    private static final String LIBRARY_TAIL_STRING = "</ul>\n<strong>Files</strong>";

    private static final String FILES_HEAD_STRING = "<ul class=\"files\">";


    private static final String HTML_MIDDLE_STRING =
    private static final String HTML_MIDDLE_STRING =
            "</ul>\n"
            "</ul>\n"
@@ -81,12 +88,14 @@ class LicenseHtmlGeneratorFromXml {
    private final List<File> mXmlFiles;
    private final List<File> mXmlFiles;


    /*
    /*
     * A map from a file name to a content id (MD5 sum of file content) for its license.
     * A map from a file name to a library name (may be empty) to a content id (MD5 sum of file
     * For example, "/system/priv-app/TeleService/TeleService.apk" maps to
     * content) for its license.
     * For example, "/system/priv-app/TeleService/TeleService.apk" maps to "service/Telephony" to
     * "9645f39e9db895a4aa6e02cb57294595". Here "9645f39e9db895a4aa6e02cb57294595" is a MD5 sum
     * "9645f39e9db895a4aa6e02cb57294595". Here "9645f39e9db895a4aa6e02cb57294595" is a MD5 sum
     * of the content of packages/services/Telephony/MODULE_LICENSE_APACHE2.
     * of the content of packages/services/Telephony/MODULE_LICENSE_APACHE2.
     */
     */
    private final Map<String, Set<String>> mFileNameToContentIdMap = new HashMap();
    private final Map<String, Map<String, Set<String>>> mFileNameToLibraryToContentIdMap =
            new HashMap();


    /*
    /*
     * A map from a content id (MD5 sum of file content) to a license file content.
     * A map from a content id (MD5 sum of file content) to a license file content.
@@ -98,7 +107,7 @@ class LicenseHtmlGeneratorFromXml {


    static class ContentIdAndFileNames {
    static class ContentIdAndFileNames {
        final String mContentId;
        final String mContentId;
        final List<String> mFileNameList = new ArrayList();
        final Map<String, List<String>> mLibraryToFileNameMap = new TreeMap();


        ContentIdAndFileNames(String contentId) {
        ContentIdAndFileNames(String contentId) {
            mContentId = contentId;
            mContentId = contentId;
@@ -120,7 +129,7 @@ class LicenseHtmlGeneratorFromXml {
            parse(xmlFile);
            parse(xmlFile);
        }
        }


        if (mFileNameToContentIdMap.isEmpty() || mContentIdToFileContentMap.isEmpty()) {
        if (mFileNameToLibraryToContentIdMap.isEmpty() || mContentIdToFileContentMap.isEmpty()) {
            return false;
            return false;
        }
        }


@@ -128,7 +137,7 @@ class LicenseHtmlGeneratorFromXml {
        try {
        try {
            writer = new PrintWriter(outputFile);
            writer = new PrintWriter(outputFile);


            generateHtml(mFileNameToContentIdMap, mContentIdToFileContentMap, writer,
            generateHtml(mFileNameToLibraryToContentIdMap, mContentIdToFileContentMap, writer,
                noticeHeader);
                noticeHeader);


            writer.flush();
            writer.flush();
@@ -157,7 +166,7 @@ class LicenseHtmlGeneratorFromXml {
                in = new FileReader(xmlFile);
                in = new FileReader(xmlFile);
            }
            }


            parse(in, mFileNameToContentIdMap, mContentIdToFileContentMap);
            parse(in, mFileNameToLibraryToContentIdMap, mContentIdToFileContentMap);


            in.close();
            in.close();
        } catch (XmlPullParserException | IOException e) {
        } catch (XmlPullParserException | IOException e) {
@@ -180,7 +189,8 @@ class LicenseHtmlGeneratorFromXml {
     *
     *
     *     <licenses>
     *     <licenses>
     *     <file-name contentId="content_id_of_license1">file1</file-name>
     *     <file-name contentId="content_id_of_license1">file1</file-name>
     *     <file-name contentId="content_id_of_license2">file2</file-name>
     *     <file-name contentId="content_id_of_license2" lib="name of library">file2</file-name>
     *     <file-name contentId="content_id_of_license2" lib="another library">file2</file-name>
     *     ...
     *     ...
     *     <file-content contentId="content_id_of_license1">license1 file contents</file-content>
     *     <file-content contentId="content_id_of_license1">license1 file contents</file-content>
     *     <file-content contentId="content_id_of_license2">license2 file contents</file-content>
     *     <file-content contentId="content_id_of_license2">license2 file contents</file-content>
@@ -188,10 +198,12 @@ class LicenseHtmlGeneratorFromXml {
     *     </licenses>
     *     </licenses>
     */
     */
    @VisibleForTesting
    @VisibleForTesting
    static void parse(InputStreamReader in, Map<String, Set<String>> outFileNameToContentIdMap,
    static void parse(InputStreamReader in,
            Map<String, Map<String, Set<String>>> outFileNameToLibraryToContentIdMap,
            Map<String, String> outContentIdToFileContentMap)
            Map<String, String> outContentIdToFileContentMap)
                    throws XmlPullParserException, IOException {
                    throws XmlPullParserException, IOException {
        Map<String, Set<String>> fileNameToContentIdMap = new HashMap<String, Set<String>>();
        Map<String, Map<String, Set<String>>> fileNameToLibraryToContentIdMap =
                new HashMap<String, Map<String, Set<String>>>();
        Map<String, String> contentIdToFileContentMap = new HashMap<String, String>();
        Map<String, String> contentIdToFileContentMap = new HashMap<String, String>();


        XmlPullParser parser = Xml.newPullParser();
        XmlPullParser parser = Xml.newPullParser();
@@ -205,12 +217,15 @@ class LicenseHtmlGeneratorFromXml {
            if (state == XmlPullParser.START_TAG) {
            if (state == XmlPullParser.START_TAG) {
                if (TAG_FILE_NAME.equals(parser.getName())) {
                if (TAG_FILE_NAME.equals(parser.getName())) {
                    String contentId = parser.getAttributeValue("", ATTR_CONTENT_ID);
                    String contentId = parser.getAttributeValue("", ATTR_CONTENT_ID);
                    String libraryName = parser.getAttributeValue("", ATTR_LIBRARY_NAME);
                    if (!TextUtils.isEmpty(contentId)) {
                    if (!TextUtils.isEmpty(contentId)) {
                        String fileName = readText(parser).trim();
                        String fileName = readText(parser).trim();
                        if (!TextUtils.isEmpty(fileName)) {
                        if (!TextUtils.isEmpty(fileName)) {
                            Set<String> contentIds =
                            Map<String, Set<String>> libs =
                                    fileNameToContentIdMap.computeIfAbsent(
                                    fileNameToLibraryToContentIdMap.computeIfAbsent(
                                            fileName, k -> new HashSet<>());
                                            fileName, k -> new HashMap<>());
                            Set<String> contentIds = libs.computeIfAbsent(
                                            libraryName, k -> new HashSet<>());
                            contentIds.add(contentId);
                            contentIds.add(contentId);
                        }
                        }
                    }
                    }
@@ -229,13 +244,19 @@ class LicenseHtmlGeneratorFromXml {


            state = parser.next();
            state = parser.next();
        }
        }
        for (Map.Entry<String, Set<String>> entry : fileNameToContentIdMap.entrySet()) {
        for (Map.Entry<String, Map<String, Set<String>>> mapEntry :
            outFileNameToContentIdMap.merge(
                fileNameToLibraryToContentIdMap.entrySet()) {
                    entry.getKey(), entry.getValue(), (s1, s2) -> {
            outFileNameToLibraryToContentIdMap.merge(
                    mapEntry.getKey(), mapEntry.getValue(), (m1, m2) -> {
                        for (Map.Entry<String, Set<String>> entry : m2.entrySet()) {
                            m1.merge(entry.getKey(), entry.getValue(), (s1, s2) -> {
                                s1.addAll(s2);
                                s1.addAll(s2);
                                return s1;
                                return s1;
                            });
                            });
                        }
                        }
                        return m1;
                    });
        }
        outContentIdToFileContentMap.putAll(contentIdToFileContentMap);
        outContentIdToFileContentMap.putAll(contentIdToFileContentMap);
    }
    }


@@ -251,13 +272,28 @@ class LicenseHtmlGeneratorFromXml {
    }
    }


    @VisibleForTesting
    @VisibleForTesting
    static void generateHtml(Map<String, Set<String>> fileNameToContentIdMap,
    static void generateHtml(Map<String, Map<String, Set<String>>> fileNameToLibraryToContentIdMap,
            Map<String, String> contentIdToFileContentMap, PrintWriter writer,
            Map<String, String> contentIdToFileContentMap, PrintWriter writer,
            String noticeHeader) {
            String noticeHeader) {
        List<String> fileNameList = new ArrayList();
        List<String> fileNameList = new ArrayList();
        fileNameList.addAll(fileNameToContentIdMap.keySet());
        fileNameList.addAll(fileNameToLibraryToContentIdMap.keySet());
        Collections.sort(fileNameList);
        Collections.sort(fileNameList);


        SortedMap<String, Set<String>> libraryToContentIdMap = new TreeMap();
        for (Map<String, Set<String>> libraryToContentValue :
                fileNameToLibraryToContentIdMap.values()) {
            for (Map.Entry<String, Set<String>> entry : libraryToContentValue.entrySet()) {
                if (TextUtils.isEmpty(entry.getKey())) {
                    continue;
                }
                libraryToContentIdMap.merge(
                        entry.getKey(), entry.getValue(), (s1, s2) -> {
                            s1.addAll(s2);
                            return s1;
                        });
            }
        }

        writer.println(HTML_HEAD_STRING);
        writer.println(HTML_HEAD_STRING);


        if (!TextUtils.isEmpty(noticeHeader)) {
        if (!TextUtils.isEmpty(noticeHeader)) {
@@ -268,9 +304,35 @@ class LicenseHtmlGeneratorFromXml {
        Map<String, Integer> contentIdToOrderMap = new HashMap();
        Map<String, Integer> contentIdToOrderMap = new HashMap();
        List<ContentIdAndFileNames> contentIdAndFileNamesList = new ArrayList();
        List<ContentIdAndFileNames> contentIdAndFileNamesList = new ArrayList();


        if (!libraryToContentIdMap.isEmpty()) {
            writer.println(LIBRARY_HEAD_STRING);
            for (Map.Entry<String, Set<String>> entry: libraryToContentIdMap.entrySet()) {
                String libraryName = entry.getKey();
                for (String contentId : entry.getValue()) {
                    // Assigns an id to a newly referred license file content.
                    if (!contentIdToOrderMap.containsKey(contentId)) {
                        contentIdToOrderMap.put(contentId, count);

                        // An index in contentIdAndFileNamesList is the order of each element.
                        contentIdAndFileNamesList.add(new ContentIdAndFileNames(contentId));
                        count++;
                    }
                    int id = contentIdToOrderMap.get(contentId);
                    writer.format("<li><a href=\"#id%d\">%s</a></li>\n", id, libraryName);
                }
            }
            writer.println(LIBRARY_TAIL_STRING);
        }

        // Prints all the file list with a link to its license file content.
        // Prints all the file list with a link to its license file content.
        for (String fileName : fileNameList) {
        for (String fileName : fileNameList) {
            for (String contentId : fileNameToContentIdMap.get(fileName)) {
            for (Map.Entry<String, Set<String>> libToContentId :
                    fileNameToLibraryToContentIdMap.get(fileName).entrySet()) {
                String libraryName = libToContentId.getKey();
                if (libraryName == null) {
                    libraryName = "";
                }
                for (String contentId : libToContentId.getValue()) {
                    // Assigns an id to a newly referred license file content.
                    // Assigns an id to a newly referred license file content.
                    if (!contentIdToOrderMap.containsKey(contentId)) {
                    if (!contentIdToOrderMap.containsKey(contentId)) {
                        contentIdToOrderMap.put(contentId, count);
                        contentIdToOrderMap.put(contentId, count);
@@ -281,8 +343,17 @@ class LicenseHtmlGeneratorFromXml {
                    }
                    }


                    int id = contentIdToOrderMap.get(contentId);
                    int id = contentIdToOrderMap.get(contentId);
                contentIdAndFileNamesList.get(id).mFileNameList.add(fileName);
                    ContentIdAndFileNames elem = contentIdAndFileNamesList.get(id);
                    List<String> files = elem.mLibraryToFileNameMap.computeIfAbsent(
                            libraryName, k -> new ArrayList());
                    files.add(fileName);
                    if (TextUtils.isEmpty(libraryName)) {
                        writer.format("<li><a href=\"#id%d\">%s</a></li>\n", id, fileName);
                        writer.format("<li><a href=\"#id%d\">%s</a></li>\n", id, fileName);
                    } else {
                        writer.format("<li><a href=\"#id%d\">%s - %s</a></li>\n",
                                id, fileName, libraryName);
                    }
                }
            }
            }
        }
        }


@@ -292,19 +363,27 @@ class LicenseHtmlGeneratorFromXml {
        // Prints all contents of the license files in order of id.
        // Prints all contents of the license files in order of id.
        for (ContentIdAndFileNames contentIdAndFileNames : contentIdAndFileNamesList) {
        for (ContentIdAndFileNames contentIdAndFileNames : contentIdAndFileNamesList) {
            writer.format("<tr id=\"id%d\"><td class=\"same-license\">\n", count);
            writer.format("<tr id=\"id%d\"><td class=\"same-license\">\n", count);
            for (Map.Entry<String, List<String>> libraryFiles :
                    contentIdAndFileNames.mLibraryToFileNameMap.entrySet()) {
                String libraryName = libraryFiles.getKey();
                if (TextUtils.isEmpty(libraryName)) {
                    writer.println("<div class=\"label\">Notices for file(s):</div>");
                    writer.println("<div class=\"label\">Notices for file(s):</div>");
                } else {
                    writer.format("<div class=\"label\"><strong>%s</strong> used by:</div>\n",
                            libraryName);
                }
                writer.println("<div class=\"file-list\">");
                writer.println("<div class=\"file-list\">");
            for (String fileName : contentIdAndFileNames.mFileNameList) {
                for (String fileName : libraryFiles.getValue()) {
                    writer.format("%s <br/>\n", fileName);
                    writer.format("%s <br/>\n", fileName);
                }
                }
                writer.println("</div><!-- file-list -->");
                writer.println("</div><!-- file-list -->");
                count++;
            }
            writer.println("<pre class=\"license-text\">");
            writer.println("<pre class=\"license-text\">");
            writer.println(contentIdToFileContentMap.get(
            writer.println(contentIdToFileContentMap.get(
                    contentIdAndFileNames.mContentId));
                    contentIdAndFileNames.mContentId));
            writer.println("</pre><!-- license-text -->");
            writer.println("</pre><!-- license-text -->");
            writer.println("</td></tr><!-- same-license -->");
            writer.println("</td></tr><!-- same-license -->");

            count++;
        }
        }


        writer.println(HTML_REAR_STRING);
        writer.println(HTML_REAR_STRING);
+152 −29

File changed.

Preview size limit exceeded, changes collapsed.