// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm_server.gui.io;
/**
* An UploadStrategySpecification consists of the parameter describing the strategy
* for uploading a collection of {@see OsmPrimitive}.
*
* This includes:
* <ul>
* <li>a decision on which {@see UploadStrategy} to use</li>
* <li>the upload chunk size</li>
* <li>whether to close the changeset used after the upload</li>
* </ul>
*
*
*/
public class UploadStrategySpecification {
/** indicates that the chunk size isn't specified */
static public final int UNSPECIFIED_CHUNK_SIZE = -1;
private UploadStrategy strategy;
private int chunkSize;
private MaxChangesetSizeExceededPolicy policy;
private boolean closeChangesetAfterUpload;
/**
* Creates a new upload strategy with default values.
*/
public UploadStrategySpecification() {
this.strategy = UploadStrategy.DEFAULT_UPLOAD_STRATEGY;
this.chunkSize = UNSPECIFIED_CHUNK_SIZE;
this.policy = null;
this.closeChangesetAfterUpload = true;
}
/**
* Clones another upload strategy. If other is null,assumes default
* values.
*
* @param other the other upload strategy
*/
public UploadStrategySpecification(UploadStrategySpecification other) {
if (other == null) return;
this.strategy = other.strategy;
this.chunkSize = other.chunkSize;
this.policy = other.policy;
this.closeChangesetAfterUpload = other.closeChangesetAfterUpload;
}
/**
* Replies the upload strategy
* @return
*/
public UploadStrategy getStrategy() {
return strategy;
}
public int getChunkSize() {
return chunkSize;
}
public static int getUnspecifiedChunkSize() {
return UNSPECIFIED_CHUNK_SIZE;
}
public MaxChangesetSizeExceededPolicy getPolicy() {
return policy;
}
public UploadStrategySpecification setStrategy(UploadStrategy strategy) {
this.strategy = strategy;
return this;
}
public UploadStrategySpecification setChunkSize(int chunkSize) {
this.chunkSize = chunkSize;
return this;
}
public UploadStrategySpecification setPolicy(MaxChangesetSizeExceededPolicy policy) {
this.policy = policy;
return this;
}
public UploadStrategySpecification setCloseChangesetAfterUpload(boolean closeChangesetAfterUpload) {
this.closeChangesetAfterUpload = closeChangesetAfterUpload;
return this;
}
public boolean isCloseChangesetAfterUpload() {
return closeChangesetAfterUpload;
}
public int getNumRequests(int numObjects) {
if (numObjects <=0) return 0;
switch(strategy) {
case INDIVIDUAL_OBJECTS_STRATEGY: return numObjects;
case SINGLE_REQUEST_STRATEGY: return 1;
case CHUNKED_DATASET_STRATEGY:
if (chunkSize == UNSPECIFIED_CHUNK_SIZE)
return 0;
else
return (int)Math.ceil((double)numObjects / (double)chunkSize);
}
// should not happen
return 0;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + chunkSize;
result = prime * result + (closeChangesetAfterUpload ? 1231 : 1237);
result = prime * result + ((policy == null) ? 0 : policy.hashCode());
result = prime * result + ((strategy == null) ? 0 : strategy.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UploadStrategySpecification other = (UploadStrategySpecification) obj;
if (chunkSize != other.chunkSize)
return false;
if (closeChangesetAfterUpload != other.closeChangesetAfterUpload)
return false;
if (policy == null) {
if (other.policy != null)
return false;
} else if (!policy.equals(other.policy))
return false;
if (strategy == null) {
if (other.strategy != null)
return false;
} else if (!strategy.equals(other.strategy))
return false;
return true;
}
}