| // Copyright 2017 The Bazel Authors. All rights reserved. | 
 | // | 
 | // 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. | 
 |  | 
 | #ifndef BAZEL_SRC_TOOLS_LAUNCHER_JAVA_LAUNCHER_H_ | 
 | #define BAZEL_SRC_TOOLS_LAUNCHER_JAVA_LAUNCHER_H_ | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "src/tools/launcher/launcher.h" | 
 |  | 
 | namespace bazel { | 
 | namespace launcher { | 
 |  | 
 | // Windows per-arg limit is MAX_ARG_STRLEN == 8k, | 
 | // here we use a slightly smaller value. | 
 | static const int MAX_ARG_STRLEN = 7000; | 
 |  | 
 | class JavaBinaryLauncher : public BinaryLauncherBase { | 
 |  public: | 
 |   JavaBinaryLauncher(const LaunchDataParser::LaunchInfo& launch_info, | 
 |                      const std::wstring& launcher_path, int argc, | 
 |                      wchar_t* argv[]) | 
 |       : BinaryLauncherBase(launch_info, launcher_path, argc, argv), | 
 |         singlejar(false), | 
 |         print_javabin(false), | 
 |         classpath_limit(MAX_ARG_STRLEN) {} | 
 |   ~JavaBinaryLauncher() override = default; | 
 |   ExitCode Launch() override; | 
 |  | 
 |  private: | 
 |   // If present, these flags should either be at the beginning of the command | 
 |   // line, or they should be wrapped in a --wrapper_script_flag=FLAG argument. | 
 |   // | 
 |   // --debug               Launch the JVM in remote debugging mode listening | 
 |   // --debug=<port>        to the specified port or the port set in the | 
 |   //                       DEFAULT_JVM_DEBUG_PORT environment variable (e.g. | 
 |   //                       'export DEFAULT_JVM_DEBUG_PORT=8000') or else the | 
 |   //                       default port of 5005.  The JVM starts suspended | 
 |   //                       unless the DEFAULT_JVM_DEBUG_SUSPEND environment | 
 |   //                       variable is set to 'n'. | 
 |   // --main_advice=<class> Run an alternate main class with the usual main | 
 |   //                       program and arguments appended as arguments. | 
 |   // --main_advice_classpath=<classpath> | 
 |   //                       Prepend additional class path entries. | 
 |   // --jvm_flag=<flag>     Pass <flag> to the "java" command itself. | 
 |   //                       <flag> may contain spaces. Can be used multiple | 
 |   //                       times. | 
 |   // --jvm_flags=<flags>   Pass space-separated flags to the "java" command | 
 |   //                       itself. Can be used multiple times. | 
 |   // --singlejar           Start the program from the packed-up deployment | 
 |   //                       jar rather than from the classpath. | 
 |   // --print_javabin       Print the location of java executable binary and | 
 |   // exit. | 
 |   // --classpath_limit=<length> | 
 |   //                       Specify the maximum classpath length. If the | 
 |   //                       classpath is shorter, this script passes it to Java | 
 |   //                       as a command line flag, otherwise it creates a | 
 |   //                       classpath jar. | 
 |   // | 
 |   // The remainder of the command line is passed to the program. | 
 |   bool ProcessWrapperArgument(const std::wstring& argument); | 
 |  | 
 |   // Parse arguments sequentially until the first unrecognized arg is | 
 |   // encountered. Scan the remaining args for --wrapper_script_flag=X options | 
 |   // and process them. | 
 |   // | 
 |   // Return the remaining arguments that should be passed to the program. | 
 |   std::vector<std::wstring> ProcessesCommandLine(); | 
 |  | 
 |   std::wstring jvm_debug_port; | 
 |   std::wstring main_advice; | 
 |   std::wstring main_advice_classpath; | 
 |   std::vector<std::wstring> jvm_flags_cmdline; | 
 |   bool singlejar; | 
 |   bool print_javabin; | 
 |   int classpath_limit; | 
 |  | 
 |   // Create a classpath jar to pass CLASSPATH value when its length is over | 
 |   // limit. | 
 |   // | 
 |   // Return the path of the classpath jar created. | 
 |   std::wstring CreateClasspathJar(const std::wstring& classpath); | 
 |  | 
 |   // Creat a directory based on the binary path, all the junctions will be | 
 |   // generated under this directory. | 
 |   std::wstring GetJunctionBaseDir(); | 
 |  | 
 |   // Delete all the junction directory and all the junctions under it. | 
 |   void DeleteJunctionBaseDir(); | 
 | }; | 
 |  | 
 | }  // namespace launcher | 
 | }  // namespace bazel | 
 |  | 
 | #endif  // BAZEL_SRC_TOOLS_LAUNCHER_JAVA_LAUNCHER_H_ |