/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.esri.gpt.catalog.harvest.jobs;
import com.esri.gpt.catalog.harvest.jobs.HjRecord.JobStatus;
import com.esri.gpt.catalog.harvest.jobs.HjRecord.JobType;
import com.esri.gpt.catalog.harvest.repository.HrRecord;
import com.esri.gpt.control.webharvest.common.CommonCriteria;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.sql.ManagedConnection;
import com.esri.gpt.framework.util.UuidUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
/**
* Create job request.
* This request will insert new harvesting job. A job will not be created if any
* other job already exist for the specific repository or repository doesn't
* exist.
*/
public class HjCreateRequest extends HjRequest {
// class variables =============================================================
// instance variables ==========================================================
/** parent harvest site */
private HrRecord _parent;
/** job type. Default: {@link HjRecord.JobType#Now} */
private JobType _jobType = JobType.Now;
/** job status. Default: {@link HjRecord.JobStatus#Submited} */
private JobStatus _jobStatus = JobStatus.Submited;
/** criteria */
private CommonCriteria criteria = new CommonCriteria();
// constructors ================================================================
/**
* Creates instance of the request.
* @param requestContext request context
* @param parent parent harvest site
* @param running <code>true</code> to make job marked as running
*/
public HjCreateRequest(RequestContext requestContext, HrRecord parent, CommonCriteria criteria, boolean running) {
super(requestContext, new HjCriteria(), new HjResult());
setParent(parent);
setJobType(criteria == null || criteria.getFromDate() == null ? JobType.Full : JobType.Now);
setJobStatus(running? JobStatus.Running: JobStatus.Submited);
this.criteria = criteria;
}
// properties ==================================================================
/**
* Gets parent site.
* @return parent site
*/
private HrRecord getParent() {
return _parent;
}
/**
* Sets parent site.
* @param parent parent site
*/
private void setParent(HrRecord parent) {
_parent = parent != null ? parent : new HrRecord();
}
/**
* Gets job type.
* @return job type
*/
private HjRecord.JobType getJobType() {
return _jobType;
}
/**
* Sets job type.
* @param jobType job type
*/
private void setJobType(HjRecord.JobType jobType) {
_jobType = jobType;
}
/**
* Gets job status.
* @return job status.
*/
public JobStatus getJobStatus() {
return _jobStatus;
}
/**
* Sets job status.
* @param jobStatus job status
*/
public final void setJobStatus(JobStatus jobStatus) {
this._jobStatus = jobStatus;
}
// methods =====================================================================
/**
* Inserts a new jobs into the database.
* If there is any job for the particular repository, no record will be
* inserted.
* @return <code>true</code> if any record has been inserted
*/
public boolean execute() {
if (recover())
return true;
// nothing has been recovered; create new record
return insert();
}
/**
* Recovers possible canceled task.
* @return <code>true</code> if any record has been recovered
*/
private boolean recover() {
// intitalize
PreparedStatement st = null;
Date currentDate = new Date();
try {
StringBuilder sbStmt = new StringBuilder();
// insert sql
sbStmt.append("UPDATE ").append(getHarvestingJobsPendingTableName());
sbStmt.append(" SET INPUT_DATE=?,HARVEST_DATE=?,JOB_STATUS=?,");
sbStmt.append(" JOB_TYPE=?,CRITERIA=?");
if (getIsDbCaseSensitive(this.getRequestContext())) {
sbStmt.append(" WHERE HARVEST_ID=? AND UPPER(JOB_STATUS)='").append(JobStatus.Canceled.name().toUpperCase()).append("'");
} else {
sbStmt.append(" WHERE HARVEST_ID=? AND JOB_STATUS='").append(JobStatus.Canceled.name().toUpperCase()).append("'");
}
// establish the connection
ManagedConnection mc = returnConnection();
Connection con = mc.getJdbcConnection();
// prepare statement
st = con.prepareStatement(sbStmt.toString());
int n = 1;
st.setTimestamp(n++, new java.sql.Timestamp(currentDate.getTime()));
st.setTimestamp(n++, new java.sql.Timestamp(currentDate.getTime()));
st.setString(n++, HjRecord.JobStatus.Submited.name().toLowerCase());
st.setString(n++, getJobType().name().toLowerCase());
st.setString(n++, criteria.toXmlString());
st.setString(n++, getParent().getUuid());
logExpression(sbStmt.toString());
// execute
int nRowCount = st.executeUpdate();
getActionResult().setNumberOfRecordsModified(nRowCount);
return nRowCount > 0;
} catch (SQLException ex) {
return false;
} finally {
closeStatement(st);
}
}
/**
* Inserts a new record.
* @return <code>true</code> if new record has been inserted
*/
private boolean insert() {
// intitalize
PreparedStatement st = null;
Date currentDate = new Date();
try {
StringBuilder sbStmt = new StringBuilder();
// insert sql
sbStmt.append("INSERT INTO ").append(getHarvestingJobsPendingTableName());
sbStmt.append(" (UUID,INPUT_DATE,HARVEST_DATE,JOB_STATUS,");
sbStmt.append(" JOB_TYPE,CRITERIA,HARVEST_ID,SERVICE_ID) ");
sbStmt.append(" VALUES (?,?,?,?,?,?,?,?)");
// establish the connection
ManagedConnection mc = returnConnection();
Connection con = mc.getJdbcConnection();
// prepare statement
st = con.prepareStatement(sbStmt.toString());
// init statement
String sUuid = UuidUtil.makeUuid(true);
int n = 1;
st.setString(n++, sUuid);
st.setTimestamp(n++, new java.sql.Timestamp(currentDate.getTime()));
st.setTimestamp(n++, new java.sql.Timestamp(currentDate.getTime()));
st.setString(n++, getJobStatus().name().toLowerCase());
st.setString(n++, getJobType().name().toLowerCase());
st.setString(n++, criteria.toXmlString());
st.setString(n++, getParent().getUuid());
st.setString(n++, getActionCriteria().getHostAddress());
logExpression(sbStmt.toString());
// execute
int nRowCount = st.executeUpdate();
getActionResult().setNumberOfRecordsModified(nRowCount);
return nRowCount > 0;
} catch (SQLException ex) {
return false;
} finally {
closeStatement(st);
}
}
}