Send transfer events to the client for better display, fixes #284 (#313)

This commit is contained in:
Guillaume Nodet
2021-01-08 20:28:02 +01:00
committed by GitHub
parent 0f438bdb09
commit 28ffaeaecc
7 changed files with 379 additions and 9 deletions

View File

@@ -94,6 +94,7 @@ import org.mvndaemon.mvnd.logging.internal.Slf4jLoggerManager;
import org.mvndaemon.mvnd.logging.smart.BuildEventListener;
import org.mvndaemon.mvnd.logging.smart.LoggingExecutionListener;
import org.mvndaemon.mvnd.logging.smart.LoggingOutputStream;
import org.mvndaemon.mvnd.transfer.DaemonMavenTransferListener;
import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1301,14 +1302,14 @@ public class DaemonMavenCli {
// If we're logging to a file then we don't want the console transfer listener as it will spew
// download progress all over the place
//
return getConsoleTransferListener(cliRequest.commandLine.hasOption(CLIManager.DEBUG));
return getDaemonTransferListener();
} else {
return getBatchTransferListener();
}
}
protected TransferListener getConsoleTransferListener(boolean printResourceNames) {
return new Slf4jMavenTransferListener(); // see https://github.com/mvndaemon/mvnd/issues/284
protected TransferListener getDaemonTransferListener() {
return new DaemonMavenTransferListener(buildEventListener);
}
protected TransferListener getBatchTransferListener() {

View File

@@ -25,6 +25,7 @@ import org.apache.maven.execution.ExecutionEvent;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.project.MavenProject;
import org.eclipse.aether.transfer.TransferEvent;
import org.mvndaemon.mvnd.builder.DependencyGraph;
import org.mvndaemon.mvnd.common.Message;
import org.mvndaemon.mvnd.common.Message.BuildException;
@@ -112,6 +113,41 @@ public class ClientDispatcher extends BuildEventListener {
queue.add(Message.log(trimTrailingEols(msg)));
}
public void transfer(String projectId, TransferEvent e) {
int event;
switch (e.getType()) {
case INITIATED:
event = Message.TRANSFER_INITIATED;
break;
case STARTED:
event = Message.TRANSFER_STARTED;
break;
case PROGRESSED:
event = Message.TRANSFER_PROGRESSED;
break;
case CORRUPTED:
event = Message.TRANSFER_CORRUPTED;
break;
case SUCCEEDED:
event = Message.TRANSFER_SUCCEEDED;
break;
case FAILED:
event = Message.TRANSFER_FAILED;
break;
default:
throw new IllegalStateException();
}
int request = e.getRequestType().ordinal();
String repositoryId = e.getResource().getRepositoryId();
String repositoryUrl = e.getResource().getRepositoryUrl();
String resourceName = e.getResource().getResourceName();
long contentLength = e.getResource().getContentLength();
long transferredBytes = e.getTransferredBytes();
String exception = e.getException() != null ? e.getException().toString() : null;
queue.add(Message.transfer(projectId, event, request, repositoryId, repositoryUrl, resourceName,
contentLength, transferredBytes, exception));
}
private MavenProject getCurrentProject(MavenSession mavenSession) {
// Workaround for https://issues.apache.org/jira/browse/MNG-6979
// MavenSession.getCurrentProject() does not return the correct value in some cases

View File

@@ -567,6 +567,15 @@ public class Server implements AutoCloseable, Runnable {
return 3;
case Message.MOJO_STARTED:
return 4;
case Message.TRANSFER_INITIATED:
case Message.TRANSFER_STARTED:
return 40;
case Message.TRANSFER_PROGRESSED:
return 41;
case Message.TRANSFER_CORRUPTED:
case Message.TRANSFER_SUCCEEDED:
case Message.TRANSFER_FAILED:
return 42;
case Message.PROJECT_LOG_MESSAGE:
return 50;
case Message.BUILD_LOG_MESSAGE:

View File

@@ -16,6 +16,7 @@
package org.mvndaemon.mvnd.logging.smart;
import org.apache.maven.execution.ExecutionEvent;
import org.eclipse.aether.transfer.TransferEvent;
/**
* An abstract build event sink.
@@ -47,6 +48,8 @@ public abstract class BuildEventListener {
public void log(String msg) {
}
public void transfer(String projectId, TransferEvent e) {
}
};
/**
@@ -74,4 +77,6 @@ public abstract class BuildEventListener {
public abstract void fail(Throwable t) throws Exception;
public abstract void log(String msg);
public abstract void transfer(String projectId, TransferEvent e);
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright 2021 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.mvndaemon.mvnd.transfer;
import org.eclipse.aether.transfer.TransferCancelledException;
import org.eclipse.aether.transfer.TransferEvent;
import org.eclipse.aether.transfer.TransferListener;
import org.mvndaemon.mvnd.logging.smart.BuildEventListener;
import org.mvndaemon.mvnd.logging.smart.ProjectBuildLogAppender;
public class DaemonMavenTransferListener implements TransferListener {
private final BuildEventListener dispatcher;
public DaemonMavenTransferListener(BuildEventListener dispatcher) {
this.dispatcher = dispatcher;
}
@Override
public void transferInitiated(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
}
@Override
public void transferStarted(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
}
@Override
public void transferProgressed(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
}
@Override
public void transferCorrupted(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
}
@Override
public void transferSucceeded(TransferEvent event) {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
}
@Override
public void transferFailed(TransferEvent event) {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
}
}