/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.importer.job.ProgressMonitor;
import org.geoserver.importer.transform.TransformChain;
import static org.geoserver.importer.ImporterUtils.*;
/**
* A unit of work during an import.
*
* @author Justin Deoliveira, OpenGeo
*/
public class ImportTask implements Serializable {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
public static enum State {
PENDING, READY, RUNNING, NO_CRS, NO_BOUNDS, NO_FORMAT, BAD_FORMAT, ERROR, CANCELED, COMPLETE
}
/**
* task id
*/
long id;
/**
* the context this task is part of
*/
ImportContext context;
/**
* source of data for the import
*/
ImportData data;
/**
* The target store for the import
*/
StoreInfo store;
/**
* state
*/
State state = State.PENDING;
/**
* id generator for items
*/
int itemid = 0;
/**
* flag signalling direct/indirect import
*/
boolean direct;
/**
* how data should be applied to the target, during ingest/indirect import
*/
UpdateMode updateMode;
/**
* The original layer name assigned to the task
*/
String originalLayerName;
/**
* the layer/resource
*/
LayerInfo layer;
/**
* Any error associated with the resource
*/
Exception error;
/**
* transform to apply to this import item
*/
TransformChain transform;
/**
* messages logged during proessing
*/
List<LogRecord> messages = new ArrayList<LogRecord>();
/**
* various metadata
*/
transient Map<Object,Object> metadata;
/**
* used to track progress
*/
transient volatile int totalToProcess;
transient volatile int numberProcessed;
public ImportTask() {
updateMode = UpdateMode.CREATE;
}
public ImportTask(ImportData data) {
this();
this.data = data;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public ImportContext getContext() {
return context;
}
public void setContext(ImportContext context) {
this.context = context;
}
public ImportData getData() {
return data;
}
public void setData(ImportData data) {
this.data = data;
}
public void setStore(StoreInfo store) {
this.store = store;
}
public StoreInfo getStore() {
return store;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public boolean isDirect() {
return direct;
}
public void setDirect(boolean direct) {
this.direct = direct;
}
public LayerInfo getLayer() {
return layer;
}
public void setLayer(LayerInfo layer) {
this.layer = layer;
}
public Exception getError() {
return error;
}
public void setError(Exception error) {
this.error = error;
}
public TransformChain getTransform() {
return transform;
}
public void setTransform(TransformChain transform) {
this.transform = transform;
}
public Map<Object, Object> getMetadata() {
if (metadata == null) {
metadata = new HashMap<Object, Object>();
}
return metadata;
}
public void clearMessages() {
if (messages != null) {
messages.clear();
}
}
public void addMessage(Level level,String msg) {
if (messages == null) {
messages = new ArrayList<LogRecord>();
}
messages.add(new LogRecord(level, msg));
}
public List<LogRecord> getMessages() {
List<LogRecord> retval;
if (messages == null) {
retval = Collections.emptyList();
} else {
retval = Collections.unmodifiableList(messages);
}
return retval;
}
public String getOriginalLayerName() {
return originalLayerName == null ? layer.getResource().getNativeName() : originalLayerName;
}
public void setOriginalLayerName(String originalLayerName) {
this.originalLayerName = originalLayerName;
}
public int getNumberProcessed() {
return numberProcessed;
}
public void setNumberProcessed(int numberProcessed) {
this.numberProcessed = numberProcessed;
}
public int getTotalToProcess() {
return totalToProcess;
}
public void setTotalToProcess(int totalToProcess) {
this.totalToProcess = totalToProcess;
}
public UpdateMode getUpdateMode() {
return updateMode;
}
public void setUpdateMode(UpdateMode updateMode) {
this.updateMode = updateMode;
}
public void reattach(Catalog catalog) {
reattach(catalog, false);
}
public void reattach(Catalog catalog, boolean lookupByName) {
store = resolve(store, catalog, lookupByName);
layer = resolve(layer, catalog, lookupByName);
}
public boolean readyForImport() {
return state == State.READY || state == State.CANCELED;
}
public ProgressMonitor progress() {
return context.progress();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((context == null) ? 0 : context.hashCode());
result = prime * result + (int) (id ^ (id >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ImportTask other = (ImportTask) obj;
if (context == null) {
if (other.context != null)
return false;
} else if (!context.equals(other.context))
return false;
if (id != other.id)
return false;
return true;
}
}