/* * Copyright 2017 the original author or authors. * * 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 org.gradle.api.internal.artifacts.transform; import com.google.common.hash.HashCode; import org.gradle.api.Transformer; import org.gradle.api.artifacts.transform.ArtifactTransform; import org.gradle.api.artifacts.transform.ArtifactTransformException; import org.gradle.api.artifacts.transform.VariantTransformConfigurationException; import org.gradle.api.internal.artifacts.VariantTransformRegistry; import org.gradle.api.internal.attributes.AttributeContainerInternal; import org.gradle.api.internal.attributes.ImmutableAttributes; import org.gradle.api.internal.changedetection.state.ValueSnapshot; import org.gradle.api.internal.changedetection.state.ValueSnapshotter; import org.gradle.caching.internal.DefaultBuildCacheHasher; import org.gradle.internal.classloader.ClassLoaderHierarchyHasher; import org.gradle.internal.reflect.Instantiator; import org.gradle.internal.util.BiFunction; import org.gradle.model.internal.type.ModelType; import java.io.File; import java.util.Arrays; import java.util.List; class DefaultVariantTransformRegistration implements VariantTransformRegistry.Registration, Transformer<List<File>, File> { private final ImmutableAttributes from; private final ImmutableAttributes to; private final Class<? extends ArtifactTransform> implementation; private final HashCode inputsHash; private final TransformedFileCache transformedFileCache; private final BiFunction<List<File>, File, File> transformer; DefaultVariantTransformRegistration(AttributeContainerInternal from, AttributeContainerInternal to, Class<? extends ArtifactTransform> implementation, Object[] params, TransformedFileCache transformedFileCache, ValueSnapshotter valueSnapshotter, ClassLoaderHierarchyHasher classLoaderHierarchyHasher, Instantiator instantiator) { this.from = from.asImmutable(); this.to = to.asImmutable(); this.implementation = implementation; this.transformedFileCache = transformedFileCache; DefaultBuildCacheHasher hasher = new DefaultBuildCacheHasher(); hasher.putString(implementation.getName()); hasher.putHash(classLoaderHierarchyHasher.getClassLoaderHash(implementation.getClassLoader())); // TODO - should snapshot later? // TODO - should make params immutable ValueSnapshot snapshot; try { snapshot = valueSnapshotter.snapshot(params); } catch (Exception e) { throw new VariantTransformConfigurationException(String.format("Could not snapshot configuration values for transform %s: %s", ModelType.of(implementation).getDisplayName(), Arrays.asList(params)), e); } snapshot.appendToHasher(hasher); inputsHash = hasher.hash(); this.transformer = new ArtifactTransformBackedTransformer(implementation, params, instantiator); } public AttributeContainerInternal getFrom() { return from; } public AttributeContainerInternal getTo() { return to; } public Transformer<List<File>, File> getArtifactTransform() { return this; } @Override public List<File> transform(File input) { try { File absoluteFile = input.getAbsoluteFile(); return transformedFileCache.getResult(absoluteFile, inputsHash, transformer); } catch (Throwable t) { throw new ArtifactTransformException(input, to, implementation, t); } } }