blob: e871db7be20242975afcc2d140bac8caec819379 [file] [log] [blame]
/**
* Copyright (c) 2015 Codetrails GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.epp.internal.logging.aeri.ide.utils;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.eclipse.epp.internal.logging.aeri.ide.l10n.LogMessages.WARN_RESPONSE_UPLOAD_REPORT_FAILED;
import static org.eclipse.epp.internal.logging.aeri.ide.utils.Formats.format;
import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.epp.internal.logging.aeri.ide.IIdeFactory;
import org.eclipse.epp.internal.logging.aeri.ide.ILogEvent;
import org.eclipse.epp.internal.logging.aeri.ide.ILogEventGroup;
import org.eclipse.epp.internal.logging.aeri.ide.IServerDescriptor;
import org.eclipse.epp.internal.logging.aeri.ide.l10n.Messages;
import org.eclipse.epp.logging.aeri.core.IModelFactory;
import org.eclipse.epp.logging.aeri.core.IProblemState;
import org.eclipse.epp.logging.aeri.core.IServerConnection;
import org.eclipse.epp.logging.aeri.core.ProblemStatus;
import org.eclipse.epp.logging.aeri.core.util.Logs;
import org.eclipse.jdt.annotation.Nullable;
public class UploadReportsScheduler {
@Nullable
Job uploadJob = null;
ConcurrentLinkedQueue<ILogEventGroup> uploadQueue = new ConcurrentLinkedQueue<>();
public IProblemState send(ILogEvent event, IProgressMonitor monitor) {
IServerDescriptor server = event.getServer();
IServerConnection cx = server.getConnection();
if (!server.isActive()) {
// we skip reports for not yet enabled end-points! TODO should we get so far with this?
String msg = Formats.format(Messages.RESPONSE_REPORT_UPLOADED, server.getName(), event.getStatus().getMessage());
IProblemState response = IModelFactory.eINSTANCE.createProblemState();
response.setStatus(ProblemStatus.FAILURE);
response.setMessage(msg);
event.setResponse(response);
Logs.debug(msg);
}
try {
IProblemState response = cx.submit(event.getStatus(), event.getContext(), SubMonitor.convert(monitor, 1));
checkNotNull(response, "Server returned null response"); //$NON-NLS-1$
event.setResponse(response);
} catch (UnknownHostException e) {
Logs.debug("Failed to connect to server ''{0}''", e, server.getName());
IProblemState response = IModelFactory.eINSTANCE.createProblemState();
response.setStatus(ProblemStatus.FAILURE);
response.setMessage(
format(Messages.RESPONSE_REPORT_UPLOAD_FAILED, server.getName(), "Unknown Host Exception: " + e.getMessage()));
event.setResponse(response);
} catch (Exception e) {
Logs.log(WARN_RESPONSE_UPLOAD_REPORT_FAILED, e, server.getName(), e.getMessage());
IProblemState response = IModelFactory.eINSTANCE.createProblemState();
response.setStatus(ProblemStatus.FAILURE);
response.setMessage(format(Messages.RESPONSE_REPORT_UPLOAD_FAILED, server.getName(), e.getMessage()));
event.setResponse(response);
}
monitor.done();
return event.getResponse();
}
public void send(ILogEventGroup group, IProgressMonitor monitor) {
SubMonitor sub = SubMonitor.convert(monitor, group.getEvents().size());
for (ILogEvent event : group.getEvents()) {
send(event, sub.newChild(1));
}
monitor.done();
}
public void schedule(ILogEvent event) {
ILogEventGroup group = IIdeFactory.eINSTANCE.createLogEventGroup();
group.setStatus(event.getStatus());
group.getEvents().add(event);
group.setStatus(event.getStatus());
schedule(group);
}
public void schedule(ILogEventGroup group) {
if (group == null) {
Logs.warn("Got a NULL log event group. Please comment on bug 494165 if you know how to reproduce this error.");
return;
}
uploadQueue.add(group);
if (uploadJob != null && uploadJob.getState() == Job.RUNNING) {
return;
}
uploadJob = new UploadJob(Messages.JOB_NAME_UPLOADING_REPORTS);
uploadJob.schedule();
}
public void schedule(Iterable<ILogEventGroup> groups) {
for (ILogEventGroup group : groups) {
schedule(group);
}
}
private final class UploadJob extends Job {
private UploadJob(String name) {
super(name);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
while (!uploadQueue.isEmpty()) {
ILogEventGroup group = uploadQueue.poll();
send(group, monitor);
}
return Status.OK_STATUS;
}
}
}