Singlejar options handling cleanup

Pass options into the `OutputJar` constructor, instead of to `DoIt`

PiperOrigin-RevId: 835091729
Change-Id: Ifba1dd560ed2db0858f241ce6ef0613fa85b53f2
diff --git a/src/tools/singlejar/output_huge_jar_test.cc b/src/tools/singlejar/output_huge_jar_test.cc
index 70ae468..6c97c18 100644
--- a/src/tools/singlejar/output_huge_jar_test.cc
+++ b/src/tools/singlejar/output_huge_jar_test.cc
@@ -53,11 +53,11 @@
     }
     fprintf(stderr, "\n");
     options_.ParseCommandLine(nargs, option_list);
-    ASSERT_EQ(0, output_jar_.Doit(&options_));
+    OutputJar output_jar_(&options_);
+    ASSERT_EQ(0, output_jar_.Doit());
     EXPECT_EQ(0, VerifyZip(out_path));
   }
 
-  OutputJar output_jar_;
   Options options_;
   std::unique_ptr<Runfiles> runfiles;
 };
diff --git a/src/tools/singlejar/output_jar.cc b/src/tools/singlejar/output_jar.cc
index edfff41..bcfd408 100644
--- a/src/tools/singlejar/output_jar.cc
+++ b/src/tools/singlejar/output_jar.cc
@@ -52,8 +52,9 @@
 #include "src/tools/singlejar/zip_headers.h"
 #include <zlib.h>
 
-OutputJar::OutputJar()
-    : options_(nullptr),
+OutputJar::OutputJar(Options* options)
+    : options_(options),
+      done_(false),
       file_(nullptr),
       outpos_(0),
       buffer_(nullptr),
@@ -96,11 +97,11 @@
   }
 }
 
-int OutputJar::Doit(Options* options) {
-  if (nullptr != options_) {
+int OutputJar::Doit() {
+  if (done_) {
     diag_errx(1, "%s:%d: Doit() can be called only once.", __FILE__, __LINE__);
   }
-  options_ = options;
+  done_ = true;
 
   // Register the handler for the build-data.properties file unless
   // --exclude_build_data is present. Otherwise we do not generate this file,
@@ -149,7 +150,7 @@
   // Copy CDS archive file (.jsa) if it is set. Page aligned start offset
   // is required.
   if (!options_->cds_archive.empty()) {
-    AppendPageAlignedFile(options->cds_archive, "Jsa-Offset", std::string(),
+    AppendPageAlignedFile(options_->cds_archive, "Jsa-Offset", std::string(),
                           "cds.archive");
   }
 
diff --git a/src/tools/singlejar/output_jar.h b/src/tools/singlejar/output_jar.h
index d1f90c3..01806df 100644
--- a/src/tools/singlejar/output_jar.h
+++ b/src/tools/singlejar/output_jar.h
@@ -38,9 +38,9 @@
 class OutputJar {
  public:
   // Constructor.
-  OutputJar();
+  OutputJar(Options* options);
   // Do all that needs to be done. Can be called only once.
-  int Doit(Options* options);
+  int Doit();
   // Destructor.
   virtual ~OutputJar();
   // Add a combiner to handle the entries with given name. OutputJar will
@@ -116,6 +116,7 @@
   bool WriteBytes(const void* buffer, size_t count);
 
   Options* options_;
+  bool done_;
   struct EntryInfo {
     EntryInfo(Combiner* combiner, int index = -1)
         : combiner_(combiner), input_jar_index_(index) {}
diff --git a/src/tools/singlejar/output_jar_simple_test.cc b/src/tools/singlejar/output_jar_simple_test.cc
index f4d13a2..8d2b6dd 100644
--- a/src/tools/singlejar/output_jar_simple_test.cc
+++ b/src/tools/singlejar/output_jar_simple_test.cc
@@ -14,6 +14,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <vector>
 
 // Must be included before anything else.
 #include "src/main/cpp/util/file.h"
@@ -73,6 +74,7 @@
 // entry in the data/ directory from the input archives.
 class CustomOutputJar : public OutputJar {
  public:
+  CustomOutputJar(Options* options) : OutputJar(options) {}
   ~CustomOutputJar() override {}
   void ExtraHandler(const std::string& /*input_jar_path*/, const CDH* cdh,
                     const std::string* input_jar_aux_label) override {
@@ -94,7 +96,8 @@
  protected:
   void SetUp() override { runfiles.reset(Runfiles::CreateForTest()); }
 
-  void CreateOutput(const string& out_path, const std::vector<string>& args) {
+  void ParseCommandLine(const string& out_path,
+                        const std::vector<string>& args) {
     const char* option_list[100] = {"--output", out_path.c_str(),
                                     "--build_target", "//some/target"};
     int nargs = 4;
@@ -111,7 +114,12 @@
     }
     fprintf(stderr, "\n");
     options_.ParseCommandLine(nargs, option_list);
-    ASSERT_EQ(0, output_jar_.Doit(&options_));
+  }
+
+  void CreateOutput(const string& out_path, const std::vector<string>& args) {
+    ParseCommandLine(out_path, args);
+    OutputJar output_jar(&options_);
+    ASSERT_EQ(0, output_jar.Doit());
     EXPECT_EQ(0, VerifyZip(out_path));
   }
 
@@ -135,7 +143,6 @@
     return out_path;
   }
 
-  OutputJar output_jar_;
   Options options_;
   std::unique_ptr<Runfiles> runfiles;
 };
@@ -590,9 +597,13 @@
   string resolvedLibDataPath2 = runfiles->Rlocation(kPathLibData2);
   string out_path = OutputFilePath("out.jar");
   const char kEntry[] = "tools/singlejar/data/extra_file1";
-  output_jar_.ExtraCombiner(kEntry, new Concatenator(kEntry));
-  CreateOutput(out_path, {"--sources", resolvedLibDataPath1.c_str(),
-                          resolvedLibDataPath2.c_str()});
+  ParseCommandLine(out_path, {"--sources", resolvedLibDataPath1.c_str(),
+                              resolvedLibDataPath2.c_str()});
+  OutputJar output_jar(&options_);
+  output_jar.ExtraCombiner(kEntry, new Concatenator(kEntry));
+  ASSERT_EQ(0, output_jar.Doit());
+  EXPECT_EQ(0, VerifyZip(out_path));
+
   string contents1 = GetEntryContents(resolvedLibDataPath1.c_str(), kEntry);
   string contents2 = GetEntryContents(resolvedLibDataPath2.c_str(), kEntry);
   EXPECT_EQ(contents1 + contents2, GetEntryContents(out_path, kEntry));
@@ -607,9 +618,9 @@
   const char* option_list[] = {"--output", out_path.c_str(), "--sources",
                                resolvedLibDataPath1.c_str(),
                                resolvedLibDataPath2.c_str()};
-  CustomOutputJar custom_output_jar;
   options_.ParseCommandLine(arraysize(option_list), option_list);
-  ASSERT_EQ(0, custom_output_jar.Doit(&options_));
+  CustomOutputJar custom_output_jar(&options_);
+  ASSERT_EQ(0, custom_output_jar.Doit());
   EXPECT_EQ(0, VerifyZip(out_path));
 
   string contents1 = GetEntryContents(resolvedLibDataPath1.c_str(), kEntry);
diff --git a/src/tools/singlejar/singlejar_local_main.cc b/src/tools/singlejar/singlejar_local_main.cc
index 8502ec9..b1b8f8d 100644
--- a/src/tools/singlejar/singlejar_local_main.cc
+++ b/src/tools/singlejar/singlejar_local_main.cc
@@ -28,7 +28,7 @@
 #endif
   Options options;
   options.ParseCommandLine(argc - 1, argv + 1);
-  OutputJar output_jar;
+  OutputJar output_jar(&options);
   // Process or drop Java 8 desugaring metadata, see b/65645388.  We don't want
   // or need these files afterwards so make sure we drop them either way.
   Combiner* desugar_checker =
@@ -47,5 +47,5 @@
                                   options.no_duplicates));
   output_jar.ExtraCombiner("reference.conf",
                            new Concatenator("reference.conf"));
-  return output_jar.Doit(&options);
+  return output_jar.Doit();
 }
diff --git a/src/tools/singlejar/singlejar_main.cc b/src/tools/singlejar/singlejar_main.cc
index 4bebe15..221ed68 100644
--- a/src/tools/singlejar/singlejar_main.cc
+++ b/src/tools/singlejar/singlejar_main.cc
@@ -27,7 +27,7 @@
 #endif
   Options options;
   options.ParseCommandLine(argc - 1, argv + 1);
-  OutputJar output_jar;
+  OutputJar output_jar(&options);
   // TODO(b/67733424): support desugar deps checking in Bazel
   if (options.check_desugar_deps) {
     diag_errx(1, "%s:%d: Desugar checking not currently supported in Bazel.",
@@ -42,5 +42,5 @@
                                   options.no_duplicates));
   output_jar.ExtraCombiner("reference.conf",
                            new Concatenator("reference.conf"));
-  return output_jar.Doit(&options);
+  return output_jar.Doit();
 }