You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/02/23 14:13:55 UTC

[maven-resolver] branch cstamas-transformer-api created (now b8bcb22)

This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a change to branch cstamas-transformer-api
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git.


      at b8bcb22  My take on artifact transformation

This branch includes the following new commits:

     new b8bcb22  My take on artifact transformation

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[maven-resolver] 01/01: My take on artifact transformation

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch cstamas-transformer-api
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit b8bcb2221f3a6ae8f52cc74005ae030f3f811825
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Wed Feb 23 15:01:27 2022 +0100

    My take on artifact transformation
    
    From resolver's perspective nothing changes (no extra IO, in
    memory copy and so on), it is just the matter that
    trasformation result is handled as resource (closed once not needed).
    It allows implementor to implement whatever cleanup is needed
    from their side.
---
 .../AbstractForwardingRepositorySystemSession.java |  4 +-
 .../aether/DefaultRepositorySystemSession.java     | 16 +++----
 .../eclipse/aether/RepositorySystemSession.java    |  4 +-
 ...leTransformer.java => ArtifactTransformer.java} | 19 ++------
 ...anager.java => ArtifactTransformerManager.java} | 10 ++--
 ...leTransformer.java => TransformedArtifact.java} | 30 +++---------
 .../connector/basic/BasicRepositoryConnector.java  | 51 ++------------------
 .../aether/internal/impl/DefaultDeployer.java      | 56 +++++++++++++++++-----
 .../aether/internal/impl/DefaultInstaller.java     | 53 +++++++++-----------
 .../aether/internal/impl/DefaultDeployerTest.java  | 37 --------------
 .../aether/internal/impl/DefaultInstallerTest.java | 46 ------------------
 .../internal/impl/StubFileTransformerManager.java  | 14 +++---
 .../aether/spi/connector/ArtifactUpload.java       | 42 +---------------
 13 files changed, 102 insertions(+), 280 deletions(-)

diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/AbstractForwardingRepositorySystemSession.java b/maven-resolver-api/src/main/java/org/eclipse/aether/AbstractForwardingRepositorySystemSession.java
index 008a2df..3725b43 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/AbstractForwardingRepositorySystemSession.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/AbstractForwardingRepositorySystemSession.java
@@ -36,7 +36,7 @@ import org.eclipse.aether.repository.WorkspaceReader;
 import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
 import org.eclipse.aether.resolution.ResolutionErrorPolicy;
 import org.eclipse.aether.transfer.TransferListener;
-import org.eclipse.aether.transform.FileTransformerManager;
+import org.eclipse.aether.transform.ArtifactTransformerManager;
 
 /**
  * A special repository system session to enable decorating or proxying another session. To do so, clients have to
@@ -213,7 +213,7 @@ public abstract class AbstractForwardingRepositorySystemSession
     }
     
     @Override
-    public FileTransformerManager getFileTransformerManager()
+    public ArtifactTransformerManager getFileTransformerManager()
     {
         return getSession().getFileTransformerManager();
     }
diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java
index 90b32f4..138cbd3 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositorySystemSession.java
@@ -47,8 +47,8 @@ import org.eclipse.aether.repository.WorkspaceReader;
 import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
 import org.eclipse.aether.resolution.ResolutionErrorPolicy;
 import org.eclipse.aether.transfer.TransferListener;
-import org.eclipse.aether.transform.FileTransformer;
-import org.eclipse.aether.transform.FileTransformerManager;
+import org.eclipse.aether.transform.ArtifactTransformer;
+import org.eclipse.aether.transform.ArtifactTransformerManager;
 
 /**
  * A simple repository system session.
@@ -78,7 +78,7 @@ public final class DefaultRepositorySystemSession
 
     private LocalRepositoryManager localRepositoryManager;
 
-    private FileTransformerManager fileTransformerManager;
+    private ArtifactTransformerManager fileTransformerManager;
 
     private WorkspaceReader workspaceReader;
 
@@ -329,12 +329,12 @@ public final class DefaultRepositorySystemSession
     }
 
     @Override
-    public FileTransformerManager getFileTransformerManager()
+    public ArtifactTransformerManager getFileTransformerManager()
     {
         return fileTransformerManager;
     }
 
-    public DefaultRepositorySystemSession setFileTransformerManager( FileTransformerManager fileTransformerManager )
+    public DefaultRepositorySystemSession setFileTransformerManager( ArtifactTransformerManager fileTransformerManager )
     {
         failIfReadOnly();
         this.fileTransformerManager = fileTransformerManager;
@@ -862,12 +862,12 @@ public final class DefaultRepositorySystemSession
 
     }
 
-    static final class NullFileTransformerManager implements FileTransformerManager
+    static final class NullFileTransformerManager implements ArtifactTransformerManager
     {
-        public static final FileTransformerManager INSTANCE = new NullFileTransformerManager();
+        public static final ArtifactTransformerManager INSTANCE = new NullFileTransformerManager();
 
         @Override
-        public Collection<FileTransformer> getTransformersForArtifact( Artifact artifact )
+        public Collection<ArtifactTransformer> getTransformersForArtifact( Artifact artifact )
         {
             return Collections.emptyList();
         }
diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java
index 5a3f14c..eb4dfe6 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositorySystemSession.java
@@ -37,7 +37,7 @@ import org.eclipse.aether.repository.WorkspaceReader;
 import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
 import org.eclipse.aether.resolution.ResolutionErrorPolicy;
 import org.eclipse.aether.transfer.TransferListener;
-import org.eclipse.aether.transform.FileTransformerManager;
+import org.eclipse.aether.transform.ArtifactTransformerManager;
 
 /**
  * Defines settings and components that control the repository system. Once initialized, the session object itself is
@@ -266,6 +266,6 @@ public interface RepositorySystemSession
      * 
      * @return the manager, never {@code null}
      */
-    FileTransformerManager getFileTransformerManager();
+    ArtifactTransformerManager getFileTransformerManager();
 
 }
diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformer.java b/maven-resolver-api/src/main/java/org/eclipse/aether/transform/ArtifactTransformer.java
similarity index 67%
copy from maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformer.java
copy to maven-resolver-api/src/main/java/org/eclipse/aether/transform/ArtifactTransformer.java
index 8de4342..a4d68a1 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformer.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/transform/ArtifactTransformer.java
@@ -19,19 +19,17 @@ package org.eclipse.aether.transform;
  * under the License.
  */
 
-import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 
 import org.eclipse.aether.artifact.Artifact;
 
 /**
- * Can transform a file while installing/deploying
+ * Can transform an artifact just before installing/deploying
  * 
  * @author Robert Scholte
  * @since 1.3.0
  */
-public interface FileTransformer
+public interface ArtifactTransformer
 {
     /**
      * Transform the target location  
@@ -39,16 +37,5 @@ public interface FileTransformer
      * @param artifact the original artifact
      * @return the transformed artifact
      */
-    Artifact transformArtifact( Artifact artifact );
-    
-    /**
-     * Transform the data
-     * 
-     * @param file the file with the original data
-     * @return the transformed data
-     * @throws IOException If an I/O error occurred
-     * @throws TransformException If the file could not be transformed
-     */
-    InputStream transformData( File file )
-        throws IOException, TransformException;
+    TransformedArtifact transformArtifact( Artifact artifact ) throws TransformException, IOException;
 }
diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformerManager.java b/maven-resolver-api/src/main/java/org/eclipse/aether/transform/ArtifactTransformerManager.java
similarity index 81%
rename from maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformerManager.java
rename to maven-resolver-api/src/main/java/org/eclipse/aether/transform/ArtifactTransformerManager.java
index edfeb36..0333d38 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformerManager.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/transform/ArtifactTransformerManager.java
@@ -29,7 +29,7 @@ import org.eclipse.aether.artifact.Artifact;
  * @author Robert Scholte
  * @since 1.3.0
  */
-public interface FileTransformerManager
+public interface ArtifactTransformerManager
 {
     /**
      * <p>
@@ -37,13 +37,9 @@ public interface FileTransformerManager
      * to the original to be deployed, you must add an explicit transformer for that file too (one that doesn't
      * transform the artifact and data).
      * </p>
-     * 
-     * <p><strong>IMPORTANT</strong> When using a fileTransformer, the content of the file is stored in memory to ensure
-     * that file content and checksums stay in sync!
-     * </p>
-     * 
+     *
      * @param artifact the artifact
      * @return a collection of FileTransformers to apply on the artifact, never {@code null}
      */
-    Collection<FileTransformer> getTransformersForArtifact( Artifact artifact );
+    Collection<ArtifactTransformer> getTransformersForArtifact( Artifact artifact );
 }
diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformer.java b/maven-resolver-api/src/main/java/org/eclipse/aether/transform/TransformedArtifact.java
similarity index 55%
rename from maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformer.java
rename to maven-resolver-api/src/main/java/org/eclipse/aether/transform/TransformedArtifact.java
index 8de4342..a11713a 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/transform/FileTransformer.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/transform/TransformedArtifact.java
@@ -19,36 +19,20 @@ package org.eclipse.aether.transform;
  * under the License.
  */
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.Closeable;
 
 import org.eclipse.aether.artifact.Artifact;
 
 /**
- * Can transform a file while installing/deploying
+ * The transformed artifact. This instance is handled by resolver as a resource, {@link #close()} is called immediately
+ * after install/deploy happened, allowing this instance to perform any kind of cleanup.
  * 
- * @author Robert Scholte
- * @since 1.3.0
+ * @since TBD
  */
-public interface FileTransformer
+public interface TransformedArtifact extends Closeable
 {
     /**
-     * Transform the target location  
-     * 
-     * @param artifact the original artifact
-     * @return the transformed artifact
+     * Returns the transformed artifact, never {@code null}.
      */
-    Artifact transformArtifact( Artifact artifact );
-    
-    /**
-     * Transform the data
-     * 
-     * @param file the file with the original data
-     * @return the transformed data
-     * @throws IOException If an I/O error occurred
-     * @throws TransformException If the file could not be transformed
-     */
-    InputStream transformData( File file )
-        throws IOException, TransformException;
+    Artifact getArtifact();
 }
diff --git a/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java b/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java
index c761941..773906d 100644
--- a/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java
+++ b/maven-resolver-connector-basic/src/main/java/org/eclipse/aether/connector/basic/BasicRepositoryConnector.java
@@ -21,10 +21,8 @@ package org.eclipse.aether.connector.basic;
 
 import static java.util.Objects.requireNonNull;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -65,7 +63,6 @@ import org.eclipse.aether.transfer.NoRepositoryLayoutException;
 import org.eclipse.aether.transfer.NoTransporterException;
 import org.eclipse.aether.transfer.TransferEvent;
 import org.eclipse.aether.transfer.TransferResource;
-import org.eclipse.aether.transform.FileTransformer;
 import org.eclipse.aether.util.ConfigUtils;
 import org.eclipse.aether.util.concurrency.RunnableErrorForwarder;
 import org.eclipse.aether.util.concurrency.WorkerThreadFactory;
@@ -312,8 +309,7 @@ final class BasicRepositoryConnector
             List<RepositoryLayout.ChecksumLocation> checksumLocations =
                     layout.getChecksumLocations( transfer.getArtifact(), true, location );
 
-            Runnable task = new PutTaskRunner( location, transfer.getFile(), transfer.getFileTransformer(),
-                    checksumLocations, listener );
+            Runnable task = new PutTaskRunner( location, transfer.getFile(), checksumLocations, listener );
             task.run();
         }
 
@@ -537,33 +533,13 @@ final class BasicRepositoryConnector
 
         private final File file;
 
-        private final FileTransformer fileTransformer;
-
         private final Collection<RepositoryLayout.ChecksumLocation> checksumLocations;
 
         PutTaskRunner( URI path, File file, List<RepositoryLayout.ChecksumLocation> checksumLocations,
                        TransferTransportListener<?> listener )
         {
-            this( path, file, null, checksumLocations, listener );
-        }
-
-        /**
-         * <strong>IMPORTANT</strong> When using a fileTransformer, the content of the file is stored in memory to
-         * ensure that file content and checksums stay in sync!
-         *
-         * @param path
-         * @param file
-         * @param fileTransformer
-         * @param checksumLocations
-         * @param listener
-         */
-        PutTaskRunner( URI path, File file, FileTransformer fileTransformer,
-                       List<RepositoryLayout.ChecksumLocation> checksumLocations,
-                       TransferTransportListener<?> listener )
-        {
             super( path, listener );
             this.file = requireNonNull( file, "source file cannot be null" );
-            this.fileTransformer = fileTransformer;
             this.checksumLocations = safe( checksumLocations );
         }
 
@@ -572,29 +548,8 @@ final class BasicRepositoryConnector
         protected void runTask()
                 throws Exception
         {
-            if ( fileTransformer != null )
-            {
-                // transform data once to byte array, ensure constant data for checksum
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                byte[] buffer = new byte[1024];
-
-                try ( InputStream transformData = fileTransformer.transformData( file ) )
-                {
-                    for ( int read; ( read = transformData.read( buffer, 0, buffer.length ) ) != -1; )
-                    {
-                        baos.write( buffer, 0, read );
-                    }
-                }
-
-                byte[] bytes = baos.toByteArray();
-                transporter.put( new PutTask( path ).setDataBytes( bytes ).setListener( listener ) );
-                uploadChecksums( file, bytes );
-            }
-            else
-            {
-                transporter.put( new PutTask( path ).setDataFile( file ).setListener( listener ) );
-                uploadChecksums( file, null );
-            }
+            transporter.put( new PutTask( path ).setDataFile( file ).setListener( listener ) );
+            uploadChecksums( file, null );
         }
 
         /**
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java
index f582f50..a61e8df 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultDeployer.java
@@ -74,8 +74,10 @@ import org.eclipse.aether.transfer.NoRepositoryConnectorException;
 import org.eclipse.aether.transfer.RepositoryOfflineException;
 import org.eclipse.aether.transfer.TransferCancelledException;
 import org.eclipse.aether.transfer.TransferEvent;
-import org.eclipse.aether.transform.FileTransformer;
-import org.eclipse.aether.transform.FileTransformerManager;
+import org.eclipse.aether.transform.ArtifactTransformer;
+import org.eclipse.aether.transform.ArtifactTransformerManager;
+import org.eclipse.aether.transform.TransformException;
+import org.eclipse.aether.transform.TransformedArtifact;
 
 /**
  */
@@ -220,6 +222,7 @@ public class DefaultDeployer
         }
     }
 
+    @SuppressWarnings( "checkstyle:methodlength" )
     private DeployResult deploy( SyncContext syncContext, RepositorySystemSession session, DeployRequest request )
         throws DeploymentException
     {
@@ -243,7 +246,7 @@ public class DefaultDeployer
         {
             List<? extends MetadataGenerator> generators = getMetadataGenerators( session, request );
 
-            FileTransformerManager fileTransformerManager = session.getFileTransformerManager();
+            ArtifactTransformerManager fileTransformerManager = session.getFileTransformerManager();
 
             List<ArtifactUpload> artifactUploads = new ArrayList<>();
             List<MetadataUpload> metadataUploads = new ArrayList<>();
@@ -263,6 +266,7 @@ public class DefaultDeployer
                 processedMetadata.put( metadata, null );
             }
 
+            ArrayList<TransformedArtifact> transformedArtifacts = new ArrayList<>();
             for ( ListIterator<Artifact> iterator = artifacts.listIterator(); iterator.hasNext(); )
             {
                 Artifact artifact = iterator.next();
@@ -274,19 +278,27 @@ public class DefaultDeployer
 
                 iterator.set( artifact );
 
-                Collection<FileTransformer> fileTransformers =
+                Collection<ArtifactTransformer> fileTransformers =
                         fileTransformerManager.getTransformersForArtifact( artifact );
                 if ( !fileTransformers.isEmpty() )
                 {
-                    for ( FileTransformer fileTransformer : fileTransformers )
+                    for ( ArtifactTransformer fileTransformer : fileTransformers )
                     {
-                        Artifact targetArtifact = fileTransformer.transformArtifact( artifact );
-
-                        ArtifactUpload upload = new ArtifactUpload( targetArtifact, artifact.getFile(),
-                                fileTransformer );
-                        upload.setTrace( trace );
-                        upload.setListener( new ArtifactUploadListener( catapult, upload ) );
-                        artifactUploads.add( upload );
+                        try
+                        {
+                            TransformedArtifact transformedArtifact = fileTransformer.transformArtifact( artifact );
+                            transformedArtifacts.add( transformedArtifact );
+                            Artifact targetArtifact = transformedArtifact.getArtifact();
+
+                            ArtifactUpload upload = new ArtifactUpload( targetArtifact, targetArtifact.getFile() );
+                            upload.setTrace( trace );
+                            upload.setListener( new ArtifactUploadListener( catapult, upload ) );
+                            artifactUploads.add( upload );
+                        }
+                        catch ( TransformException | IOException e )
+                        {
+                            throw new DeploymentException( "Transformation failed", e );
+                        }
                     }
                 }
                 else
@@ -300,6 +312,26 @@ public class DefaultDeployer
 
             connector.put( artifactUploads, null );
 
+            ArrayList<IOException> ioExceptions = new ArrayList<>();
+            for ( TransformedArtifact transformedArtifact : transformedArtifacts )
+            {
+                try
+                {
+                    transformedArtifact.close();
+                }
+                catch ( IOException e )
+                {
+                    ioExceptions.add( e );
+                }
+            }
+            if ( !ioExceptions.isEmpty() )
+            {
+                DeploymentException deploymentException = new DeploymentException(
+                        "Failed to close transformed artifacts" );
+                ioExceptions.forEach( deploymentException::addSuppressed );
+                throw deploymentException;
+            }
+
             for ( ArtifactUpload upload : artifactUploads )
             {
                 if ( upload.getException() != null )
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
index 6b3f7a7..7b39dd8 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultInstaller.java
@@ -22,7 +22,7 @@ package org.eclipse.aether.internal.impl;
 import static java.util.Objects.requireNonNull;
 
 import java.io.File;
-import java.io.InputStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.IdentityHashMap;
@@ -56,7 +56,9 @@ import org.eclipse.aether.repository.LocalRepositoryManager;
 import org.eclipse.aether.spi.io.FileProcessor;
 import org.eclipse.aether.spi.locator.Service;
 import org.eclipse.aether.spi.locator.ServiceLocator;
-import org.eclipse.aether.transform.FileTransformer;
+import org.eclipse.aether.transform.ArtifactTransformer;
+import org.eclipse.aether.transform.TransformException;
+import org.eclipse.aether.transform.TransformedArtifact;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -239,38 +241,35 @@ public class DefaultInstaller
 
         File srcFile = artifact.getFile();
 
-        Collection<FileTransformer> fileTransformers = session.getFileTransformerManager()
+        Collection<ArtifactTransformer> fileTransformers = session.getFileTransformerManager()
                 .getTransformersForArtifact( artifact );
         if ( fileTransformers.isEmpty() )
         {
-            install( session, trace, artifact, lrm, srcFile, null );
+            install( session, trace, artifact, lrm, srcFile );
         }
         else
         {
-            for ( FileTransformer fileTransformer : fileTransformers )
+            for ( ArtifactTransformer fileTransformer : fileTransformers )
             {
-                install( session, trace, artifact, lrm, srcFile, fileTransformer );
+                try ( TransformedArtifact transformedArtifact = fileTransformer.transformArtifact( artifact ) )
+                {
+                    install( session, trace, transformedArtifact.getArtifact(), lrm, srcFile );
+                }
+                catch ( TransformException | IOException e )
+                {
+                    throw new InstallationException( "Transformation failed", e );
+                }
             }
         }
     }
 
     private void install( RepositorySystemSession session, RequestTrace trace, Artifact artifact,
-                          LocalRepositoryManager lrm, File srcFile, FileTransformer fileTransformer )
+                          LocalRepositoryManager lrm, File srcFile )
         throws InstallationException
     {
-        final Artifact targetArtifact;
-        if ( fileTransformer != null )
-        {
-            targetArtifact = fileTransformer.transformArtifact( artifact );
-        }
-        else
-        {
-            targetArtifact = artifact;
-        }
+        File dstFile = new File( lrm.getRepository().getBasedir(), lrm.getPathForLocalArtifact( artifact ) );
 
-        File dstFile = new File( lrm.getRepository().getBasedir(), lrm.getPathForLocalArtifact( targetArtifact ) );
-
-        artifactInstalling( session, trace, targetArtifact, dstFile );
+        artifactInstalling( session, trace, artifact, dstFile );
 
         Exception exception = null;
         try
@@ -281,38 +280,30 @@ public class DefaultInstaller
             }
 
             boolean copy =
-                "pom".equals( targetArtifact.getExtension() ) || srcFile.lastModified() != dstFile.lastModified()
+                "pom".equals( artifact.getExtension() ) || srcFile.lastModified() != dstFile.lastModified()
                     || srcFile.length() != dstFile.length() || !srcFile.exists();
 
             if ( !copy )
             {
                 LOGGER.debug( "Skipped re-installing {} to {}, seems unchanged", srcFile, dstFile );
             }
-            else if ( fileTransformer != null ) 
-            {
-                try ( InputStream is = fileTransformer.transformData( srcFile ) )
-                {
-                    fileProcessor.write( dstFile, is );
-                    dstFile.setLastModified( srcFile.lastModified() );
-                }
-            }
             else
             {
                 fileProcessor.copy( srcFile, dstFile );
                 dstFile.setLastModified( srcFile.lastModified() );
             }
 
-            lrm.add( session, new LocalArtifactRegistration( targetArtifact ) );
+            lrm.add( session, new LocalArtifactRegistration( artifact ) );
         }
         catch ( Exception e )
         {
             exception = e;
-            throw new InstallationException( "Failed to install artifact " + targetArtifact + ": " + e.getMessage(),
+            throw new InstallationException( "Failed to install artifact " + artifact + ": " + e.getMessage(),
                     e );
         }
         finally
         {
-            artifactInstalled( session, trace, targetArtifact, dstFile, exception );
+            artifactInstalled( session, trace, artifact, dstFile, exception );
         }
     }
 
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java
index 6664d28..cda29f7 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultDeployerTest.java
@@ -25,11 +25,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -58,8 +55,6 @@ import org.eclipse.aether.spi.connector.MetadataDownload;
 import org.eclipse.aether.spi.connector.MetadataUpload;
 import org.eclipse.aether.spi.connector.RepositoryConnector;
 import org.eclipse.aether.transfer.MetadataNotFoundException;
-import org.eclipse.aether.transform.FileTransformer;
-import org.eclipse.aether.util.artifact.SubArtifact;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -391,36 +386,4 @@ public class DefaultDeployerTest
         TestFileUtils.readProps( metadataFile, props );
         assertNull( props.toString(), props.get( "old" ) );
     }
-
-    @Test
-    public void testFileTransformer() throws Exception
-    {
-        final Artifact transformedArtifact = new SubArtifact( artifact, null, "raj" );
-        FileTransformer transformer = new FileTransformer()
-        {
-            @Override
-            public InputStream transformData( File file )
-            {
-                return new ByteArrayInputStream( "transformed data".getBytes( StandardCharsets.UTF_8 ) );
-            }
-            
-            @Override
-            public Artifact transformArtifact( Artifact artifact )
-            {
-                return transformedArtifact;
-            }
-        };
-        
-        StubFileTransformerManager fileTransformerManager = new StubFileTransformerManager();
-        fileTransformerManager.addFileTransformer( "jar", transformer );
-        session.setFileTransformerManager( fileTransformerManager );
-        
-        request = new DeployRequest();
-        request.addArtifact( artifact );
-        deployer.deploy( session, request );
-        
-        Artifact putArtifact = connector.getActualArtifactPutRequests().get( 0 );
-        assertEquals( transformedArtifact, putArtifact );
-    }
-
 }
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultInstallerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultInstallerTest.java
index 0fb0e56..a1f0938 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultInstallerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultInstallerTest.java
@@ -26,13 +26,8 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileReader;
 import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 import org.eclipse.aether.DefaultRepositorySystemSession;
@@ -50,8 +45,6 @@ import org.eclipse.aether.internal.test.util.TestUtils;
 import org.eclipse.aether.metadata.DefaultMetadata;
 import org.eclipse.aether.metadata.Metadata;
 import org.eclipse.aether.metadata.Metadata.Nature;
-import org.eclipse.aether.transform.FileTransformer;
-import org.eclipse.aether.util.artifact.SubArtifact;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -420,43 +413,4 @@ public class DefaultInstallerTest
         assertEquals( "artifact timestamp was not set to src file", artifact.getFile().lastModified(),
                       localArtifactFile.lastModified() );
     }
-    
-    @Test
-    public void testFileTransformer() throws Exception
-    {
-        final Artifact transformedArtifact = new SubArtifact( artifact, null, "raj" );
-        FileTransformer transformer = new FileTransformer()
-        {
-            @Override
-            public InputStream transformData( File file )
-            {
-                return new ByteArrayInputStream( "transformed data".getBytes( StandardCharsets.UTF_8 ) );
-            }
-            
-            @Override
-            public Artifact transformArtifact( Artifact artifact )
-            {
-                return transformedArtifact;
-            }
-        };
-        
-        StubFileTransformerManager fileTransformerManager = new StubFileTransformerManager();
-        fileTransformerManager.addFileTransformer( "jar", transformer );
-        session.setFileTransformerManager( fileTransformerManager );
-        
-        request = new InstallRequest();
-        request.addArtifact( artifact );
-        installer.install( session, request );
-        
-        assertFalse( localArtifactFile.exists() );
-        
-        String transformedArtifactPath = session.getLocalRepositoryManager().getPathForLocalArtifact( transformedArtifact );
-        File transformedArtifactFile = new File( session.getLocalRepository().getBasedir(), transformedArtifactPath );
-        assertTrue( transformedArtifactFile.exists() );
-        
-        try ( BufferedReader r = new BufferedReader( new FileReader( transformedArtifactFile ) ) )
-        {
-            assertEquals( "transformed data", r.readLine() );
-        }
-    }
 }
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubFileTransformerManager.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubFileTransformerManager.java
index a079a2a..d4a30e3 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubFileTransformerManager.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/StubFileTransformerManager.java
@@ -25,24 +25,24 @@ import java.util.HashSet;
 import java.util.Map;
 
 import org.eclipse.aether.artifact.Artifact;
-import org.eclipse.aether.transform.FileTransformer;
-import org.eclipse.aether.transform.FileTransformerManager;
+import org.eclipse.aether.transform.ArtifactTransformer;
+import org.eclipse.aether.transform.ArtifactTransformerManager;
 
-public class StubFileTransformerManager implements FileTransformerManager
+public class StubFileTransformerManager implements ArtifactTransformerManager
 {
-    private Map<String, Collection<FileTransformer>> fileTransformers = new HashMap<>();
+    private Map<String, Collection<ArtifactTransformer>> fileTransformers = new HashMap<>();
     
     @Override
-    public Collection<FileTransformer> getTransformersForArtifact( Artifact artifact )
+    public Collection<ArtifactTransformer> getTransformersForArtifact( Artifact artifact )
     {
         return fileTransformers.get( artifact.getExtension() );
     }
     
-    public void addFileTransformer( String extension, FileTransformer fileTransformer )
+    public void addFileTransformer( String extension, ArtifactTransformer fileTransformer )
     {
         if ( !fileTransformers.containsKey( extension ) )
         {
-            fileTransformers.put( extension, new HashSet<FileTransformer>() );
+            fileTransformers.put( extension, new HashSet<ArtifactTransformer>() );
         }
         fileTransformers.get( extension ).add( fileTransformer );
     }
diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/ArtifactUpload.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/ArtifactUpload.java
index 90323b1..fc680c5 100644
--- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/ArtifactUpload.java
+++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/ArtifactUpload.java
@@ -25,7 +25,6 @@ import org.eclipse.aether.RequestTrace;
 import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.transfer.ArtifactTransferException;
 import org.eclipse.aether.transfer.TransferListener;
-import org.eclipse.aether.transform.FileTransformer;
 
 /**
  * An upload of an artifact to a remote repository. A repository connector processing this upload has to use
@@ -34,8 +33,6 @@ import org.eclipse.aether.transform.FileTransformer;
 public final class ArtifactUpload
     extends ArtifactTransfer
 {
-    private FileTransformer fileTransformer;
-
     /**
      * Creates a new uninitialized upload.
      */
@@ -56,24 +53,6 @@ public final class ArtifactUpload
         setFile( file );
     }
 
-    /**
-     * <p>Creates a new upload with the specified properties.</p> 
-     * 
-     * <p><strong>IMPORTANT</strong> When using a fileTransformer, the
-     * content of the file is stored in memory to ensure that file content and checksums stay in sync!
-     * </p>
-     * 
-     * @param artifact The artifact to upload, may be {@code null}.
-     * @param file The local file to upload the artifact from, may be {@code null}.
-     * @param fileTransformer The file transformer, may be {@code null}.
-     */
-    public ArtifactUpload( Artifact artifact, File file, FileTransformer fileTransformer )
-    {
-        setArtifact( artifact );
-        setFile( file );
-        setFileTransformer( fileTransformer );
-    }
-
     @Override
     public ArtifactUpload setArtifact( Artifact artifact )
     {
@@ -109,29 +88,10 @@ public final class ArtifactUpload
         return this;
     }
     
-    public ArtifactUpload setFileTransformer( FileTransformer fileTransformer )
-    {
-        this.fileTransformer = fileTransformer;
-        return this;
-    }
-    
-    public FileTransformer getFileTransformer()
-    {
-        return fileTransformer;
-    }
-
     @Override
     public String toString()
     {
-        if ( getFileTransformer() != null )
-        {
-            return getArtifact() + " >>> " + getFileTransformer().transformArtifact( getArtifact() )
-                + " - " + getFile();
-        }
-        else
-        {
-            return getArtifact() + " - " + getFile();
-        }
+        return getArtifact() + " - " + getFile();
     }
 
 }