Fixup 28ffaea Send transfer events to the client for better display #284

This commit is contained in:
Peter Palaga
2021-01-08 22:00:56 +01:00
parent 3beb854cc9
commit 3eb9d8d41b
6 changed files with 80 additions and 46 deletions

View File

@@ -787,7 +787,7 @@ public abstract class Message {
public static final int PUT = 2;
final String projectId;
final int request;
final int requestType;
final String repositoryId;
final String repositoryUrl;
final String resourceName;
@@ -795,13 +795,13 @@ public abstract class Message {
final long transferredBytes;
final String exception;
private TransferEvent(int type, String projectId, int request,
private TransferEvent(int type, String projectId, int requestType,
String repositoryId, String repositoryUrl,
String resourceName, long contentLength, long transferredBytes,
String exception) {
super(type);
this.projectId = projectId;
this.request = request;
this.requestType = requestType;
this.repositoryId = repositoryId;
this.repositoryUrl = repositoryUrl;
this.resourceName = resourceName;
@@ -814,8 +814,8 @@ public abstract class Message {
return projectId;
}
public int getRequest() {
return request;
public int getRequestType() {
return requestType;
}
public String getRepositoryId() {
@@ -846,7 +846,7 @@ public abstract class Message {
public String toString() {
return mnemonic() + "{" +
"projectId=" + projectId +
", request=" + request +
", requestType=" + requestType +
", repositoryId='" + repositoryId + '\'' +
", repositoryUrl='" + repositoryUrl + '\'' +
", resourceName='" + resourceName + '\'' +
@@ -879,7 +879,7 @@ public abstract class Message {
public void write(DataOutputStream output) throws IOException {
super.write(output);
writeUTF(output, projectId);
output.writeByte(request);
output.writeByte(requestType);
writeUTF(output, repositoryId);
writeUTF(output, repositoryUrl);
writeUTF(output, resourceName);
@@ -943,11 +943,11 @@ public abstract class Message {
return new ProjectEvent(Message.DISPLAY, projectId, message);
}
public static TransferEvent transfer(String projectId, int event, int request,
public static TransferEvent transfer(String projectId, int transferEventType, int requestType,
String repositoryId, String repositoryUrl,
String resourceName, long contentLength, long transferredBytes,
String exception) {
return new TransferEvent(event, projectId, request,
return new TransferEvent(transferEventType, projectId, requestType,
repositoryId, repositoryUrl, resourceName, contentLength, transferredBytes, exception);
}

View File

@@ -33,14 +33,24 @@ public class OsUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(OsUtils.class);
private static final long KB = 1024;
private static final String UNITS = "kmgt";
private static final String UNITS = "Bkmgt";
private OsUtils() {
}
public static String kbTohumanReadable(long kb) {
public static String bytesTohumanReadable(long bytes) {
int unit = 0;
while (bytes >= KB && unit < UNITS.length() - 1) {
bytes /= KB;
unit++;
}
String kbString = String.valueOf(bytes);
return new StringBuilder(kbString.length() + 1).append(kbString).append(UNITS.charAt(unit)).toString();
}
public static String kbTohumanReadable(long kb) {
int unit = 1;
while (kb >= KB && unit < UNITS.length() - 1) {
kb /= KB;
unit++;

View File

@@ -531,25 +531,26 @@ public class TerminalOutput implements ClientOutput {
return null;
}
TransferEvent event = transfers.iterator().next();
String action = event.getRequest() == TransferEvent.PUT ? "Uploading" : "Downloading";
String action = event.getRequestType() == TransferEvent.PUT ? "Uploading" : "Downloading";
if (transfers.size() == 1) {
String direction = event.getRequest() == TransferEvent.PUT ? "to" : "from";
String direction = event.getRequestType() == TransferEvent.PUT ? "to" : "from";
long cur = event.getTransferredBytes();
long max = event.getContentLength();
String prg = OsUtils.kbTohumanReadable(cur / 1024) + " / " + OsUtils.kbTohumanReadable(max / 1024);
AttributedStringBuilder asb = new AttributedStringBuilder();
asb.append(action);
asb.append(" ");
asb.append(' ');
asb.style(AttributedStyle.BOLD);
asb.append(pathToMaven(event.getResourceName()));
asb.style(AttributedStyle.DEFAULT);
asb.append(" ");
asb.append(' ');
asb.append(direction);
asb.append(" ");
asb.append(' ');
asb.append(event.getRepositoryId());
if (cur > 0 && cur < max) {
asb.append(": ");
asb.append(prg);
asb.append(' ');
asb.append(OsUtils.bytesTohumanReadable(cur));
asb.append('/');
asb.append(OsUtils.bytesTohumanReadable(max));
}
return asb.toAttributedString();
} else {

View File

@@ -1302,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 getDaemonTransferListener();
return getConsoleTransferListener();
} else {
return getBatchTransferListener();
}
}
protected TransferListener getDaemonTransferListener() {
return new DaemonMavenTransferListener(buildEventListener);
protected TransferListener getConsoleTransferListener() {
return new DaemonMavenTransferListener(buildEventListener, new Slf4jMavenTransferListener());
}
protected TransferListener getBatchTransferListener() {

View File

@@ -26,6 +26,8 @@ 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.eclipse.aether.transfer.TransferEvent.EventType;
import org.eclipse.aether.transfer.TransferEvent.RequestType;
import org.mvndaemon.mvnd.builder.DependencyGraph;
import org.mvndaemon.mvnd.common.Message;
import org.mvndaemon.mvnd.common.Message.BuildException;
@@ -114,37 +116,50 @@ public class ClientDispatcher extends BuildEventListener {
}
public void transfer(String projectId, TransferEvent e) {
int event;
final 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();
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("Unexpected " + EventType.class.getSimpleName() + ": " + e.getType());
}
final int requestType;
switch (e.getRequestType()) {
case GET:
requestType = Message.TransferEvent.GET;
break;
case GET_EXISTENCE:
requestType = Message.TransferEvent.GET_EXISTENCE;
break;
case PUT:
requestType = Message.TransferEvent.PUT;
break;
default:
throw new IllegalStateException("Unexpected " + RequestType.class.getSimpleName() + ": " + e.getRequestType());
}
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,
queue.add(Message.transfer(projectId, event, requestType, repositoryId, repositoryUrl, resourceName,
contentLength, transferredBytes, exception));
}

View File

@@ -24,38 +24,46 @@ import org.mvndaemon.mvnd.logging.smart.ProjectBuildLogAppender;
public class DaemonMavenTransferListener implements TransferListener {
private final BuildEventListener dispatcher;
private final TransferListener delegate;
public DaemonMavenTransferListener(BuildEventListener dispatcher) {
public DaemonMavenTransferListener(BuildEventListener dispatcher, TransferListener delegate) {
this.dispatcher = dispatcher;
this.delegate = delegate;
}
@Override
public void transferInitiated(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
delegate.transferInitiated(event);
}
@Override
public void transferStarted(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
delegate.transferStarted(event);
}
@Override
public void transferProgressed(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
delegate.transferProgressed(event);
}
@Override
public void transferCorrupted(TransferEvent event) throws TransferCancelledException {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
delegate.transferCorrupted(event);
}
@Override
public void transferSucceeded(TransferEvent event) {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
delegate.transferSucceeded(event);
}
@Override
public void transferFailed(TransferEvent event) {
dispatcher.transfer(ProjectBuildLogAppender.getProjectId(), event);
delegate.transferFailed(event);
}
}