public abstract class Transform
extends java.lang.Object
For each added transform, a new task is created. The action of adding a transform takes care of handling dependencies between the tasks. This is done based on what the transform processes. The output of the transform becomes consumable by other transforms and these tasks get automatically linked together.
The Transform indicates what it applies to (content, scope) and what it generates (content).
A transform receives input as a collection TransformInput
, which is composed of
JarInput
s and DirectoryInput
s.
Both provide information about the QualifiedContent.Scope
s and QualifiedContent.ContentType
s associated with their
particular content.
The output is handled by TransformOutputProvider
which allows creating new self-contained
content, each associated with their own Scopes and Content Types.
The content handled by TransformInput/Output is managed by the transform system, and their
location is not configurable.
It is best practice to write into as many outputs as Jar/Folder Inputs have been received by the transform. Combining all the inputs into a single output prevents downstream transform from processing limited scopes.
While it's possible to differentiate different Content Types by file extension, it's not possible
to do so for Scopes. Therefore if a transform request a Scope but the only available Output
contains more than the requested Scope, the build will fail.
If a transform request a single content type but the only available content includes more than
the requested type, the input file/folder will contain all the files of all the types, but
the transform should only read, process and output the type(s) it requested.
Additionally, a transform can indicate secondary inputs/outputs. These are not handled by upstream or downstream transforms, and are not restricted by type handled by transform. They can be anything.
It's up to each transform to manage where these files are, and to make sure that these files are generated before the transform is called. This is done through additional parameters when register the transform.
These secondary inputs/outputs allow a transform to read but not process any content. This
can be achieved by having getScopes()
return an empty list and use
getReferencedScopes()
to indicate what to read instead.
Constructor and Description |
---|
Transform() |
Modifier and Type | Method and Description |
---|---|
boolean |
applyToVariant(VariantInfo variant)
Whether this transform should be applied to a given variant.
|
abstract java.util.Set<QualifiedContent.ContentType> |
getInputTypes()
Returns the type(s) of data that is consumed by the Transform.
|
abstract java.lang.String |
getName()
Returns the unique name of the transform.
|
java.util.Set<QualifiedContent.ContentType> |
getOutputTypes()
Returns the type(s) of data that is generated by the Transform.
|
java.util.Map<java.lang.String,java.lang.Object> |
getParameterInputs()
Returns a map of non-file input parameters using a unique identifier as the map key.
|
java.util.Set<? super QualifiedContent.Scope> |
getReferencedScopes()
Returns the referenced scope(s) for the Transform.
|
abstract java.util.Set<? super QualifiedContent.Scope> |
getScopes()
Returns the scope(s) of the Transform.
|
java.util.Collection<java.io.File> |
getSecondaryDirectoryOutputs()
Returns a list of additional (out of streams) directory(ies) that this Transform creates.
|
java.util.Collection<java.io.File> |
getSecondaryFileInputs()
Deprecated.
replaced by
getSecondaryFiles() |
java.util.Collection<java.io.File> |
getSecondaryFileOutputs()
Returns a list of additional (out of streams) file(s) that this Transform creates.
|
java.util.Collection<SecondaryFile> |
getSecondaryFiles()
Returns a list of additional file(s) that this Transform needs to run.
|
boolean |
isCacheable()
Returns if this transform's outputs should be cached.
|
abstract boolean |
isIncremental()
Returns whether the Transform can perform incremental work.
|
void |
transform(Context context,
java.util.Collection<TransformInput> inputs,
java.util.Collection<TransformInput> referencedInputs,
TransformOutputProvider outputProvider,
boolean isIncremental)
Deprecated.
replaced by
transform(TransformInvocation) . |
void |
transform(TransformInvocation transformInvocation)
Executes the Transform.
|
@NonNull public abstract java.lang.String getName()
This is associated with the type of work that the transform does. It does not have to be unique per variant.
@Incubating public boolean applyToVariant(@NonNull VariantInfo variant)
variant
- information about the current variant.@NonNull public abstract java.util.Set<QualifiedContent.ContentType> getInputTypes()
QualifiedContent.DefaultContentType
@NonNull public java.util.Set<QualifiedContent.ContentType> getOutputTypes()
The default implementation returns getInputTypes()
.
This must be of type QualifiedContent.DefaultContentType
@NonNull public abstract java.util.Set<? super QualifiedContent.Scope> getScopes()
@NonNull public java.util.Set<? super QualifiedContent.Scope> getReferencedScopes()
The default implementation returns an empty Set.
@Deprecated @NonNull public java.util.Collection<java.io.File> getSecondaryFileInputs()
getSecondaryFiles()
getSecondaryFiles()
API which allow eah secondary file to indicate if changes
can be handled incrementally or not. This API will treat all additional file change as
a non incremental event.
Changes to files returned in this list will trigger a new execution of the Transform even if the qualified-content inputs haven't been touched.
Any changes to these files will trigger a non incremental execution.
The default implementation returns an empty collection.
@NonNull public java.util.Collection<SecondaryFile> getSecondaryFiles()
Changes to files returned in this list will trigger a new execution of the Transform even if the qualified-content inputs haven't been touched.
Each secondary input has the ability to be declared as necessitating a non incremental execution in case of change. This Transform can therefore declare which secondary file changes it supports in incremental mode.
The default implementation returns an empty collection.
@NonNull public java.util.Collection<java.io.File> getSecondaryFileOutputs()
These File instances can only represent files, not directories. For directories, use
getSecondaryDirectoryOutputs()
Changes to files returned in this list will trigger a new execution of the Transform even if the qualified-content inputs haven't been touched.
Changes to these output files force a non incremental execution.
The default implementation returns an empty collection.
@NonNull public java.util.Collection<java.io.File> getSecondaryDirectoryOutputs()
These File instances can only represent directories. For files, use
getSecondaryFileOutputs()
Changes to directories returned in this list will trigger a new execution of the Transform even if the qualified-content inputs haven't been touched.
Changes to these output directories force a non incremental execution.
The default implementation returns an empty collection.
@NonNull public java.util.Map<java.lang.String,java.lang.Object> getParameterInputs()
Changes to values returned in this map will trigger a new execution of the Transform even if the content inputs haven't been touched.
Changes to these values force a non incremental execution.
The default implementation returns an empty Map.
public abstract boolean isIncremental()
If it does, then the TransformInput may contain a list of changed/removed/added files, unless something else triggers a non incremental run.
@Deprecated public void transform(@NonNull Context context, @NonNull java.util.Collection<TransformInput> inputs, @NonNull java.util.Collection<TransformInput> referencedInputs, @Nullable TransformOutputProvider outputProvider, boolean isIncremental) throws java.io.IOException, TransformException, java.lang.InterruptedException
transform(TransformInvocation)
.java.io.IOException
TransformException
java.lang.InterruptedException
public void transform(@NonNull TransformInvocation transformInvocation) throws TransformException, java.lang.InterruptedException, java.io.IOException
The inputs are packaged as an instance of TransformInvocation
TransformInput
. These are the inputs
that are consumed by this Transform. A transformed version of these inputs must
be written into the output. What is received is controlled through
getInputTypes()
, and getScopes()
.TransformInput
. This is
for reference only and should be not be transformed. What is received is controlled
through getReferencedScopes()
.getScopes()
, and what it wants to
see in getReferencedScopes()
.
Even though a transform's isIncremental()
returns true, this method may
be receive false
in isIncremental. This can be due to
getSecondaryFiles()
,
getSecondaryFileOutputs()
, getSecondaryDirectoryOutputs()
)getParameterInputs()
)JarInput.getStatus()
will return Status.NOTCHANGED
even though
the file may be added/changed.DirectoryInput.getChangedFiles()
will return an empty map even though
some files may be added/changed.transformInvocation
- the invocation object containing the transform inputs.java.io.IOException
- if an IO error occurs.java.lang.InterruptedException
TransformException
- Generic exception encapsulating the cause.public boolean isCacheable()
CacheableTask
Javadoc if you would like to make your transform
cacheable.