/*
 * Copyright (C) 2008 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.
 */

import java.io.IOException;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.util.Set;
import java.util.TreeSet;
import java.util.List;

/**
 * Writes /java/android/preloaded-classes. Also updates LoadedClass.preloaded
 * fields and writes over compiled log file.
 */
public class WritePreloadedClassFile {

    private static final String PRELOADED_CLASS_FILE
            = "java/android/preloaded-classes";

    public static void main(String[] args)
            throws IOException, ClassNotFoundException {
        if (args.length != 1) {
            System.err.println(
                    "Usage: WritePreloadedClassFile [compiled log file]");
            System.exit(0);
        }

        Root root = Root.fromFile(args[0]);

        for (LoadedClass loadedClass : root.loadedClasses.values()) {
            loadedClass.preloaded = false;
        }

        Writer out = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(PRELOADED_CLASS_FILE),
                Charset.forName("US-ASCII")));

        out.write("# Classes which are preloaded by " +
                "com.android.internal.os.ZygoteInit.\n");
        out.write("# Automatically generated by /tools/preload.\n");
        out.write("# percent=" + Proc.PERCENTAGE_TO_PRELOAD + ", weight="
                + ClassRank.SEQUENCE_WEIGHT
                + ", bucket_size=" + ClassRank.BUCKET_SIZE
                + "\n");

        Set<LoadedClass> highestRanked = new TreeSet<LoadedClass>();
        for (Proc proc : root.processes.values()) {
            List<LoadedClass> highestForProc = proc.highestRankedClasses();

            System.out.println(proc.name + ": " + highestForProc.size());

            for (LoadedClass loadedClass : highestForProc) {
                loadedClass.preloaded = true;
            }
            highestRanked.addAll(highestForProc);
        }

        for (LoadedClass loadedClass : highestRanked) {
            out.write(loadedClass.name);
            out.write('\n');
        }

        out.close();

        System.out.println(highestRanked.size()
                + " classes will be preloaded.");

        // Update data to reflect LoadedClass.preloaded changes.
        root.toFile(args[0]);
    }
}
