001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.io;
003    
004    /**
005     * An UploadStrategySpecification consists of the parameter describing the strategy
006     * for uploading a collection of {@link OsmPrimitive}.
007     *
008     * This includes:
009     * <ul>
010     * <li>a decision on which {@link UploadStrategy} to use</li>
011     * <li>the upload chunk size</li>
012     * <li>whether to close the changeset used after the upload</li>
013     * </ul>
014     *
015     *
016     */
017    public class UploadStrategySpecification  {
018        /** indicates that the chunk size isn't specified */
019        static public final int UNSPECIFIED_CHUNK_SIZE = -1;
020    
021        private UploadStrategy strategy;
022        private int chunkSize;
023        private MaxChangesetSizeExceededPolicy policy;
024        private boolean closeChangesetAfterUpload;
025    
026        /**
027         * Creates a new upload strategy with default values.
028         */
029        public UploadStrategySpecification() {
030            this.strategy = UploadStrategy.DEFAULT_UPLOAD_STRATEGY;
031            this.chunkSize = UNSPECIFIED_CHUNK_SIZE;
032            this.policy = null;
033            this.closeChangesetAfterUpload = true;
034        }
035    
036        /**
037         * Clones another upload strategy. If other is null,assumes default
038         * values.
039         *
040         * @param other the other upload strategy
041         */
042        public UploadStrategySpecification(UploadStrategySpecification other) {
043            if (other == null) return;
044            this.strategy = other.strategy;
045            this.chunkSize = other.chunkSize;
046            this.policy = other.policy;
047            this.closeChangesetAfterUpload = other.closeChangesetAfterUpload;
048        }
049    
050        /**
051         * Replies the upload strategy
052         * @return
053         */
054        public UploadStrategy getStrategy() {
055            return strategy;
056        }
057    
058        public int getChunkSize() {
059            return chunkSize;
060        }
061    
062        public static int getUnspecifiedChunkSize() {
063            return UNSPECIFIED_CHUNK_SIZE;
064        }
065    
066        public MaxChangesetSizeExceededPolicy getPolicy() {
067            return policy;
068        }
069    
070        public UploadStrategySpecification setStrategy(UploadStrategy strategy) {
071            this.strategy = strategy;
072            return this;
073        }
074    
075        public UploadStrategySpecification setChunkSize(int chunkSize) {
076            this.chunkSize = chunkSize;
077            return this;
078        }
079    
080        public UploadStrategySpecification setPolicy(MaxChangesetSizeExceededPolicy policy) {
081            this.policy = policy;
082            return this;
083        }
084    
085        public UploadStrategySpecification setCloseChangesetAfterUpload(boolean closeChangesetAfterUpload) {
086            this.closeChangesetAfterUpload = closeChangesetAfterUpload;
087            return this;
088        }
089    
090        public boolean isCloseChangesetAfterUpload() {
091            return closeChangesetAfterUpload;
092        }
093    
094        public int getNumRequests(int numObjects) {
095            if (numObjects <=0) return 0;
096            switch(strategy) {
097            case INDIVIDUAL_OBJECTS_STRATEGY: return numObjects;
098            case SINGLE_REQUEST_STRATEGY: return 1;
099            case CHUNKED_DATASET_STRATEGY:
100                if (chunkSize == UNSPECIFIED_CHUNK_SIZE)
101                    return 0;
102                else
103                    return (int)Math.ceil((double)numObjects / (double)chunkSize);
104            }
105            // should not happen
106            return 0;
107        }
108    
109        @Override
110        public int hashCode() {
111            final int prime = 31;
112            int result = 1;
113            result = prime * result + chunkSize;
114            result = prime * result + (closeChangesetAfterUpload ? 1231 : 1237);
115            result = prime * result + ((policy == null) ? 0 : policy.hashCode());
116            result = prime * result + ((strategy == null) ? 0 : strategy.hashCode());
117            return result;
118        }
119    
120        @Override
121        public boolean equals(Object obj) {
122            if (this == obj)
123                return true;
124            if (obj == null)
125                return false;
126            if (getClass() != obj.getClass())
127                return false;
128            UploadStrategySpecification other = (UploadStrategySpecification) obj;
129            if (chunkSize != other.chunkSize)
130                return false;
131            if (closeChangesetAfterUpload != other.closeChangesetAfterUpload)
132                return false;
133            if (policy == null) {
134                if (other.policy != null)
135                    return false;
136            } else if (!policy.equals(other.policy))
137                return false;
138            if (strategy == null) {
139                if (other.strategy != null)
140                    return false;
141            } else if (!strategy.equals(other.strategy))
142                return false;
143            return true;
144        }
145    }