001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.io.imagery;
003    
004    import java.awt.image.BufferedImage;
005    
006    import org.openstreetmap.josm.data.imagery.GeorefImage.State;
007    import org.openstreetmap.josm.gui.layer.WMSLayer.PrecacheTask;
008    
009    public class WMSRequest implements Comparable<WMSRequest> {
010        private final int xIndex;
011        private final int yIndex;
012        private final double pixelPerDegree;
013        private final boolean real; // Download even if autodownloading is disabled
014        private final PrecacheTask precacheTask; // Download even when wms tile is not currently visible (precache)
015        private final boolean allowPartialCacheMatch;
016        private int priority;
017        private boolean hasExactMatch;
018        // Result
019        private State state;
020        private BufferedImage image;
021    
022        public WMSRequest(int xIndex, int yIndex, double pixelPerDegree, boolean real, boolean allowPartialCacheMatch) {
023            this(xIndex, yIndex, pixelPerDegree, real, allowPartialCacheMatch, null);
024        }
025    
026        public WMSRequest(int xIndex, int yIndex, double pixelPerDegree, boolean real, boolean allowPartialCacheMatch, PrecacheTask precacheTask) {
027            this.xIndex = xIndex;
028            this.yIndex = yIndex;
029            this.pixelPerDegree = pixelPerDegree;
030            this.real = real;
031            this.precacheTask = precacheTask;
032            this.allowPartialCacheMatch = allowPartialCacheMatch;
033        }
034    
035    
036        public void finish(State state, BufferedImage image) {
037            this.state = state;
038            this.image = image;
039        }
040    
041        public int getXIndex() {
042            return xIndex;
043        }
044    
045        public int getYIndex() {
046            return yIndex;
047        }
048    
049        public double getPixelPerDegree() {
050            return pixelPerDegree;
051        }
052    
053        @Override
054        public int hashCode() {
055            final int prime = 31;
056            int result = 1;
057            long temp;
058            temp = Double.doubleToLongBits(pixelPerDegree);
059            result = prime * result + (int) (temp ^ (temp >>> 32));
060            result = prime * result + xIndex;
061            result = prime * result + yIndex;
062            return result;
063        }
064    
065        @Override
066        public boolean equals(Object obj) {
067            if (this == obj)
068                return true;
069            if (obj == null)
070                return false;
071            if (getClass() != obj.getClass())
072                return false;
073            WMSRequest other = (WMSRequest) obj;
074            if (Double.doubleToLongBits(pixelPerDegree) != Double
075                    .doubleToLongBits(other.pixelPerDegree))
076                return false;
077            if (xIndex != other.xIndex)
078                return false;
079            if (yIndex != other.yIndex)
080                return false;
081            if (allowPartialCacheMatch != other.allowPartialCacheMatch)
082                return false;
083            return true;
084        }
085    
086        public void setPriority(int priority) {
087            this.priority = priority;
088        }
089    
090        public int getPriority() {
091            return priority;
092        }
093    
094        @Override
095        public int compareTo(WMSRequest o) {
096            return priority - o.priority;
097        }
098    
099        public State getState() {
100            return state;
101        }
102    
103        public BufferedImage getImage() {
104            return image;
105        }
106    
107        @Override
108        public String toString() {
109            return "WMSRequest [xIndex=" + xIndex + ", yIndex=" + yIndex
110                    + ", pixelPerDegree=" + pixelPerDegree + "]";
111        }
112    
113        public boolean isReal() {
114            return real;
115        }
116    
117        public boolean isPrecacheOnly() {
118            return precacheTask != null;
119        }
120    
121        public PrecacheTask getPrecacheTask() {
122            return precacheTask;
123        }
124    
125        public boolean isAllowPartialCacheMatch() {
126            return allowPartialCacheMatch;
127        }
128    
129        public boolean hasExactMatch() {
130            return hasExactMatch;
131        }
132    
133        public void setHasExactMatch(boolean hasExactMatch) {
134            this.hasExactMatch = hasExactMatch;
135        }
136    }