// Path: webcrawler-downloader/src/main/java/com/zongtui/webcrawler/sourceer/Request.java
// public class Request implements Serializable {
// 
//     private static final long serialVersionUID = 2062192774891352043L;
// 
//     public static final String CYCLE_TRIED_TIMES = "_cycle_tried_times";
//     public static final String STATUS_CODE = "statusCode";
//     public static final String PROXY = "proxy";
// 
//     private String url;
// 
//     private String method;
// 
//     /**
//      * Store additional information in extras.
//      */
//     private Map<String, Object> extras;
// 
//     /**
//      * Priority of the request.<br>
//      * The bigger will be processed earlier. <br>
//      * @see us.codecraft.webmagic.scheduler.PriorityScheduler
//      */
//     private long priority;
// 
//     public Request() {
//     }
// 
//     public Request(String url) {
//         this.url = url;
//     }
// 
//     public long getPriority() {
//         return priority;
//     }
// 
//     /**
//      * Set the priority of request for sorting.<br>
//      * Need a scheduler supporting priority.<br>
//      * @see us.codecraft.webmagic.scheduler.PriorityScheduler
//      *
//      * @param priority
//      * @return this
//      */
//     @Experimental
//     public Request setPriority(long priority) {
//         this.priority = priority;
//         return this;
//     }
// 
//     public Object getExtra(String key) {
//         if (extras == null) {
//             return null;
//         }
//         return extras.get(key);
//     }
// 
//     public Request putExtra(String key, Object value) {
//         if (extras == null) {
//             extras = new HashMap<String, Object>();
//         }
//         extras.put(key, value);
//         return this;
//     }
// 
//     public String getUrl() {
//         return url;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         Request request = (Request) o;
// 
//         if (!url.equals(request.url)) return false;
// 
//         return true;
//     }
// 
//     public Map<String, Object> getExtras() {
//         return extras;
//     }
// 
//     @Override
//     public int hashCode() {
//         return url.hashCode();
//     }
// 
//     public void setExtras(Map<String, Object> extras) {
//         this.extras = extras;
//     }
// 
//     public void setUrl(String url) {
//         this.url = url;
//     }
// 
//     /**
//      * The http method of the request. Get for default.
//      * @return httpMethod
//      * @see us.codecraft.webmagic.utils.HttpConstant.Method
//      * @since 0.5.0
//      */
//     public String getMethod() {
//         return method;
//     }
// 
//     public void setMethod(String method) {
//         this.method = method;
//     }
// 
//     @Override
//     public String toString() {
//         return "Request{" +
//                 "url='" + url + '\'' +
//                 ", method='" + method + '\'' +
//                 ", extras=" + extras +
//                 ", priority=" + priority +
//                 '}';
//     }
// }
// 
// Path: webcrawler-downloader/src/main/java/com/zongtui/webcrawler/sourceer/Task.java
// public interface Task {
// 
//     /**
//      * unique id for a task.
//      *
//      * @return uuid
//      */
//     public String getUUID();
// 
//     /**
//      * site of a task
//      *
//      * @return site
//      */
//     public Site getSite();
// 
// }
// 
// Path: webcrawler-downloader/src/main/java/com/zongtui/webcrawler/sourceer/utils/NumberUtils.java
// public abstract class NumberUtils {
// 
//     public static int compareLong(long o1, long o2) {
//         if (o1 < o2) {
//             return -1;
//         } else if (o1 == o2) {
//             return 0;
//         } else {
//             return 1;
//         }
//     }
// }


import java.util.Comparator;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import org.apache.http.annotation.ThreadSafe;
import com.zongtui.webcrawler.sourceer.Request;
import com.zongtui.webcrawler.sourceer.Task;
import com.zongtui.webcrawler.sourceer.utils.NumberUtils;

        public int compare(Request o1, Request o2) {
            return -NumberUtils.compareLong(o1.getPriority(), o2.getPriority());
        }
    });

    @Override
    public void pushWhenNoDuplicate(Request request, Task task) {
        if (request.getPriority() == 0) {
            noPriorityQueue.add(request);
        } else if (request.getPriority() > 0) {
            priorityQueuePlus.put(request);
        } else {
            priorityQueueMinus.put(request);
        }
    }

    @Override
    public synchronized Request poll(Task task) {
        Request poll = priorityQueuePlus.poll();
        if (poll != null) {
            return poll;
        }
        poll = noPriorityQueue.poll();
        if (poll != null) {
            return poll;
        }
        return priorityQueueMinus.poll();
    }

    @Override

// Path: webcrawler-downloader/src/main/java/com/zongtui/webcrawler/sourceer/Request.java
// public class Request implements Serializable {
// 
//     private static final long serialVersionUID = 2062192774891352043L;
// 
//     public static final String CYCLE_TRIED_TIMES = "_cycle_tried_times";
//     public static final String STATUS_CODE = "statusCode";
//     public static final String PROXY = "proxy";
// 
//     private String url;
// 
//     private String method;
// 
//     /**
//      * Store additional information in extras.
//      */
//     private Map<String, Object> extras;
// 
//     /**
//      * Priority of the request.<br>
//      * The bigger will be processed earlier. <br>
//      * @see us.codecraft.webmagic.scheduler.PriorityScheduler
//      */
//     private long priority;
// 
//     public Request() {
//     }
// 
//     public Request(String url) {
//         this.url = url;
//     }
// 
//     public long getPriority() {
//         return priority;
//     }
// 
//     /**
//      * Set the priority of request for sorting.<br>
//      * Need a scheduler supporting priority.<br>
//      * @see us.codecraft.webmagic.scheduler.PriorityScheduler
//      *
//      * @param priority
//      * @return this
//      */
//     @Experimental
//     public Request setPriority(long priority) {
//         this.priority = priority;
//         return this;
//     }
// 
//     public Object getExtra(String key) {
//         if (extras == null) {
//             return null;
//         }
//         return extras.get(key);
//     }
// 
//     public Request putExtra(String key, Object value) {
//         if (extras == null) {
//             extras = new HashMap<String, Object>();
//         }
//         extras.put(key, value);
//         return this;
//     }
// 
//     public String getUrl() {
//         return url;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         Request request = (Request) o;
// 
//         if (!url.equals(request.url)) return false;
// 
//         return true;
//     }
// 
//     public Map<String, Object> getExtras() {
//         return extras;
//     }
// 
//     @Override
//     public int hashCode() {
//         return url.hashCode();
//     }
// 
//     public void setExtras(Map<String, Object> extras) {
//         this.extras = extras;
//     }
// 
//     public void setUrl(String url) {
//         this.url = url;
//     }
// 
//     /**
//      * The http method of the request. Get for default.
//      * @return httpMethod
//      * @see us.codecraft.webmagic.utils.HttpConstant.Method
//      * @since 0.5.0
//      */
//     public String getMethod() {
//         return method;
//     }
// 
//     public void setMethod(String method) {
//         this.method = method;
//     }
// 
//     @Override
//     public String toString() {
//         return "Request{" +
//                 "url='" + url + '\'' +
//                 ", method='" + method + '\'' +
//                 ", extras=" + extras +
//                 ", priority=" + priority +
//                 '}';
//     }
// }
// 
// Path: webcrawler-downloader/src/main/java/com/zongtui/webcrawler/sourceer/Task.java
// public interface Task {
// 
//     /**
//      * unique id for a task.
//      *
//      * @return uuid
//      */
//     public String getUUID();
// 
//     /**
//      * site of a task
//      *
//      * @return site
//      */
//     public Site getSite();
// 
// }
// 
// Path: webcrawler-downloader/src/main/java/com/zongtui/webcrawler/sourceer/utils/NumberUtils.java
// public abstract class NumberUtils {
// 
//     public static int compareLong(long o1, long o2) {
//         if (o1 < o2) {
//             return -1;
//         } else if (o1 == o2) {
//             return 0;
//         } else {
//             return 1;
//         }
//     }
// }


// Path: webcrawler-downloader/src/main/java/com/zongtui/webcrawler/sourceer/scheduler/PriorityScheduler.java
import java.util.Comparator;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import org.apache.http.annotation.ThreadSafe;
import com.zongtui.webcrawler.sourceer.Request;
import com.zongtui.webcrawler.sourceer.Task;
import com.zongtui.webcrawler.sourceer.utils.NumberUtils;

        public int compare(Request o1, Request o2) {
            return -NumberUtils.compareLong(o1.getPriority(), o2.getPriority());
        }
    });

    @Override
    public void pushWhenNoDuplicate(Request request, Task task) {
        if (request.getPriority() == 0) {
            noPriorityQueue.add(request);
        } else if (request.getPriority() > 0) {
            priorityQueuePlus.put(request);
        } else {
            priorityQueueMinus.put(request);
        }
    }

    @Override
    public synchronized Request poll(Task task) {
        Request poll = priorityQueuePlus.poll();
        if (poll != null) {
            return poll;
        }
        poll = noPriorityQueue.poll();
        if (poll != null) {
            return poll;
        }
        return priorityQueueMinus.poll();
    }

    @Override

    public int getLeftRequestsCount(Task task) {
