blob: 599fa69dde6c5d73b69ea8f7d4280fb5ff5bcae8 [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc.
*
* 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.caliper.config;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.caliper.model.VmSpec;
import com.google.caliper.platform.Platform;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import java.io.File;
import javax.annotation.concurrent.GuardedBy;
/**
* This is the configuration passed to the VM by the user. This differs from the {@link VmSpec}
* in that any number of configurations can yield the same spec (due to default flag values) and any
* number of specs can come from a single configuration (due to
* <a href="http://www.oracle.com/technetwork/java/ergo5-140223.html">ergonomics</a>).
*
* @author gak@google.com (Gregory Kick)
*/
public final class VmConfig {
private final Platform platform;
private final File vmHome;
private final ImmutableList<String> options;
@GuardedBy("this")
private File vmExecutable;
private VmConfig(Builder builder) {
this.platform = builder.platform;
this.vmHome = builder.vmHome;
this.options = builder.optionsBuilder.build();
}
@VisibleForTesting
public VmConfig(File vmHome, Iterable<String> options, File vmExecutable, Platform platform) {
this.platform = platform;
this.vmHome = checkNotNull(vmHome);
this.vmExecutable = checkNotNull(vmExecutable);
this.options = ImmutableList.copyOf(options);
}
public File vmHome() {
return vmHome;
}
public synchronized File vmExecutable() {
if (vmExecutable == null) {
vmExecutable = platform.vmExecutable(vmHome);
}
return vmExecutable;
}
public ImmutableList<String> options() {
return options;
}
public String platformName() {
return platform.name();
}
public ImmutableList<String> workerClassPathArgs() {
return platform.workerClassPathArgs();
}
public ImmutableSet<String> workerProcessArgs() {
return platform.workerProcessArgs();
}
public ImmutableSet<String> commonInstrumentVmArgs() {
return platform.commonInstrumentVmArgs();
}
@Override public boolean equals(Object obj) {
if (obj == this) {
return true;
} else if (obj instanceof VmConfig) {
VmConfig that = (VmConfig) obj;
return this.platform.equals(that.platform)
&& this.vmHome.equals(that.vmHome)
&& this.options.equals(that.options);
} else {
return false;
}
}
@Override public int hashCode() {
return Objects.hashCode(platform, vmHome, options);
}
@Override public String toString() {
return MoreObjects.toStringHelper(this)
.add("platform", platform)
.add("vmHome", vmHome)
.add("options", options)
.toString();
}
@VisibleForTesting public static final class Builder {
private final Platform platform;
private final File vmHome;
private final ImmutableList.Builder<String> optionsBuilder = ImmutableList.builder();
public Builder(Platform platform, File vmHome) {
this.platform = checkNotNull(platform);
this.vmHome = checkNotNull(vmHome);
}
public Builder addOption(String option) {
optionsBuilder.add(option);
return this;
}
public Builder addAllOptions(Iterable<String> options) {
optionsBuilder.addAll(options);
return this;
}
public VmConfig build() {
return new VmConfig(this);
}
}
}