/*
* 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.configuration;
import org.gradle.groovy.scripts.ScriptSource;
import org.gradle.internal.operations.BuildOperationContext;
import org.gradle.internal.operations.BuildOperationExecutor;
import org.gradle.internal.operations.RunnableBuildOperation;
import org.gradle.internal.progress.BuildOperationDescriptor;
import org.gradle.internal.resource.TextResource;
import java.io.File;
/**
* A decorating {@link ScriptPlugin} implementation that delegates to a given
* delegatee implementation, but wraps the apply() execution in a
* {@link org.gradle.internal.operations.BuildOperation}.
*/
public class BuildOperationScriptPlugin implements ScriptPlugin {
private ScriptPlugin decorated;
private BuildOperationExecutor buildOperationExecutor;
public BuildOperationScriptPlugin(ScriptPlugin decorated, BuildOperationExecutor buildOperationExecutor) {
this.decorated = decorated;
this.buildOperationExecutor = buildOperationExecutor;
}
@Override
public ScriptSource getSource() {
return decorated.getSource();
}
@Override
public void apply(final Object target) {
TextResource resource = getSource().getResource();
if (resource.isContentCached() && resource.getHasEmptyContent()) {
//no operation, if there is no script code provided
decorated.apply(target);
} else {
buildOperationExecutor.run(new RunnableBuildOperation() {
@Override
public void run(BuildOperationContext context) {
decorated.apply(target);
}
@Override
public BuildOperationDescriptor.Builder description() {
ScriptSource source = getSource();
File file = source.getResource().getFile();
String name = "Apply script " + (file != null ? file.getName() : source.getDisplayName());
String displayName = name + " to " + target;
return BuildOperationDescriptor.displayName(displayName)
.name(name)
.details(new ApplyScriptPluginBuildOperationType.DetailsImpl(file, displayName));
}
});
}
}
}