blob: 624b5f1d7f6689a03f0876bb8540749064926f3b [file] [log] [blame]
// Copyright 2023 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.
package com.google.devtools.build.lib.analysis.platform;
import com.google.auto.value.AutoValue;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
/** Proepeties set on a specific {@link PlatformInfo}. */
@AutoValue
public abstract class PlatformProperties {
abstract ImmutableMap<String, String> properties();
public boolean isEmpty() {
return properties().isEmpty();
}
/** Returns a new {@link Builder} for creating a fresh {@link PlatformProperties} instance. */
public static Builder builder() {
return new Builder();
}
/** Builder class to facilitate creating valid {@link PlatformProperties} instances. */
public static final class Builder {
@Nullable private PlatformProperties parent = null;
private ImmutableMap<String, String> properties = ImmutableMap.of();
@CanIgnoreReturnValue
public Builder setParent(@Nullable PlatformProperties parent) {
this.parent = parent;
return this;
}
/** Returns the current properties (but not any from the parent), for validation. */
ImmutableMap<String, String> getProperties() {
return this.properties;
}
@CanIgnoreReturnValue
public Builder setProperties(Map<String, String> properties) {
this.properties = ImmutableMap.copyOf(properties);
return this;
}
public PlatformProperties build() {
ImmutableMap<String, String> properties = mergeParent(parent, this.properties);
return new AutoValue_PlatformProperties(properties);
}
@Nullable
private static ImmutableMap<String, String> mergeParent(
PlatformProperties parent, ImmutableMap<String, String> properties) {
if (parent == null || parent.isEmpty()) {
return properties;
}
HashMap<String, String> result = new HashMap<>();
if (parent != null && !parent.properties().isEmpty()) {
result.putAll(parent.properties());
}
if (!properties.isEmpty()) {
for (Map.Entry<String, String> entry : properties.entrySet()) {
if (Strings.isNullOrEmpty(entry.getValue())) {
result.remove(entry.getKey());
} else {
result.put(entry.getKey(), entry.getValue());
}
}
}
return ImmutableMap.copyOf(result);
}
}
}