package org.netbeans.gradle.project.api.modelquery;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
import javax.annotation.Nonnull;
import org.gradle.util.GradleVersion;
import org.jtrim.utils.ExceptionHelper;
import org.openide.modules.SpecificationVersion;
/**
* Defines the properties of the target Gradle daemon.
* <P>
* Instances of this class are immutable and therefore are safe to be shared
* by multiple threads concurrently.
*/
public final class GradleTarget implements Serializable {
private static final long serialVersionUID = 1L;
private final SpecificationVersion jdkVersion;
private final GradleVersion gradleVersion;
/**
* Creates a new {@code GradleTarget} with the given JRE and Gradle version.
*
* @param javaVersion the version of JRE used to execute the Gradle daemon.
* This argument cannot be {@code null}.
* @param gradleVersion the version of Gradle used in the Gradle daemon.
* This argument cannot be {@code null}.
*/
public GradleTarget(
@Nonnull SpecificationVersion javaVersion,
@Nonnull GradleVersion gradleVersion) {
ExceptionHelper.checkNotNullArgument(javaVersion, "javaVersion");
ExceptionHelper.checkNotNullArgument(gradleVersion, "gradleVersion");
this.jdkVersion = javaVersion;
this.gradleVersion = gradleVersion;
}
/**
* Returns the version of JRE (or JDK) used to execute the Gradle daemon.
*
* @return the version of Java used to execute the Gradle daemon. This
* method never returns {@code null}.
*/
@Nonnull
public SpecificationVersion getJavaVersion() {
return jdkVersion;
}
/**
* Returns the version of Gradle used in the Gradle daemon.
*
* @return the version of Gradle used in the Gradle daemon.
*/
@Nonnull
public GradleVersion getGradleVersion() {
return gradleVersion;
}
private Object writeReplace() {
return new SerializedFormat(this);
}
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
throw new InvalidObjectException("Use proxy.");
}
private static final class SerializedFormat implements Serializable {
private static final long serialVersionUID = 1L;
private final String javaVersion;
private final String gradleVersion;
public SerializedFormat(GradleTarget source) {
this.javaVersion = source.getJavaVersion().toString();
GradleVersion sourceVersion = source.getGradleVersion();
this.gradleVersion = sourceVersion.getVersion();
}
private GradleVersion getGradleVersion() {
GradleVersion result = GradleVersion.version(gradleVersion);
if (GradleVersion.current().equals(result)) {
// There can be properties only set for GradleVersion.current(),
// so try to be as good as possible (this is only a best effort
// because the current version might have changed since the version
// was serialized.
result = GradleVersion.current();
}
return result;
}
public SpecificationVersion getJavaVersion() {
return new SpecificationVersion(javaVersion);
}
private Object readResolve() throws ObjectStreamException {
return new GradleTarget(getJavaVersion(), getGradleVersion());
}
}
}