Skip to content
Snippets Groups Projects
Commit 04a9caf9 authored by Vojtěch Moravec's avatar Vojtěch Moravec
Browse files

Allow consumer to set more than one listener.

This commit changes to listener/listanable logic, so that instead of
'setting' the single listener you are adding listener to array list of
listeners.
parent c8b8b83e
No related branches found
No related tags found
No related merge requests found
......@@ -8,6 +8,7 @@ import azgracompress.huffman.Huffman;
import azgracompress.io.OutBitStream;
import java.io.DataOutputStream;
import java.util.ArrayList;
public abstract class CompressorDecompressorBase {
public static final int LONG_BYTES = 8;
......@@ -17,35 +18,52 @@ public abstract class CompressorDecompressorBase {
protected final CompressionOptions options;
private final int codebookSize;
private IStatusListener statusListener = null;
private IProgressListener progressListener = null;
private ArrayList<IStatusListener> statusListeners;
private ArrayList<IProgressListener> progressListeners;
public CompressorDecompressorBase(CompressionOptions options) {
this.options = options;
this.codebookSize = (int) Math.pow(2, this.options.getBitsPerCodebookIndex());
// Default status listener, which can be override by setStatusListener.
statusListener = this::defaultLog;
addStatusListener(this::defaultLog);
}
public void setStatusListener(IStatusListener listener) {
this.statusListener = listener;
}
public void addStatusListener(final IStatusListener listener) {
public void setProgressListener(IProgressListener listener) {
this.progressListener = listener;
if (statusListeners == null) {
statusListeners = new ArrayList<>(1);
}
statusListeners.add(listener);
}
protected IProgressListener getProgressListener() {
return progressListener;
public void addProgressListener(final IProgressListener listener) {
if (this.progressListeners == null) {
this.progressListeners = new ArrayList<>(1);
}
this.progressListeners.add(listener);
}
protected IStatusListener getStatusListener() {
return statusListener;
protected void duplicateAllListeners(IListenable other) {
if (other == this)
return;
if (this.statusListeners != null) {
for (final IStatusListener statusListener : this.statusListeners) {
other.addStatusListener(statusListener);
}
}
if (this.progressListeners != null) {
for (final IProgressListener progressListener : this.progressListeners) {
other.addProgressListener(progressListener);
}
}
}
protected void reportStatusToListeners(final String status) {
if (this.statusListener != null) {
this.statusListener.sendMessage(status);
if (this.statusListeners != null) {
for (final IStatusListener listener : this.statusListeners) {
listener.sendMessage(status);
}
}
}
......@@ -54,8 +72,10 @@ public abstract class CompressorDecompressorBase {
}
protected void reportProgressListeners(final int index, final int finalIndex, final String message) {
if (this.progressListener != null) {
this.progressListener.sendProgress(message, index, finalIndex);
if (this.progressListeners != null) {
for (final IProgressListener listener : this.progressListeners) {
listener.sendProgress(message, index, finalIndex);
}
}
}
......
......@@ -5,16 +5,16 @@ import azgracompress.compression.listeners.IStatusListener;
public interface IListenable {
/**
* Set status listener. Status messages are reported to this listener.
* Add status listener. Status messages are reported to this listener.
*
* @param listener Status listener.
*/
void setStatusListener(IStatusListener listener);
void addStatusListener(IStatusListener listener);
/**
* Set progress listener. Status messages with progress information are reported to this listener.
* Add progress listener. Status messages with progress information are reported to this listener.
*
* @param listener Progress listener.
*/
void setProgressListener(IProgressListener listener);
void addProgressListener(IProgressListener listener);
}
package azgracompress.compression;
import azgracompress.cli.ParsedCliOptions;
import azgracompress.compression.exception.ImageCompressionException;
import azgracompress.compression.listeners.IProgressListener;
import azgracompress.compression.listeners.IStatusListener;
......@@ -21,7 +20,7 @@ public class ImageCompressor extends CompressorDecompressorBase {
* @return Correct implementation of image compressor or null if configuration is not valid.
*/
private IImageCompressor getImageCompressor() {
IImageCompressor compressor = null;
IImageCompressor compressor;
switch (options.getQuantizationType()) {
case Scalar:
compressor = new SQImageCompressor(options);
......@@ -38,14 +37,7 @@ public class ImageCompressor extends CompressorDecompressorBase {
}
// Forward listeners to image compressor.
final IStatusListener parentStatusListener = getStatusListener();
if (parentStatusListener != null)
compressor.setStatusListener(parentStatusListener);
final IProgressListener parentProgressListener = getProgressListener();
if (parentProgressListener != null)
compressor.setProgressListener(parentProgressListener);
duplicateAllListeners(compressor);
return compressor;
}
......
......@@ -40,7 +40,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
* @return Correct implementation of image decompressor.
*/
private IImageDecompressor getImageDecompressor(final QCMPFileHeader header) {
IImageDecompressor decompressor = null;
IImageDecompressor decompressor;
switch (header.getQuantizationType()) {
case Scalar:
decompressor = new SQImageDecompressor(options);
......@@ -56,14 +56,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
}
// Forward listeners to image decompressor.
final IStatusListener parentStatusListener = getStatusListener();
if (parentStatusListener != null)
decompressor.setStatusListener(parentStatusListener);
final IProgressListener parentProgressListener = getProgressListener();
if (parentProgressListener != null)
decompressor.setProgressListener(parentProgressListener);
duplicateAllListeners(decompressor);
return decompressor;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment