package de.otto.edison.jobs.eventbus;
import de.otto.edison.jobs.domain.Level;
import de.otto.edison.jobs.eventbus.events.StateChangeEvent.State;
import de.otto.edison.jobs.service.JobRunnable;
import net.jcip.annotations.Immutable;
import org.slf4j.Marker;
import org.springframework.context.ApplicationEventPublisher;
import java.util.Objects;
import java.util.Optional;
import static de.otto.edison.jobs.domain.Level.ERROR;
import static de.otto.edison.jobs.domain.Level.INFO;
import static de.otto.edison.jobs.domain.Level.WARNING;
import static de.otto.edison.jobs.eventbus.events.MessageEvent.newMessageEvent;
import static de.otto.edison.jobs.eventbus.events.StateChangeEvent.newStateChangeEvent;
@Immutable
public class JobEventPublisher {
private final ApplicationEventPublisher applicationEventPublisher;
private final JobRunnable jobRunnable;
private final String jobId;
private JobEventPublisher(final ApplicationEventPublisher applicationEventPublisher,
final JobRunnable jobRunnable,
final String jobId) {
this.applicationEventPublisher = applicationEventPublisher;
this.jobRunnable = jobRunnable;
this.jobId = jobId;
}
public void stateChanged(final State state) {
applicationEventPublisher.publishEvent(newStateChangeEvent(jobRunnable, jobId, state));
}
public void message(final Level level, final String message) {
applicationEventPublisher.publishEvent(newMessageEvent(jobRunnable, jobId, level, message, Optional.empty()));
}
public void message(final Marker marker, final Level level, final String message) {
applicationEventPublisher.publishEvent(newMessageEvent(jobRunnable, jobId, level, message, Optional.of(marker)));
}
public void skipped() {
stateChanged(State.SKIPPED);
}
public void info(final String message) {
message(INFO, message);
}
public void warn(final String message) {
message(WARNING, message);
}
public void error(final String message) {
message(ERROR, message);
}
public void info(final Marker marker, final String message) {
message(marker, INFO, message);
}
public void warn(final Marker marker, final String message) {
message(marker, WARNING, message);
}
public void error(final Marker marker, final String message) {
message(marker, ERROR, message);
}
public static JobEventPublisher newJobEventPublisher(final ApplicationEventPublisher applicationEventPublisher,
final JobRunnable jobRunnable,
final String jobId) {
return new JobEventPublisher(
applicationEventPublisher,
jobRunnable,
jobId
);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
JobEventPublisher that = (JobEventPublisher) o;
return Objects.equals(applicationEventPublisher, that.applicationEventPublisher) &&
Objects.equals(jobRunnable, that.jobRunnable) &&
Objects.equals(jobId, that.jobId);
}
@Override
public int hashCode() {
return Objects.hash(applicationEventPublisher, jobRunnable, jobId);
}
@Override
public String toString() {
return "JobEventPublisher{" +
"applicationEventPublisher=" + applicationEventPublisher +
", jobRunnable=" + jobRunnable +
", jobId=" + jobId +
'}';
}
}