Fix poor usage of compareTo.

This commit is contained in:
Major-
2015-03-06 22:32:17 +00:00
parent 91f9005954
commit d787906514
4 changed files with 81 additions and 58 deletions
@@ -11,29 +11,27 @@ public final class OnDemandRequest implements Comparable<OnDemandRequest> {
/**
* An enumeration containing the different request priorities.
*
* @author Graham
*/
public enum Priority {
/**
* High priority - used in-game when data is required immediately but has not yet been received.
* High priority - used when a player is in-game and data is required immediately.
*/
HIGH(0),
/**
* Medium priority - used while loading the 'bare minimum' required to run the game.
* Medium priority - used while loading extra resources when the client is not logged in.
*/
MEDIUM(1),
/**
* Low priority - used when a file is not required urgently. The client login screen says
* "loading extra files.." when low priority loading is being performed.
* Low priority - used when a file is not required urgently (such as when serving the rest of the cache whilst
* the player is in-game).
*/
LOW(2);
/**
* Converts the integer value to a priority.
* Converts the integer value to a Priority.
*
* @param value The integer value.
* @return The priority.
@@ -58,7 +56,7 @@ public final class OnDemandRequest implements Comparable<OnDemandRequest> {
private final int value;
/**
* Creates a priority.
* Creates the Priority.
*
* @param value The integer value.
*/
@@ -66,6 +64,18 @@ public final class OnDemandRequest implements Comparable<OnDemandRequest> {
this.value = value;
}
/**
* Compares this Priority with the specified other Priority.
* <p>
* Used as an ordinal-independent variant of {@link #compareTo}.
*
* @param other The other Priority.
* @return 1 if this Priority is greater than {@code other}, 0 if they are equal, otherwise -1.
*/
public int compareWith(Priority other) {
return Integer.compare(value, other.value);
}
/**
* Converts the priority to an integer.
*
@@ -78,52 +88,44 @@ public final class OnDemandRequest implements Comparable<OnDemandRequest> {
}
/**
* The file descriptor.
* The FileDescriptor.
*/
private final FileDescriptor fileDescriptor;
private final FileDescriptor descriptor;
/**
* The request priority.
* The request Priority.
*/
private final Priority priority;
/**
* Creates the 'on-demand' request.
* Creates the OnDemandRequest.
*
* @param fileDescriptor The file descriptor.
* @param priority The priority.
* @param descriptor The {@link FileDescriptor}.
* @param priority The {@link Priority}.
*/
public OnDemandRequest(FileDescriptor fileDescriptor, Priority priority) {
this.fileDescriptor = fileDescriptor;
public OnDemandRequest(FileDescriptor descriptor, Priority priority) {
this.descriptor = descriptor;
this.priority = priority;
}
@Override
public int compareTo(OnDemandRequest other) {
int thisPriority = priority.toInteger();
int otherPriority = other.priority.toInteger();
if (thisPriority < otherPriority) {
return 1;
} else if (thisPriority == otherPriority) {
return 0;
}
return -1;
return priority.compareWith(other.priority);
}
/**
* Gets the file descriptor.
* Gets the {@link FileDescriptor}.
*
* @return The file descriptor.
* @return The FileDescriptor.
*/
public FileDescriptor getFileDescriptor() {
return fileDescriptor;
return descriptor;
}
/**
* Gets the priority.
* Gets the {@link Priority}.
*
* @return The priority.
* @return The Priority.
*/
public Priority getPriority() {
return priority;
+2 -11
View File
@@ -8,7 +8,7 @@ import io.netty.channel.Channel;
* @author Graham
* @param <T> The type of request.
*/
public final class ChannelRequest<T> implements Comparable<ChannelRequest<T>> {
public class ChannelRequest<T> {
/**
* The channel.
@@ -18,7 +18,7 @@ public final class ChannelRequest<T> implements Comparable<ChannelRequest<T>> {
/**
* The request.
*/
private final T request;
protected final T request;
/**
* Creates a new channel request.
@@ -31,15 +31,6 @@ public final class ChannelRequest<T> implements Comparable<ChannelRequest<T>> {
this.request = request;
}
@SuppressWarnings("unchecked")
@Override
public int compareTo(ChannelRequest<T> o) {
if (request instanceof Comparable<?> && o.request instanceof Comparable<?>) {
return ((Comparable<T>) request).compareTo(o.request);
}
return 0;
}
/**
* Gets the channel.
*
@@ -0,0 +1,30 @@
package org.apollo.update;
import io.netty.channel.Channel;
/**
* A {@link ChannelRequest} with a {@link Comparable} request type.
*
* @author Major
*
* @param <T> The type of request.
*/
public final class ComparableChannelRequest<T extends Comparable<T>> extends ChannelRequest<T> implements
Comparable<ComparableChannelRequest<T>> {
/**
* Creates the ComparableChannelRequest.
*
* @param channel The {@link Channel} making the request.
* @param request The request.
*/
public ComparableChannelRequest(Channel channel, T request) {
super(channel, request);
}
@Override
public int compareTo(ComparableChannelRequest<T> o) {
return request.compareTo(o.request);
}
}
+17 -17
View File
@@ -11,7 +11,7 @@ import org.apollo.net.codec.jaggrab.JagGrabRequest;
import org.apollo.net.codec.update.OnDemandRequest;
/**
* A class which dispatches requests to worker threads.
* Dispatches update requests to worker threads.
*
* @author Graham
*/
@@ -22,20 +22,20 @@ public final class UpdateDispatcher {
*/
private static final int MAXIMUM_QUEUE_SIZE = 1024;
/**
* A queue for pending 'on-demand' requests.
*/
private final BlockingQueue<ComparableChannelRequest<OnDemandRequest>> demand = new PriorityBlockingQueue<>();
/**
* A queue for pending HTTP requests.
*/
private final BlockingQueue<ChannelRequest<HttpRequest>> httpQueue = new LinkedBlockingQueue<>();
private final BlockingQueue<ChannelRequest<HttpRequest>> http = new LinkedBlockingQueue<>();
/**
* A queue for pending JAGGRAB requests.
*/
private final BlockingQueue<ChannelRequest<JagGrabRequest>> jagGrabQueue = new LinkedBlockingQueue<>();
/**
* A queue for pending 'on-demand' requests.
*/
private final BlockingQueue<ChannelRequest<OnDemandRequest>> onDemandQueue = new PriorityBlockingQueue<>();
private final BlockingQueue<ChannelRequest<JagGrabRequest>> jaggrab = new LinkedBlockingQueue<>();
/**
* Dispatches a HTTP request.
@@ -44,10 +44,10 @@ public final class UpdateDispatcher {
* @param request The request.
*/
public void dispatch(Channel channel, HttpRequest request) {
if (httpQueue.size() >= MAXIMUM_QUEUE_SIZE) {
if (http.size() >= MAXIMUM_QUEUE_SIZE) {
channel.close();
}
httpQueue.add(new ChannelRequest<>(channel, request));
http.add(new ChannelRequest<>(channel, request));
}
/**
@@ -57,10 +57,10 @@ public final class UpdateDispatcher {
* @param request The request.
*/
public void dispatch(Channel channel, JagGrabRequest request) {
if (jagGrabQueue.size() >= MAXIMUM_QUEUE_SIZE) {
if (jaggrab.size() >= MAXIMUM_QUEUE_SIZE) {
channel.close();
}
jagGrabQueue.add(new ChannelRequest<>(channel, request));
jaggrab.add(new ChannelRequest<>(channel, request));
}
/**
@@ -70,10 +70,10 @@ public final class UpdateDispatcher {
* @param request The request.
*/
public void dispatch(Channel channel, OnDemandRequest request) {
if (onDemandQueue.size() >= MAXIMUM_QUEUE_SIZE) {
if (demand.size() >= MAXIMUM_QUEUE_SIZE) {
channel.close();
}
onDemandQueue.add(new ChannelRequest<>(channel, request));
demand.add(new ComparableChannelRequest<>(channel, request));
}
/**
@@ -83,7 +83,7 @@ public final class UpdateDispatcher {
* @throws InterruptedException If the thread is interrupted.
*/
ChannelRequest<HttpRequest> nextHttpRequest() throws InterruptedException {
return httpQueue.take();
return http.take();
}
/**
@@ -93,7 +93,7 @@ public final class UpdateDispatcher {
* @throws InterruptedException If the thread is interrupted.
*/
ChannelRequest<JagGrabRequest> nextJagGrabRequest() throws InterruptedException {
return jagGrabQueue.take();
return jaggrab.take();
}
/**
@@ -103,7 +103,7 @@ public final class UpdateDispatcher {
* @throws InterruptedException If the thread is interrupted.
*/
ChannelRequest<OnDemandRequest> nextOnDemandRequest() throws InterruptedException {
return onDemandQueue.take();
return demand.take();
}
}