As I've written before, this PR can be fixed without breaking other stuff by 
using any form of serialization:

Just use the following class:

DeployRequestList

package org.apache.maven.plugin.deploy;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

import org.apache.maven.project.MavenProject;

/**
 * unique global list of deploy requests which are to be executed at the end of 
a multimodule project
 * 
 * 
 */
public class DeployRequestList implements Serializable {
        
        private List<DeployRequest> list;
        
        public DeployRequestList(Integer initialListSize) {
                list = new ArrayList<DeployRequest>(initialListSize);
        }
        
        public DeployRequestList(List<DeployRequest> deployRequests) {
                this.list = deployRequests;
        }

        public List<DeployRequest> getList() {
                return list;
        }

        public String serialize() {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                XMLEncoder encoder = new XMLEncoder(new 
BufferedOutputStream(baos));
                encoder.writeObject(getList().size());
                for (DeployRequest request : getList()) {
                        if (request == null) {
                                encoder.writeObject(null);
                        } else {
                                request.serializeIn(encoder);
                        }
                }
                encoder.close();
                String result = new String(baos.toByteArray(), 
StandardCharsets.UTF_8);
                return result;
        }
        
        public static DeployRequestList deserialize(String 
serializedDeployRequestList, List<MavenProject> reactorProjects) {
                ByteArrayInputStream bais = new 
ByteArrayInputStream(serializedDeployRequestList.getBytes(StandardCharsets.UTF_8));
                
                XMLDecoder decoder = new XMLDecoder(new 
BufferedInputStream(bais));
                Integer listSize = (Integer) decoder.readObject();
                
                DeployRequestList result = new DeployRequestList(listSize);
                for (int i=0; i < listSize; i++) {
                        String projectFile = (String) decoder.readObject();
                        if (projectFile == null) {
                                result.getList().add(null);
                        } else {
                                
result.getList().add(DeployRequest.deserialize(decoder, reactorProjects, 
projectFile));
                        }
                }

                decoder.close();
            
            return result;
        }
        
}

And add serialize/deserialize functions to DeployRequest:

public void serializeIn(XMLEncoder encoder) {
                encoder.writeObject(getProject().getFile().getAbsolutePath());
            encoder.writeObject(updateReleaseInfo);
            encoder.writeObject(getRetryFailedDeploymentCount());
            encoder.writeObject(getAltDeploymentRepository());
            encoder.writeObject(getAltSnapshotDeploymentRepository());
            encoder.writeObject(getAltReleaseDeploymentRepository());
        }

        public static DeployRequest deserialize(XMLDecoder decoder, 
List<MavenProject> reactorProjects,
                        String projectFile) {
                MavenProject project = null;
                for (MavenProject reactorProject : reactorProjects) {
                        if 
(projectFile.equals(reactorProject.getFile().getAbsolutePath())) {
                                project = reactorProject;
                                break;
                        }
                }
                if (project==null) {
                        throw new RuntimeException("Project for file '" + 
projectFile + "' could not be found within reactorprojects.");
                }
                
                boolean read_isUpdateReleaseInfo = (Boolean) 
decoder.readObject();
                int read_retryFailedDeploymentCount = (Integer) 
decoder.readObject();
                String read_altDeploymentRepository = (String) 
decoder.readObject();
                String read_altSnapshotDeploymentRepository = (String) 
decoder.readObject();
                String read_altReleaseDeploymentRepository = (String) 
decoder.readObject();
                
                return new DeployRequest().setProject( project 
).setUpdateReleaseInfo( read_isUpdateReleaseInfo 
).setRetryFailedDeploymentCount( read_retryFailedDeploymentCount 
).setAltReleaseDeploymentRepository( read_altReleaseDeploymentRepository 
).setAltSnapshotDeploymentRepository( read_altSnapshotDeploymentRepository 
).setAltDeploymentRepository( read_altDeploymentRepository );
        }

Then you can easily serialize the list into the property string. I don't think 
Maven Core will change its concept of different class loaders. So to hang up 
shared stuff in a shared variable is the way to go.

[ Full content available at: 
https://github.com/apache/maven-deploy-plugin/pull/1 ]
This message was relayed via gitbox.apache.org for [email protected]

Reply via email to