package nl.ipo.cds.domain; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.sql.Timestamp; import java.util.HashMap; import java.util.Map; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.SecondaryTable; import javax.persistence.Transient; import nl.idgis.commons.jobexecutor.AbstractJob; import nl.idgis.commons.jobexecutor.JobTypeIntrospector; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; @Entity @SecondaryTable (name = "etljob"/*, pkJoinColumns = @PrimaryKeyJoinColumn (name = "id")*/) public abstract class EtlJob extends AbstractJob { //@Id //private Long id; @ManyToOne @JoinColumn (table = "etljob") private DatasetType datasettype; @ManyToOne @JoinColumn (table = "etljob") private Bronhouder bronhouder; @Column (table = "etljob") private String uuid; @Column(name = "metadata_update_datum", table = "etljob") private Timestamp metadataUpdateDatum; @Column(table = "etljob", nullable = false, columnDefinition="bool default false") private Boolean verversen = false; // default waarde ipv null @Column(name = "metadata_url", table = "etljob") private String metadataUrl; @Column( name = "dataset_url", table = "etljob") private String datasetUrl; @Column (table = "etljob") private String wfsUrl; @Column( name = "feature_count", table = "etljob") private Integer featureCount; @Column( name = "geometry_error_count", table = "etljob") private Integer geometryErrorCount; @Column( name = "force_execution", table = "etljob", nullable = false, columnDefinition="bool default false" ) private Boolean forceExecution = false; /* We use a global parameters text field to store all kinds of job parameters. This field can be used to store other parameters for future job types. */ @Column(table = "etljob", name = "parameters", columnDefinition="TEXT") private String parameters; @Transient private Integer maxFeatures = null; @Transient private boolean ignoreInvalidMapping = false; protected EtlJob () { } public EtlJob (final int priority) { super (priority); } /** * @return the datasetType */ public DatasetType getDatasetType() { return datasettype; } /** * @param datasetType * the datasetType to set */ public void setDatasetType(DatasetType datasetType) { this.datasettype = datasetType; } /** * @return the bronhouder */ public Bronhouder getBronhouder() { return bronhouder; } /** * @param bronhouder the bronhouder to set */ public void setBronhouder(Bronhouder bronhouder) { this.bronhouder = bronhouder; } /** * @return the uuid */ public String getUuid() { return uuid; } /** * @param uuid the uuid to set */ public void setUuid(String uuid) { this.uuid = uuid; } /** * @return the metadataUpdateDatum */ public Timestamp getMetadataUpdateDatum() { return metadataUpdateDatum; } /** * @param metadataUpdateDatum * the metadataUpdateDatum to set */ public void setMetadataUpdateDatum(Timestamp metadataUpdateDatum) { this.metadataUpdateDatum = metadataUpdateDatum; } /** * @return the verversen */ public Boolean getVerversen() { return verversen; } /** * @param verversen * the verversen to set */ public void setVerversen(Boolean verversen) { this.verversen = verversen; } /** * @return the wfsUrl */ public String getWfsUrl() { return wfsUrl; } /** * @param wfsUrl * the wfsUrl to set */ public void setWfsUrl(String wfsUrl) { this.wfsUrl = wfsUrl; } /** * @return the metadataUrl */ public String getMetadataUrl() { return metadataUrl; } /** * @param metadataUrl the metadataUrl to set */ public void setMetadataUrl(String metadataUrl) { this.metadataUrl = metadataUrl; } /** * @return the datasetUrl */ public String getDatasetUrl() { return datasetUrl; } /** * @param datasetUrl * the datasetUrl to set */ public void setDatasetUrl(String datasetUrl) { this.datasetUrl = datasetUrl; } private Map<String,Object> readParameters() { if (parameters == null || parameters.isEmpty()) { return new HashMap<>(); } ObjectMapper mapper = new ObjectMapper(); ByteArrayInputStream bis = new ByteArrayInputStream(parameters.getBytes()); try { Map<String, Object> params = mapper.readValue(bis, new TypeReference<Map<String, Object>>() {}); bis.close(); return params; } catch (IOException e) { throw new RuntimeException("Error reading job parameters from string field.", e); } } private void writeParameters(Map<String, Object> params) { ObjectMapper mapper = new ObjectMapper(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { mapper.writeValue(bos, params); bos.flush(); parameters = bos.toString(); bos.close(); } catch (IOException e) { throw new RuntimeException("Error writing job parameters to string field.", e); } } protected void setParameter(String key, Object value) { Map<String, Object> params = readParameters(); params.put(key, value); writeParameters(params); } protected Object getParameter(String key) { return readParameters().get(key); } public Integer getFeatureCount() { return featureCount; } public void setFeatureCount(Integer featureCount) { this.featureCount = featureCount; } public Integer getGeometryErrorCount() { return geometryErrorCount; } public void setGeometryErrorCount(Integer geometryErrorCount) { this.geometryErrorCount = geometryErrorCount; } @Override public String toString() { return "## Job (id: " + getId () + ", creatie: " + getCreateTime () + ", status: " + getStatus () + ", verversen: " + verversen + ", jobType: " + JobTypeIntrospector.getJobTypeName (this) + ", uuid: " + uuid + ", type: " + datasettype + ", bronhouder: " + bronhouder + ")"; } public boolean isForceExecution () { return forceExecution ; } public void setForceExecution (final boolean forceExecution) { this.forceExecution = forceExecution; } public Integer getMaxFeatures () { return maxFeatures; } public void setMaxFeatures (final Integer maxFeatures) { this.maxFeatures = maxFeatures; } public boolean isIgnoreInvalidMapping() { return ignoreInvalidMapping; } public void setIgnoreInvalidMapping(boolean ignoreInvalidMapping) { this.ignoreInvalidMapping = ignoreInvalidMapping; } }