ccalvarin | 06db11f | 2017-03-28 18:07:32 +0000 | [diff] [blame] | 1 | // Copyright 2017 The Bazel Authors. All rights reserved. |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
ccalvarin | f39dc6f | 2017-06-09 11:51:45 -0400 | [diff] [blame] | 14 | package com.google.devtools.common.options; |
ccalvarin | 06db11f | 2017-03-28 18:07:32 +0000 | [diff] [blame] | 15 | |
| 16 | import com.google.common.base.CharMatcher; |
| 17 | import com.google.common.base.Strings; |
| 18 | import com.google.common.io.BaseEncoding; |
| 19 | import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy; |
ccalvarin | 06db11f | 2017-03-28 18:07:32 +0000 | [diff] [blame] | 20 | import com.google.protobuf.InvalidProtocolBufferException; |
| 21 | import com.google.protobuf.TextFormat; |
| 22 | |
| 23 | /** |
| 24 | * Parses the given InvocationPolicy string, which may be a base64-encoded binary-serialized |
| 25 | * InvocationPolicy message, or a text formatted InvocationPolicy message. Note that the text |
| 26 | * format is not backwards compatible as the binary format is. |
| 27 | */ |
| 28 | public class InvocationPolicyParser { |
| 29 | /** |
ccalvarin | f39dc6f | 2017-06-09 11:51:45 -0400 | [diff] [blame] | 30 | * Parses InvocationPolicy in either of the accepted formats. Returns an empty policy if no policy |
| 31 | * is provided. |
ccalvarin | 06db11f | 2017-03-28 18:07:32 +0000 | [diff] [blame] | 32 | * |
ccalvarin | f39dc6f | 2017-06-09 11:51:45 -0400 | [diff] [blame] | 33 | * @throws com.google.devtools.common.options.OptionsParsingException if the value of |
| 34 | * --invocation_policy is invalid. |
ccalvarin | 06db11f | 2017-03-28 18:07:32 +0000 | [diff] [blame] | 35 | */ |
| 36 | public static InvocationPolicy parsePolicy(String policy) throws OptionsParsingException { |
| 37 | if (Strings.isNullOrEmpty(policy)) { |
| 38 | return InvocationPolicy.getDefaultInstance(); |
| 39 | } |
| 40 | |
| 41 | try { |
| 42 | try { |
| 43 | // First try decoding the policy as a base64 encoded binary proto. |
| 44 | return InvocationPolicy.parseFrom( |
| 45 | BaseEncoding.base64().decode(CharMatcher.whitespace().removeFrom(policy))); |
| 46 | } catch (IllegalArgumentException e) { |
| 47 | // If the flag value can't be decoded from base64, try decoding the policy as a text |
| 48 | // formatted proto. |
| 49 | InvocationPolicy.Builder builder = InvocationPolicy.newBuilder(); |
| 50 | TextFormat.merge(policy, builder); |
| 51 | return builder.build(); |
| 52 | } |
| 53 | } catch (InvalidProtocolBufferException | TextFormat.ParseException e) { |
| 54 | throw new OptionsParsingException("Malformed value of --invocation_policy: " + policy, e); |
| 55 | } |
| 56 | } |
| 57 | } |